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 u32 ok; 587699353dSShannon Nelson }; 597699353dSShannon Nelson 6002b34d03SSabrina Dubroca #define NSIM_MACSEC_MAX_SECY_COUNT 3 6102b34d03SSabrina Dubroca #define NSIM_MACSEC_MAX_RXSC_COUNT 1 6202b34d03SSabrina Dubroca struct nsim_rxsc { 6302b34d03SSabrina Dubroca sci_t sci; 6402b34d03SSabrina Dubroca bool used; 6502b34d03SSabrina Dubroca }; 6602b34d03SSabrina Dubroca 6702b34d03SSabrina Dubroca struct nsim_secy { 6802b34d03SSabrina Dubroca sci_t sci; 6902b34d03SSabrina Dubroca struct nsim_rxsc nsim_rxsc[NSIM_MACSEC_MAX_RXSC_COUNT]; 7002b34d03SSabrina Dubroca u8 nsim_rxsc_count; 7102b34d03SSabrina Dubroca bool used; 7202b34d03SSabrina Dubroca }; 7302b34d03SSabrina Dubroca 7402b34d03SSabrina Dubroca struct nsim_macsec { 7502b34d03SSabrina Dubroca struct nsim_secy nsim_secy[NSIM_MACSEC_MAX_SECY_COUNT]; 7602b34d03SSabrina Dubroca u8 nsim_secy_count; 7702b34d03SSabrina Dubroca }; 7802b34d03SSabrina Dubroca 7977f9591bSAntonio Cardace struct nsim_ethtool_pauseparam { 80ff1f7c17SJakub Kicinski bool rx; 81ff1f7c17SJakub Kicinski bool tx; 82ff1f7c17SJakub Kicinski bool report_stats_rx; 83ff1f7c17SJakub Kicinski bool report_stats_tx; 84ff1f7c17SJakub Kicinski }; 85ff1f7c17SJakub Kicinski 8677f9591bSAntonio Cardace struct nsim_ethtool { 870d7f76dcSJakub Kicinski u32 get_err; 880d7f76dcSJakub Kicinski u32 set_err; 892e367522SJakub Kicinski u32 channels; 9077f9591bSAntonio Cardace struct nsim_ethtool_pauseparam pauseparam; 91a7fc6db0SAntonio Cardace struct ethtool_coalesce coalesce; 92a7fc6db0SAntonio Cardace struct ethtool_ringparam ring; 930d7f76dcSJakub Kicinski struct ethtool_fecparam fec; 9477f9591bSAntonio Cardace }; 9577f9591bSAntonio Cardace 963762ec05SDavid Wei struct nsim_rq { 973762ec05SDavid Wei struct napi_struct napi; 983762ec05SDavid Wei struct sk_buff_head skb_queue; 993762ec05SDavid Wei struct page_pool *page_pool; 100*bf3624cfSBreno Leitao struct hrtimer napi_timer; 1013762ec05SDavid Wei }; 1023762ec05SDavid Wei 10383c9e13aSJakub Kicinski struct netdevsim { 10431d3ad83SJakub Kicinski struct net_device *netdev; 105a60f9e48SJiri Pirko struct nsim_dev *nsim_dev; 106e05b2d14SJiri Pirko struct nsim_dev_port *nsim_dev_port; 107b63e78fcSVladimir Oltean struct mock_phc *phc; 108915c82f8SJakub Kicinski struct nsim_rq **rq; 10931d3ad83SJakub Kicinski 1105bc8e8dbSJakub Kicinski int rq_reset_mode; 1115bc8e8dbSJakub Kicinski 11283c9e13aSJakub Kicinski u64 tx_packets; 11383c9e13aSJakub Kicinski u64 tx_bytes; 1149eb95228SDavid Wei u64 tx_dropped; 11583c9e13aSJakub Kicinski struct u64_stats_sync syncp; 11631d3ad83SJakub Kicinski 11740e4fe4cSJiri Pirko struct nsim_bus_dev *nsim_bus_dev; 11879579220SJakub Kicinski 11931d3ad83SJakub Kicinski struct bpf_prog *bpf_offloaded; 12031d3ad83SJakub Kicinski u32 bpf_offloaded_id; 12131d3ad83SJakub Kicinski 12205296620SJakub Kicinski struct xdp_attachment_info xdp; 123799e173dSJakub Kicinski struct xdp_attachment_info xdp_hw; 12431d3ad83SJakub Kicinski 12531d3ad83SJakub Kicinski bool bpf_tc_accept; 12631d3ad83SJakub Kicinski bool bpf_tc_non_bound_accept; 12731d3ad83SJakub Kicinski bool bpf_xdpdrv_accept; 12831d3ad83SJakub Kicinski bool bpf_xdpoffload_accept; 129395cacb5SJakub Kicinski 130395cacb5SJakub Kicinski bool bpf_map_accept; 1317699353dSShannon Nelson struct nsim_ipsec ipsec; 13202b34d03SSabrina Dubroca struct nsim_macsec macsec; 133424be63aSJakub Kicinski struct { 134424be63aSJakub Kicinski u32 inject_error; 135424be63aSJakub Kicinski u32 sleep; 136dc9c0753SJakub Kicinski u32 __ports[2][NSIM_UDP_TUNNEL_N_PORTS]; 137dc9c0753SJakub Kicinski u32 (*ports)[NSIM_UDP_TUNNEL_N_PORTS]; 13850bf398eSJakub Kicinski struct dentry *ddir; 139424be63aSJakub Kicinski struct debugfs_u32_array dfs_ports[2]; 140424be63aSJakub Kicinski } udp_ports; 141ff1f7c17SJakub Kicinski 1421580cbcbSJakub Kicinski struct page *page; 1431580cbcbSJakub Kicinski struct dentry *pp_dfs; 1446917d207SJakub Kicinski struct dentry *qr_dfs; 1451580cbcbSJakub Kicinski 146ff1f7c17SJakub Kicinski struct nsim_ethtool ethtool; 147f532957dSDavid Wei struct netdevsim __rcu *peer; 14883c9e13aSJakub Kicinski }; 14931d3ad83SJakub Kicinski 150e05b2d14SJiri Pirko struct netdevsim * 151e05b2d14SJiri Pirko nsim_create(struct nsim_dev *nsim_dev, struct nsim_dev_port *nsim_dev_port); 152e05b2d14SJiri Pirko void nsim_destroy(struct netdevsim *ns); 153f532957dSDavid Wei bool netdev_is_nsim(struct net_device *dev); 154e05b2d14SJiri Pirko 155ff1f7c17SJakub Kicinski void nsim_ethtool_init(struct netdevsim *ns); 156ff1f7c17SJakub Kicinski 157424be63aSJakub Kicinski void nsim_udp_tunnels_debugfs_create(struct nsim_dev *nsim_dev); 158424be63aSJakub Kicinski int nsim_udp_tunnels_info_create(struct nsim_dev *nsim_dev, 159424be63aSJakub Kicinski struct net_device *dev); 160424be63aSJakub Kicinski void nsim_udp_tunnels_info_destroy(struct net_device *dev); 161424be63aSJakub Kicinski 1627c5db7e7SJakub Kicinski #ifdef CONFIG_BPF_SYSCALL 163d514f41eSJiri Pirko int nsim_bpf_dev_init(struct nsim_dev *nsim_dev); 164d514f41eSJiri Pirko void nsim_bpf_dev_exit(struct nsim_dev *nsim_dev); 16531d3ad83SJakub Kicinski int nsim_bpf_init(struct netdevsim *ns); 16631d3ad83SJakub Kicinski void nsim_bpf_uninit(struct netdevsim *ns); 16731d3ad83SJakub Kicinski int nsim_bpf(struct net_device *dev, struct netdev_bpf *bpf); 16831d3ad83SJakub Kicinski int nsim_bpf_disable_tc(struct netdevsim *ns); 16931d3ad83SJakub Kicinski int nsim_bpf_setup_tc_block_cb(enum tc_setup_type type, 17031d3ad83SJakub Kicinski void *type_data, void *cb_priv); 1717c5db7e7SJakub Kicinski #else 172d514f41eSJiri Pirko 173d514f41eSJiri Pirko static inline int nsim_bpf_dev_init(struct nsim_dev *nsim_dev) 174d514f41eSJiri Pirko { 175d514f41eSJiri Pirko return 0; 176d514f41eSJiri Pirko } 177d514f41eSJiri Pirko 178d514f41eSJiri Pirko static inline void nsim_bpf_dev_exit(struct nsim_dev *nsim_dev) 179d514f41eSJiri Pirko { 180d514f41eSJiri Pirko } 1817c5db7e7SJakub Kicinski static inline int nsim_bpf_init(struct netdevsim *ns) 1827c5db7e7SJakub Kicinski { 1837c5db7e7SJakub Kicinski return 0; 1847c5db7e7SJakub Kicinski } 1857c5db7e7SJakub Kicinski 1867c5db7e7SJakub Kicinski static inline void nsim_bpf_uninit(struct netdevsim *ns) 1877c5db7e7SJakub Kicinski { 1887c5db7e7SJakub Kicinski } 1897c5db7e7SJakub Kicinski 1907c5db7e7SJakub Kicinski static inline int nsim_bpf(struct net_device *dev, struct netdev_bpf *bpf) 1917c5db7e7SJakub Kicinski { 192e8407fdeSAndrii Nakryiko return -EOPNOTSUPP; 1937c5db7e7SJakub Kicinski } 1947c5db7e7SJakub Kicinski 1957c5db7e7SJakub Kicinski static inline int nsim_bpf_disable_tc(struct netdevsim *ns) 1967c5db7e7SJakub Kicinski { 1977c5db7e7SJakub Kicinski return 0; 1987c5db7e7SJakub Kicinski } 1997c5db7e7SJakub Kicinski 2007c5db7e7SJakub Kicinski static inline int 2017c5db7e7SJakub Kicinski nsim_bpf_setup_tc_block_cb(enum tc_setup_type type, void *type_data, 2027c5db7e7SJakub Kicinski void *cb_priv) 2037c5db7e7SJakub Kicinski { 2047c5db7e7SJakub Kicinski return -EOPNOTSUPP; 2057c5db7e7SJakub Kicinski } 2067c5db7e7SJakub Kicinski #endif 20779579220SJakub Kicinski 20837923ed6SDavid Ahern enum nsim_resource_id { 20937923ed6SDavid Ahern NSIM_RESOURCE_NONE, /* DEVLINK_RESOURCE_ID_PARENT_TOP */ 21037923ed6SDavid Ahern NSIM_RESOURCE_IPV4, 21137923ed6SDavid Ahern NSIM_RESOURCE_IPV4_FIB, 21237923ed6SDavid Ahern NSIM_RESOURCE_IPV4_FIB_RULES, 21337923ed6SDavid Ahern NSIM_RESOURCE_IPV6, 21437923ed6SDavid Ahern NSIM_RESOURCE_IPV6_FIB, 21537923ed6SDavid Ahern NSIM_RESOURCE_IPV6_FIB_RULES, 21635266255SIdo Schimmel NSIM_RESOURCE_NEXTHOPS, 21737923ed6SDavid Ahern }; 21837923ed6SDavid Ahern 21982c93a87SJiri Pirko struct nsim_dev_health { 22082c93a87SJiri Pirko struct devlink_health_reporter *empty_reporter; 22182c93a87SJiri Pirko struct devlink_health_reporter *dummy_reporter; 22282c93a87SJiri Pirko struct dentry *ddir; 22382c93a87SJiri Pirko char *recovered_break_msg; 22482c93a87SJiri Pirko u32 binary_len; 22582c93a87SJiri Pirko bool fail_recover; 22682c93a87SJiri Pirko }; 22782c93a87SJiri Pirko 22882c93a87SJiri Pirko int nsim_dev_health_init(struct nsim_dev *nsim_dev, struct devlink *devlink); 22982c93a87SJiri Pirko void nsim_dev_health_exit(struct nsim_dev *nsim_dev); 23082c93a87SJiri Pirko 2311a6d7ae7SPetr Machata struct nsim_dev_hwstats_netdev { 2321a6d7ae7SPetr Machata struct list_head list; 2331a6d7ae7SPetr Machata struct net_device *netdev; 2341a6d7ae7SPetr Machata struct rtnl_hw_stats64 stats; 2351a6d7ae7SPetr Machata bool enabled; 2361a6d7ae7SPetr Machata bool fail_enable; 2371a6d7ae7SPetr Machata }; 2381a6d7ae7SPetr Machata 2391a6d7ae7SPetr Machata struct nsim_dev_hwstats { 2401a6d7ae7SPetr Machata struct dentry *ddir; 2411a6d7ae7SPetr Machata struct dentry *l3_ddir; 2421a6d7ae7SPetr Machata 2431a6d7ae7SPetr Machata struct mutex hwsdev_list_lock; /* protects hwsdev list(s) */ 2441a6d7ae7SPetr Machata struct list_head l3_list; 2451a6d7ae7SPetr Machata 2461a6d7ae7SPetr Machata struct notifier_block netdevice_nb; 2471a6d7ae7SPetr Machata struct delayed_work traffic_dw; 2481a6d7ae7SPetr Machata }; 2491a6d7ae7SPetr Machata 2501a6d7ae7SPetr Machata int nsim_dev_hwstats_init(struct nsim_dev *nsim_dev); 2511a6d7ae7SPetr Machata void nsim_dev_hwstats_exit(struct nsim_dev *nsim_dev); 2521a6d7ae7SPetr Machata 253a8700c3dSIdo Schimmel #if IS_ENABLED(CONFIG_PSAMPLE) 254a8700c3dSIdo Schimmel int nsim_dev_psample_init(struct nsim_dev *nsim_dev); 255a8700c3dSIdo Schimmel void nsim_dev_psample_exit(struct nsim_dev *nsim_dev); 256a8700c3dSIdo Schimmel #else 257a8700c3dSIdo Schimmel static inline int nsim_dev_psample_init(struct nsim_dev *nsim_dev) 258a8700c3dSIdo Schimmel { 259a8700c3dSIdo Schimmel return 0; 260a8700c3dSIdo Schimmel } 261a8700c3dSIdo Schimmel 262a8700c3dSIdo Schimmel static inline void nsim_dev_psample_exit(struct nsim_dev *nsim_dev) 263a8700c3dSIdo Schimmel { 264a8700c3dSIdo Schimmel } 265a8700c3dSIdo Schimmel #endif 266a8700c3dSIdo Schimmel 267814b9ce6SDmytro Linkin enum nsim_dev_port_type { 268814b9ce6SDmytro Linkin NSIM_DEV_PORT_TYPE_PF, 269814b9ce6SDmytro Linkin NSIM_DEV_PORT_TYPE_VF, 270814b9ce6SDmytro Linkin }; 271814b9ce6SDmytro Linkin 272814b9ce6SDmytro Linkin #define NSIM_DEV_VF_PORT_INDEX_BASE 128 273814b9ce6SDmytro Linkin #define NSIM_DEV_VF_PORT_INDEX_MAX UINT_MAX 274814b9ce6SDmytro Linkin 2758320d145SJiri Pirko struct nsim_dev_port { 2768320d145SJiri Pirko struct list_head list; 2778320d145SJiri Pirko struct devlink_port devlink_port; 2788320d145SJiri Pirko unsigned int port_index; 279814b9ce6SDmytro Linkin enum nsim_dev_port_type port_type; 2808320d145SJiri Pirko struct dentry *ddir; 281f3d101b4SDmytro Linkin struct dentry *rate_parent; 282f3d101b4SDmytro Linkin char *parent_name; 283e05b2d14SJiri Pirko struct netdevsim *ns; 2848320d145SJiri Pirko }; 2858320d145SJiri Pirko 2865e388f3dSJakub Kicinski struct nsim_vf_config { 2875e388f3dSJakub Kicinski int link_state; 2885e388f3dSJakub Kicinski u16 min_tx_rate; 2895e388f3dSJakub Kicinski u16 max_tx_rate; 2905e388f3dSJakub Kicinski u16 vlan; 2915e388f3dSJakub Kicinski __be16 vlan_proto; 2925e388f3dSJakub Kicinski u16 qos; 2935e388f3dSJakub Kicinski u8 vf_mac[ETH_ALEN]; 2945e388f3dSJakub Kicinski bool spoofchk_enabled; 2955e388f3dSJakub Kicinski bool trusted; 2965e388f3dSJakub Kicinski bool rss_query_enabled; 2975e388f3dSJakub Kicinski }; 2985e388f3dSJakub Kicinski 299a60f9e48SJiri Pirko struct nsim_dev { 300d514f41eSJiri Pirko struct nsim_bus_dev *nsim_bus_dev; 301a60f9e48SJiri Pirko struct nsim_fib_data *fib_data; 302da58f90fSIdo Schimmel struct nsim_trap_data *trap_data; 303d514f41eSJiri Pirko struct dentry *ddir; 304ab1d0cc0SJiri Pirko struct dentry *ports_ddir; 3058526ad96STaehee Yoo struct dentry *take_snapshot; 306885226f5SDmytro Linkin struct dentry *nodes_ddir; 3075e388f3dSJakub Kicinski 3085e388f3dSJakub Kicinski struct nsim_vf_config *vfconfigs; 3095e388f3dSJakub Kicinski 310d514f41eSJiri Pirko struct bpf_offload_dev *bpf_dev; 311d514f41eSJiri Pirko bool bpf_bind_accept; 312e4ff5aa4SToke Høiland-Jørgensen bool bpf_bind_verifier_accept; 313d514f41eSJiri Pirko u32 bpf_bind_verifier_delay; 314d514f41eSJiri Pirko struct dentry *ddir_bpf_bound_progs; 315d514f41eSJiri Pirko u32 prog_id_gen; 316d514f41eSJiri Pirko struct list_head bpf_bound_progs; 317d514f41eSJiri Pirko struct list_head bpf_bound_maps; 318514cf64cSJiri Pirko struct netdev_phys_item_id switch_id; 3198320d145SJiri Pirko struct list_head port_list; 320fa4dfc4aSJiri Pirko bool fw_update_status; 321cbb58368SJacob Keller u32 fw_update_overwrite_mask; 322150e8f8aSJiri Pirko u32 max_macs; 323150e8f8aSJiri Pirko bool test1; 324155ddfc5SJiri Pirko bool dont_allow_reload; 325155ddfc5SJiri Pirko bool fail_reload; 3264418f862SJiri Pirko struct devlink_region *dummy_region; 32782c93a87SJiri Pirko struct nsim_dev_health health; 3281a6d7ae7SPetr Machata struct nsim_dev_hwstats hwstats; 329d3cbb907SJiri Pirko struct flow_action_cookie *fa_cookie; 330d3cbb907SJiri Pirko spinlock_t fa_cookie_lock; /* protects fa_cookie */ 3310dc8249aSIdo Schimmel bool fail_trap_group_set; 332ad188458SIdo Schimmel bool fail_trap_policer_set; 333ad188458SIdo Schimmel bool fail_trap_policer_counter_get; 334275b51c2SOleksandr Mazur bool fail_trap_drop_counter_get; 335424be63aSJakub Kicinski struct { 336dc9c0753SJakub Kicinski struct udp_tunnel_nic_shared utn_shared; 337dc9c0753SJakub Kicinski u32 __ports[2][NSIM_UDP_TUNNEL_N_PORTS]; 338424be63aSJakub Kicinski bool sync_all; 339424be63aSJakub Kicinski bool open_only; 340424be63aSJakub Kicinski bool ipv4_only; 341dc9c0753SJakub Kicinski bool shared; 342dda75173SJakub Kicinski bool static_iana_vxlan; 343424be63aSJakub Kicinski u32 sleep; 344424be63aSJakub Kicinski } udp_ports; 345a8700c3dSIdo Schimmel struct nsim_dev_psample *psample; 346160dc373SDmytro Linkin u16 esw_mode; 347a60f9e48SJiri Pirko }; 348a60f9e48SJiri Pirko 349160dc373SDmytro Linkin static inline bool nsim_esw_mode_is_legacy(struct nsim_dev *nsim_dev) 350160dc373SDmytro Linkin { 351160dc373SDmytro Linkin return nsim_dev->esw_mode == DEVLINK_ESWITCH_MODE_LEGACY; 352160dc373SDmytro Linkin } 353160dc373SDmytro Linkin 354160dc373SDmytro Linkin static inline bool nsim_esw_mode_is_switchdev(struct nsim_dev *nsim_dev) 355160dc373SDmytro Linkin { 356160dc373SDmytro Linkin return nsim_dev->esw_mode == DEVLINK_ESWITCH_MODE_SWITCHDEV; 357160dc373SDmytro Linkin } 358160dc373SDmytro Linkin 35990d29913SJiri Pirko static inline struct net *nsim_dev_net(struct nsim_dev *nsim_dev) 36090d29913SJiri Pirko { 36190d29913SJiri Pirko return devlink_net(priv_to_devlink(nsim_dev)); 36290d29913SJiri Pirko } 36390d29913SJiri Pirko 364d514f41eSJiri Pirko int nsim_dev_init(void); 365d514f41eSJiri Pirko void nsim_dev_exit(void); 366a66f64b8SJakub Kicinski int nsim_drv_probe(struct nsim_bus_dev *nsim_bus_dev); 367a66f64b8SJakub Kicinski void nsim_drv_remove(struct nsim_bus_dev *nsim_bus_dev); 368a66f64b8SJakub Kicinski int nsim_drv_port_add(struct nsim_bus_dev *nsim_bus_dev, 369814b9ce6SDmytro Linkin enum nsim_dev_port_type type, 370794b2c05SJiri Pirko unsigned int port_index); 371a66f64b8SJakub Kicinski int nsim_drv_port_del(struct nsim_bus_dev *nsim_bus_dev, 372814b9ce6SDmytro Linkin enum nsim_dev_port_type type, 373794b2c05SJiri Pirko unsigned int port_index); 3741c401078SJakub Kicinski int nsim_drv_configure_vfs(struct nsim_bus_dev *nsim_bus_dev, 3751c401078SJakub Kicinski unsigned int num_vfs); 37637923ed6SDavid Ahern 3775e388f3dSJakub Kicinski unsigned int nsim_dev_get_vfs(struct nsim_dev *nsim_dev); 3785e388f3dSJakub Kicinski 37975ba029fSJiri Pirko struct nsim_fib_data *nsim_fib_create(struct devlink *devlink, 38075ba029fSJiri Pirko struct netlink_ext_ack *extack); 38175ba029fSJiri Pirko void nsim_fib_destroy(struct devlink *devlink, struct nsim_fib_data *fib_data); 382a5facc4cSJiri Pirko u64 nsim_fib_get_val(struct nsim_fib_data *fib_data, 383a5facc4cSJiri Pirko enum nsim_resource_id res_id, bool max); 38437923ed6SDavid Ahern 385814b9ce6SDmytro Linkin static inline bool nsim_dev_port_is_pf(struct nsim_dev_port *nsim_dev_port) 386814b9ce6SDmytro Linkin { 387814b9ce6SDmytro Linkin return nsim_dev_port->port_type == NSIM_DEV_PORT_TYPE_PF; 388814b9ce6SDmytro Linkin } 389814b9ce6SDmytro Linkin 390814b9ce6SDmytro Linkin static inline bool nsim_dev_port_is_vf(struct nsim_dev_port *nsim_dev_port) 391814b9ce6SDmytro Linkin { 392814b9ce6SDmytro Linkin return nsim_dev_port->port_type == NSIM_DEV_PORT_TYPE_VF; 393814b9ce6SDmytro Linkin } 3947699353dSShannon Nelson #if IS_ENABLED(CONFIG_XFRM_OFFLOAD) 3957699353dSShannon Nelson void nsim_ipsec_init(struct netdevsim *ns); 3967699353dSShannon Nelson void nsim_ipsec_teardown(struct netdevsim *ns); 3977699353dSShannon Nelson bool nsim_ipsec_tx(struct netdevsim *ns, struct sk_buff *skb); 3987699353dSShannon Nelson #else 3997699353dSShannon Nelson static inline void nsim_ipsec_init(struct netdevsim *ns) 4007699353dSShannon Nelson { 4017699353dSShannon Nelson } 4027699353dSShannon Nelson 4037699353dSShannon Nelson static inline void nsim_ipsec_teardown(struct netdevsim *ns) 4047699353dSShannon Nelson { 4057699353dSShannon Nelson } 4067699353dSShannon Nelson 4077699353dSShannon Nelson static inline bool nsim_ipsec_tx(struct netdevsim *ns, struct sk_buff *skb) 4087699353dSShannon Nelson { 4097699353dSShannon Nelson return true; 4107699353dSShannon Nelson } 4117699353dSShannon Nelson #endif 4127699353dSShannon Nelson 41302b34d03SSabrina Dubroca #if IS_ENABLED(CONFIG_MACSEC) 41402b34d03SSabrina Dubroca void nsim_macsec_init(struct netdevsim *ns); 41502b34d03SSabrina Dubroca void nsim_macsec_teardown(struct netdevsim *ns); 41602b34d03SSabrina Dubroca #else 41702b34d03SSabrina Dubroca static inline void nsim_macsec_init(struct netdevsim *ns) 41802b34d03SSabrina Dubroca { 41902b34d03SSabrina Dubroca } 42002b34d03SSabrina Dubroca 42102b34d03SSabrina Dubroca static inline void nsim_macsec_teardown(struct netdevsim *ns) 42202b34d03SSabrina Dubroca { 42302b34d03SSabrina Dubroca } 42402b34d03SSabrina Dubroca #endif 42502b34d03SSabrina Dubroca 42640e4fe4cSJiri Pirko struct nsim_bus_dev { 42740e4fe4cSJiri Pirko struct device dev; 428f9d9db47SJiri Pirko struct list_head list; 429f9d9db47SJiri Pirko unsigned int port_count; 430d4861fc6SPeilin Ye unsigned int num_queues; /* Number of queues for each port on this bus */ 4317b60027bSJiri Pirko struct net *initial_net; /* Purpose of this is to carry net pointer 4327b60027bSJiri Pirko * during the probe time only. 4337b60027bSJiri Pirko */ 434d3953819SDmytro Linkin unsigned int max_vfs; 43540e4fe4cSJiri Pirko unsigned int num_vfs; 436f5cd2160STaehee Yoo bool init; 43740e4fe4cSJiri Pirko }; 438925f5afeSJiri Pirko 439925f5afeSJiri Pirko int nsim_bus_init(void); 440925f5afeSJiri Pirko void nsim_bus_exit(void); 441