Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.15.
  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
 16#include <linux/device.h>
 17#include <linux/kernel.h>
 18#include <linux/list.h>
 19#include <linux/netdevice.h>
 20#include <linux/u64_stats_sync.h>
 21#include <net/devlink.h>
 22#include <net/xdp.h>
 23
 24#define DRV_NAME	"netdevsim"
 25
 26#define NSIM_XDP_MAX_MTU	4000
 27
 28#define NSIM_EA(extack, msg)	NL_SET_ERR_MSG_MOD((extack), msg)
 29
 30#define NSIM_IPSEC_MAX_SA_COUNT		33
 31#define NSIM_IPSEC_VALID		BIT(31)
 32
 33struct nsim_sa {
 34	struct xfrm_state *xs;
 35	__be32 ipaddr[4];
 36	u32 key[4];
 37	u32 salt;
 38	bool used;
 39	bool crypt;
 40	bool rx;
 41};
 42
 43struct nsim_ipsec {
 44	struct nsim_sa sa[NSIM_IPSEC_MAX_SA_COUNT];
 45	struct dentry *pfile;
 46	u32 count;
 47	u32 tx;
 48	u32 ok;
 49};
 50
 51struct netdevsim {
 52	struct net_device *netdev;
 53	struct nsim_dev *nsim_dev;
 54	struct nsim_dev_port *nsim_dev_port;
 55
 56	u64 tx_packets;
 57	u64 tx_bytes;
 58	struct u64_stats_sync syncp;
 59
 60	struct nsim_bus_dev *nsim_bus_dev;
 61
 62	struct bpf_prog	*bpf_offloaded;
 63	u32 bpf_offloaded_id;
 64
 65	struct xdp_attachment_info xdp;
 66	struct xdp_attachment_info xdp_hw;
 67
 68	bool bpf_tc_accept;
 69	bool bpf_tc_non_bound_accept;
 70	bool bpf_xdpdrv_accept;
 71	bool bpf_xdpoffload_accept;
 72
 73	bool bpf_map_accept;
 74	struct nsim_ipsec ipsec;
 75};
 76
 77struct netdevsim *
 78nsim_create(struct nsim_dev *nsim_dev, struct nsim_dev_port *nsim_dev_port);
 79void nsim_destroy(struct netdevsim *ns);
 80
 81#ifdef CONFIG_BPF_SYSCALL
 82int nsim_bpf_dev_init(struct nsim_dev *nsim_dev);
 83void nsim_bpf_dev_exit(struct nsim_dev *nsim_dev);
 84int nsim_bpf_init(struct netdevsim *ns);
 85void nsim_bpf_uninit(struct netdevsim *ns);
 86int nsim_bpf(struct net_device *dev, struct netdev_bpf *bpf);
 87int nsim_bpf_disable_tc(struct netdevsim *ns);
 88int nsim_bpf_setup_tc_block_cb(enum tc_setup_type type,
 89			       void *type_data, void *cb_priv);
 90#else
 91
 92static inline int nsim_bpf_dev_init(struct nsim_dev *nsim_dev)
 93{
 94	return 0;
 95}
 96
 97static inline void nsim_bpf_dev_exit(struct nsim_dev *nsim_dev)
 98{
 99}
100static inline int nsim_bpf_init(struct netdevsim *ns)
101{
102	return 0;
103}
104
105static inline void nsim_bpf_uninit(struct netdevsim *ns)
106{
107}
108
109static inline int nsim_bpf(struct net_device *dev, struct netdev_bpf *bpf)
110{
111	return bpf->command == XDP_QUERY_PROG ? 0 : -EOPNOTSUPP;
112}
113
114static inline int nsim_bpf_disable_tc(struct netdevsim *ns)
115{
116	return 0;
117}
118
119static inline int
120nsim_bpf_setup_tc_block_cb(enum tc_setup_type type, void *type_data,
121			   void *cb_priv)
122{
123	return -EOPNOTSUPP;
124}
125#endif
126
127enum nsim_resource_id {
128	NSIM_RESOURCE_NONE,   /* DEVLINK_RESOURCE_ID_PARENT_TOP */
129	NSIM_RESOURCE_IPV4,
130	NSIM_RESOURCE_IPV4_FIB,
131	NSIM_RESOURCE_IPV4_FIB_RULES,
132	NSIM_RESOURCE_IPV6,
133	NSIM_RESOURCE_IPV6_FIB,
134	NSIM_RESOURCE_IPV6_FIB_RULES,
135};
136
137struct nsim_dev_port {
138	struct list_head list;
139	struct devlink_port devlink_port;
140	unsigned int port_index;
141	struct dentry *ddir;
142	struct netdevsim *ns;
143};
144
145struct nsim_dev {
146	struct nsim_bus_dev *nsim_bus_dev;
147	struct nsim_fib_data *fib_data;
148	struct nsim_trap_data *trap_data;
149	struct dentry *ddir;
150	struct dentry *ports_ddir;
151	struct bpf_offload_dev *bpf_dev;
152	bool bpf_bind_accept;
153	u32 bpf_bind_verifier_delay;
154	struct dentry *ddir_bpf_bound_progs;
155	u32 prog_id_gen;
156	struct list_head bpf_bound_progs;
157	struct list_head bpf_bound_maps;
158	struct netdev_phys_item_id switch_id;
159	struct list_head port_list;
160	struct mutex port_list_lock; /* protects port list */
161	bool fw_update_status;
162	u32 max_macs;
163	bool test1;
164	struct devlink_region *dummy_region;
165};
166
167int nsim_dev_init(void);
168void nsim_dev_exit(void);
169int nsim_dev_probe(struct nsim_bus_dev *nsim_bus_dev);
170void nsim_dev_remove(struct nsim_bus_dev *nsim_bus_dev);
171int nsim_dev_port_add(struct nsim_bus_dev *nsim_bus_dev,
172		      unsigned int port_index);
173int nsim_dev_port_del(struct nsim_bus_dev *nsim_bus_dev,
174		      unsigned int port_index);
175
176int nsim_fib_init(void);
177void nsim_fib_exit(void);
178u64 nsim_fib_get_val(struct net *net, enum nsim_resource_id res_id, bool max);
179int nsim_fib_set_max(struct net *net, enum nsim_resource_id res_id, u64 val,
180		     struct netlink_ext_ack *extack);
181
182#if IS_ENABLED(CONFIG_XFRM_OFFLOAD)
183void nsim_ipsec_init(struct netdevsim *ns);
184void nsim_ipsec_teardown(struct netdevsim *ns);
185bool nsim_ipsec_tx(struct netdevsim *ns, struct sk_buff *skb);
186#else
187static inline void nsim_ipsec_init(struct netdevsim *ns)
188{
189}
190
191static inline void nsim_ipsec_teardown(struct netdevsim *ns)
192{
193}
194
195static inline bool nsim_ipsec_tx(struct netdevsim *ns, struct sk_buff *skb)
196{
197	return true;
198}
199#endif
200
201struct nsim_vf_config {
202	int link_state;
203	u16 min_tx_rate;
204	u16 max_tx_rate;
205	u16 vlan;
206	__be16 vlan_proto;
207	u16 qos;
208	u8 vf_mac[ETH_ALEN];
209	bool spoofchk_enabled;
210	bool trusted;
211	bool rss_query_enabled;
212};
213
214struct nsim_bus_dev {
215	struct device dev;
216	struct list_head list;
217	unsigned int port_count;
218	unsigned int num_vfs;
219	struct nsim_vf_config *vfconfigs;
220};
221
222int nsim_bus_init(void);
223void nsim_bus_exit(void);