2 * Copyright (C) 2017 Netronome Systems, Inc.
4 * This software is licensed under the GNU General License Version 2,
5 * June 1991 as shown in the file COPYING in the top-level directory of this
8 * THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS"
9 * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
10 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
11 * FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE
12 * OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME
13 * THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16 #include <linux/debugfs.h>
17 #include <linux/etherdevice.h>
18 #include <linux/kernel.h>
19 #include <linux/module.h>
20 #include <linux/netdevice.h>
21 #include <linux/slab.h>
22 #include <net/netlink.h>
23 #include <net/pkt_cls.h>
24 #include <net/rtnetlink.h>
26 #include "netdevsim.h"
28 static netdev_tx_t
nsim_start_xmit(struct sk_buff
*skb
, struct net_device
*dev
)
30 struct netdevsim
*ns
= netdev_priv(dev
);
32 if (!nsim_ipsec_tx(ns
, skb
))
35 u64_stats_update_begin(&ns
->syncp
);
37 ns
->tx_bytes
+= skb
->len
;
38 u64_stats_update_end(&ns
->syncp
);
46 static void nsim_set_rx_mode(struct net_device
*dev
)
50 static int nsim_change_mtu(struct net_device
*dev
, int new_mtu
)
52 struct netdevsim
*ns
= netdev_priv(dev
);
54 if (ns
->xdp
.prog
&& new_mtu
> NSIM_XDP_MAX_MTU
)
63 nsim_get_stats64(struct net_device
*dev
, struct rtnl_link_stats64
*stats
)
65 struct netdevsim
*ns
= netdev_priv(dev
);
69 start
= u64_stats_fetch_begin(&ns
->syncp
);
70 stats
->tx_bytes
= ns
->tx_bytes
;
71 stats
->tx_packets
= ns
->tx_packets
;
72 } while (u64_stats_fetch_retry(&ns
->syncp
, start
));
76 nsim_setup_tc_block_cb(enum tc_setup_type type
, void *type_data
, void *cb_priv
)
78 return nsim_bpf_setup_tc_block_cb(type
, type_data
, cb_priv
);
81 static int nsim_set_vf_mac(struct net_device
*dev
, int vf
, u8
*mac
)
83 struct netdevsim
*ns
= netdev_priv(dev
);
84 struct nsim_bus_dev
*nsim_bus_dev
= ns
->nsim_bus_dev
;
86 /* Only refuse multicast addresses, zero address can mean unset/any. */
87 if (vf
>= nsim_bus_dev
->num_vfs
|| is_multicast_ether_addr(mac
))
89 memcpy(nsim_bus_dev
->vfconfigs
[vf
].vf_mac
, mac
, ETH_ALEN
);
94 static int nsim_set_vf_vlan(struct net_device
*dev
, int vf
,
95 u16 vlan
, u8 qos
, __be16 vlan_proto
)
97 struct netdevsim
*ns
= netdev_priv(dev
);
98 struct nsim_bus_dev
*nsim_bus_dev
= ns
->nsim_bus_dev
;
100 if (vf
>= nsim_bus_dev
->num_vfs
|| vlan
> 4095 || qos
> 7)
103 nsim_bus_dev
->vfconfigs
[vf
].vlan
= vlan
;
104 nsim_bus_dev
->vfconfigs
[vf
].qos
= qos
;
105 nsim_bus_dev
->vfconfigs
[vf
].vlan_proto
= vlan_proto
;
110 static int nsim_set_vf_rate(struct net_device
*dev
, int vf
, int min
, int max
)
112 struct netdevsim
*ns
= netdev_priv(dev
);
113 struct nsim_bus_dev
*nsim_bus_dev
= ns
->nsim_bus_dev
;
115 if (vf
>= nsim_bus_dev
->num_vfs
)
118 nsim_bus_dev
->vfconfigs
[vf
].min_tx_rate
= min
;
119 nsim_bus_dev
->vfconfigs
[vf
].max_tx_rate
= max
;
124 static int nsim_set_vf_spoofchk(struct net_device
*dev
, int vf
, bool val
)
126 struct netdevsim
*ns
= netdev_priv(dev
);
127 struct nsim_bus_dev
*nsim_bus_dev
= ns
->nsim_bus_dev
;
129 if (vf
>= nsim_bus_dev
->num_vfs
)
131 nsim_bus_dev
->vfconfigs
[vf
].spoofchk_enabled
= val
;
136 static int nsim_set_vf_rss_query_en(struct net_device
*dev
, int vf
, bool val
)
138 struct netdevsim
*ns
= netdev_priv(dev
);
139 struct nsim_bus_dev
*nsim_bus_dev
= ns
->nsim_bus_dev
;
141 if (vf
>= nsim_bus_dev
->num_vfs
)
143 nsim_bus_dev
->vfconfigs
[vf
].rss_query_enabled
= val
;
148 static int nsim_set_vf_trust(struct net_device
*dev
, int vf
, bool val
)
150 struct netdevsim
*ns
= netdev_priv(dev
);
151 struct nsim_bus_dev
*nsim_bus_dev
= ns
->nsim_bus_dev
;
153 if (vf
>= nsim_bus_dev
->num_vfs
)
155 nsim_bus_dev
->vfconfigs
[vf
].trusted
= val
;
161 nsim_get_vf_config(struct net_device
*dev
, int vf
, struct ifla_vf_info
*ivi
)
163 struct netdevsim
*ns
= netdev_priv(dev
);
164 struct nsim_bus_dev
*nsim_bus_dev
= ns
->nsim_bus_dev
;
166 if (vf
>= nsim_bus_dev
->num_vfs
)
170 ivi
->linkstate
= nsim_bus_dev
->vfconfigs
[vf
].link_state
;
171 ivi
->min_tx_rate
= nsim_bus_dev
->vfconfigs
[vf
].min_tx_rate
;
172 ivi
->max_tx_rate
= nsim_bus_dev
->vfconfigs
[vf
].max_tx_rate
;
173 ivi
->vlan
= nsim_bus_dev
->vfconfigs
[vf
].vlan
;
174 ivi
->vlan_proto
= nsim_bus_dev
->vfconfigs
[vf
].vlan_proto
;
175 ivi
->qos
= nsim_bus_dev
->vfconfigs
[vf
].qos
;
176 memcpy(&ivi
->mac
, nsim_bus_dev
->vfconfigs
[vf
].vf_mac
, ETH_ALEN
);
177 ivi
->spoofchk
= nsim_bus_dev
->vfconfigs
[vf
].spoofchk_enabled
;
178 ivi
->trusted
= nsim_bus_dev
->vfconfigs
[vf
].trusted
;
179 ivi
->rss_query_en
= nsim_bus_dev
->vfconfigs
[vf
].rss_query_enabled
;
184 static int nsim_set_vf_link_state(struct net_device
*dev
, int vf
, int state
)
186 struct netdevsim
*ns
= netdev_priv(dev
);
187 struct nsim_bus_dev
*nsim_bus_dev
= ns
->nsim_bus_dev
;
189 if (vf
>= nsim_bus_dev
->num_vfs
)
193 case IFLA_VF_LINK_STATE_AUTO
:
194 case IFLA_VF_LINK_STATE_ENABLE
:
195 case IFLA_VF_LINK_STATE_DISABLE
:
201 nsim_bus_dev
->vfconfigs
[vf
].link_state
= state
;
206 static LIST_HEAD(nsim_block_cb_list
);
209 nsim_setup_tc(struct net_device
*dev
, enum tc_setup_type type
, void *type_data
)
211 struct netdevsim
*ns
= netdev_priv(dev
);
215 return flow_block_cb_setup_simple(type_data
,
217 nsim_setup_tc_block_cb
,
225 nsim_set_features(struct net_device
*dev
, netdev_features_t features
)
227 struct netdevsim
*ns
= netdev_priv(dev
);
229 if ((dev
->features
& NETIF_F_HW_TC
) > (features
& NETIF_F_HW_TC
))
230 return nsim_bpf_disable_tc(ns
);
235 static struct devlink_port
*nsim_get_devlink_port(struct net_device
*dev
)
237 struct netdevsim
*ns
= netdev_priv(dev
);
239 return &ns
->nsim_dev_port
->devlink_port
;
242 static const struct net_device_ops nsim_netdev_ops
= {
243 .ndo_start_xmit
= nsim_start_xmit
,
244 .ndo_set_rx_mode
= nsim_set_rx_mode
,
245 .ndo_set_mac_address
= eth_mac_addr
,
246 .ndo_validate_addr
= eth_validate_addr
,
247 .ndo_change_mtu
= nsim_change_mtu
,
248 .ndo_get_stats64
= nsim_get_stats64
,
249 .ndo_set_vf_mac
= nsim_set_vf_mac
,
250 .ndo_set_vf_vlan
= nsim_set_vf_vlan
,
251 .ndo_set_vf_rate
= nsim_set_vf_rate
,
252 .ndo_set_vf_spoofchk
= nsim_set_vf_spoofchk
,
253 .ndo_set_vf_trust
= nsim_set_vf_trust
,
254 .ndo_get_vf_config
= nsim_get_vf_config
,
255 .ndo_set_vf_link_state
= nsim_set_vf_link_state
,
256 .ndo_set_vf_rss_query_en
= nsim_set_vf_rss_query_en
,
257 .ndo_setup_tc
= nsim_setup_tc
,
258 .ndo_set_features
= nsim_set_features
,
260 .ndo_get_devlink_port
= nsim_get_devlink_port
,
263 static void nsim_setup(struct net_device
*dev
)
266 eth_hw_addr_random(dev
);
268 dev
->tx_queue_len
= 0;
269 dev
->flags
|= IFF_NOARP
;
270 dev
->flags
&= ~IFF_MULTICAST
;
271 dev
->priv_flags
|= IFF_LIVE_ADDR_CHANGE
|
273 dev
->features
|= NETIF_F_HIGHDMA
|
278 dev
->hw_features
|= NETIF_F_HW_TC
;
279 dev
->max_mtu
= ETH_MAX_MTU
;
283 nsim_create(struct nsim_dev
*nsim_dev
, struct nsim_dev_port
*nsim_dev_port
)
285 struct net_device
*dev
;
286 struct netdevsim
*ns
;
289 dev
= alloc_netdev(sizeof(*ns
), "eth%d", NET_NAME_UNKNOWN
, nsim_setup
);
291 return ERR_PTR(-ENOMEM
);
293 dev_net_set(dev
, nsim_dev_net(nsim_dev
));
294 ns
= netdev_priv(dev
);
296 ns
->nsim_dev
= nsim_dev
;
297 ns
->nsim_dev_port
= nsim_dev_port
;
298 ns
->nsim_bus_dev
= nsim_dev
->nsim_bus_dev
;
299 SET_NETDEV_DEV(dev
, &ns
->nsim_bus_dev
->dev
);
300 dev
->netdev_ops
= &nsim_netdev_ops
;
303 err
= nsim_bpf_init(ns
);
305 goto err_free_netdev
;
309 err
= register_netdevice(dev
);
311 goto err_ipsec_teardown
;
317 nsim_ipsec_teardown(ns
);
325 void nsim_destroy(struct netdevsim
*ns
)
327 struct net_device
*dev
= ns
->netdev
;
330 unregister_netdevice(dev
);
331 nsim_ipsec_teardown(ns
);
337 static int nsim_validate(struct nlattr
*tb
[], struct nlattr
*data
[],
338 struct netlink_ext_ack
*extack
)
340 NL_SET_ERR_MSG_MOD(extack
, "Please use: echo \"[ID] [PORT_COUNT]\" > /sys/bus/netdevsim/new_device");
344 static struct rtnl_link_ops nsim_link_ops __read_mostly
= {
346 .validate
= nsim_validate
,
349 static int __init
nsim_module_init(void)
353 err
= nsim_dev_init();
357 err
= nsim_bus_init();
361 err
= rtnl_link_register(&nsim_link_ops
);
374 static void __exit
nsim_module_exit(void)
376 rtnl_link_unregister(&nsim_link_ops
);
381 module_init(nsim_module_init
);
382 module_exit(nsim_module_exit
);
383 MODULE_LICENSE("GPL");
384 MODULE_ALIAS_RTNL_LINK(DRV_NAME
);