162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Copyright (C) 2017 Netronome Systems, Inc. 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * This software is licensed under the GNU General License Version 2, 562306a36Sopenharmony_ci * June 1991 as shown in the file COPYING in the top-level directory of this 662306a36Sopenharmony_ci * source tree. 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" 962306a36Sopenharmony_ci * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, 1062306a36Sopenharmony_ci * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 1162306a36Sopenharmony_ci * FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE 1262306a36Sopenharmony_ci * OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME 1362306a36Sopenharmony_ci * THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 1462306a36Sopenharmony_ci */ 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#include <linux/debugfs.h> 1762306a36Sopenharmony_ci#include <linux/device.h> 1862306a36Sopenharmony_ci#include <linux/ethtool.h> 1962306a36Sopenharmony_ci#include <linux/kernel.h> 2062306a36Sopenharmony_ci#include <linux/list.h> 2162306a36Sopenharmony_ci#include <linux/netdevice.h> 2262306a36Sopenharmony_ci#include <linux/ptp_mock.h> 2362306a36Sopenharmony_ci#include <linux/u64_stats_sync.h> 2462306a36Sopenharmony_ci#include <net/devlink.h> 2562306a36Sopenharmony_ci#include <net/udp_tunnel.h> 2662306a36Sopenharmony_ci#include <net/xdp.h> 2762306a36Sopenharmony_ci#include <net/macsec.h> 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#define DRV_NAME "netdevsim" 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci#define NSIM_XDP_MAX_MTU 4000 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci#define NSIM_EA(extack, msg) NL_SET_ERR_MSG_MOD((extack), msg) 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci#define NSIM_IPSEC_MAX_SA_COUNT 33 3662306a36Sopenharmony_ci#define NSIM_IPSEC_VALID BIT(31) 3762306a36Sopenharmony_ci#define NSIM_UDP_TUNNEL_N_PORTS 4 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_cistruct nsim_sa { 4062306a36Sopenharmony_ci struct xfrm_state *xs; 4162306a36Sopenharmony_ci __be32 ipaddr[4]; 4262306a36Sopenharmony_ci u32 key[4]; 4362306a36Sopenharmony_ci u32 salt; 4462306a36Sopenharmony_ci bool used; 4562306a36Sopenharmony_ci bool crypt; 4662306a36Sopenharmony_ci bool rx; 4762306a36Sopenharmony_ci}; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cistruct nsim_ipsec { 5062306a36Sopenharmony_ci struct nsim_sa sa[NSIM_IPSEC_MAX_SA_COUNT]; 5162306a36Sopenharmony_ci struct dentry *pfile; 5262306a36Sopenharmony_ci u32 count; 5362306a36Sopenharmony_ci u32 tx; 5462306a36Sopenharmony_ci u32 ok; 5562306a36Sopenharmony_ci}; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci#define NSIM_MACSEC_MAX_SECY_COUNT 3 5862306a36Sopenharmony_ci#define NSIM_MACSEC_MAX_RXSC_COUNT 1 5962306a36Sopenharmony_cistruct nsim_rxsc { 6062306a36Sopenharmony_ci sci_t sci; 6162306a36Sopenharmony_ci bool used; 6262306a36Sopenharmony_ci}; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_cistruct nsim_secy { 6562306a36Sopenharmony_ci sci_t sci; 6662306a36Sopenharmony_ci struct nsim_rxsc nsim_rxsc[NSIM_MACSEC_MAX_RXSC_COUNT]; 6762306a36Sopenharmony_ci u8 nsim_rxsc_count; 6862306a36Sopenharmony_ci bool used; 6962306a36Sopenharmony_ci}; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_cistruct nsim_macsec { 7262306a36Sopenharmony_ci struct nsim_secy nsim_secy[NSIM_MACSEC_MAX_SECY_COUNT]; 7362306a36Sopenharmony_ci u8 nsim_secy_count; 7462306a36Sopenharmony_ci}; 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_cistruct nsim_ethtool_pauseparam { 7762306a36Sopenharmony_ci bool rx; 7862306a36Sopenharmony_ci bool tx; 7962306a36Sopenharmony_ci bool report_stats_rx; 8062306a36Sopenharmony_ci bool report_stats_tx; 8162306a36Sopenharmony_ci}; 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_cistruct nsim_ethtool { 8462306a36Sopenharmony_ci u32 get_err; 8562306a36Sopenharmony_ci u32 set_err; 8662306a36Sopenharmony_ci u32 channels; 8762306a36Sopenharmony_ci struct nsim_ethtool_pauseparam pauseparam; 8862306a36Sopenharmony_ci struct ethtool_coalesce coalesce; 8962306a36Sopenharmony_ci struct ethtool_ringparam ring; 9062306a36Sopenharmony_ci struct ethtool_fecparam fec; 9162306a36Sopenharmony_ci}; 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_cistruct netdevsim { 9462306a36Sopenharmony_ci struct net_device *netdev; 9562306a36Sopenharmony_ci struct nsim_dev *nsim_dev; 9662306a36Sopenharmony_ci struct nsim_dev_port *nsim_dev_port; 9762306a36Sopenharmony_ci struct mock_phc *phc; 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci u64 tx_packets; 10062306a36Sopenharmony_ci u64 tx_bytes; 10162306a36Sopenharmony_ci struct u64_stats_sync syncp; 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci struct nsim_bus_dev *nsim_bus_dev; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci struct bpf_prog *bpf_offloaded; 10662306a36Sopenharmony_ci u32 bpf_offloaded_id; 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci struct xdp_attachment_info xdp; 10962306a36Sopenharmony_ci struct xdp_attachment_info xdp_hw; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci bool bpf_tc_accept; 11262306a36Sopenharmony_ci bool bpf_tc_non_bound_accept; 11362306a36Sopenharmony_ci bool bpf_xdpdrv_accept; 11462306a36Sopenharmony_ci bool bpf_xdpoffload_accept; 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci bool bpf_map_accept; 11762306a36Sopenharmony_ci struct nsim_ipsec ipsec; 11862306a36Sopenharmony_ci struct nsim_macsec macsec; 11962306a36Sopenharmony_ci struct { 12062306a36Sopenharmony_ci u32 inject_error; 12162306a36Sopenharmony_ci u32 sleep; 12262306a36Sopenharmony_ci u32 __ports[2][NSIM_UDP_TUNNEL_N_PORTS]; 12362306a36Sopenharmony_ci u32 (*ports)[NSIM_UDP_TUNNEL_N_PORTS]; 12462306a36Sopenharmony_ci struct debugfs_u32_array dfs_ports[2]; 12562306a36Sopenharmony_ci } udp_ports; 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci struct nsim_ethtool ethtool; 12862306a36Sopenharmony_ci}; 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_cistruct netdevsim * 13162306a36Sopenharmony_cinsim_create(struct nsim_dev *nsim_dev, struct nsim_dev_port *nsim_dev_port); 13262306a36Sopenharmony_civoid nsim_destroy(struct netdevsim *ns); 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_civoid nsim_ethtool_init(struct netdevsim *ns); 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_civoid nsim_udp_tunnels_debugfs_create(struct nsim_dev *nsim_dev); 13762306a36Sopenharmony_ciint nsim_udp_tunnels_info_create(struct nsim_dev *nsim_dev, 13862306a36Sopenharmony_ci struct net_device *dev); 13962306a36Sopenharmony_civoid nsim_udp_tunnels_info_destroy(struct net_device *dev); 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci#ifdef CONFIG_BPF_SYSCALL 14262306a36Sopenharmony_ciint nsim_bpf_dev_init(struct nsim_dev *nsim_dev); 14362306a36Sopenharmony_civoid nsim_bpf_dev_exit(struct nsim_dev *nsim_dev); 14462306a36Sopenharmony_ciint nsim_bpf_init(struct netdevsim *ns); 14562306a36Sopenharmony_civoid nsim_bpf_uninit(struct netdevsim *ns); 14662306a36Sopenharmony_ciint nsim_bpf(struct net_device *dev, struct netdev_bpf *bpf); 14762306a36Sopenharmony_ciint nsim_bpf_disable_tc(struct netdevsim *ns); 14862306a36Sopenharmony_ciint nsim_bpf_setup_tc_block_cb(enum tc_setup_type type, 14962306a36Sopenharmony_ci void *type_data, void *cb_priv); 15062306a36Sopenharmony_ci#else 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_cistatic inline int nsim_bpf_dev_init(struct nsim_dev *nsim_dev) 15362306a36Sopenharmony_ci{ 15462306a36Sopenharmony_ci return 0; 15562306a36Sopenharmony_ci} 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_cistatic inline void nsim_bpf_dev_exit(struct nsim_dev *nsim_dev) 15862306a36Sopenharmony_ci{ 15962306a36Sopenharmony_ci} 16062306a36Sopenharmony_cistatic inline int nsim_bpf_init(struct netdevsim *ns) 16162306a36Sopenharmony_ci{ 16262306a36Sopenharmony_ci return 0; 16362306a36Sopenharmony_ci} 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_cistatic inline void nsim_bpf_uninit(struct netdevsim *ns) 16662306a36Sopenharmony_ci{ 16762306a36Sopenharmony_ci} 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_cistatic inline int nsim_bpf(struct net_device *dev, struct netdev_bpf *bpf) 17062306a36Sopenharmony_ci{ 17162306a36Sopenharmony_ci return -EOPNOTSUPP; 17262306a36Sopenharmony_ci} 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_cistatic inline int nsim_bpf_disable_tc(struct netdevsim *ns) 17562306a36Sopenharmony_ci{ 17662306a36Sopenharmony_ci return 0; 17762306a36Sopenharmony_ci} 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_cistatic inline int 18062306a36Sopenharmony_cinsim_bpf_setup_tc_block_cb(enum tc_setup_type type, void *type_data, 18162306a36Sopenharmony_ci void *cb_priv) 18262306a36Sopenharmony_ci{ 18362306a36Sopenharmony_ci return -EOPNOTSUPP; 18462306a36Sopenharmony_ci} 18562306a36Sopenharmony_ci#endif 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_cienum nsim_resource_id { 18862306a36Sopenharmony_ci NSIM_RESOURCE_NONE, /* DEVLINK_RESOURCE_ID_PARENT_TOP */ 18962306a36Sopenharmony_ci NSIM_RESOURCE_IPV4, 19062306a36Sopenharmony_ci NSIM_RESOURCE_IPV4_FIB, 19162306a36Sopenharmony_ci NSIM_RESOURCE_IPV4_FIB_RULES, 19262306a36Sopenharmony_ci NSIM_RESOURCE_IPV6, 19362306a36Sopenharmony_ci NSIM_RESOURCE_IPV6_FIB, 19462306a36Sopenharmony_ci NSIM_RESOURCE_IPV6_FIB_RULES, 19562306a36Sopenharmony_ci NSIM_RESOURCE_NEXTHOPS, 19662306a36Sopenharmony_ci}; 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_cistruct nsim_dev_health { 19962306a36Sopenharmony_ci struct devlink_health_reporter *empty_reporter; 20062306a36Sopenharmony_ci struct devlink_health_reporter *dummy_reporter; 20162306a36Sopenharmony_ci struct dentry *ddir; 20262306a36Sopenharmony_ci char *recovered_break_msg; 20362306a36Sopenharmony_ci u32 binary_len; 20462306a36Sopenharmony_ci bool fail_recover; 20562306a36Sopenharmony_ci}; 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ciint nsim_dev_health_init(struct nsim_dev *nsim_dev, struct devlink *devlink); 20862306a36Sopenharmony_civoid nsim_dev_health_exit(struct nsim_dev *nsim_dev); 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_cistruct nsim_dev_hwstats_netdev { 21162306a36Sopenharmony_ci struct list_head list; 21262306a36Sopenharmony_ci struct net_device *netdev; 21362306a36Sopenharmony_ci struct rtnl_hw_stats64 stats; 21462306a36Sopenharmony_ci bool enabled; 21562306a36Sopenharmony_ci bool fail_enable; 21662306a36Sopenharmony_ci}; 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_cistruct nsim_dev_hwstats { 21962306a36Sopenharmony_ci struct dentry *ddir; 22062306a36Sopenharmony_ci struct dentry *l3_ddir; 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci struct mutex hwsdev_list_lock; /* protects hwsdev list(s) */ 22362306a36Sopenharmony_ci struct list_head l3_list; 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci struct notifier_block netdevice_nb; 22662306a36Sopenharmony_ci struct delayed_work traffic_dw; 22762306a36Sopenharmony_ci}; 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ciint nsim_dev_hwstats_init(struct nsim_dev *nsim_dev); 23062306a36Sopenharmony_civoid nsim_dev_hwstats_exit(struct nsim_dev *nsim_dev); 23162306a36Sopenharmony_ci 23262306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_PSAMPLE) 23362306a36Sopenharmony_ciint nsim_dev_psample_init(struct nsim_dev *nsim_dev); 23462306a36Sopenharmony_civoid nsim_dev_psample_exit(struct nsim_dev *nsim_dev); 23562306a36Sopenharmony_ci#else 23662306a36Sopenharmony_cistatic inline int nsim_dev_psample_init(struct nsim_dev *nsim_dev) 23762306a36Sopenharmony_ci{ 23862306a36Sopenharmony_ci return 0; 23962306a36Sopenharmony_ci} 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_cistatic inline void nsim_dev_psample_exit(struct nsim_dev *nsim_dev) 24262306a36Sopenharmony_ci{ 24362306a36Sopenharmony_ci} 24462306a36Sopenharmony_ci#endif 24562306a36Sopenharmony_ci 24662306a36Sopenharmony_cienum nsim_dev_port_type { 24762306a36Sopenharmony_ci NSIM_DEV_PORT_TYPE_PF, 24862306a36Sopenharmony_ci NSIM_DEV_PORT_TYPE_VF, 24962306a36Sopenharmony_ci}; 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci#define NSIM_DEV_VF_PORT_INDEX_BASE 128 25262306a36Sopenharmony_ci#define NSIM_DEV_VF_PORT_INDEX_MAX UINT_MAX 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_cistruct nsim_dev_port { 25562306a36Sopenharmony_ci struct list_head list; 25662306a36Sopenharmony_ci struct devlink_port devlink_port; 25762306a36Sopenharmony_ci unsigned int port_index; 25862306a36Sopenharmony_ci enum nsim_dev_port_type port_type; 25962306a36Sopenharmony_ci struct dentry *ddir; 26062306a36Sopenharmony_ci struct dentry *rate_parent; 26162306a36Sopenharmony_ci char *parent_name; 26262306a36Sopenharmony_ci struct netdevsim *ns; 26362306a36Sopenharmony_ci}; 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_cistruct nsim_vf_config { 26662306a36Sopenharmony_ci int link_state; 26762306a36Sopenharmony_ci u16 min_tx_rate; 26862306a36Sopenharmony_ci u16 max_tx_rate; 26962306a36Sopenharmony_ci u16 vlan; 27062306a36Sopenharmony_ci __be16 vlan_proto; 27162306a36Sopenharmony_ci u16 qos; 27262306a36Sopenharmony_ci u8 vf_mac[ETH_ALEN]; 27362306a36Sopenharmony_ci bool spoofchk_enabled; 27462306a36Sopenharmony_ci bool trusted; 27562306a36Sopenharmony_ci bool rss_query_enabled; 27662306a36Sopenharmony_ci}; 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_cistruct nsim_dev { 27962306a36Sopenharmony_ci struct nsim_bus_dev *nsim_bus_dev; 28062306a36Sopenharmony_ci struct nsim_fib_data *fib_data; 28162306a36Sopenharmony_ci struct nsim_trap_data *trap_data; 28262306a36Sopenharmony_ci struct dentry *ddir; 28362306a36Sopenharmony_ci struct dentry *ports_ddir; 28462306a36Sopenharmony_ci struct dentry *take_snapshot; 28562306a36Sopenharmony_ci struct dentry *nodes_ddir; 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_ci struct nsim_vf_config *vfconfigs; 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci struct bpf_offload_dev *bpf_dev; 29062306a36Sopenharmony_ci bool bpf_bind_accept; 29162306a36Sopenharmony_ci bool bpf_bind_verifier_accept; 29262306a36Sopenharmony_ci u32 bpf_bind_verifier_delay; 29362306a36Sopenharmony_ci struct dentry *ddir_bpf_bound_progs; 29462306a36Sopenharmony_ci u32 prog_id_gen; 29562306a36Sopenharmony_ci struct list_head bpf_bound_progs; 29662306a36Sopenharmony_ci struct list_head bpf_bound_maps; 29762306a36Sopenharmony_ci struct netdev_phys_item_id switch_id; 29862306a36Sopenharmony_ci struct list_head port_list; 29962306a36Sopenharmony_ci bool fw_update_status; 30062306a36Sopenharmony_ci u32 fw_update_overwrite_mask; 30162306a36Sopenharmony_ci u32 max_macs; 30262306a36Sopenharmony_ci bool test1; 30362306a36Sopenharmony_ci bool dont_allow_reload; 30462306a36Sopenharmony_ci bool fail_reload; 30562306a36Sopenharmony_ci struct devlink_region *dummy_region; 30662306a36Sopenharmony_ci struct nsim_dev_health health; 30762306a36Sopenharmony_ci struct nsim_dev_hwstats hwstats; 30862306a36Sopenharmony_ci struct flow_action_cookie *fa_cookie; 30962306a36Sopenharmony_ci spinlock_t fa_cookie_lock; /* protects fa_cookie */ 31062306a36Sopenharmony_ci bool fail_trap_group_set; 31162306a36Sopenharmony_ci bool fail_trap_policer_set; 31262306a36Sopenharmony_ci bool fail_trap_policer_counter_get; 31362306a36Sopenharmony_ci bool fail_trap_drop_counter_get; 31462306a36Sopenharmony_ci struct { 31562306a36Sopenharmony_ci struct udp_tunnel_nic_shared utn_shared; 31662306a36Sopenharmony_ci u32 __ports[2][NSIM_UDP_TUNNEL_N_PORTS]; 31762306a36Sopenharmony_ci bool sync_all; 31862306a36Sopenharmony_ci bool open_only; 31962306a36Sopenharmony_ci bool ipv4_only; 32062306a36Sopenharmony_ci bool shared; 32162306a36Sopenharmony_ci bool static_iana_vxlan; 32262306a36Sopenharmony_ci u32 sleep; 32362306a36Sopenharmony_ci } udp_ports; 32462306a36Sopenharmony_ci struct nsim_dev_psample *psample; 32562306a36Sopenharmony_ci u16 esw_mode; 32662306a36Sopenharmony_ci}; 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_cistatic inline bool nsim_esw_mode_is_legacy(struct nsim_dev *nsim_dev) 32962306a36Sopenharmony_ci{ 33062306a36Sopenharmony_ci return nsim_dev->esw_mode == DEVLINK_ESWITCH_MODE_LEGACY; 33162306a36Sopenharmony_ci} 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_cistatic inline bool nsim_esw_mode_is_switchdev(struct nsim_dev *nsim_dev) 33462306a36Sopenharmony_ci{ 33562306a36Sopenharmony_ci return nsim_dev->esw_mode == DEVLINK_ESWITCH_MODE_SWITCHDEV; 33662306a36Sopenharmony_ci} 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_cistatic inline struct net *nsim_dev_net(struct nsim_dev *nsim_dev) 33962306a36Sopenharmony_ci{ 34062306a36Sopenharmony_ci return devlink_net(priv_to_devlink(nsim_dev)); 34162306a36Sopenharmony_ci} 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_ciint nsim_dev_init(void); 34462306a36Sopenharmony_civoid nsim_dev_exit(void); 34562306a36Sopenharmony_ciint nsim_drv_probe(struct nsim_bus_dev *nsim_bus_dev); 34662306a36Sopenharmony_civoid nsim_drv_remove(struct nsim_bus_dev *nsim_bus_dev); 34762306a36Sopenharmony_ciint nsim_drv_port_add(struct nsim_bus_dev *nsim_bus_dev, 34862306a36Sopenharmony_ci enum nsim_dev_port_type type, 34962306a36Sopenharmony_ci unsigned int port_index); 35062306a36Sopenharmony_ciint nsim_drv_port_del(struct nsim_bus_dev *nsim_bus_dev, 35162306a36Sopenharmony_ci enum nsim_dev_port_type type, 35262306a36Sopenharmony_ci unsigned int port_index); 35362306a36Sopenharmony_ciint nsim_drv_configure_vfs(struct nsim_bus_dev *nsim_bus_dev, 35462306a36Sopenharmony_ci unsigned int num_vfs); 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_ciunsigned int nsim_dev_get_vfs(struct nsim_dev *nsim_dev); 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_cistruct nsim_fib_data *nsim_fib_create(struct devlink *devlink, 35962306a36Sopenharmony_ci struct netlink_ext_ack *extack); 36062306a36Sopenharmony_civoid nsim_fib_destroy(struct devlink *devlink, struct nsim_fib_data *fib_data); 36162306a36Sopenharmony_ciu64 nsim_fib_get_val(struct nsim_fib_data *fib_data, 36262306a36Sopenharmony_ci enum nsim_resource_id res_id, bool max); 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_cistatic inline bool nsim_dev_port_is_pf(struct nsim_dev_port *nsim_dev_port) 36562306a36Sopenharmony_ci{ 36662306a36Sopenharmony_ci return nsim_dev_port->port_type == NSIM_DEV_PORT_TYPE_PF; 36762306a36Sopenharmony_ci} 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_cistatic inline bool nsim_dev_port_is_vf(struct nsim_dev_port *nsim_dev_port) 37062306a36Sopenharmony_ci{ 37162306a36Sopenharmony_ci return nsim_dev_port->port_type == NSIM_DEV_PORT_TYPE_VF; 37262306a36Sopenharmony_ci} 37362306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_XFRM_OFFLOAD) 37462306a36Sopenharmony_civoid nsim_ipsec_init(struct netdevsim *ns); 37562306a36Sopenharmony_civoid nsim_ipsec_teardown(struct netdevsim *ns); 37662306a36Sopenharmony_cibool nsim_ipsec_tx(struct netdevsim *ns, struct sk_buff *skb); 37762306a36Sopenharmony_ci#else 37862306a36Sopenharmony_cistatic inline void nsim_ipsec_init(struct netdevsim *ns) 37962306a36Sopenharmony_ci{ 38062306a36Sopenharmony_ci} 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_cistatic inline void nsim_ipsec_teardown(struct netdevsim *ns) 38362306a36Sopenharmony_ci{ 38462306a36Sopenharmony_ci} 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_cistatic inline bool nsim_ipsec_tx(struct netdevsim *ns, struct sk_buff *skb) 38762306a36Sopenharmony_ci{ 38862306a36Sopenharmony_ci return true; 38962306a36Sopenharmony_ci} 39062306a36Sopenharmony_ci#endif 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_MACSEC) 39362306a36Sopenharmony_civoid nsim_macsec_init(struct netdevsim *ns); 39462306a36Sopenharmony_civoid nsim_macsec_teardown(struct netdevsim *ns); 39562306a36Sopenharmony_ci#else 39662306a36Sopenharmony_cistatic inline void nsim_macsec_init(struct netdevsim *ns) 39762306a36Sopenharmony_ci{ 39862306a36Sopenharmony_ci} 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_cistatic inline void nsim_macsec_teardown(struct netdevsim *ns) 40162306a36Sopenharmony_ci{ 40262306a36Sopenharmony_ci} 40362306a36Sopenharmony_ci#endif 40462306a36Sopenharmony_ci 40562306a36Sopenharmony_cistruct nsim_bus_dev { 40662306a36Sopenharmony_ci struct device dev; 40762306a36Sopenharmony_ci struct list_head list; 40862306a36Sopenharmony_ci unsigned int port_count; 40962306a36Sopenharmony_ci unsigned int num_queues; /* Number of queues for each port on this bus */ 41062306a36Sopenharmony_ci struct net *initial_net; /* Purpose of this is to carry net pointer 41162306a36Sopenharmony_ci * during the probe time only. 41262306a36Sopenharmony_ci */ 41362306a36Sopenharmony_ci unsigned int max_vfs; 41462306a36Sopenharmony_ci unsigned int num_vfs; 41562306a36Sopenharmony_ci bool init; 41662306a36Sopenharmony_ci}; 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_ciint nsim_bus_init(void); 41962306a36Sopenharmony_civoid nsim_bus_exit(void); 420