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> 1983c9e13aSJakub Kicinski #include <linux/kernel.h> 2031d3ad83SJakub Kicinski #include <linux/list.h> 2183c9e13aSJakub Kicinski #include <linux/netdevice.h> 2283c9e13aSJakub Kicinski #include <linux/u64_stats_sync.h> 238320d145SJiri Pirko #include <net/devlink.h> 24dc9c0753SJakub Kicinski #include <net/udp_tunnel.h> 2505296620SJakub Kicinski #include <net/xdp.h> 2683c9e13aSJakub Kicinski 2783c9e13aSJakub Kicinski #define DRV_NAME "netdevsim" 2883c9e13aSJakub Kicinski 2931d3ad83SJakub Kicinski #define NSIM_XDP_MAX_MTU 4000 3031d3ad83SJakub Kicinski 3131d3ad83SJakub Kicinski #define NSIM_EA(extack, msg) NL_SET_ERR_MSG_MOD((extack), msg) 3231d3ad83SJakub Kicinski 337699353dSShannon Nelson #define NSIM_IPSEC_MAX_SA_COUNT 33 347699353dSShannon Nelson #define NSIM_IPSEC_VALID BIT(31) 35424be63aSJakub Kicinski #define NSIM_UDP_TUNNEL_N_PORTS 4 367699353dSShannon Nelson 377699353dSShannon Nelson struct nsim_sa { 387699353dSShannon Nelson struct xfrm_state *xs; 397699353dSShannon Nelson __be32 ipaddr[4]; 407699353dSShannon Nelson u32 key[4]; 417699353dSShannon Nelson u32 salt; 427699353dSShannon Nelson bool used; 437699353dSShannon Nelson bool crypt; 447699353dSShannon Nelson bool rx; 457699353dSShannon Nelson }; 467699353dSShannon Nelson 477699353dSShannon Nelson struct nsim_ipsec { 487699353dSShannon Nelson struct nsim_sa sa[NSIM_IPSEC_MAX_SA_COUNT]; 497699353dSShannon Nelson struct dentry *pfile; 507699353dSShannon Nelson u32 count; 517699353dSShannon Nelson u32 tx; 527699353dSShannon Nelson u32 ok; 537699353dSShannon Nelson }; 547699353dSShannon Nelson 5577f9591bSAntonio Cardace struct nsim_ethtool_pauseparam { 56ff1f7c17SJakub Kicinski bool rx; 57ff1f7c17SJakub Kicinski bool tx; 58ff1f7c17SJakub Kicinski bool report_stats_rx; 59ff1f7c17SJakub Kicinski bool report_stats_tx; 60ff1f7c17SJakub Kicinski }; 61ff1f7c17SJakub Kicinski 6277f9591bSAntonio Cardace struct nsim_ethtool { 630d7f76dcSJakub Kicinski u32 get_err; 640d7f76dcSJakub Kicinski u32 set_err; 6577f9591bSAntonio Cardace struct nsim_ethtool_pauseparam pauseparam; 66a7fc6db0SAntonio Cardace struct ethtool_coalesce coalesce; 67a7fc6db0SAntonio Cardace struct ethtool_ringparam ring; 680d7f76dcSJakub Kicinski struct ethtool_fecparam fec; 6977f9591bSAntonio Cardace }; 7077f9591bSAntonio Cardace 7183c9e13aSJakub Kicinski struct netdevsim { 7231d3ad83SJakub Kicinski struct net_device *netdev; 73a60f9e48SJiri Pirko struct nsim_dev *nsim_dev; 74e05b2d14SJiri Pirko struct nsim_dev_port *nsim_dev_port; 7531d3ad83SJakub Kicinski 7683c9e13aSJakub Kicinski u64 tx_packets; 7783c9e13aSJakub Kicinski u64 tx_bytes; 7883c9e13aSJakub Kicinski struct u64_stats_sync syncp; 7931d3ad83SJakub Kicinski 8040e4fe4cSJiri Pirko struct nsim_bus_dev *nsim_bus_dev; 8179579220SJakub Kicinski 8231d3ad83SJakub Kicinski struct bpf_prog *bpf_offloaded; 8331d3ad83SJakub Kicinski u32 bpf_offloaded_id; 8431d3ad83SJakub Kicinski 8505296620SJakub Kicinski struct xdp_attachment_info xdp; 86799e173dSJakub Kicinski struct xdp_attachment_info xdp_hw; 8731d3ad83SJakub Kicinski 8831d3ad83SJakub Kicinski bool bpf_tc_accept; 8931d3ad83SJakub Kicinski bool bpf_tc_non_bound_accept; 9031d3ad83SJakub Kicinski bool bpf_xdpdrv_accept; 9131d3ad83SJakub Kicinski bool bpf_xdpoffload_accept; 92395cacb5SJakub Kicinski 93395cacb5SJakub Kicinski bool bpf_map_accept; 947699353dSShannon Nelson struct nsim_ipsec ipsec; 95424be63aSJakub Kicinski struct { 96424be63aSJakub Kicinski u32 inject_error; 97424be63aSJakub Kicinski u32 sleep; 98dc9c0753SJakub Kicinski u32 __ports[2][NSIM_UDP_TUNNEL_N_PORTS]; 99dc9c0753SJakub Kicinski u32 (*ports)[NSIM_UDP_TUNNEL_N_PORTS]; 100424be63aSJakub Kicinski struct debugfs_u32_array dfs_ports[2]; 101424be63aSJakub Kicinski } udp_ports; 102ff1f7c17SJakub Kicinski 103ff1f7c17SJakub Kicinski struct nsim_ethtool ethtool; 10483c9e13aSJakub Kicinski }; 10531d3ad83SJakub Kicinski 106e05b2d14SJiri Pirko struct netdevsim * 107e05b2d14SJiri Pirko nsim_create(struct nsim_dev *nsim_dev, struct nsim_dev_port *nsim_dev_port); 108e05b2d14SJiri Pirko void nsim_destroy(struct netdevsim *ns); 109e05b2d14SJiri Pirko 110ff1f7c17SJakub Kicinski void nsim_ethtool_init(struct netdevsim *ns); 111ff1f7c17SJakub Kicinski 112424be63aSJakub Kicinski void nsim_udp_tunnels_debugfs_create(struct nsim_dev *nsim_dev); 113424be63aSJakub Kicinski int nsim_udp_tunnels_info_create(struct nsim_dev *nsim_dev, 114424be63aSJakub Kicinski struct net_device *dev); 115424be63aSJakub Kicinski void nsim_udp_tunnels_info_destroy(struct net_device *dev); 116424be63aSJakub Kicinski 1177c5db7e7SJakub Kicinski #ifdef CONFIG_BPF_SYSCALL 118d514f41eSJiri Pirko int nsim_bpf_dev_init(struct nsim_dev *nsim_dev); 119d514f41eSJiri Pirko void nsim_bpf_dev_exit(struct nsim_dev *nsim_dev); 12031d3ad83SJakub Kicinski int nsim_bpf_init(struct netdevsim *ns); 12131d3ad83SJakub Kicinski void nsim_bpf_uninit(struct netdevsim *ns); 12231d3ad83SJakub Kicinski int nsim_bpf(struct net_device *dev, struct netdev_bpf *bpf); 12331d3ad83SJakub Kicinski int nsim_bpf_disable_tc(struct netdevsim *ns); 12431d3ad83SJakub Kicinski int nsim_bpf_setup_tc_block_cb(enum tc_setup_type type, 12531d3ad83SJakub Kicinski void *type_data, void *cb_priv); 1267c5db7e7SJakub Kicinski #else 127d514f41eSJiri Pirko 128d514f41eSJiri Pirko static inline int nsim_bpf_dev_init(struct nsim_dev *nsim_dev) 129d514f41eSJiri Pirko { 130d514f41eSJiri Pirko return 0; 131d514f41eSJiri Pirko } 132d514f41eSJiri Pirko 133d514f41eSJiri Pirko static inline void nsim_bpf_dev_exit(struct nsim_dev *nsim_dev) 134d514f41eSJiri Pirko { 135d514f41eSJiri Pirko } 1367c5db7e7SJakub Kicinski static inline int nsim_bpf_init(struct netdevsim *ns) 1377c5db7e7SJakub Kicinski { 1387c5db7e7SJakub Kicinski return 0; 1397c5db7e7SJakub Kicinski } 1407c5db7e7SJakub Kicinski 1417c5db7e7SJakub Kicinski static inline void nsim_bpf_uninit(struct netdevsim *ns) 1427c5db7e7SJakub Kicinski { 1437c5db7e7SJakub Kicinski } 1447c5db7e7SJakub Kicinski 1457c5db7e7SJakub Kicinski static inline int nsim_bpf(struct net_device *dev, struct netdev_bpf *bpf) 1467c5db7e7SJakub Kicinski { 147e8407fdeSAndrii Nakryiko return -EOPNOTSUPP; 1487c5db7e7SJakub Kicinski } 1497c5db7e7SJakub Kicinski 1507c5db7e7SJakub Kicinski static inline int nsim_bpf_disable_tc(struct netdevsim *ns) 1517c5db7e7SJakub Kicinski { 1527c5db7e7SJakub Kicinski return 0; 1537c5db7e7SJakub Kicinski } 1547c5db7e7SJakub Kicinski 1557c5db7e7SJakub Kicinski static inline int 1567c5db7e7SJakub Kicinski nsim_bpf_setup_tc_block_cb(enum tc_setup_type type, void *type_data, 1577c5db7e7SJakub Kicinski void *cb_priv) 1587c5db7e7SJakub Kicinski { 1597c5db7e7SJakub Kicinski return -EOPNOTSUPP; 1607c5db7e7SJakub Kicinski } 1617c5db7e7SJakub Kicinski #endif 16279579220SJakub Kicinski 16337923ed6SDavid Ahern enum nsim_resource_id { 16437923ed6SDavid Ahern NSIM_RESOURCE_NONE, /* DEVLINK_RESOURCE_ID_PARENT_TOP */ 16537923ed6SDavid Ahern NSIM_RESOURCE_IPV4, 16637923ed6SDavid Ahern NSIM_RESOURCE_IPV4_FIB, 16737923ed6SDavid Ahern NSIM_RESOURCE_IPV4_FIB_RULES, 16837923ed6SDavid Ahern NSIM_RESOURCE_IPV6, 16937923ed6SDavid Ahern NSIM_RESOURCE_IPV6_FIB, 17037923ed6SDavid Ahern NSIM_RESOURCE_IPV6_FIB_RULES, 17135266255SIdo Schimmel NSIM_RESOURCE_NEXTHOPS, 17237923ed6SDavid Ahern }; 17337923ed6SDavid Ahern 17482c93a87SJiri Pirko struct nsim_dev_health { 17582c93a87SJiri Pirko struct devlink_health_reporter *empty_reporter; 17682c93a87SJiri Pirko struct devlink_health_reporter *dummy_reporter; 17782c93a87SJiri Pirko struct dentry *ddir; 17882c93a87SJiri Pirko char *recovered_break_msg; 17982c93a87SJiri Pirko u32 binary_len; 18082c93a87SJiri Pirko bool fail_recover; 18182c93a87SJiri Pirko }; 18282c93a87SJiri Pirko 18382c93a87SJiri Pirko int nsim_dev_health_init(struct nsim_dev *nsim_dev, struct devlink *devlink); 18482c93a87SJiri Pirko void nsim_dev_health_exit(struct nsim_dev *nsim_dev); 18582c93a87SJiri Pirko 186a8700c3dSIdo Schimmel #if IS_ENABLED(CONFIG_PSAMPLE) 187a8700c3dSIdo Schimmel int nsim_dev_psample_init(struct nsim_dev *nsim_dev); 188a8700c3dSIdo Schimmel void nsim_dev_psample_exit(struct nsim_dev *nsim_dev); 189a8700c3dSIdo Schimmel #else 190a8700c3dSIdo Schimmel static inline int nsim_dev_psample_init(struct nsim_dev *nsim_dev) 191a8700c3dSIdo Schimmel { 192a8700c3dSIdo Schimmel return 0; 193a8700c3dSIdo Schimmel } 194a8700c3dSIdo Schimmel 195a8700c3dSIdo Schimmel static inline void nsim_dev_psample_exit(struct nsim_dev *nsim_dev) 196a8700c3dSIdo Schimmel { 197a8700c3dSIdo Schimmel } 198a8700c3dSIdo Schimmel #endif 199a8700c3dSIdo Schimmel 200814b9ce6SDmytro Linkin enum nsim_dev_port_type { 201814b9ce6SDmytro Linkin NSIM_DEV_PORT_TYPE_PF, 202814b9ce6SDmytro Linkin NSIM_DEV_PORT_TYPE_VF, 203814b9ce6SDmytro Linkin }; 204814b9ce6SDmytro Linkin 205814b9ce6SDmytro Linkin #define NSIM_DEV_VF_PORT_INDEX_BASE 128 206814b9ce6SDmytro Linkin #define NSIM_DEV_VF_PORT_INDEX_MAX UINT_MAX 207814b9ce6SDmytro Linkin 2088320d145SJiri Pirko struct nsim_dev_port { 2098320d145SJiri Pirko struct list_head list; 2108320d145SJiri Pirko struct devlink_port devlink_port; 2118320d145SJiri Pirko unsigned int port_index; 212814b9ce6SDmytro Linkin enum nsim_dev_port_type port_type; 2138320d145SJiri Pirko struct dentry *ddir; 214*f3d101b4SDmytro Linkin struct dentry *rate_parent; 215*f3d101b4SDmytro Linkin char *parent_name; 216e05b2d14SJiri Pirko struct netdevsim *ns; 2178320d145SJiri Pirko }; 2188320d145SJiri Pirko 219a60f9e48SJiri Pirko struct nsim_dev { 220d514f41eSJiri Pirko struct nsim_bus_dev *nsim_bus_dev; 221a60f9e48SJiri Pirko struct nsim_fib_data *fib_data; 222da58f90fSIdo Schimmel struct nsim_trap_data *trap_data; 223d514f41eSJiri Pirko struct dentry *ddir; 224ab1d0cc0SJiri Pirko struct dentry *ports_ddir; 2258526ad96STaehee Yoo struct dentry *take_snapshot; 226d3953819SDmytro Linkin struct dentry *max_vfs; 227885226f5SDmytro Linkin struct dentry *nodes_ddir; 228d514f41eSJiri Pirko struct bpf_offload_dev *bpf_dev; 229d514f41eSJiri Pirko bool bpf_bind_accept; 230e4ff5aa4SToke Høiland-Jørgensen bool bpf_bind_verifier_accept; 231d514f41eSJiri Pirko u32 bpf_bind_verifier_delay; 232d514f41eSJiri Pirko struct dentry *ddir_bpf_bound_progs; 233d514f41eSJiri Pirko u32 prog_id_gen; 234d514f41eSJiri Pirko struct list_head bpf_bound_progs; 235d514f41eSJiri Pirko struct list_head bpf_bound_maps; 236514cf64cSJiri Pirko struct netdev_phys_item_id switch_id; 2378320d145SJiri Pirko struct list_head port_list; 238794b2c05SJiri Pirko struct mutex port_list_lock; /* protects port list */ 239fa4dfc4aSJiri Pirko bool fw_update_status; 240cbb58368SJacob Keller u32 fw_update_overwrite_mask; 241150e8f8aSJiri Pirko u32 max_macs; 242150e8f8aSJiri Pirko bool test1; 243155ddfc5SJiri Pirko bool dont_allow_reload; 244155ddfc5SJiri Pirko bool fail_reload; 2454418f862SJiri Pirko struct devlink_region *dummy_region; 24682c93a87SJiri Pirko struct nsim_dev_health health; 247d3cbb907SJiri Pirko struct flow_action_cookie *fa_cookie; 248d3cbb907SJiri Pirko spinlock_t fa_cookie_lock; /* protects fa_cookie */ 2490dc8249aSIdo Schimmel bool fail_trap_group_set; 250ad188458SIdo Schimmel bool fail_trap_policer_set; 251ad188458SIdo Schimmel bool fail_trap_policer_counter_get; 252424be63aSJakub Kicinski struct { 253dc9c0753SJakub Kicinski struct udp_tunnel_nic_shared utn_shared; 254dc9c0753SJakub Kicinski u32 __ports[2][NSIM_UDP_TUNNEL_N_PORTS]; 255424be63aSJakub Kicinski bool sync_all; 256424be63aSJakub Kicinski bool open_only; 257424be63aSJakub Kicinski bool ipv4_only; 258dc9c0753SJakub Kicinski bool shared; 259dda75173SJakub Kicinski bool static_iana_vxlan; 260424be63aSJakub Kicinski u32 sleep; 261424be63aSJakub Kicinski } udp_ports; 262a8700c3dSIdo Schimmel struct nsim_dev_psample *psample; 263160dc373SDmytro Linkin u16 esw_mode; 264a60f9e48SJiri Pirko }; 265a60f9e48SJiri Pirko 266160dc373SDmytro Linkin int nsim_esw_legacy_enable(struct nsim_dev *nsim_dev, struct netlink_ext_ack *extack); 267160dc373SDmytro Linkin int nsim_esw_switchdev_enable(struct nsim_dev *nsim_dev, struct netlink_ext_ack *extack); 268160dc373SDmytro Linkin 269160dc373SDmytro Linkin static inline bool nsim_esw_mode_is_legacy(struct nsim_dev *nsim_dev) 270160dc373SDmytro Linkin { 271160dc373SDmytro Linkin return nsim_dev->esw_mode == DEVLINK_ESWITCH_MODE_LEGACY; 272160dc373SDmytro Linkin } 273160dc373SDmytro Linkin 274160dc373SDmytro Linkin static inline bool nsim_esw_mode_is_switchdev(struct nsim_dev *nsim_dev) 275160dc373SDmytro Linkin { 276160dc373SDmytro Linkin return nsim_dev->esw_mode == DEVLINK_ESWITCH_MODE_SWITCHDEV; 277160dc373SDmytro Linkin } 278160dc373SDmytro Linkin 27990d29913SJiri Pirko static inline struct net *nsim_dev_net(struct nsim_dev *nsim_dev) 28090d29913SJiri Pirko { 28190d29913SJiri Pirko return devlink_net(priv_to_devlink(nsim_dev)); 28290d29913SJiri Pirko } 28390d29913SJiri Pirko 284d514f41eSJiri Pirko int nsim_dev_init(void); 285d514f41eSJiri Pirko void nsim_dev_exit(void); 2868320d145SJiri Pirko int nsim_dev_probe(struct nsim_bus_dev *nsim_bus_dev); 2878320d145SJiri Pirko void nsim_dev_remove(struct nsim_bus_dev *nsim_bus_dev); 288794b2c05SJiri Pirko int nsim_dev_port_add(struct nsim_bus_dev *nsim_bus_dev, 289814b9ce6SDmytro Linkin enum nsim_dev_port_type type, 290794b2c05SJiri Pirko unsigned int port_index); 291794b2c05SJiri Pirko int nsim_dev_port_del(struct nsim_bus_dev *nsim_bus_dev, 292814b9ce6SDmytro Linkin enum nsim_dev_port_type type, 293794b2c05SJiri Pirko unsigned int port_index); 29437923ed6SDavid Ahern 29575ba029fSJiri Pirko struct nsim_fib_data *nsim_fib_create(struct devlink *devlink, 29675ba029fSJiri Pirko struct netlink_ext_ack *extack); 29775ba029fSJiri Pirko void nsim_fib_destroy(struct devlink *devlink, struct nsim_fib_data *fib_data); 298a5facc4cSJiri Pirko u64 nsim_fib_get_val(struct nsim_fib_data *fib_data, 299a5facc4cSJiri Pirko enum nsim_resource_id res_id, bool max); 30037923ed6SDavid Ahern 301d3953819SDmytro Linkin ssize_t nsim_bus_dev_max_vfs_read(struct file *file, 302d3953819SDmytro Linkin char __user *data, 303d3953819SDmytro Linkin size_t count, loff_t *ppos); 304d3953819SDmytro Linkin ssize_t nsim_bus_dev_max_vfs_write(struct file *file, 305d3953819SDmytro Linkin const char __user *data, 306d3953819SDmytro Linkin size_t count, loff_t *ppos); 30732ac15d8SDmytro Linkin void nsim_bus_dev_vfs_disable(struct nsim_bus_dev *nsim_bus_dev); 308d3953819SDmytro Linkin 309814b9ce6SDmytro Linkin static inline bool nsim_dev_port_is_pf(struct nsim_dev_port *nsim_dev_port) 310814b9ce6SDmytro Linkin { 311814b9ce6SDmytro Linkin return nsim_dev_port->port_type == NSIM_DEV_PORT_TYPE_PF; 312814b9ce6SDmytro Linkin } 313814b9ce6SDmytro Linkin 314814b9ce6SDmytro Linkin static inline bool nsim_dev_port_is_vf(struct nsim_dev_port *nsim_dev_port) 315814b9ce6SDmytro Linkin { 316814b9ce6SDmytro Linkin return nsim_dev_port->port_type == NSIM_DEV_PORT_TYPE_VF; 317814b9ce6SDmytro Linkin } 3187699353dSShannon Nelson #if IS_ENABLED(CONFIG_XFRM_OFFLOAD) 3197699353dSShannon Nelson void nsim_ipsec_init(struct netdevsim *ns); 3207699353dSShannon Nelson void nsim_ipsec_teardown(struct netdevsim *ns); 3217699353dSShannon Nelson bool nsim_ipsec_tx(struct netdevsim *ns, struct sk_buff *skb); 3227699353dSShannon Nelson #else 3237699353dSShannon Nelson static inline void nsim_ipsec_init(struct netdevsim *ns) 3247699353dSShannon Nelson { 3257699353dSShannon Nelson } 3267699353dSShannon Nelson 3277699353dSShannon Nelson static inline void nsim_ipsec_teardown(struct netdevsim *ns) 3287699353dSShannon Nelson { 3297699353dSShannon Nelson } 3307699353dSShannon Nelson 3317699353dSShannon Nelson static inline bool nsim_ipsec_tx(struct netdevsim *ns, struct sk_buff *skb) 3327699353dSShannon Nelson { 3337699353dSShannon Nelson return true; 3347699353dSShannon Nelson } 3357699353dSShannon Nelson #endif 3367699353dSShannon Nelson 33740e4fe4cSJiri Pirko struct nsim_vf_config { 33840e4fe4cSJiri Pirko int link_state; 33940e4fe4cSJiri Pirko u16 min_tx_rate; 34040e4fe4cSJiri Pirko u16 max_tx_rate; 34140e4fe4cSJiri Pirko u16 vlan; 34240e4fe4cSJiri Pirko __be16 vlan_proto; 34340e4fe4cSJiri Pirko u16 qos; 34440e4fe4cSJiri Pirko u8 vf_mac[ETH_ALEN]; 34540e4fe4cSJiri Pirko bool spoofchk_enabled; 34640e4fe4cSJiri Pirko bool trusted; 34740e4fe4cSJiri Pirko bool rss_query_enabled; 34840e4fe4cSJiri Pirko }; 349925f5afeSJiri Pirko 35040e4fe4cSJiri Pirko struct nsim_bus_dev { 35140e4fe4cSJiri Pirko struct device dev; 352f9d9db47SJiri Pirko struct list_head list; 353f9d9db47SJiri Pirko unsigned int port_count; 3547b60027bSJiri Pirko struct net *initial_net; /* Purpose of this is to carry net pointer 3557b60027bSJiri Pirko * during the probe time only. 3567b60027bSJiri Pirko */ 357d3953819SDmytro Linkin unsigned int max_vfs; 35840e4fe4cSJiri Pirko unsigned int num_vfs; 359d3953819SDmytro Linkin struct mutex vfs_lock; /* Protects vfconfigs */ 36040e4fe4cSJiri Pirko struct nsim_vf_config *vfconfigs; 3616ab63366STaehee Yoo /* Lock for devlink->reload_enabled in netdevsim module */ 3626ab63366STaehee Yoo struct mutex nsim_bus_reload_lock; 363f5cd2160STaehee Yoo bool init; 36440e4fe4cSJiri Pirko }; 365925f5afeSJiri Pirko 366925f5afeSJiri Pirko int nsim_bus_init(void); 367925f5afeSJiri Pirko void nsim_bus_exit(void); 368