183c9e13aSJakub Kicinski /*
283c9e13aSJakub Kicinski * Copyright (C) 2017 Netronome Systems, Inc.
383c9e13aSJakub Kicinski *
483c9e13aSJakub Kicinski * This software is licensed under the GNU General License Version 2,
583c9e13aSJakub Kicinski * June 1991 as shown in the file COPYING in the top-level directory of this
683c9e13aSJakub Kicinski * source tree.
783c9e13aSJakub Kicinski *
883c9e13aSJakub Kicinski * THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS"
983c9e13aSJakub Kicinski * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
1083c9e13aSJakub Kicinski * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
1183c9e13aSJakub Kicinski * FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE
1283c9e13aSJakub Kicinski * OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME
1383c9e13aSJakub Kicinski * THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
1483c9e13aSJakub Kicinski */
1583c9e13aSJakub Kicinski
16424be63aSJakub Kicinski #include <linux/debugfs.h>
1779579220SJakub Kicinski #include <linux/device.h>
18a7fc6db0SAntonio Cardace #include <linux/ethtool.h>
19f394d07bSTaehee Yoo #include <linux/ethtool_netlink.h>
2083c9e13aSJakub Kicinski #include <linux/kernel.h>
2131d3ad83SJakub Kicinski #include <linux/list.h>
2283c9e13aSJakub Kicinski #include <linux/netdevice.h>
23b63e78fcSVladimir Oltean #include <linux/ptp_mock.h>
2483c9e13aSJakub Kicinski #include <linux/u64_stats_sync.h>
258320d145SJiri Pirko #include <net/devlink.h>
26dc9c0753SJakub Kicinski #include <net/udp_tunnel.h>
2705296620SJakub Kicinski #include <net/xdp.h>
2802b34d03SSabrina Dubroca #include <net/macsec.h>
2983c9e13aSJakub Kicinski
3083c9e13aSJakub Kicinski #define DRV_NAME "netdevsim"
3183c9e13aSJakub Kicinski
3231d3ad83SJakub Kicinski #define NSIM_XDP_MAX_MTU 4000
3331d3ad83SJakub Kicinski
3431d3ad83SJakub Kicinski #define NSIM_EA(extack, msg) NL_SET_ERR_MSG_MOD((extack), msg)
3531d3ad83SJakub Kicinski
367699353dSShannon Nelson #define NSIM_IPSEC_MAX_SA_COUNT 33
377699353dSShannon Nelson #define NSIM_IPSEC_VALID BIT(31)
38424be63aSJakub Kicinski #define NSIM_UDP_TUNNEL_N_PORTS 4
397699353dSShannon Nelson
40f394d07bSTaehee Yoo #define NSIM_HDS_THRESHOLD_MAX 1024
41f394d07bSTaehee Yoo
427699353dSShannon Nelson struct nsim_sa {
437699353dSShannon Nelson struct xfrm_state *xs;
447699353dSShannon Nelson __be32 ipaddr[4];
457699353dSShannon Nelson u32 key[4];
467699353dSShannon Nelson u32 salt;
477699353dSShannon Nelson bool used;
487699353dSShannon Nelson bool crypt;
497699353dSShannon Nelson bool rx;
507699353dSShannon Nelson };
517699353dSShannon Nelson
527699353dSShannon Nelson struct nsim_ipsec {
537699353dSShannon Nelson struct nsim_sa sa[NSIM_IPSEC_MAX_SA_COUNT];
547699353dSShannon Nelson struct dentry *pfile;
557699353dSShannon Nelson u32 count;
567699353dSShannon Nelson u32 tx;
577699353dSShannon Nelson };
587699353dSShannon Nelson
5902b34d03SSabrina Dubroca #define NSIM_MACSEC_MAX_SECY_COUNT 3
6002b34d03SSabrina Dubroca #define NSIM_MACSEC_MAX_RXSC_COUNT 1
6102b34d03SSabrina Dubroca struct nsim_rxsc {
6202b34d03SSabrina Dubroca sci_t sci;
6302b34d03SSabrina Dubroca bool used;
6402b34d03SSabrina Dubroca };
6502b34d03SSabrina Dubroca
6602b34d03SSabrina Dubroca struct nsim_secy {
6702b34d03SSabrina Dubroca sci_t sci;
6802b34d03SSabrina Dubroca struct nsim_rxsc nsim_rxsc[NSIM_MACSEC_MAX_RXSC_COUNT];
6902b34d03SSabrina Dubroca u8 nsim_rxsc_count;
7002b34d03SSabrina Dubroca bool used;
7102b34d03SSabrina Dubroca };
7202b34d03SSabrina Dubroca
7302b34d03SSabrina Dubroca struct nsim_macsec {
7402b34d03SSabrina Dubroca struct nsim_secy nsim_secy[NSIM_MACSEC_MAX_SECY_COUNT];
7502b34d03SSabrina Dubroca u8 nsim_secy_count;
7602b34d03SSabrina Dubroca };
7702b34d03SSabrina Dubroca
7877f9591bSAntonio Cardace struct nsim_ethtool_pauseparam {
79ff1f7c17SJakub Kicinski bool rx;
80ff1f7c17SJakub Kicinski bool tx;
81ff1f7c17SJakub Kicinski bool report_stats_rx;
82ff1f7c17SJakub Kicinski bool report_stats_tx;
83ff1f7c17SJakub Kicinski };
84ff1f7c17SJakub Kicinski
8577f9591bSAntonio Cardace struct nsim_ethtool {
860d7f76dcSJakub Kicinski u32 get_err;
870d7f76dcSJakub Kicinski u32 set_err;
882e367522SJakub Kicinski u32 channels;
8977f9591bSAntonio Cardace struct nsim_ethtool_pauseparam pauseparam;
90a7fc6db0SAntonio Cardace struct ethtool_coalesce coalesce;
91a7fc6db0SAntonio Cardace struct ethtool_ringparam ring;
920d7f76dcSJakub Kicinski struct ethtool_fecparam fec;
9377f9591bSAntonio Cardace };
9477f9591bSAntonio Cardace
953762ec05SDavid Wei struct nsim_rq {
963762ec05SDavid Wei struct napi_struct napi;
973762ec05SDavid Wei struct sk_buff_head skb_queue;
983762ec05SDavid Wei struct page_pool *page_pool;
99bf3624cfSBreno Leitao struct hrtimer napi_timer;
1003762ec05SDavid Wei };
1013762ec05SDavid Wei
10283c9e13aSJakub Kicinski struct netdevsim {
10331d3ad83SJakub Kicinski struct net_device *netdev;
104a60f9e48SJiri Pirko struct nsim_dev *nsim_dev;
105e05b2d14SJiri Pirko struct nsim_dev_port *nsim_dev_port;
106b63e78fcSVladimir Oltean struct mock_phc *phc;
107915c82f8SJakub Kicinski struct nsim_rq **rq;
10831d3ad83SJakub Kicinski
1095bc8e8dbSJakub Kicinski int rq_reset_mode;
1105bc8e8dbSJakub Kicinski
11183c9e13aSJakub Kicinski u64 tx_packets;
11283c9e13aSJakub Kicinski u64 tx_bytes;
1139eb95228SDavid Wei u64 tx_dropped;
11483c9e13aSJakub Kicinski struct u64_stats_sync syncp;
11531d3ad83SJakub Kicinski
11640e4fe4cSJiri Pirko struct nsim_bus_dev *nsim_bus_dev;
11779579220SJakub Kicinski
11831d3ad83SJakub Kicinski struct bpf_prog *bpf_offloaded;
11931d3ad83SJakub Kicinski u32 bpf_offloaded_id;
12031d3ad83SJakub Kicinski
12105296620SJakub Kicinski struct xdp_attachment_info xdp;
122799e173dSJakub Kicinski struct xdp_attachment_info xdp_hw;
12331d3ad83SJakub Kicinski
12431d3ad83SJakub Kicinski bool bpf_tc_accept;
12531d3ad83SJakub Kicinski bool bpf_tc_non_bound_accept;
12631d3ad83SJakub Kicinski bool bpf_xdpdrv_accept;
12731d3ad83SJakub Kicinski bool bpf_xdpoffload_accept;
128395cacb5SJakub Kicinski
129395cacb5SJakub Kicinski bool bpf_map_accept;
1307699353dSShannon Nelson struct nsim_ipsec ipsec;
13102b34d03SSabrina Dubroca struct nsim_macsec macsec;
132424be63aSJakub Kicinski struct {
133424be63aSJakub Kicinski u32 inject_error;
134424be63aSJakub Kicinski u32 sleep;
135dc9c0753SJakub Kicinski u32 __ports[2][NSIM_UDP_TUNNEL_N_PORTS];
136dc9c0753SJakub Kicinski u32 (*ports)[NSIM_UDP_TUNNEL_N_PORTS];
13750bf398eSJakub Kicinski struct dentry *ddir;
138424be63aSJakub Kicinski struct debugfs_u32_array dfs_ports[2];
139424be63aSJakub Kicinski } udp_ports;
140ff1f7c17SJakub Kicinski
1411580cbcbSJakub Kicinski struct page *page;
1421580cbcbSJakub Kicinski struct dentry *pp_dfs;
1436917d207SJakub Kicinski struct dentry *qr_dfs;
1441580cbcbSJakub Kicinski
145ff1f7c17SJakub Kicinski struct nsim_ethtool ethtool;
146f532957dSDavid Wei struct netdevsim __rcu *peer;
147*1901066aSStanislav Fomichev
148*1901066aSStanislav Fomichev struct notifier_block nb;
149*1901066aSStanislav Fomichev struct netdev_net_notifier nn;
15083c9e13aSJakub Kicinski };
15131d3ad83SJakub Kicinski
152e05b2d14SJiri Pirko struct netdevsim *
153e05b2d14SJiri Pirko nsim_create(struct nsim_dev *nsim_dev, struct nsim_dev_port *nsim_dev_port);
154e05b2d14SJiri Pirko void nsim_destroy(struct netdevsim *ns);
155f532957dSDavid Wei bool netdev_is_nsim(struct net_device *dev);
156e05b2d14SJiri Pirko
157ff1f7c17SJakub Kicinski void nsim_ethtool_init(struct netdevsim *ns);
158ff1f7c17SJakub Kicinski
159424be63aSJakub Kicinski void nsim_udp_tunnels_debugfs_create(struct nsim_dev *nsim_dev);
160424be63aSJakub Kicinski int nsim_udp_tunnels_info_create(struct nsim_dev *nsim_dev,
161424be63aSJakub Kicinski struct net_device *dev);
162424be63aSJakub Kicinski void nsim_udp_tunnels_info_destroy(struct net_device *dev);
163424be63aSJakub Kicinski
1647c5db7e7SJakub Kicinski #ifdef CONFIG_BPF_SYSCALL
165d514f41eSJiri Pirko int nsim_bpf_dev_init(struct nsim_dev *nsim_dev);
166d514f41eSJiri Pirko void nsim_bpf_dev_exit(struct nsim_dev *nsim_dev);
16731d3ad83SJakub Kicinski int nsim_bpf_init(struct netdevsim *ns);
16831d3ad83SJakub Kicinski void nsim_bpf_uninit(struct netdevsim *ns);
16931d3ad83SJakub Kicinski int nsim_bpf(struct net_device *dev, struct netdev_bpf *bpf);
17031d3ad83SJakub Kicinski int nsim_bpf_disable_tc(struct netdevsim *ns);
17131d3ad83SJakub Kicinski int nsim_bpf_setup_tc_block_cb(enum tc_setup_type type,
17231d3ad83SJakub Kicinski void *type_data, void *cb_priv);
1737c5db7e7SJakub Kicinski #else
174d514f41eSJiri Pirko
nsim_bpf_dev_init(struct nsim_dev * nsim_dev)175d514f41eSJiri Pirko static inline int nsim_bpf_dev_init(struct nsim_dev *nsim_dev)
176d514f41eSJiri Pirko {
177d514f41eSJiri Pirko return 0;
178d514f41eSJiri Pirko }
179d514f41eSJiri Pirko
nsim_bpf_dev_exit(struct nsim_dev * nsim_dev)180d514f41eSJiri Pirko static inline void nsim_bpf_dev_exit(struct nsim_dev *nsim_dev)
181d514f41eSJiri Pirko {
182d514f41eSJiri Pirko }
nsim_bpf_init(struct netdevsim * ns)1837c5db7e7SJakub Kicinski static inline int nsim_bpf_init(struct netdevsim *ns)
1847c5db7e7SJakub Kicinski {
1857c5db7e7SJakub Kicinski return 0;
1867c5db7e7SJakub Kicinski }
1877c5db7e7SJakub Kicinski
nsim_bpf_uninit(struct netdevsim * ns)1887c5db7e7SJakub Kicinski static inline void nsim_bpf_uninit(struct netdevsim *ns)
1897c5db7e7SJakub Kicinski {
1907c5db7e7SJakub Kicinski }
1917c5db7e7SJakub Kicinski
nsim_bpf(struct net_device * dev,struct netdev_bpf * bpf)1927c5db7e7SJakub Kicinski static inline int nsim_bpf(struct net_device *dev, struct netdev_bpf *bpf)
1937c5db7e7SJakub Kicinski {
194e8407fdeSAndrii Nakryiko return -EOPNOTSUPP;
1957c5db7e7SJakub Kicinski }
1967c5db7e7SJakub Kicinski
nsim_bpf_disable_tc(struct netdevsim * ns)1977c5db7e7SJakub Kicinski static inline int nsim_bpf_disable_tc(struct netdevsim *ns)
1987c5db7e7SJakub Kicinski {
1997c5db7e7SJakub Kicinski return 0;
2007c5db7e7SJakub Kicinski }
2017c5db7e7SJakub Kicinski
2027c5db7e7SJakub Kicinski static inline int
nsim_bpf_setup_tc_block_cb(enum tc_setup_type type,void * type_data,void * cb_priv)2037c5db7e7SJakub Kicinski nsim_bpf_setup_tc_block_cb(enum tc_setup_type type, void *type_data,
2047c5db7e7SJakub Kicinski void *cb_priv)
2057c5db7e7SJakub Kicinski {
2067c5db7e7SJakub Kicinski return -EOPNOTSUPP;
2077c5db7e7SJakub Kicinski }
2087c5db7e7SJakub Kicinski #endif
20979579220SJakub Kicinski
21037923ed6SDavid Ahern enum nsim_resource_id {
21137923ed6SDavid Ahern NSIM_RESOURCE_NONE, /* DEVLINK_RESOURCE_ID_PARENT_TOP */
21237923ed6SDavid Ahern NSIM_RESOURCE_IPV4,
21337923ed6SDavid Ahern NSIM_RESOURCE_IPV4_FIB,
21437923ed6SDavid Ahern NSIM_RESOURCE_IPV4_FIB_RULES,
21537923ed6SDavid Ahern NSIM_RESOURCE_IPV6,
21637923ed6SDavid Ahern NSIM_RESOURCE_IPV6_FIB,
21737923ed6SDavid Ahern NSIM_RESOURCE_IPV6_FIB_RULES,
21835266255SIdo Schimmel NSIM_RESOURCE_NEXTHOPS,
21937923ed6SDavid Ahern };
22037923ed6SDavid Ahern
22182c93a87SJiri Pirko struct nsim_dev_health {
22282c93a87SJiri Pirko struct devlink_health_reporter *empty_reporter;
22382c93a87SJiri Pirko struct devlink_health_reporter *dummy_reporter;
22482c93a87SJiri Pirko struct dentry *ddir;
22582c93a87SJiri Pirko char *recovered_break_msg;
22682c93a87SJiri Pirko u32 binary_len;
22782c93a87SJiri Pirko bool fail_recover;
22882c93a87SJiri Pirko };
22982c93a87SJiri Pirko
23082c93a87SJiri Pirko int nsim_dev_health_init(struct nsim_dev *nsim_dev, struct devlink *devlink);
23182c93a87SJiri Pirko void nsim_dev_health_exit(struct nsim_dev *nsim_dev);
23282c93a87SJiri Pirko
2331a6d7ae7SPetr Machata struct nsim_dev_hwstats_netdev {
2341a6d7ae7SPetr Machata struct list_head list;
2351a6d7ae7SPetr Machata struct net_device *netdev;
2361a6d7ae7SPetr Machata struct rtnl_hw_stats64 stats;
2371a6d7ae7SPetr Machata bool enabled;
2381a6d7ae7SPetr Machata bool fail_enable;
2391a6d7ae7SPetr Machata };
2401a6d7ae7SPetr Machata
2411a6d7ae7SPetr Machata struct nsim_dev_hwstats {
2421a6d7ae7SPetr Machata struct dentry *ddir;
2431a6d7ae7SPetr Machata struct dentry *l3_ddir;
2441a6d7ae7SPetr Machata
2451a6d7ae7SPetr Machata struct mutex hwsdev_list_lock; /* protects hwsdev list(s) */
2461a6d7ae7SPetr Machata struct list_head l3_list;
2471a6d7ae7SPetr Machata
2481a6d7ae7SPetr Machata struct notifier_block netdevice_nb;
2491a6d7ae7SPetr Machata struct delayed_work traffic_dw;
2501a6d7ae7SPetr Machata };
2511a6d7ae7SPetr Machata
2521a6d7ae7SPetr Machata int nsim_dev_hwstats_init(struct nsim_dev *nsim_dev);
2531a6d7ae7SPetr Machata void nsim_dev_hwstats_exit(struct nsim_dev *nsim_dev);
2541a6d7ae7SPetr Machata
255a8700c3dSIdo Schimmel #if IS_ENABLED(CONFIG_PSAMPLE)
256a8700c3dSIdo Schimmel int nsim_dev_psample_init(struct nsim_dev *nsim_dev);
257a8700c3dSIdo Schimmel void nsim_dev_psample_exit(struct nsim_dev *nsim_dev);
258a8700c3dSIdo Schimmel #else
nsim_dev_psample_init(struct nsim_dev * nsim_dev)259a8700c3dSIdo Schimmel static inline int nsim_dev_psample_init(struct nsim_dev *nsim_dev)
260a8700c3dSIdo Schimmel {
261a8700c3dSIdo Schimmel return 0;
262a8700c3dSIdo Schimmel }
263a8700c3dSIdo Schimmel
nsim_dev_psample_exit(struct nsim_dev * nsim_dev)264a8700c3dSIdo Schimmel static inline void nsim_dev_psample_exit(struct nsim_dev *nsim_dev)
265a8700c3dSIdo Schimmel {
266a8700c3dSIdo Schimmel }
267a8700c3dSIdo Schimmel #endif
268a8700c3dSIdo Schimmel
269814b9ce6SDmytro Linkin enum nsim_dev_port_type {
270814b9ce6SDmytro Linkin NSIM_DEV_PORT_TYPE_PF,
271814b9ce6SDmytro Linkin NSIM_DEV_PORT_TYPE_VF,
272814b9ce6SDmytro Linkin };
273814b9ce6SDmytro Linkin
274814b9ce6SDmytro Linkin #define NSIM_DEV_VF_PORT_INDEX_BASE 128
275814b9ce6SDmytro Linkin #define NSIM_DEV_VF_PORT_INDEX_MAX UINT_MAX
276814b9ce6SDmytro Linkin
2778320d145SJiri Pirko struct nsim_dev_port {
2788320d145SJiri Pirko struct list_head list;
2798320d145SJiri Pirko struct devlink_port devlink_port;
2808320d145SJiri Pirko unsigned int port_index;
281814b9ce6SDmytro Linkin enum nsim_dev_port_type port_type;
2828320d145SJiri Pirko struct dentry *ddir;
283f3d101b4SDmytro Linkin struct dentry *rate_parent;
284f3d101b4SDmytro Linkin char *parent_name;
285e05b2d14SJiri Pirko struct netdevsim *ns;
2868320d145SJiri Pirko };
2878320d145SJiri Pirko
2885e388f3dSJakub Kicinski struct nsim_vf_config {
2895e388f3dSJakub Kicinski int link_state;
2905e388f3dSJakub Kicinski u16 min_tx_rate;
2915e388f3dSJakub Kicinski u16 max_tx_rate;
2925e388f3dSJakub Kicinski u16 vlan;
2935e388f3dSJakub Kicinski __be16 vlan_proto;
2945e388f3dSJakub Kicinski u16 qos;
2955e388f3dSJakub Kicinski u8 vf_mac[ETH_ALEN];
2965e388f3dSJakub Kicinski bool spoofchk_enabled;
2975e388f3dSJakub Kicinski bool trusted;
2985e388f3dSJakub Kicinski bool rss_query_enabled;
2995e388f3dSJakub Kicinski };
3005e388f3dSJakub Kicinski
301a60f9e48SJiri Pirko struct nsim_dev {
302d514f41eSJiri Pirko struct nsim_bus_dev *nsim_bus_dev;
303a60f9e48SJiri Pirko struct nsim_fib_data *fib_data;
304da58f90fSIdo Schimmel struct nsim_trap_data *trap_data;
305d514f41eSJiri Pirko struct dentry *ddir;
306ab1d0cc0SJiri Pirko struct dentry *ports_ddir;
3078526ad96STaehee Yoo struct dentry *take_snapshot;
308885226f5SDmytro Linkin struct dentry *nodes_ddir;
3095e388f3dSJakub Kicinski
3105e388f3dSJakub Kicinski struct nsim_vf_config *vfconfigs;
3115e388f3dSJakub Kicinski
312d514f41eSJiri Pirko struct bpf_offload_dev *bpf_dev;
313d514f41eSJiri Pirko bool bpf_bind_accept;
314e4ff5aa4SToke Høiland-Jørgensen bool bpf_bind_verifier_accept;
315d514f41eSJiri Pirko u32 bpf_bind_verifier_delay;
316d514f41eSJiri Pirko struct dentry *ddir_bpf_bound_progs;
317d514f41eSJiri Pirko u32 prog_id_gen;
318d514f41eSJiri Pirko struct list_head bpf_bound_progs;
319d514f41eSJiri Pirko struct list_head bpf_bound_maps;
320514cf64cSJiri Pirko struct netdev_phys_item_id switch_id;
3218320d145SJiri Pirko struct list_head port_list;
322fa4dfc4aSJiri Pirko bool fw_update_status;
323cbb58368SJacob Keller u32 fw_update_overwrite_mask;
324150e8f8aSJiri Pirko u32 max_macs;
325150e8f8aSJiri Pirko bool test1;
326155ddfc5SJiri Pirko bool dont_allow_reload;
327155ddfc5SJiri Pirko bool fail_reload;
3284418f862SJiri Pirko struct devlink_region *dummy_region;
32982c93a87SJiri Pirko struct nsim_dev_health health;
3301a6d7ae7SPetr Machata struct nsim_dev_hwstats hwstats;
331d3cbb907SJiri Pirko struct flow_action_cookie *fa_cookie;
332d3cbb907SJiri Pirko spinlock_t fa_cookie_lock; /* protects fa_cookie */
3330dc8249aSIdo Schimmel bool fail_trap_group_set;
334ad188458SIdo Schimmel bool fail_trap_policer_set;
335ad188458SIdo Schimmel bool fail_trap_policer_counter_get;
336275b51c2SOleksandr Mazur bool fail_trap_drop_counter_get;
337424be63aSJakub Kicinski struct {
338dc9c0753SJakub Kicinski struct udp_tunnel_nic_shared utn_shared;
339dc9c0753SJakub Kicinski u32 __ports[2][NSIM_UDP_TUNNEL_N_PORTS];
340424be63aSJakub Kicinski bool sync_all;
341424be63aSJakub Kicinski bool open_only;
342424be63aSJakub Kicinski bool ipv4_only;
343dc9c0753SJakub Kicinski bool shared;
344dda75173SJakub Kicinski bool static_iana_vxlan;
345424be63aSJakub Kicinski u32 sleep;
346424be63aSJakub Kicinski } udp_ports;
347a8700c3dSIdo Schimmel struct nsim_dev_psample *psample;
348160dc373SDmytro Linkin u16 esw_mode;
349a60f9e48SJiri Pirko };
350a60f9e48SJiri Pirko
nsim_esw_mode_is_legacy(struct nsim_dev * nsim_dev)351160dc373SDmytro Linkin static inline bool nsim_esw_mode_is_legacy(struct nsim_dev *nsim_dev)
352160dc373SDmytro Linkin {
353160dc373SDmytro Linkin return nsim_dev->esw_mode == DEVLINK_ESWITCH_MODE_LEGACY;
354160dc373SDmytro Linkin }
355160dc373SDmytro Linkin
nsim_esw_mode_is_switchdev(struct nsim_dev * nsim_dev)356160dc373SDmytro Linkin static inline bool nsim_esw_mode_is_switchdev(struct nsim_dev *nsim_dev)
357160dc373SDmytro Linkin {
358160dc373SDmytro Linkin return nsim_dev->esw_mode == DEVLINK_ESWITCH_MODE_SWITCHDEV;
359160dc373SDmytro Linkin }
360160dc373SDmytro Linkin
nsim_dev_net(struct nsim_dev * nsim_dev)36190d29913SJiri Pirko static inline struct net *nsim_dev_net(struct nsim_dev *nsim_dev)
36290d29913SJiri Pirko {
36390d29913SJiri Pirko return devlink_net(priv_to_devlink(nsim_dev));
36490d29913SJiri Pirko }
36590d29913SJiri Pirko
366d514f41eSJiri Pirko int nsim_dev_init(void);
367d514f41eSJiri Pirko void nsim_dev_exit(void);
368a66f64b8SJakub Kicinski int nsim_drv_probe(struct nsim_bus_dev *nsim_bus_dev);
369a66f64b8SJakub Kicinski void nsim_drv_remove(struct nsim_bus_dev *nsim_bus_dev);
370a66f64b8SJakub Kicinski int nsim_drv_port_add(struct nsim_bus_dev *nsim_bus_dev,
371814b9ce6SDmytro Linkin enum nsim_dev_port_type type,
372794b2c05SJiri Pirko unsigned int port_index);
373a66f64b8SJakub Kicinski int nsim_drv_port_del(struct nsim_bus_dev *nsim_bus_dev,
374814b9ce6SDmytro Linkin enum nsim_dev_port_type type,
375794b2c05SJiri Pirko unsigned int port_index);
3761c401078SJakub Kicinski int nsim_drv_configure_vfs(struct nsim_bus_dev *nsim_bus_dev,
3771c401078SJakub Kicinski unsigned int num_vfs);
37837923ed6SDavid Ahern
3795e388f3dSJakub Kicinski unsigned int nsim_dev_get_vfs(struct nsim_dev *nsim_dev);
3805e388f3dSJakub Kicinski
38175ba029fSJiri Pirko struct nsim_fib_data *nsim_fib_create(struct devlink *devlink,
38275ba029fSJiri Pirko struct netlink_ext_ack *extack);
38375ba029fSJiri Pirko void nsim_fib_destroy(struct devlink *devlink, struct nsim_fib_data *fib_data);
384a5facc4cSJiri Pirko u64 nsim_fib_get_val(struct nsim_fib_data *fib_data,
385a5facc4cSJiri Pirko enum nsim_resource_id res_id, bool max);
38637923ed6SDavid Ahern
nsim_dev_port_is_pf(struct nsim_dev_port * nsim_dev_port)387814b9ce6SDmytro Linkin static inline bool nsim_dev_port_is_pf(struct nsim_dev_port *nsim_dev_port)
388814b9ce6SDmytro Linkin {
389814b9ce6SDmytro Linkin return nsim_dev_port->port_type == NSIM_DEV_PORT_TYPE_PF;
390814b9ce6SDmytro Linkin }
391814b9ce6SDmytro Linkin
nsim_dev_port_is_vf(struct nsim_dev_port * nsim_dev_port)392814b9ce6SDmytro Linkin static inline bool nsim_dev_port_is_vf(struct nsim_dev_port *nsim_dev_port)
393814b9ce6SDmytro Linkin {
394814b9ce6SDmytro Linkin return nsim_dev_port->port_type == NSIM_DEV_PORT_TYPE_VF;
395814b9ce6SDmytro Linkin }
3967699353dSShannon Nelson #if IS_ENABLED(CONFIG_XFRM_OFFLOAD)
3977699353dSShannon Nelson void nsim_ipsec_init(struct netdevsim *ns);
3987699353dSShannon Nelson void nsim_ipsec_teardown(struct netdevsim *ns);
3997699353dSShannon Nelson bool nsim_ipsec_tx(struct netdevsim *ns, struct sk_buff *skb);
4007699353dSShannon Nelson #else
nsim_ipsec_init(struct netdevsim * ns)4017699353dSShannon Nelson static inline void nsim_ipsec_init(struct netdevsim *ns)
4027699353dSShannon Nelson {
4037699353dSShannon Nelson }
4047699353dSShannon Nelson
nsim_ipsec_teardown(struct netdevsim * ns)4057699353dSShannon Nelson static inline void nsim_ipsec_teardown(struct netdevsim *ns)
4067699353dSShannon Nelson {
4077699353dSShannon Nelson }
4087699353dSShannon Nelson
nsim_ipsec_tx(struct netdevsim * ns,struct sk_buff * skb)4097699353dSShannon Nelson static inline bool nsim_ipsec_tx(struct netdevsim *ns, struct sk_buff *skb)
4107699353dSShannon Nelson {
4117699353dSShannon Nelson return true;
4127699353dSShannon Nelson }
4137699353dSShannon Nelson #endif
4147699353dSShannon Nelson
41502b34d03SSabrina Dubroca #if IS_ENABLED(CONFIG_MACSEC)
41602b34d03SSabrina Dubroca void nsim_macsec_init(struct netdevsim *ns);
41702b34d03SSabrina Dubroca void nsim_macsec_teardown(struct netdevsim *ns);
41802b34d03SSabrina Dubroca #else
nsim_macsec_init(struct netdevsim * ns)41902b34d03SSabrina Dubroca static inline void nsim_macsec_init(struct netdevsim *ns)
42002b34d03SSabrina Dubroca {
42102b34d03SSabrina Dubroca }
42202b34d03SSabrina Dubroca
nsim_macsec_teardown(struct netdevsim * ns)42302b34d03SSabrina Dubroca static inline void nsim_macsec_teardown(struct netdevsim *ns)
42402b34d03SSabrina Dubroca {
42502b34d03SSabrina Dubroca }
42602b34d03SSabrina Dubroca #endif
42702b34d03SSabrina Dubroca
42840e4fe4cSJiri Pirko struct nsim_bus_dev {
42940e4fe4cSJiri Pirko struct device dev;
430f9d9db47SJiri Pirko struct list_head list;
431f9d9db47SJiri Pirko unsigned int port_count;
432d4861fc6SPeilin Ye unsigned int num_queues; /* Number of queues for each port on this bus */
4337b60027bSJiri Pirko struct net *initial_net; /* Purpose of this is to carry net pointer
4347b60027bSJiri Pirko * during the probe time only.
4357b60027bSJiri Pirko */
436d3953819SDmytro Linkin unsigned int max_vfs;
43740e4fe4cSJiri Pirko unsigned int num_vfs;
438f5cd2160STaehee Yoo bool init;
43940e4fe4cSJiri Pirko };
440925f5afeSJiri Pirko
441925f5afeSJiri Pirko int nsim_bus_init(void);
442925f5afeSJiri Pirko void nsim_bus_exit(void);
443