25
25
26
26
#include "netdevsim.h"
27
27
28
+ struct nsim_vf_config {
29
+ int link_state ;
30
+ u16 min_tx_rate ;
31
+ u16 max_tx_rate ;
32
+ u16 vlan ;
33
+ __be16 vlan_proto ;
34
+ u16 qos ;
35
+ u8 vf_mac [ETH_ALEN ];
36
+ bool spoofchk_enabled ;
37
+ bool trusted ;
38
+ bool rss_query_enabled ;
39
+ };
40
+
41
+ static u32 nsim_dev_id ;
42
+
43
+ static int nsim_num_vf (struct device * dev )
44
+ {
45
+ struct netdevsim * ns = to_nsim (dev );
46
+
47
+ return ns -> num_vfs ;
48
+ }
49
+
50
+ static struct bus_type nsim_bus = {
51
+ .name = DRV_NAME ,
52
+ .dev_name = DRV_NAME ,
53
+ .num_vf = nsim_num_vf ,
54
+ };
55
+
56
+ static int nsim_vfs_enable (struct netdevsim * ns , unsigned int num_vfs )
57
+ {
58
+ ns -> vfconfigs = kcalloc (num_vfs , sizeof (struct nsim_vf_config ),
59
+ GFP_KERNEL );
60
+ if (!ns -> vfconfigs )
61
+ return - ENOMEM ;
62
+ ns -> num_vfs = num_vfs ;
63
+
64
+ return 0 ;
65
+ }
66
+
67
+ static void nsim_vfs_disable (struct netdevsim * ns )
68
+ {
69
+ kfree (ns -> vfconfigs );
70
+ ns -> vfconfigs = NULL ;
71
+ ns -> num_vfs = 0 ;
72
+ }
73
+
74
+ static ssize_t
75
+ nsim_numvfs_store (struct device * dev , struct device_attribute * attr ,
76
+ const char * buf , size_t count )
77
+ {
78
+ struct netdevsim * ns = to_nsim (dev );
79
+ unsigned int num_vfs ;
80
+ int ret ;
81
+
82
+ ret = kstrtouint (buf , 0 , & num_vfs );
83
+ if (ret )
84
+ return ret ;
85
+
86
+ rtnl_lock ();
87
+ if (ns -> num_vfs == num_vfs )
88
+ goto exit_good ;
89
+ if (ns -> num_vfs && num_vfs ) {
90
+ ret = - EBUSY ;
91
+ goto exit_unlock ;
92
+ }
93
+
94
+ if (num_vfs ) {
95
+ ret = nsim_vfs_enable (ns , num_vfs );
96
+ if (ret )
97
+ goto exit_unlock ;
98
+ } else {
99
+ nsim_vfs_disable (ns );
100
+ }
101
+ exit_good :
102
+ ret = count ;
103
+ exit_unlock :
104
+ rtnl_unlock ();
105
+
106
+ return ret ;
107
+ }
108
+
109
+ static ssize_t
110
+ nsim_numvfs_show (struct device * dev , struct device_attribute * attr , char * buf )
111
+ {
112
+ struct netdevsim * ns = to_nsim (dev );
113
+
114
+ return sprintf (buf , "%u\n" , ns -> num_vfs );
115
+ }
116
+
117
+ static struct device_attribute nsim_numvfs_attr =
118
+ __ATTR (sriov_numvfs , 0664 , nsim_numvfs_show , nsim_numvfs_store );
119
+
120
+ static struct attribute * nsim_dev_attrs [] = {
121
+ & nsim_numvfs_attr .attr ,
122
+ NULL ,
123
+ };
124
+
125
+ static const struct attribute_group nsim_dev_attr_group = {
126
+ .attrs = nsim_dev_attrs ,
127
+ };
128
+
129
+ static const struct attribute_group * nsim_dev_attr_groups [] = {
130
+ & nsim_dev_attr_group ,
131
+ NULL ,
132
+ };
133
+
134
+ static void nsim_dev_release (struct device * dev )
135
+ {
136
+ struct netdevsim * ns = to_nsim (dev );
137
+
138
+ nsim_vfs_disable (ns );
139
+ free_netdev (ns -> netdev );
140
+ }
141
+
142
+ struct device_type nsim_dev_type = {
143
+ .groups = nsim_dev_attr_groups ,
144
+ .release = nsim_dev_release ,
145
+ };
146
+
28
147
static int nsim_init (struct net_device * dev )
29
148
{
30
149
struct netdevsim * ns = netdev_priv (dev );
@@ -37,8 +156,19 @@ static int nsim_init(struct net_device *dev)
37
156
if (err )
38
157
goto err_debugfs_destroy ;
39
158
159
+ ns -> dev .id = nsim_dev_id ++ ;
160
+ ns -> dev .bus = & nsim_bus ;
161
+ ns -> dev .type = & nsim_dev_type ;
162
+ err = device_register (& ns -> dev );
163
+ if (err )
164
+ goto err_bpf_uninit ;
165
+
166
+ SET_NETDEV_DEV (dev , & ns -> dev );
167
+
40
168
return 0 ;
41
169
170
+ err_bpf_uninit :
171
+ nsim_bpf_uninit (ns );
42
172
err_debugfs_destroy :
43
173
debugfs_remove_recursive (ns -> ddir );
44
174
return err ;
@@ -52,6 +182,14 @@ static void nsim_uninit(struct net_device *dev)
52
182
nsim_bpf_uninit (ns );
53
183
}
54
184
185
+ static void nsim_free (struct net_device * dev )
186
+ {
187
+ struct netdevsim * ns = netdev_priv (dev );
188
+
189
+ device_unregister (& ns -> dev );
190
+ /* netdev and vf state will be freed out of device_release() */
191
+ }
192
+
55
193
static netdev_tx_t nsim_start_xmit (struct sk_buff * skb , struct net_device * dev )
56
194
{
57
195
struct netdevsim * ns = netdev_priv (dev );
@@ -122,6 +260,123 @@ nsim_setup_tc_block(struct net_device *dev, struct tc_block_offload *f)
122
260
}
123
261
}
124
262
263
+ static int nsim_set_vf_mac (struct net_device * dev , int vf , u8 * mac )
264
+ {
265
+ struct netdevsim * ns = netdev_priv (dev );
266
+
267
+ /* Only refuse multicast addresses, zero address can mean unset/any. */
268
+ if (vf >= ns -> num_vfs || is_multicast_ether_addr (mac ))
269
+ return - EINVAL ;
270
+ memcpy (ns -> vfconfigs [vf ].vf_mac , mac , ETH_ALEN );
271
+
272
+ return 0 ;
273
+ }
274
+
275
+ static int nsim_set_vf_vlan (struct net_device * dev , int vf ,
276
+ u16 vlan , u8 qos , __be16 vlan_proto )
277
+ {
278
+ struct netdevsim * ns = netdev_priv (dev );
279
+
280
+ if (vf >= ns -> num_vfs || vlan > 4095 || qos > 7 )
281
+ return - EINVAL ;
282
+
283
+ ns -> vfconfigs [vf ].vlan = vlan ;
284
+ ns -> vfconfigs [vf ].qos = qos ;
285
+ ns -> vfconfigs [vf ].vlan_proto = vlan_proto ;
286
+
287
+ return 0 ;
288
+ }
289
+
290
+ static int nsim_set_vf_rate (struct net_device * dev , int vf , int min , int max )
291
+ {
292
+ struct netdevsim * ns = netdev_priv (dev );
293
+
294
+ if (vf >= ns -> num_vfs )
295
+ return - EINVAL ;
296
+
297
+ ns -> vfconfigs [vf ].min_tx_rate = min ;
298
+ ns -> vfconfigs [vf ].max_tx_rate = max ;
299
+
300
+ return 0 ;
301
+ }
302
+
303
+ static int nsim_set_vf_spoofchk (struct net_device * dev , int vf , bool val )
304
+ {
305
+ struct netdevsim * ns = netdev_priv (dev );
306
+
307
+ if (vf >= ns -> num_vfs )
308
+ return - EINVAL ;
309
+ ns -> vfconfigs [vf ].spoofchk_enabled = val ;
310
+
311
+ return 0 ;
312
+ }
313
+
314
+ static int nsim_set_vf_rss_query_en (struct net_device * dev , int vf , bool val )
315
+ {
316
+ struct netdevsim * ns = netdev_priv (dev );
317
+
318
+ if (vf >= ns -> num_vfs )
319
+ return - EINVAL ;
320
+ ns -> vfconfigs [vf ].rss_query_enabled = val ;
321
+
322
+ return 0 ;
323
+ }
324
+
325
+ static int nsim_set_vf_trust (struct net_device * dev , int vf , bool val )
326
+ {
327
+ struct netdevsim * ns = netdev_priv (dev );
328
+
329
+ if (vf >= ns -> num_vfs )
330
+ return - EINVAL ;
331
+ ns -> vfconfigs [vf ].trusted = val ;
332
+
333
+ return 0 ;
334
+ }
335
+
336
+ static int
337
+ nsim_get_vf_config (struct net_device * dev , int vf , struct ifla_vf_info * ivi )
338
+ {
339
+ struct netdevsim * ns = netdev_priv (dev );
340
+
341
+ if (vf >= ns -> num_vfs )
342
+ return - EINVAL ;
343
+
344
+ ivi -> vf = vf ;
345
+ ivi -> linkstate = ns -> vfconfigs [vf ].link_state ;
346
+ ivi -> min_tx_rate = ns -> vfconfigs [vf ].min_tx_rate ;
347
+ ivi -> max_tx_rate = ns -> vfconfigs [vf ].max_tx_rate ;
348
+ ivi -> vlan = ns -> vfconfigs [vf ].vlan ;
349
+ ivi -> vlan_proto = ns -> vfconfigs [vf ].vlan_proto ;
350
+ ivi -> qos = ns -> vfconfigs [vf ].qos ;
351
+ memcpy (& ivi -> mac , ns -> vfconfigs [vf ].vf_mac , ETH_ALEN );
352
+ ivi -> spoofchk = ns -> vfconfigs [vf ].spoofchk_enabled ;
353
+ ivi -> trusted = ns -> vfconfigs [vf ].trusted ;
354
+ ivi -> rss_query_en = ns -> vfconfigs [vf ].rss_query_enabled ;
355
+
356
+ return 0 ;
357
+ }
358
+
359
+ static int nsim_set_vf_link_state (struct net_device * dev , int vf , int state )
360
+ {
361
+ struct netdevsim * ns = netdev_priv (dev );
362
+
363
+ if (vf >= ns -> num_vfs )
364
+ return - EINVAL ;
365
+
366
+ switch (state ) {
367
+ case IFLA_VF_LINK_STATE_AUTO :
368
+ case IFLA_VF_LINK_STATE_ENABLE :
369
+ case IFLA_VF_LINK_STATE_DISABLE :
370
+ break ;
371
+ default :
372
+ return - EINVAL ;
373
+ }
374
+
375
+ ns -> vfconfigs [vf ].link_state = state ;
376
+
377
+ return 0 ;
378
+ }
379
+
125
380
static int
126
381
nsim_setup_tc (struct net_device * dev , enum tc_setup_type type , void * type_data )
127
382
{
@@ -153,6 +408,14 @@ static const struct net_device_ops nsim_netdev_ops = {
153
408
.ndo_validate_addr = eth_validate_addr ,
154
409
.ndo_change_mtu = nsim_change_mtu ,
155
410
.ndo_get_stats64 = nsim_get_stats64 ,
411
+ .ndo_set_vf_mac = nsim_set_vf_mac ,
412
+ .ndo_set_vf_vlan = nsim_set_vf_vlan ,
413
+ .ndo_set_vf_rate = nsim_set_vf_rate ,
414
+ .ndo_set_vf_spoofchk = nsim_set_vf_spoofchk ,
415
+ .ndo_set_vf_trust = nsim_set_vf_trust ,
416
+ .ndo_get_vf_config = nsim_get_vf_config ,
417
+ .ndo_set_vf_link_state = nsim_set_vf_link_state ,
418
+ .ndo_set_vf_rss_query_en = nsim_set_vf_rss_query_en ,
156
419
.ndo_setup_tc = nsim_setup_tc ,
157
420
.ndo_set_features = nsim_set_features ,
158
421
.ndo_bpf = nsim_bpf ,
@@ -164,7 +427,7 @@ static void nsim_setup(struct net_device *dev)
164
427
eth_hw_addr_random (dev );
165
428
166
429
dev -> netdev_ops = & nsim_netdev_ops ;
167
- dev -> needs_free_netdev = true ;
430
+ dev -> priv_destructor = nsim_free ;
168
431
169
432
dev -> tx_queue_len = 0 ;
170
433
dev -> flags |= IFF_NOARP ;
@@ -209,12 +472,18 @@ static int __init nsim_module_init(void)
209
472
if (IS_ERR (nsim_ddir ))
210
473
return PTR_ERR (nsim_ddir );
211
474
212
- err = rtnl_link_register ( & nsim_link_ops );
475
+ err = bus_register ( & nsim_bus );
213
476
if (err )
214
477
goto err_debugfs_destroy ;
215
478
479
+ err = rtnl_link_register (& nsim_link_ops );
480
+ if (err )
481
+ goto err_unreg_bus ;
482
+
216
483
return 0 ;
217
484
485
+ err_unreg_bus :
486
+ bus_unregister (& nsim_bus );
218
487
err_debugfs_destroy :
219
488
debugfs_remove_recursive (nsim_ddir );
220
489
return err ;
@@ -223,6 +492,7 @@ static int __init nsim_module_init(void)
223
492
static void __exit nsim_module_exit (void )
224
493
{
225
494
rtnl_link_unregister (& nsim_link_ops );
495
+ bus_unregister (& nsim_bus );
226
496
debugfs_remove_recursive (nsim_ddir );
227
497
}
228
498
0 commit comments