Jakub Kicinski | 83c9e13 | 2017-12-01 15:08:58 -0800 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2017 Netronome Systems, Inc. |
| 3 | * |
| 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 |
| 6 | * source tree. |
| 7 | * |
| 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. |
| 14 | */ |
| 15 | |
Jakub Kicinski | 424be63 | 2020-07-09 17:42:48 -0700 | [diff] [blame] | 16 | #include <linux/debugfs.h> |
Jakub Kicinski | 7957922 | 2017-12-01 15:09:01 -0800 | [diff] [blame] | 17 | #include <linux/device.h> |
Antonio Cardace | a7fc6db | 2020-11-18 21:45:19 +0100 | [diff] [blame] | 18 | #include <linux/ethtool.h> |
Jakub Kicinski | 83c9e13 | 2017-12-01 15:08:58 -0800 | [diff] [blame] | 19 | #include <linux/kernel.h> |
Jakub Kicinski | 31d3ad8 | 2017-12-01 15:08:59 -0800 | [diff] [blame] | 20 | #include <linux/list.h> |
Jakub Kicinski | 83c9e13 | 2017-12-01 15:08:58 -0800 | [diff] [blame] | 21 | #include <linux/netdevice.h> |
| 22 | #include <linux/u64_stats_sync.h> |
Jiri Pirko | 8320d14 | 2019-04-25 15:59:53 +0200 | [diff] [blame] | 23 | #include <net/devlink.h> |
Jakub Kicinski | dc9c075 | 2020-09-25 17:56:42 -0700 | [diff] [blame] | 24 | #include <net/udp_tunnel.h> |
Jakub Kicinski | 0529662 | 2018-07-11 20:36:40 -0700 | [diff] [blame] | 25 | #include <net/xdp.h> |
Jakub Kicinski | 83c9e13 | 2017-12-01 15:08:58 -0800 | [diff] [blame] | 26 | |
| 27 | #define DRV_NAME "netdevsim" |
| 28 | |
Jakub Kicinski | 31d3ad8 | 2017-12-01 15:08:59 -0800 | [diff] [blame] | 29 | #define NSIM_XDP_MAX_MTU 4000 |
| 30 | |
| 31 | #define NSIM_EA(extack, msg) NL_SET_ERR_MSG_MOD((extack), msg) |
| 32 | |
Shannon Nelson | 7699353 | 2018-06-26 10:07:54 -0700 | [diff] [blame] | 33 | #define NSIM_IPSEC_MAX_SA_COUNT 33 |
| 34 | #define NSIM_IPSEC_VALID BIT(31) |
Jakub Kicinski | 424be63 | 2020-07-09 17:42:48 -0700 | [diff] [blame] | 35 | #define NSIM_UDP_TUNNEL_N_PORTS 4 |
Shannon Nelson | 7699353 | 2018-06-26 10:07:54 -0700 | [diff] [blame] | 36 | |
| 37 | struct nsim_sa { |
| 38 | struct xfrm_state *xs; |
| 39 | __be32 ipaddr[4]; |
| 40 | u32 key[4]; |
| 41 | u32 salt; |
| 42 | bool used; |
| 43 | bool crypt; |
| 44 | bool rx; |
| 45 | }; |
| 46 | |
| 47 | struct nsim_ipsec { |
| 48 | struct nsim_sa sa[NSIM_IPSEC_MAX_SA_COUNT]; |
| 49 | struct dentry *pfile; |
| 50 | u32 count; |
| 51 | u32 tx; |
| 52 | u32 ok; |
| 53 | }; |
| 54 | |
Antonio Cardace | 77f9591 | 2020-11-18 21:45:18 +0100 | [diff] [blame] | 55 | struct nsim_ethtool_pauseparam { |
Jakub Kicinski | ff1f7c1 | 2020-09-14 17:11:54 -0700 | [diff] [blame] | 56 | bool rx; |
| 57 | bool tx; |
| 58 | bool report_stats_rx; |
| 59 | bool report_stats_tx; |
| 60 | }; |
| 61 | |
Antonio Cardace | 77f9591 | 2020-11-18 21:45:18 +0100 | [diff] [blame] | 62 | struct nsim_ethtool { |
Jakub Kicinski | 0d7f76d | 2021-03-29 20:59:53 -0700 | [diff] [blame] | 63 | u32 get_err; |
| 64 | u32 set_err; |
Antonio Cardace | 77f9591 | 2020-11-18 21:45:18 +0100 | [diff] [blame] | 65 | struct nsim_ethtool_pauseparam pauseparam; |
Antonio Cardace | a7fc6db | 2020-11-18 21:45:19 +0100 | [diff] [blame] | 66 | struct ethtool_coalesce coalesce; |
| 67 | struct ethtool_ringparam ring; |
Jakub Kicinski | 0d7f76d | 2021-03-29 20:59:53 -0700 | [diff] [blame] | 68 | struct ethtool_fecparam fec; |
Antonio Cardace | 77f9591 | 2020-11-18 21:45:18 +0100 | [diff] [blame] | 69 | }; |
| 70 | |
Jakub Kicinski | 83c9e13 | 2017-12-01 15:08:58 -0800 | [diff] [blame] | 71 | struct netdevsim { |
Jakub Kicinski | 31d3ad8 | 2017-12-01 15:08:59 -0800 | [diff] [blame] | 72 | struct net_device *netdev; |
Jiri Pirko | a60f9e4 | 2019-04-25 15:59:49 +0200 | [diff] [blame] | 73 | struct nsim_dev *nsim_dev; |
Jiri Pirko | e05b2d1 | 2019-04-25 15:59:55 +0200 | [diff] [blame] | 74 | struct nsim_dev_port *nsim_dev_port; |
Jakub Kicinski | 31d3ad8 | 2017-12-01 15:08:59 -0800 | [diff] [blame] | 75 | |
Jakub Kicinski | 83c9e13 | 2017-12-01 15:08:58 -0800 | [diff] [blame] | 76 | u64 tx_packets; |
| 77 | u64 tx_bytes; |
| 78 | struct u64_stats_sync syncp; |
Jakub Kicinski | 31d3ad8 | 2017-12-01 15:08:59 -0800 | [diff] [blame] | 79 | |
Jiri Pirko | 40e4fe4 | 2019-04-25 15:59:45 +0200 | [diff] [blame] | 80 | struct nsim_bus_dev *nsim_bus_dev; |
Jakub Kicinski | 7957922 | 2017-12-01 15:09:01 -0800 | [diff] [blame] | 81 | |
Jakub Kicinski | 31d3ad8 | 2017-12-01 15:08:59 -0800 | [diff] [blame] | 82 | struct bpf_prog *bpf_offloaded; |
| 83 | u32 bpf_offloaded_id; |
| 84 | |
Jakub Kicinski | 0529662 | 2018-07-11 20:36:40 -0700 | [diff] [blame] | 85 | struct xdp_attachment_info xdp; |
Jakub Kicinski | 799e173 | 2018-07-11 20:36:42 -0700 | [diff] [blame] | 86 | struct xdp_attachment_info xdp_hw; |
Jakub Kicinski | 31d3ad8 | 2017-12-01 15:08:59 -0800 | [diff] [blame] | 87 | |
Jakub Kicinski | 31d3ad8 | 2017-12-01 15:08:59 -0800 | [diff] [blame] | 88 | bool bpf_tc_accept; |
| 89 | bool bpf_tc_non_bound_accept; |
| 90 | bool bpf_xdpdrv_accept; |
| 91 | bool bpf_xdpoffload_accept; |
Jakub Kicinski | 395cacb | 2018-01-17 19:13:30 -0800 | [diff] [blame] | 92 | |
| 93 | bool bpf_map_accept; |
Shannon Nelson | 7699353 | 2018-06-26 10:07:54 -0700 | [diff] [blame] | 94 | struct nsim_ipsec ipsec; |
Jakub Kicinski | 424be63 | 2020-07-09 17:42:48 -0700 | [diff] [blame] | 95 | struct { |
| 96 | u32 inject_error; |
| 97 | u32 sleep; |
Jakub Kicinski | dc9c075 | 2020-09-25 17:56:42 -0700 | [diff] [blame] | 98 | u32 __ports[2][NSIM_UDP_TUNNEL_N_PORTS]; |
| 99 | u32 (*ports)[NSIM_UDP_TUNNEL_N_PORTS]; |
Jakub Kicinski | 424be63 | 2020-07-09 17:42:48 -0700 | [diff] [blame] | 100 | struct debugfs_u32_array dfs_ports[2]; |
| 101 | } udp_ports; |
Jakub Kicinski | ff1f7c1 | 2020-09-14 17:11:54 -0700 | [diff] [blame] | 102 | |
| 103 | struct nsim_ethtool ethtool; |
Jakub Kicinski | 83c9e13 | 2017-12-01 15:08:58 -0800 | [diff] [blame] | 104 | }; |
Jakub Kicinski | 31d3ad8 | 2017-12-01 15:08:59 -0800 | [diff] [blame] | 105 | |
Jiri Pirko | e05b2d1 | 2019-04-25 15:59:55 +0200 | [diff] [blame] | 106 | struct netdevsim * |
| 107 | nsim_create(struct nsim_dev *nsim_dev, struct nsim_dev_port *nsim_dev_port); |
| 108 | void nsim_destroy(struct netdevsim *ns); |
| 109 | |
Jakub Kicinski | ff1f7c1 | 2020-09-14 17:11:54 -0700 | [diff] [blame] | 110 | void nsim_ethtool_init(struct netdevsim *ns); |
| 111 | |
Jakub Kicinski | 424be63 | 2020-07-09 17:42:48 -0700 | [diff] [blame] | 112 | void nsim_udp_tunnels_debugfs_create(struct nsim_dev *nsim_dev); |
| 113 | int nsim_udp_tunnels_info_create(struct nsim_dev *nsim_dev, |
| 114 | struct net_device *dev); |
| 115 | void nsim_udp_tunnels_info_destroy(struct net_device *dev); |
| 116 | |
Jakub Kicinski | 7c5db7e | 2018-01-23 11:22:54 -0800 | [diff] [blame] | 117 | #ifdef CONFIG_BPF_SYSCALL |
Jiri Pirko | d514f41 | 2019-04-25 15:59:50 +0200 | [diff] [blame] | 118 | int nsim_bpf_dev_init(struct nsim_dev *nsim_dev); |
| 119 | void nsim_bpf_dev_exit(struct nsim_dev *nsim_dev); |
Jakub Kicinski | 31d3ad8 | 2017-12-01 15:08:59 -0800 | [diff] [blame] | 120 | int nsim_bpf_init(struct netdevsim *ns); |
| 121 | void nsim_bpf_uninit(struct netdevsim *ns); |
| 122 | int nsim_bpf(struct net_device *dev, struct netdev_bpf *bpf); |
| 123 | int nsim_bpf_disable_tc(struct netdevsim *ns); |
| 124 | int nsim_bpf_setup_tc_block_cb(enum tc_setup_type type, |
| 125 | void *type_data, void *cb_priv); |
Jakub Kicinski | 7c5db7e | 2018-01-23 11:22:54 -0800 | [diff] [blame] | 126 | #else |
Jiri Pirko | d514f41 | 2019-04-25 15:59:50 +0200 | [diff] [blame] | 127 | |
| 128 | static inline int nsim_bpf_dev_init(struct nsim_dev *nsim_dev) |
| 129 | { |
| 130 | return 0; |
| 131 | } |
| 132 | |
| 133 | static inline void nsim_bpf_dev_exit(struct nsim_dev *nsim_dev) |
| 134 | { |
| 135 | } |
Jakub Kicinski | 7c5db7e | 2018-01-23 11:22:54 -0800 | [diff] [blame] | 136 | static inline int nsim_bpf_init(struct netdevsim *ns) |
| 137 | { |
| 138 | return 0; |
| 139 | } |
| 140 | |
| 141 | static inline void nsim_bpf_uninit(struct netdevsim *ns) |
| 142 | { |
| 143 | } |
| 144 | |
| 145 | static inline int nsim_bpf(struct net_device *dev, struct netdev_bpf *bpf) |
| 146 | { |
Andrii Nakryiko | e8407fd | 2020-07-21 23:46:02 -0700 | [diff] [blame] | 147 | return -EOPNOTSUPP; |
Jakub Kicinski | 7c5db7e | 2018-01-23 11:22:54 -0800 | [diff] [blame] | 148 | } |
| 149 | |
| 150 | static inline int nsim_bpf_disable_tc(struct netdevsim *ns) |
| 151 | { |
| 152 | return 0; |
| 153 | } |
| 154 | |
| 155 | static inline int |
| 156 | nsim_bpf_setup_tc_block_cb(enum tc_setup_type type, void *type_data, |
| 157 | void *cb_priv) |
| 158 | { |
| 159 | return -EOPNOTSUPP; |
| 160 | } |
| 161 | #endif |
Jakub Kicinski | 7957922 | 2017-12-01 15:09:01 -0800 | [diff] [blame] | 162 | |
David Ahern | 37923ed | 2018-03-27 18:22:00 -0700 | [diff] [blame] | 163 | enum nsim_resource_id { |
| 164 | NSIM_RESOURCE_NONE, /* DEVLINK_RESOURCE_ID_PARENT_TOP */ |
| 165 | NSIM_RESOURCE_IPV4, |
| 166 | NSIM_RESOURCE_IPV4_FIB, |
| 167 | NSIM_RESOURCE_IPV4_FIB_RULES, |
| 168 | NSIM_RESOURCE_IPV6, |
| 169 | NSIM_RESOURCE_IPV6_FIB, |
| 170 | NSIM_RESOURCE_IPV6_FIB_RULES, |
Ido Schimmel | 3526625 | 2020-11-04 15:30:37 +0200 | [diff] [blame] | 171 | NSIM_RESOURCE_NEXTHOPS, |
David Ahern | 37923ed | 2018-03-27 18:22:00 -0700 | [diff] [blame] | 172 | }; |
| 173 | |
Jiri Pirko | 82c93a8 | 2019-10-10 15:18:50 +0200 | [diff] [blame] | 174 | struct nsim_dev_health { |
| 175 | struct devlink_health_reporter *empty_reporter; |
| 176 | struct devlink_health_reporter *dummy_reporter; |
| 177 | struct dentry *ddir; |
| 178 | char *recovered_break_msg; |
| 179 | u32 binary_len; |
| 180 | bool fail_recover; |
| 181 | }; |
| 182 | |
| 183 | int nsim_dev_health_init(struct nsim_dev *nsim_dev, struct devlink *devlink); |
| 184 | void nsim_dev_health_exit(struct nsim_dev *nsim_dev); |
| 185 | |
Ido Schimmel | a8700c3 | 2021-03-14 14:19:32 +0200 | [diff] [blame] | 186 | #if IS_ENABLED(CONFIG_PSAMPLE) |
| 187 | int nsim_dev_psample_init(struct nsim_dev *nsim_dev); |
| 188 | void nsim_dev_psample_exit(struct nsim_dev *nsim_dev); |
| 189 | #else |
| 190 | static inline int nsim_dev_psample_init(struct nsim_dev *nsim_dev) |
| 191 | { |
| 192 | return 0; |
| 193 | } |
| 194 | |
| 195 | static inline void nsim_dev_psample_exit(struct nsim_dev *nsim_dev) |
| 196 | { |
| 197 | } |
| 198 | #endif |
| 199 | |
Dmytro Linkin | 814b9ce | 2021-06-02 15:17:16 +0300 | [diff] [blame] | 200 | enum nsim_dev_port_type { |
| 201 | NSIM_DEV_PORT_TYPE_PF, |
| 202 | NSIM_DEV_PORT_TYPE_VF, |
| 203 | }; |
| 204 | |
| 205 | #define NSIM_DEV_VF_PORT_INDEX_BASE 128 |
| 206 | #define NSIM_DEV_VF_PORT_INDEX_MAX UINT_MAX |
| 207 | |
Jiri Pirko | 8320d14 | 2019-04-25 15:59:53 +0200 | [diff] [blame] | 208 | struct nsim_dev_port { |
| 209 | struct list_head list; |
| 210 | struct devlink_port devlink_port; |
| 211 | unsigned int port_index; |
Dmytro Linkin | 814b9ce | 2021-06-02 15:17:16 +0300 | [diff] [blame] | 212 | enum nsim_dev_port_type port_type; |
Jiri Pirko | 8320d14 | 2019-04-25 15:59:53 +0200 | [diff] [blame] | 213 | struct dentry *ddir; |
Dmytro Linkin | f3d101b | 2021-06-02 15:17:29 +0300 | [diff] [blame] | 214 | struct dentry *rate_parent; |
| 215 | char *parent_name; |
Jiri Pirko | e05b2d1 | 2019-04-25 15:59:55 +0200 | [diff] [blame] | 216 | struct netdevsim *ns; |
Jiri Pirko | 8320d14 | 2019-04-25 15:59:53 +0200 | [diff] [blame] | 217 | }; |
| 218 | |
Jiri Pirko | a60f9e4 | 2019-04-25 15:59:49 +0200 | [diff] [blame] | 219 | struct nsim_dev { |
Jiri Pirko | d514f41 | 2019-04-25 15:59:50 +0200 | [diff] [blame] | 220 | struct nsim_bus_dev *nsim_bus_dev; |
Jiri Pirko | a60f9e4 | 2019-04-25 15:59:49 +0200 | [diff] [blame] | 221 | struct nsim_fib_data *fib_data; |
Ido Schimmel | da58f90 | 2019-08-17 16:28:20 +0300 | [diff] [blame] | 222 | struct nsim_trap_data *trap_data; |
Jiri Pirko | d514f41 | 2019-04-25 15:59:50 +0200 | [diff] [blame] | 223 | struct dentry *ddir; |
Jiri Pirko | ab1d0cc | 2019-04-25 15:59:52 +0200 | [diff] [blame] | 224 | struct dentry *ports_ddir; |
Taehee Yoo | 8526ad9 | 2020-02-01 16:43:13 +0000 | [diff] [blame] | 225 | struct dentry *take_snapshot; |
Dmytro Linkin | d395381 | 2021-06-02 15:17:14 +0300 | [diff] [blame] | 226 | struct dentry *max_vfs; |
Dmytro Linkin | 885226f | 2021-06-02 15:17:26 +0300 | [diff] [blame] | 227 | struct dentry *nodes_ddir; |
Jiri Pirko | d514f41 | 2019-04-25 15:59:50 +0200 | [diff] [blame] | 228 | struct bpf_offload_dev *bpf_dev; |
| 229 | bool bpf_bind_accept; |
Toke Høiland-Jørgensen | e4ff5aa | 2020-12-09 14:57:39 +0100 | [diff] [blame] | 230 | bool bpf_bind_verifier_accept; |
Jiri Pirko | d514f41 | 2019-04-25 15:59:50 +0200 | [diff] [blame] | 231 | u32 bpf_bind_verifier_delay; |
| 232 | struct dentry *ddir_bpf_bound_progs; |
| 233 | u32 prog_id_gen; |
| 234 | struct list_head bpf_bound_progs; |
| 235 | struct list_head bpf_bound_maps; |
Jiri Pirko | 514cf64 | 2019-04-25 15:59:51 +0200 | [diff] [blame] | 236 | struct netdev_phys_item_id switch_id; |
Jiri Pirko | 8320d14 | 2019-04-25 15:59:53 +0200 | [diff] [blame] | 237 | struct list_head port_list; |
Jiri Pirko | 794b2c0 | 2019-04-25 15:59:54 +0200 | [diff] [blame] | 238 | struct mutex port_list_lock; /* protects port list */ |
Jiri Pirko | fa4dfc4 | 2019-06-04 15:40:43 +0200 | [diff] [blame] | 239 | bool fw_update_status; |
Jacob Keller | cbb5836 | 2020-09-25 13:46:08 -0700 | [diff] [blame] | 240 | u32 fw_update_overwrite_mask; |
Jiri Pirko | 150e8f8 | 2019-08-09 13:05:12 +0200 | [diff] [blame] | 241 | u32 max_macs; |
| 242 | bool test1; |
Jiri Pirko | 155ddfc | 2019-10-06 08:30:01 +0200 | [diff] [blame] | 243 | bool dont_allow_reload; |
| 244 | bool fail_reload; |
Jiri Pirko | 4418f86 | 2019-08-15 15:46:33 +0200 | [diff] [blame] | 245 | struct devlink_region *dummy_region; |
Jiri Pirko | 82c93a8 | 2019-10-10 15:18:50 +0200 | [diff] [blame] | 246 | struct nsim_dev_health health; |
Jiri Pirko | d3cbb90 | 2020-02-25 11:45:26 +0100 | [diff] [blame] | 247 | struct flow_action_cookie *fa_cookie; |
| 248 | spinlock_t fa_cookie_lock; /* protects fa_cookie */ |
Ido Schimmel | 0dc8249 | 2020-03-30 22:38:23 +0300 | [diff] [blame] | 249 | bool fail_trap_group_set; |
Ido Schimmel | ad18845 | 2020-03-30 22:38:20 +0300 | [diff] [blame] | 250 | bool fail_trap_policer_set; |
| 251 | bool fail_trap_policer_counter_get; |
Oleksandr Mazur | 275b51c | 2021-06-17 14:36:32 +0300 | [diff] [blame] | 252 | bool fail_trap_drop_counter_get; |
Jakub Kicinski | 424be63 | 2020-07-09 17:42:48 -0700 | [diff] [blame] | 253 | struct { |
Jakub Kicinski | dc9c075 | 2020-09-25 17:56:42 -0700 | [diff] [blame] | 254 | struct udp_tunnel_nic_shared utn_shared; |
| 255 | u32 __ports[2][NSIM_UDP_TUNNEL_N_PORTS]; |
Jakub Kicinski | 424be63 | 2020-07-09 17:42:48 -0700 | [diff] [blame] | 256 | bool sync_all; |
| 257 | bool open_only; |
| 258 | bool ipv4_only; |
Jakub Kicinski | dc9c075 | 2020-09-25 17:56:42 -0700 | [diff] [blame] | 259 | bool shared; |
Jakub Kicinski | dda7517 | 2020-09-25 17:56:47 -0700 | [diff] [blame] | 260 | bool static_iana_vxlan; |
Jakub Kicinski | 424be63 | 2020-07-09 17:42:48 -0700 | [diff] [blame] | 261 | u32 sleep; |
| 262 | } udp_ports; |
Ido Schimmel | a8700c3 | 2021-03-14 14:19:32 +0200 | [diff] [blame] | 263 | struct nsim_dev_psample *psample; |
Dmytro Linkin | 160dc37 | 2021-06-02 15:17:18 +0300 | [diff] [blame] | 264 | u16 esw_mode; |
Jiri Pirko | a60f9e4 | 2019-04-25 15:59:49 +0200 | [diff] [blame] | 265 | }; |
| 266 | |
Dmytro Linkin | 160dc37 | 2021-06-02 15:17:18 +0300 | [diff] [blame] | 267 | int nsim_esw_legacy_enable(struct nsim_dev *nsim_dev, struct netlink_ext_ack *extack); |
| 268 | int nsim_esw_switchdev_enable(struct nsim_dev *nsim_dev, struct netlink_ext_ack *extack); |
| 269 | |
| 270 | static inline bool nsim_esw_mode_is_legacy(struct nsim_dev *nsim_dev) |
| 271 | { |
| 272 | return nsim_dev->esw_mode == DEVLINK_ESWITCH_MODE_LEGACY; |
| 273 | } |
| 274 | |
| 275 | static inline bool nsim_esw_mode_is_switchdev(struct nsim_dev *nsim_dev) |
| 276 | { |
| 277 | return nsim_dev->esw_mode == DEVLINK_ESWITCH_MODE_SWITCHDEV; |
| 278 | } |
| 279 | |
Jiri Pirko | 90d2991 | 2019-10-03 11:49:37 +0200 | [diff] [blame] | 280 | static inline struct net *nsim_dev_net(struct nsim_dev *nsim_dev) |
| 281 | { |
| 282 | return devlink_net(priv_to_devlink(nsim_dev)); |
| 283 | } |
| 284 | |
Jiri Pirko | d514f41 | 2019-04-25 15:59:50 +0200 | [diff] [blame] | 285 | int nsim_dev_init(void); |
| 286 | void nsim_dev_exit(void); |
Jiri Pirko | 8320d14 | 2019-04-25 15:59:53 +0200 | [diff] [blame] | 287 | int nsim_dev_probe(struct nsim_bus_dev *nsim_bus_dev); |
| 288 | void nsim_dev_remove(struct nsim_bus_dev *nsim_bus_dev); |
Jiri Pirko | 794b2c0 | 2019-04-25 15:59:54 +0200 | [diff] [blame] | 289 | int nsim_dev_port_add(struct nsim_bus_dev *nsim_bus_dev, |
Dmytro Linkin | 814b9ce | 2021-06-02 15:17:16 +0300 | [diff] [blame] | 290 | enum nsim_dev_port_type type, |
Jiri Pirko | 794b2c0 | 2019-04-25 15:59:54 +0200 | [diff] [blame] | 291 | unsigned int port_index); |
| 292 | int nsim_dev_port_del(struct nsim_bus_dev *nsim_bus_dev, |
Dmytro Linkin | 814b9ce | 2021-06-02 15:17:16 +0300 | [diff] [blame] | 293 | enum nsim_dev_port_type type, |
Jiri Pirko | 794b2c0 | 2019-04-25 15:59:54 +0200 | [diff] [blame] | 294 | unsigned int port_index); |
David Ahern | 37923ed | 2018-03-27 18:22:00 -0700 | [diff] [blame] | 295 | |
Jiri Pirko | 75ba029 | 2019-10-03 11:49:36 +0200 | [diff] [blame] | 296 | struct nsim_fib_data *nsim_fib_create(struct devlink *devlink, |
| 297 | struct netlink_ext_ack *extack); |
| 298 | void nsim_fib_destroy(struct devlink *devlink, struct nsim_fib_data *fib_data); |
Jiri Pirko | a5facc4 | 2019-10-03 11:49:26 +0200 | [diff] [blame] | 299 | u64 nsim_fib_get_val(struct nsim_fib_data *fib_data, |
| 300 | enum nsim_resource_id res_id, bool max); |
David Ahern | 37923ed | 2018-03-27 18:22:00 -0700 | [diff] [blame] | 301 | |
Dmytro Linkin | d395381 | 2021-06-02 15:17:14 +0300 | [diff] [blame] | 302 | ssize_t nsim_bus_dev_max_vfs_read(struct file *file, |
| 303 | char __user *data, |
| 304 | size_t count, loff_t *ppos); |
| 305 | ssize_t nsim_bus_dev_max_vfs_write(struct file *file, |
| 306 | const char __user *data, |
| 307 | size_t count, loff_t *ppos); |
Dmytro Linkin | 32ac15d | 2021-06-02 15:17:15 +0300 | [diff] [blame] | 308 | void nsim_bus_dev_vfs_disable(struct nsim_bus_dev *nsim_bus_dev); |
Dmytro Linkin | d395381 | 2021-06-02 15:17:14 +0300 | [diff] [blame] | 309 | |
Dmytro Linkin | 814b9ce | 2021-06-02 15:17:16 +0300 | [diff] [blame] | 310 | static inline bool nsim_dev_port_is_pf(struct nsim_dev_port *nsim_dev_port) |
| 311 | { |
| 312 | return nsim_dev_port->port_type == NSIM_DEV_PORT_TYPE_PF; |
| 313 | } |
| 314 | |
| 315 | static inline bool nsim_dev_port_is_vf(struct nsim_dev_port *nsim_dev_port) |
| 316 | { |
| 317 | return nsim_dev_port->port_type == NSIM_DEV_PORT_TYPE_VF; |
| 318 | } |
Shannon Nelson | 7699353 | 2018-06-26 10:07:54 -0700 | [diff] [blame] | 319 | #if IS_ENABLED(CONFIG_XFRM_OFFLOAD) |
| 320 | void nsim_ipsec_init(struct netdevsim *ns); |
| 321 | void nsim_ipsec_teardown(struct netdevsim *ns); |
| 322 | bool nsim_ipsec_tx(struct netdevsim *ns, struct sk_buff *skb); |
| 323 | #else |
| 324 | static inline void nsim_ipsec_init(struct netdevsim *ns) |
| 325 | { |
| 326 | } |
| 327 | |
| 328 | static inline void nsim_ipsec_teardown(struct netdevsim *ns) |
| 329 | { |
| 330 | } |
| 331 | |
| 332 | static inline bool nsim_ipsec_tx(struct netdevsim *ns, struct sk_buff *skb) |
| 333 | { |
| 334 | return true; |
| 335 | } |
| 336 | #endif |
| 337 | |
Jiri Pirko | 40e4fe4 | 2019-04-25 15:59:45 +0200 | [diff] [blame] | 338 | struct nsim_vf_config { |
| 339 | int link_state; |
| 340 | u16 min_tx_rate; |
| 341 | u16 max_tx_rate; |
| 342 | u16 vlan; |
| 343 | __be16 vlan_proto; |
| 344 | u16 qos; |
| 345 | u8 vf_mac[ETH_ALEN]; |
| 346 | bool spoofchk_enabled; |
| 347 | bool trusted; |
| 348 | bool rss_query_enabled; |
| 349 | }; |
Jiri Pirko | 925f5af | 2019-04-25 15:59:44 +0200 | [diff] [blame] | 350 | |
Jiri Pirko | 40e4fe4 | 2019-04-25 15:59:45 +0200 | [diff] [blame] | 351 | struct nsim_bus_dev { |
| 352 | struct device dev; |
Jiri Pirko | f9d9db4 | 2019-04-25 15:59:48 +0200 | [diff] [blame] | 353 | struct list_head list; |
| 354 | unsigned int port_count; |
Peilin Ye | d4861fc | 2021-07-15 18:52:45 -0700 | [diff] [blame] | 355 | unsigned int num_queues; /* Number of queues for each port on this bus */ |
Jiri Pirko | 7b60027 | 2019-10-05 08:10:32 +0200 | [diff] [blame] | 356 | struct net *initial_net; /* Purpose of this is to carry net pointer |
| 357 | * during the probe time only. |
| 358 | */ |
Dmytro Linkin | d395381 | 2021-06-02 15:17:14 +0300 | [diff] [blame] | 359 | unsigned int max_vfs; |
Jiri Pirko | 40e4fe4 | 2019-04-25 15:59:45 +0200 | [diff] [blame] | 360 | unsigned int num_vfs; |
Dmytro Linkin | d395381 | 2021-06-02 15:17:14 +0300 | [diff] [blame] | 361 | struct mutex vfs_lock; /* Protects vfconfigs */ |
Jiri Pirko | 40e4fe4 | 2019-04-25 15:59:45 +0200 | [diff] [blame] | 362 | struct nsim_vf_config *vfconfigs; |
Taehee Yoo | 6ab6336 | 2020-02-01 16:43:04 +0000 | [diff] [blame] | 363 | /* Lock for devlink->reload_enabled in netdevsim module */ |
| 364 | struct mutex nsim_bus_reload_lock; |
Leon Romanovsky | 5c0418e | 2021-08-05 17:34:28 +0300 | [diff] [blame] | 365 | bool in_reload; |
Taehee Yoo | f5cd216 | 2020-02-01 16:42:54 +0000 | [diff] [blame] | 366 | bool init; |
Jiri Pirko | 40e4fe4 | 2019-04-25 15:59:45 +0200 | [diff] [blame] | 367 | }; |
Jiri Pirko | 925f5af | 2019-04-25 15:59:44 +0200 | [diff] [blame] | 368 | |
Jiri Pirko | 925f5af | 2019-04-25 15:59:44 +0200 | [diff] [blame] | 369 | int nsim_bus_init(void); |
| 370 | void nsim_bus_exit(void); |