xref: /OK3568_Linux_fs/kernel/include/net/switchdev.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * include/net/switchdev.h - Switch device API
4*4882a593Smuzhiyun  * Copyright (c) 2014-2015 Jiri Pirko <jiri@resnulli.us>
5*4882a593Smuzhiyun  * Copyright (c) 2014-2015 Scott Feldman <sfeldma@gmail.com>
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun #ifndef _LINUX_SWITCHDEV_H_
8*4882a593Smuzhiyun #define _LINUX_SWITCHDEV_H_
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <linux/netdevice.h>
11*4882a593Smuzhiyun #include <linux/notifier.h>
12*4882a593Smuzhiyun #include <linux/list.h>
13*4882a593Smuzhiyun #include <net/ip_fib.h>
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #define SWITCHDEV_F_NO_RECURSE		BIT(0)
16*4882a593Smuzhiyun #define SWITCHDEV_F_SKIP_EOPNOTSUPP	BIT(1)
17*4882a593Smuzhiyun #define SWITCHDEV_F_DEFER		BIT(2)
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun struct switchdev_trans {
20*4882a593Smuzhiyun 	bool ph_prepare;
21*4882a593Smuzhiyun };
22*4882a593Smuzhiyun 
switchdev_trans_ph_prepare(struct switchdev_trans * trans)23*4882a593Smuzhiyun static inline bool switchdev_trans_ph_prepare(struct switchdev_trans *trans)
24*4882a593Smuzhiyun {
25*4882a593Smuzhiyun 	return trans && trans->ph_prepare;
26*4882a593Smuzhiyun }
27*4882a593Smuzhiyun 
switchdev_trans_ph_commit(struct switchdev_trans * trans)28*4882a593Smuzhiyun static inline bool switchdev_trans_ph_commit(struct switchdev_trans *trans)
29*4882a593Smuzhiyun {
30*4882a593Smuzhiyun 	return trans && !trans->ph_prepare;
31*4882a593Smuzhiyun }
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun enum switchdev_attr_id {
34*4882a593Smuzhiyun 	SWITCHDEV_ATTR_ID_UNDEFINED,
35*4882a593Smuzhiyun 	SWITCHDEV_ATTR_ID_PORT_STP_STATE,
36*4882a593Smuzhiyun 	SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS,
37*4882a593Smuzhiyun 	SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS,
38*4882a593Smuzhiyun 	SWITCHDEV_ATTR_ID_PORT_MROUTER,
39*4882a593Smuzhiyun 	SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME,
40*4882a593Smuzhiyun 	SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING,
41*4882a593Smuzhiyun 	SWITCHDEV_ATTR_ID_BRIDGE_VLAN_PROTOCOL,
42*4882a593Smuzhiyun 	SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED,
43*4882a593Smuzhiyun 	SWITCHDEV_ATTR_ID_BRIDGE_MROUTER,
44*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_BRIDGE_MRP)
45*4882a593Smuzhiyun 	SWITCHDEV_ATTR_ID_MRP_PORT_ROLE,
46*4882a593Smuzhiyun #endif
47*4882a593Smuzhiyun };
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun struct switchdev_attr {
50*4882a593Smuzhiyun 	struct net_device *orig_dev;
51*4882a593Smuzhiyun 	enum switchdev_attr_id id;
52*4882a593Smuzhiyun 	u32 flags;
53*4882a593Smuzhiyun 	void *complete_priv;
54*4882a593Smuzhiyun 	void (*complete)(struct net_device *dev, int err, void *priv);
55*4882a593Smuzhiyun 	union {
56*4882a593Smuzhiyun 		u8 stp_state;				/* PORT_STP_STATE */
57*4882a593Smuzhiyun 		unsigned long brport_flags;		/* PORT_{PRE}_BRIDGE_FLAGS */
58*4882a593Smuzhiyun 		bool mrouter;				/* PORT_MROUTER */
59*4882a593Smuzhiyun 		clock_t ageing_time;			/* BRIDGE_AGEING_TIME */
60*4882a593Smuzhiyun 		bool vlan_filtering;			/* BRIDGE_VLAN_FILTERING */
61*4882a593Smuzhiyun 		u16 vlan_protocol;			/* BRIDGE_VLAN_PROTOCOL */
62*4882a593Smuzhiyun 		bool mc_disabled;			/* MC_DISABLED */
63*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_BRIDGE_MRP)
64*4882a593Smuzhiyun 		u8 mrp_port_role;			/* MRP_PORT_ROLE */
65*4882a593Smuzhiyun #endif
66*4882a593Smuzhiyun 	} u;
67*4882a593Smuzhiyun };
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun enum switchdev_obj_id {
70*4882a593Smuzhiyun 	SWITCHDEV_OBJ_ID_UNDEFINED,
71*4882a593Smuzhiyun 	SWITCHDEV_OBJ_ID_PORT_VLAN,
72*4882a593Smuzhiyun 	SWITCHDEV_OBJ_ID_PORT_MDB,
73*4882a593Smuzhiyun 	SWITCHDEV_OBJ_ID_HOST_MDB,
74*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_BRIDGE_MRP)
75*4882a593Smuzhiyun 	SWITCHDEV_OBJ_ID_MRP,
76*4882a593Smuzhiyun 	SWITCHDEV_OBJ_ID_RING_TEST_MRP,
77*4882a593Smuzhiyun 	SWITCHDEV_OBJ_ID_RING_ROLE_MRP,
78*4882a593Smuzhiyun 	SWITCHDEV_OBJ_ID_RING_STATE_MRP,
79*4882a593Smuzhiyun 	SWITCHDEV_OBJ_ID_IN_TEST_MRP,
80*4882a593Smuzhiyun 	SWITCHDEV_OBJ_ID_IN_ROLE_MRP,
81*4882a593Smuzhiyun 	SWITCHDEV_OBJ_ID_IN_STATE_MRP,
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun #endif
84*4882a593Smuzhiyun };
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun struct switchdev_obj {
87*4882a593Smuzhiyun 	struct net_device *orig_dev;
88*4882a593Smuzhiyun 	enum switchdev_obj_id id;
89*4882a593Smuzhiyun 	u32 flags;
90*4882a593Smuzhiyun 	void *complete_priv;
91*4882a593Smuzhiyun 	void (*complete)(struct net_device *dev, int err, void *priv);
92*4882a593Smuzhiyun };
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun /* SWITCHDEV_OBJ_ID_PORT_VLAN */
95*4882a593Smuzhiyun struct switchdev_obj_port_vlan {
96*4882a593Smuzhiyun 	struct switchdev_obj obj;
97*4882a593Smuzhiyun 	u16 flags;
98*4882a593Smuzhiyun 	u16 vid_begin;
99*4882a593Smuzhiyun 	u16 vid_end;
100*4882a593Smuzhiyun };
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun #define SWITCHDEV_OBJ_PORT_VLAN(OBJ) \
103*4882a593Smuzhiyun 	container_of((OBJ), struct switchdev_obj_port_vlan, obj)
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun /* SWITCHDEV_OBJ_ID_PORT_MDB */
106*4882a593Smuzhiyun struct switchdev_obj_port_mdb {
107*4882a593Smuzhiyun 	struct switchdev_obj obj;
108*4882a593Smuzhiyun 	unsigned char addr[ETH_ALEN];
109*4882a593Smuzhiyun 	u16 vid;
110*4882a593Smuzhiyun };
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun #define SWITCHDEV_OBJ_PORT_MDB(OBJ) \
113*4882a593Smuzhiyun 	container_of((OBJ), struct switchdev_obj_port_mdb, obj)
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_BRIDGE_MRP)
117*4882a593Smuzhiyun /* SWITCHDEV_OBJ_ID_MRP */
118*4882a593Smuzhiyun struct switchdev_obj_mrp {
119*4882a593Smuzhiyun 	struct switchdev_obj obj;
120*4882a593Smuzhiyun 	struct net_device *p_port;
121*4882a593Smuzhiyun 	struct net_device *s_port;
122*4882a593Smuzhiyun 	u32 ring_id;
123*4882a593Smuzhiyun 	u16 prio;
124*4882a593Smuzhiyun };
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun #define SWITCHDEV_OBJ_MRP(OBJ) \
127*4882a593Smuzhiyun 	container_of((OBJ), struct switchdev_obj_mrp, obj)
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun /* SWITCHDEV_OBJ_ID_RING_TEST_MRP */
130*4882a593Smuzhiyun struct switchdev_obj_ring_test_mrp {
131*4882a593Smuzhiyun 	struct switchdev_obj obj;
132*4882a593Smuzhiyun 	/* The value is in us and a value of 0 represents to stop */
133*4882a593Smuzhiyun 	u32 interval;
134*4882a593Smuzhiyun 	u8 max_miss;
135*4882a593Smuzhiyun 	u32 ring_id;
136*4882a593Smuzhiyun 	u32 period;
137*4882a593Smuzhiyun 	bool monitor;
138*4882a593Smuzhiyun };
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun #define SWITCHDEV_OBJ_RING_TEST_MRP(OBJ) \
141*4882a593Smuzhiyun 	container_of((OBJ), struct switchdev_obj_ring_test_mrp, obj)
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun /* SWICHDEV_OBJ_ID_RING_ROLE_MRP */
144*4882a593Smuzhiyun struct switchdev_obj_ring_role_mrp {
145*4882a593Smuzhiyun 	struct switchdev_obj obj;
146*4882a593Smuzhiyun 	u8 ring_role;
147*4882a593Smuzhiyun 	u32 ring_id;
148*4882a593Smuzhiyun };
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun #define SWITCHDEV_OBJ_RING_ROLE_MRP(OBJ) \
151*4882a593Smuzhiyun 	container_of((OBJ), struct switchdev_obj_ring_role_mrp, obj)
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun struct switchdev_obj_ring_state_mrp {
154*4882a593Smuzhiyun 	struct switchdev_obj obj;
155*4882a593Smuzhiyun 	u8 ring_state;
156*4882a593Smuzhiyun 	u32 ring_id;
157*4882a593Smuzhiyun };
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun #define SWITCHDEV_OBJ_RING_STATE_MRP(OBJ) \
160*4882a593Smuzhiyun 	container_of((OBJ), struct switchdev_obj_ring_state_mrp, obj)
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun /* SWITCHDEV_OBJ_ID_IN_TEST_MRP */
163*4882a593Smuzhiyun struct switchdev_obj_in_test_mrp {
164*4882a593Smuzhiyun 	struct switchdev_obj obj;
165*4882a593Smuzhiyun 	/* The value is in us and a value of 0 represents to stop */
166*4882a593Smuzhiyun 	u32 interval;
167*4882a593Smuzhiyun 	u32 in_id;
168*4882a593Smuzhiyun 	u32 period;
169*4882a593Smuzhiyun 	u8 max_miss;
170*4882a593Smuzhiyun };
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun #define SWITCHDEV_OBJ_IN_TEST_MRP(OBJ) \
173*4882a593Smuzhiyun 	container_of((OBJ), struct switchdev_obj_in_test_mrp, obj)
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun /* SWICHDEV_OBJ_ID_IN_ROLE_MRP */
176*4882a593Smuzhiyun struct switchdev_obj_in_role_mrp {
177*4882a593Smuzhiyun 	struct switchdev_obj obj;
178*4882a593Smuzhiyun 	struct net_device *i_port;
179*4882a593Smuzhiyun 	u32 ring_id;
180*4882a593Smuzhiyun 	u16 in_id;
181*4882a593Smuzhiyun 	u8 in_role;
182*4882a593Smuzhiyun };
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun #define SWITCHDEV_OBJ_IN_ROLE_MRP(OBJ) \
185*4882a593Smuzhiyun 	container_of((OBJ), struct switchdev_obj_in_role_mrp, obj)
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun struct switchdev_obj_in_state_mrp {
188*4882a593Smuzhiyun 	struct switchdev_obj obj;
189*4882a593Smuzhiyun 	u32 in_id;
190*4882a593Smuzhiyun 	u8 in_state;
191*4882a593Smuzhiyun };
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun #define SWITCHDEV_OBJ_IN_STATE_MRP(OBJ) \
194*4882a593Smuzhiyun 	container_of((OBJ), struct switchdev_obj_in_state_mrp, obj)
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun #endif
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun typedef int switchdev_obj_dump_cb_t(struct switchdev_obj *obj);
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun enum switchdev_notifier_type {
201*4882a593Smuzhiyun 	SWITCHDEV_FDB_ADD_TO_BRIDGE = 1,
202*4882a593Smuzhiyun 	SWITCHDEV_FDB_DEL_TO_BRIDGE,
203*4882a593Smuzhiyun 	SWITCHDEV_FDB_ADD_TO_DEVICE,
204*4882a593Smuzhiyun 	SWITCHDEV_FDB_DEL_TO_DEVICE,
205*4882a593Smuzhiyun 	SWITCHDEV_FDB_OFFLOADED,
206*4882a593Smuzhiyun 	SWITCHDEV_FDB_FLUSH_TO_BRIDGE,
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun 	SWITCHDEV_PORT_OBJ_ADD, /* Blocking. */
209*4882a593Smuzhiyun 	SWITCHDEV_PORT_OBJ_DEL, /* Blocking. */
210*4882a593Smuzhiyun 	SWITCHDEV_PORT_ATTR_SET, /* May be blocking . */
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun 	SWITCHDEV_VXLAN_FDB_ADD_TO_BRIDGE,
213*4882a593Smuzhiyun 	SWITCHDEV_VXLAN_FDB_DEL_TO_BRIDGE,
214*4882a593Smuzhiyun 	SWITCHDEV_VXLAN_FDB_ADD_TO_DEVICE,
215*4882a593Smuzhiyun 	SWITCHDEV_VXLAN_FDB_DEL_TO_DEVICE,
216*4882a593Smuzhiyun 	SWITCHDEV_VXLAN_FDB_OFFLOADED,
217*4882a593Smuzhiyun };
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun struct switchdev_notifier_info {
220*4882a593Smuzhiyun 	struct net_device *dev;
221*4882a593Smuzhiyun 	struct netlink_ext_ack *extack;
222*4882a593Smuzhiyun };
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun struct switchdev_notifier_fdb_info {
225*4882a593Smuzhiyun 	struct switchdev_notifier_info info; /* must be first */
226*4882a593Smuzhiyun 	const unsigned char *addr;
227*4882a593Smuzhiyun 	u16 vid;
228*4882a593Smuzhiyun 	u8 added_by_user:1,
229*4882a593Smuzhiyun 	   offloaded:1;
230*4882a593Smuzhiyun };
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun struct switchdev_notifier_port_obj_info {
233*4882a593Smuzhiyun 	struct switchdev_notifier_info info; /* must be first */
234*4882a593Smuzhiyun 	const struct switchdev_obj *obj;
235*4882a593Smuzhiyun 	struct switchdev_trans *trans;
236*4882a593Smuzhiyun 	bool handled;
237*4882a593Smuzhiyun };
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun struct switchdev_notifier_port_attr_info {
240*4882a593Smuzhiyun 	struct switchdev_notifier_info info; /* must be first */
241*4882a593Smuzhiyun 	const struct switchdev_attr *attr;
242*4882a593Smuzhiyun 	struct switchdev_trans *trans;
243*4882a593Smuzhiyun 	bool handled;
244*4882a593Smuzhiyun };
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun static inline struct net_device *
switchdev_notifier_info_to_dev(const struct switchdev_notifier_info * info)247*4882a593Smuzhiyun switchdev_notifier_info_to_dev(const struct switchdev_notifier_info *info)
248*4882a593Smuzhiyun {
249*4882a593Smuzhiyun 	return info->dev;
250*4882a593Smuzhiyun }
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun static inline struct netlink_ext_ack *
switchdev_notifier_info_to_extack(const struct switchdev_notifier_info * info)253*4882a593Smuzhiyun switchdev_notifier_info_to_extack(const struct switchdev_notifier_info *info)
254*4882a593Smuzhiyun {
255*4882a593Smuzhiyun 	return info->extack;
256*4882a593Smuzhiyun }
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun #ifdef CONFIG_NET_SWITCHDEV
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun void switchdev_deferred_process(void);
261*4882a593Smuzhiyun int switchdev_port_attr_set(struct net_device *dev,
262*4882a593Smuzhiyun 			    const struct switchdev_attr *attr);
263*4882a593Smuzhiyun int switchdev_port_obj_add(struct net_device *dev,
264*4882a593Smuzhiyun 			   const struct switchdev_obj *obj,
265*4882a593Smuzhiyun 			   struct netlink_ext_ack *extack);
266*4882a593Smuzhiyun int switchdev_port_obj_del(struct net_device *dev,
267*4882a593Smuzhiyun 			   const struct switchdev_obj *obj);
268*4882a593Smuzhiyun 
269*4882a593Smuzhiyun int register_switchdev_notifier(struct notifier_block *nb);
270*4882a593Smuzhiyun int unregister_switchdev_notifier(struct notifier_block *nb);
271*4882a593Smuzhiyun int call_switchdev_notifiers(unsigned long val, struct net_device *dev,
272*4882a593Smuzhiyun 			     struct switchdev_notifier_info *info,
273*4882a593Smuzhiyun 			     struct netlink_ext_ack *extack);
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun int register_switchdev_blocking_notifier(struct notifier_block *nb);
276*4882a593Smuzhiyun int unregister_switchdev_blocking_notifier(struct notifier_block *nb);
277*4882a593Smuzhiyun int call_switchdev_blocking_notifiers(unsigned long val, struct net_device *dev,
278*4882a593Smuzhiyun 				      struct switchdev_notifier_info *info,
279*4882a593Smuzhiyun 				      struct netlink_ext_ack *extack);
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun void switchdev_port_fwd_mark_set(struct net_device *dev,
282*4882a593Smuzhiyun 				 struct net_device *group_dev,
283*4882a593Smuzhiyun 				 bool joining);
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun int switchdev_handle_port_obj_add(struct net_device *dev,
286*4882a593Smuzhiyun 			struct switchdev_notifier_port_obj_info *port_obj_info,
287*4882a593Smuzhiyun 			bool (*check_cb)(const struct net_device *dev),
288*4882a593Smuzhiyun 			int (*add_cb)(struct net_device *dev,
289*4882a593Smuzhiyun 				      const struct switchdev_obj *obj,
290*4882a593Smuzhiyun 				      struct switchdev_trans *trans,
291*4882a593Smuzhiyun 				      struct netlink_ext_ack *extack));
292*4882a593Smuzhiyun int switchdev_handle_port_obj_del(struct net_device *dev,
293*4882a593Smuzhiyun 			struct switchdev_notifier_port_obj_info *port_obj_info,
294*4882a593Smuzhiyun 			bool (*check_cb)(const struct net_device *dev),
295*4882a593Smuzhiyun 			int (*del_cb)(struct net_device *dev,
296*4882a593Smuzhiyun 				      const struct switchdev_obj *obj));
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun int switchdev_handle_port_attr_set(struct net_device *dev,
299*4882a593Smuzhiyun 			struct switchdev_notifier_port_attr_info *port_attr_info,
300*4882a593Smuzhiyun 			bool (*check_cb)(const struct net_device *dev),
301*4882a593Smuzhiyun 			int (*set_cb)(struct net_device *dev,
302*4882a593Smuzhiyun 				      const struct switchdev_attr *attr,
303*4882a593Smuzhiyun 				      struct switchdev_trans *trans));
304*4882a593Smuzhiyun #else
305*4882a593Smuzhiyun 
switchdev_deferred_process(void)306*4882a593Smuzhiyun static inline void switchdev_deferred_process(void)
307*4882a593Smuzhiyun {
308*4882a593Smuzhiyun }
309*4882a593Smuzhiyun 
switchdev_port_attr_set(struct net_device * dev,const struct switchdev_attr * attr)310*4882a593Smuzhiyun static inline int switchdev_port_attr_set(struct net_device *dev,
311*4882a593Smuzhiyun 					  const struct switchdev_attr *attr)
312*4882a593Smuzhiyun {
313*4882a593Smuzhiyun 	return -EOPNOTSUPP;
314*4882a593Smuzhiyun }
315*4882a593Smuzhiyun 
switchdev_port_obj_add(struct net_device * dev,const struct switchdev_obj * obj,struct netlink_ext_ack * extack)316*4882a593Smuzhiyun static inline int switchdev_port_obj_add(struct net_device *dev,
317*4882a593Smuzhiyun 					 const struct switchdev_obj *obj,
318*4882a593Smuzhiyun 					 struct netlink_ext_ack *extack)
319*4882a593Smuzhiyun {
320*4882a593Smuzhiyun 	return -EOPNOTSUPP;
321*4882a593Smuzhiyun }
322*4882a593Smuzhiyun 
switchdev_port_obj_del(struct net_device * dev,const struct switchdev_obj * obj)323*4882a593Smuzhiyun static inline int switchdev_port_obj_del(struct net_device *dev,
324*4882a593Smuzhiyun 					 const struct switchdev_obj *obj)
325*4882a593Smuzhiyun {
326*4882a593Smuzhiyun 	return -EOPNOTSUPP;
327*4882a593Smuzhiyun }
328*4882a593Smuzhiyun 
register_switchdev_notifier(struct notifier_block * nb)329*4882a593Smuzhiyun static inline int register_switchdev_notifier(struct notifier_block *nb)
330*4882a593Smuzhiyun {
331*4882a593Smuzhiyun 	return 0;
332*4882a593Smuzhiyun }
333*4882a593Smuzhiyun 
unregister_switchdev_notifier(struct notifier_block * nb)334*4882a593Smuzhiyun static inline int unregister_switchdev_notifier(struct notifier_block *nb)
335*4882a593Smuzhiyun {
336*4882a593Smuzhiyun 	return 0;
337*4882a593Smuzhiyun }
338*4882a593Smuzhiyun 
call_switchdev_notifiers(unsigned long val,struct net_device * dev,struct switchdev_notifier_info * info,struct netlink_ext_ack * extack)339*4882a593Smuzhiyun static inline int call_switchdev_notifiers(unsigned long val,
340*4882a593Smuzhiyun 					   struct net_device *dev,
341*4882a593Smuzhiyun 					   struct switchdev_notifier_info *info,
342*4882a593Smuzhiyun 					   struct netlink_ext_ack *extack)
343*4882a593Smuzhiyun {
344*4882a593Smuzhiyun 	return NOTIFY_DONE;
345*4882a593Smuzhiyun }
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun static inline int
register_switchdev_blocking_notifier(struct notifier_block * nb)348*4882a593Smuzhiyun register_switchdev_blocking_notifier(struct notifier_block *nb)
349*4882a593Smuzhiyun {
350*4882a593Smuzhiyun 	return 0;
351*4882a593Smuzhiyun }
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun static inline int
unregister_switchdev_blocking_notifier(struct notifier_block * nb)354*4882a593Smuzhiyun unregister_switchdev_blocking_notifier(struct notifier_block *nb)
355*4882a593Smuzhiyun {
356*4882a593Smuzhiyun 	return 0;
357*4882a593Smuzhiyun }
358*4882a593Smuzhiyun 
359*4882a593Smuzhiyun static inline int
call_switchdev_blocking_notifiers(unsigned long val,struct net_device * dev,struct switchdev_notifier_info * info,struct netlink_ext_ack * extack)360*4882a593Smuzhiyun call_switchdev_blocking_notifiers(unsigned long val,
361*4882a593Smuzhiyun 				  struct net_device *dev,
362*4882a593Smuzhiyun 				  struct switchdev_notifier_info *info,
363*4882a593Smuzhiyun 				  struct netlink_ext_ack *extack)
364*4882a593Smuzhiyun {
365*4882a593Smuzhiyun 	return NOTIFY_DONE;
366*4882a593Smuzhiyun }
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun static inline int
switchdev_handle_port_obj_add(struct net_device * dev,struct switchdev_notifier_port_obj_info * port_obj_info,bool (* check_cb)(const struct net_device * dev),int (* add_cb)(struct net_device * dev,const struct switchdev_obj * obj,struct switchdev_trans * trans,struct netlink_ext_ack * extack))369*4882a593Smuzhiyun switchdev_handle_port_obj_add(struct net_device *dev,
370*4882a593Smuzhiyun 			struct switchdev_notifier_port_obj_info *port_obj_info,
371*4882a593Smuzhiyun 			bool (*check_cb)(const struct net_device *dev),
372*4882a593Smuzhiyun 			int (*add_cb)(struct net_device *dev,
373*4882a593Smuzhiyun 				      const struct switchdev_obj *obj,
374*4882a593Smuzhiyun 				      struct switchdev_trans *trans,
375*4882a593Smuzhiyun 				      struct netlink_ext_ack *extack))
376*4882a593Smuzhiyun {
377*4882a593Smuzhiyun 	return 0;
378*4882a593Smuzhiyun }
379*4882a593Smuzhiyun 
380*4882a593Smuzhiyun static inline int
switchdev_handle_port_obj_del(struct net_device * dev,struct switchdev_notifier_port_obj_info * port_obj_info,bool (* check_cb)(const struct net_device * dev),int (* del_cb)(struct net_device * dev,const struct switchdev_obj * obj))381*4882a593Smuzhiyun switchdev_handle_port_obj_del(struct net_device *dev,
382*4882a593Smuzhiyun 			struct switchdev_notifier_port_obj_info *port_obj_info,
383*4882a593Smuzhiyun 			bool (*check_cb)(const struct net_device *dev),
384*4882a593Smuzhiyun 			int (*del_cb)(struct net_device *dev,
385*4882a593Smuzhiyun 				      const struct switchdev_obj *obj))
386*4882a593Smuzhiyun {
387*4882a593Smuzhiyun 	return 0;
388*4882a593Smuzhiyun }
389*4882a593Smuzhiyun 
390*4882a593Smuzhiyun static inline int
switchdev_handle_port_attr_set(struct net_device * dev,struct switchdev_notifier_port_attr_info * port_attr_info,bool (* check_cb)(const struct net_device * dev),int (* set_cb)(struct net_device * dev,const struct switchdev_attr * attr,struct switchdev_trans * trans))391*4882a593Smuzhiyun switchdev_handle_port_attr_set(struct net_device *dev,
392*4882a593Smuzhiyun 			struct switchdev_notifier_port_attr_info *port_attr_info,
393*4882a593Smuzhiyun 			bool (*check_cb)(const struct net_device *dev),
394*4882a593Smuzhiyun 			int (*set_cb)(struct net_device *dev,
395*4882a593Smuzhiyun 				      const struct switchdev_attr *attr,
396*4882a593Smuzhiyun 				      struct switchdev_trans *trans))
397*4882a593Smuzhiyun {
398*4882a593Smuzhiyun 	return 0;
399*4882a593Smuzhiyun }
400*4882a593Smuzhiyun #endif
401*4882a593Smuzhiyun 
402*4882a593Smuzhiyun #endif /* _LINUX_SWITCHDEV_H_ */
403