Commit | Line | Data |
---|---|---|
2874c5fd | 1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
007f790c JP |
2 | /* |
3 | * include/net/switchdev.h - Switch device API | |
7ea6eb3f | 4 | * Copyright (c) 2014-2015 Jiri Pirko <jiri@resnulli.us> |
f8f21471 | 5 | * Copyright (c) 2014-2015 Scott Feldman <sfeldma@gmail.com> |
007f790c JP |
6 | */ |
7 | #ifndef _LINUX_SWITCHDEV_H_ | |
8 | #define _LINUX_SWITCHDEV_H_ | |
9 | ||
10 | #include <linux/netdevice.h> | |
03bf0c28 | 11 | #include <linux/notifier.h> |
7ea6eb3f | 12 | #include <linux/list.h> |
850d0cbc | 13 | #include <net/ip_fib.h> |
03bf0c28 | 14 | |
3094333d | 15 | #define SWITCHDEV_F_NO_RECURSE BIT(0) |
464314ea | 16 | #define SWITCHDEV_F_SKIP_EOPNOTSUPP BIT(1) |
0bc05d58 | 17 | #define SWITCHDEV_F_DEFER BIT(2) |
3094333d | 18 | |
3094333d | 19 | enum switchdev_attr_id { |
1f868398 | 20 | SWITCHDEV_ATTR_ID_UNDEFINED, |
1f868398 | 21 | SWITCHDEV_ATTR_ID_PORT_STP_STATE, |
7ae9147f | 22 | SWITCHDEV_ATTR_ID_PORT_MST_STATE, |
1f868398 | 23 | SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS, |
746dc184 | 24 | SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS, |
6d549648 | 25 | SWITCHDEV_ATTR_ID_PORT_MROUTER, |
f55ac58a | 26 | SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME, |
81435c33 | 27 | SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING, |
22ec19f3 | 28 | SWITCHDEV_ATTR_ID_BRIDGE_VLAN_PROTOCOL, |
147c1e9b | 29 | SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED, |
77041420 | 30 | SWITCHDEV_ATTR_ID_BRIDGE_MROUTER, |
87c167bb | 31 | SWITCHDEV_ATTR_ID_BRIDGE_MST, |
c284b545 | 32 | SWITCHDEV_ATTR_ID_MRP_PORT_ROLE, |
6284c723 | 33 | SWITCHDEV_ATTR_ID_VLAN_MSTI, |
3094333d SF |
34 | }; |
35 | ||
7ae9147f TW |
36 | struct switchdev_mst_state { |
37 | u16 msti; | |
38 | u8 state; | |
39 | }; | |
40 | ||
e18f4c18 VO |
41 | struct switchdev_brport_flags { |
42 | unsigned long val; | |
43 | unsigned long mask; | |
44 | }; | |
45 | ||
6284c723 TW |
46 | struct switchdev_vlan_msti { |
47 | u16 vid; | |
48 | u16 msti; | |
49 | }; | |
50 | ||
3094333d | 51 | struct switchdev_attr { |
6ff64f6f | 52 | struct net_device *orig_dev; |
3094333d | 53 | enum switchdev_attr_id id; |
3094333d | 54 | u32 flags; |
7ceb2afb ER |
55 | void *complete_priv; |
56 | void (*complete)(struct net_device *dev, int err, void *priv); | |
f8e20a9f | 57 | union { |
35636062 | 58 | u8 stp_state; /* PORT_STP_STATE */ |
7ae9147f | 59 | struct switchdev_mst_state mst_state; /* PORT_MST_STATE */ |
e18f4c18 | 60 | struct switchdev_brport_flags brport_flags; /* PORT_BRIDGE_FLAGS */ |
6d549648 | 61 | bool mrouter; /* PORT_MROUTER */ |
eabfdda9 | 62 | clock_t ageing_time; /* BRIDGE_AGEING_TIME */ |
81435c33 | 63 | bool vlan_filtering; /* BRIDGE_VLAN_FILTERING */ |
22ec19f3 | 64 | u16 vlan_protocol; /* BRIDGE_VLAN_PROTOCOL */ |
87c167bb | 65 | bool mst; /* BRIDGE_MST */ |
147c1e9b | 66 | bool mc_disabled; /* MC_DISABLED */ |
c284b545 | 67 | u8 mrp_port_role; /* MRP_PORT_ROLE */ |
6284c723 | 68 | struct switchdev_vlan_msti vlan_msti; /* VLAN_MSTI */ |
42275bd8 | 69 | } u; |
3094333d SF |
70 | }; |
71 | ||
491d0f15 | 72 | enum switchdev_obj_id { |
57d80838 JP |
73 | SWITCHDEV_OBJ_ID_UNDEFINED, |
74 | SWITCHDEV_OBJ_ID_PORT_VLAN, | |
4d41e125 | 75 | SWITCHDEV_OBJ_ID_PORT_MDB, |
47d5b6db | 76 | SWITCHDEV_OBJ_ID_HOST_MDB, |
c284b545 HV |
77 | SWITCHDEV_OBJ_ID_MRP, |
78 | SWITCHDEV_OBJ_ID_RING_TEST_MRP, | |
79 | SWITCHDEV_OBJ_ID_RING_ROLE_MRP, | |
80 | SWITCHDEV_OBJ_ID_RING_STATE_MRP, | |
cf7c5274 HV |
81 | SWITCHDEV_OBJ_ID_IN_TEST_MRP, |
82 | SWITCHDEV_OBJ_ID_IN_ROLE_MRP, | |
83 | SWITCHDEV_OBJ_ID_IN_STATE_MRP, | |
491d0f15 SF |
84 | }; |
85 | ||
648b4a99 | 86 | struct switchdev_obj { |
4f2673b3 | 87 | struct list_head list; |
6ff64f6f | 88 | struct net_device *orig_dev; |
9e8f4a54 | 89 | enum switchdev_obj_id id; |
4d429c5d | 90 | u32 flags; |
7ceb2afb ER |
91 | void *complete_priv; |
92 | void (*complete)(struct net_device *dev, int err, void *priv); | |
648b4a99 JP |
93 | }; |
94 | ||
57d80838 | 95 | /* SWITCHDEV_OBJ_ID_PORT_VLAN */ |
8f24f309 | 96 | struct switchdev_obj_port_vlan { |
648b4a99 | 97 | struct switchdev_obj obj; |
44bbcf5c | 98 | u16 flags; |
b7a9e0da | 99 | u16 vid; |
8d23a54f VO |
100 | /* If set, the notifier signifies a change of one of the following |
101 | * flags for a VLAN that already exists: | |
102 | * - BRIDGE_VLAN_INFO_PVID | |
103 | * - BRIDGE_VLAN_INFO_UNTAGGED | |
104 | * Entries with BRIDGE_VLAN_INFO_BRENTRY unset are not notified at all. | |
105 | */ | |
106 | bool changed; | |
44bbcf5c VD |
107 | }; |
108 | ||
ec394af5 PM |
109 | #define SWITCHDEV_OBJ_PORT_VLAN(OBJ) \ |
110 | container_of((OBJ), struct switchdev_obj_port_vlan, obj) | |
648b4a99 | 111 | |
4d41e125 ER |
112 | /* SWITCHDEV_OBJ_ID_PORT_MDB */ |
113 | struct switchdev_obj_port_mdb { | |
114 | struct switchdev_obj obj; | |
115 | unsigned char addr[ETH_ALEN]; | |
116 | u16 vid; | |
117 | }; | |
118 | ||
ec394af5 PM |
119 | #define SWITCHDEV_OBJ_PORT_MDB(OBJ) \ |
120 | container_of((OBJ), struct switchdev_obj_port_mdb, obj) | |
4d41e125 | 121 | |
c284b545 | 122 | |
c284b545 HV |
123 | /* SWITCHDEV_OBJ_ID_MRP */ |
124 | struct switchdev_obj_mrp { | |
125 | struct switchdev_obj obj; | |
126 | struct net_device *p_port; | |
127 | struct net_device *s_port; | |
128 | u32 ring_id; | |
4b3a61b0 | 129 | u16 prio; |
c284b545 HV |
130 | }; |
131 | ||
132 | #define SWITCHDEV_OBJ_MRP(OBJ) \ | |
133 | container_of((OBJ), struct switchdev_obj_mrp, obj) | |
134 | ||
135 | /* SWITCHDEV_OBJ_ID_RING_TEST_MRP */ | |
136 | struct switchdev_obj_ring_test_mrp { | |
137 | struct switchdev_obj obj; | |
138 | /* The value is in us and a value of 0 represents to stop */ | |
139 | u32 interval; | |
140 | u8 max_miss; | |
141 | u32 ring_id; | |
142 | u32 period; | |
c6676e7d | 143 | bool monitor; |
c284b545 HV |
144 | }; |
145 | ||
146 | #define SWITCHDEV_OBJ_RING_TEST_MRP(OBJ) \ | |
147 | container_of((OBJ), struct switchdev_obj_ring_test_mrp, obj) | |
148 | ||
149 | /* SWICHDEV_OBJ_ID_RING_ROLE_MRP */ | |
150 | struct switchdev_obj_ring_role_mrp { | |
151 | struct switchdev_obj obj; | |
152 | u8 ring_role; | |
153 | u32 ring_id; | |
c513efa2 | 154 | u8 sw_backup; |
c284b545 HV |
155 | }; |
156 | ||
157 | #define SWITCHDEV_OBJ_RING_ROLE_MRP(OBJ) \ | |
158 | container_of((OBJ), struct switchdev_obj_ring_role_mrp, obj) | |
159 | ||
160 | struct switchdev_obj_ring_state_mrp { | |
161 | struct switchdev_obj obj; | |
162 | u8 ring_state; | |
163 | u32 ring_id; | |
164 | }; | |
165 | ||
166 | #define SWITCHDEV_OBJ_RING_STATE_MRP(OBJ) \ | |
167 | container_of((OBJ), struct switchdev_obj_ring_state_mrp, obj) | |
168 | ||
cf7c5274 HV |
169 | /* SWITCHDEV_OBJ_ID_IN_TEST_MRP */ |
170 | struct switchdev_obj_in_test_mrp { | |
171 | struct switchdev_obj obj; | |
172 | /* The value is in us and a value of 0 represents to stop */ | |
173 | u32 interval; | |
174 | u32 in_id; | |
175 | u32 period; | |
176 | u8 max_miss; | |
177 | }; | |
178 | ||
179 | #define SWITCHDEV_OBJ_IN_TEST_MRP(OBJ) \ | |
180 | container_of((OBJ), struct switchdev_obj_in_test_mrp, obj) | |
181 | ||
182 | /* SWICHDEV_OBJ_ID_IN_ROLE_MRP */ | |
183 | struct switchdev_obj_in_role_mrp { | |
184 | struct switchdev_obj obj; | |
185 | struct net_device *i_port; | |
186 | u32 ring_id; | |
187 | u16 in_id; | |
188 | u8 in_role; | |
c513efa2 | 189 | u8 sw_backup; |
cf7c5274 HV |
190 | }; |
191 | ||
192 | #define SWITCHDEV_OBJ_IN_ROLE_MRP(OBJ) \ | |
193 | container_of((OBJ), struct switchdev_obj_in_role_mrp, obj) | |
194 | ||
195 | struct switchdev_obj_in_state_mrp { | |
196 | struct switchdev_obj obj; | |
197 | u32 in_id; | |
198 | u8 in_state; | |
199 | }; | |
200 | ||
201 | #define SWITCHDEV_OBJ_IN_STATE_MRP(OBJ) \ | |
202 | container_of((OBJ), struct switchdev_obj_in_state_mrp, obj) | |
203 | ||
648b4a99 JP |
204 | typedef int switchdev_obj_dump_cb_t(struct switchdev_obj *obj); |
205 | ||
957e2235 VO |
206 | struct switchdev_brport { |
207 | struct net_device *dev; | |
208 | const void *ctx; | |
209 | struct notifier_block *atomic_nb; | |
210 | struct notifier_block *blocking_nb; | |
211 | bool tx_fwd_offload; | |
212 | }; | |
213 | ||
ebb9a03a | 214 | enum switchdev_notifier_type { |
6b26b51b AS |
215 | SWITCHDEV_FDB_ADD_TO_BRIDGE = 1, |
216 | SWITCHDEV_FDB_DEL_TO_BRIDGE, | |
217 | SWITCHDEV_FDB_ADD_TO_DEVICE, | |
218 | SWITCHDEV_FDB_DEL_TO_DEVICE, | |
9fe8bcec | 219 | SWITCHDEV_FDB_OFFLOADED, |
d05e8e68 | 220 | SWITCHDEV_FDB_FLUSH_TO_BRIDGE, |
9a997353 | 221 | |
aa4efe21 PM |
222 | SWITCHDEV_PORT_OBJ_ADD, /* Blocking. */ |
223 | SWITCHDEV_PORT_OBJ_DEL, /* Blocking. */ | |
1cb33af1 | 224 | SWITCHDEV_PORT_ATTR_SET, /* May be blocking . */ |
aa4efe21 | 225 | |
5728ae0d PM |
226 | SWITCHDEV_VXLAN_FDB_ADD_TO_BRIDGE, |
227 | SWITCHDEV_VXLAN_FDB_DEL_TO_BRIDGE, | |
9a997353 PM |
228 | SWITCHDEV_VXLAN_FDB_ADD_TO_DEVICE, |
229 | SWITCHDEV_VXLAN_FDB_DEL_TO_DEVICE, | |
0efe1173 | 230 | SWITCHDEV_VXLAN_FDB_OFFLOADED, |
957e2235 VO |
231 | |
232 | SWITCHDEV_BRPORT_OFFLOADED, | |
233 | SWITCHDEV_BRPORT_UNOFFLOADED, | |
3aeb6617 JP |
234 | }; |
235 | ||
ebb9a03a | 236 | struct switchdev_notifier_info { |
03bf0c28 | 237 | struct net_device *dev; |
479c86dc | 238 | struct netlink_ext_ack *extack; |
69bfac96 | 239 | const void *ctx; |
03bf0c28 JP |
240 | }; |
241 | ||
3eb4a4c3 VO |
242 | /* Remember to update br_switchdev_fdb_populate() when adding |
243 | * new members to this structure | |
244 | */ | |
ebb9a03a JP |
245 | struct switchdev_notifier_fdb_info { |
246 | struct switchdev_notifier_info info; /* must be first */ | |
3aeb6617 JP |
247 | const unsigned char *addr; |
248 | u16 vid; | |
e9ba0fbc | 249 | u8 added_by_user:1, |
2c4eca3e | 250 | is_local:1, |
27fabd02 | 251 | locked:1, |
e9ba0fbc | 252 | offloaded:1; |
3aeb6617 JP |
253 | }; |
254 | ||
aa4efe21 PM |
255 | struct switchdev_notifier_port_obj_info { |
256 | struct switchdev_notifier_info info; /* must be first */ | |
257 | const struct switchdev_obj *obj; | |
aa4efe21 PM |
258 | bool handled; |
259 | }; | |
260 | ||
1cb33af1 FF |
261 | struct switchdev_notifier_port_attr_info { |
262 | struct switchdev_notifier_info info; /* must be first */ | |
263 | const struct switchdev_attr *attr; | |
1cb33af1 FF |
264 | bool handled; |
265 | }; | |
266 | ||
957e2235 VO |
267 | struct switchdev_notifier_brport_info { |
268 | struct switchdev_notifier_info info; /* must be first */ | |
269 | const struct switchdev_brport brport; | |
270 | }; | |
271 | ||
03bf0c28 | 272 | static inline struct net_device * |
ebb9a03a | 273 | switchdev_notifier_info_to_dev(const struct switchdev_notifier_info *info) |
03bf0c28 JP |
274 | { |
275 | return info->dev; | |
276 | } | |
007f790c | 277 | |
479c86dc PM |
278 | static inline struct netlink_ext_ack * |
279 | switchdev_notifier_info_to_extack(const struct switchdev_notifier_info *info) | |
280 | { | |
281 | return info->extack; | |
282 | } | |
283 | ||
c6451cda VO |
284 | static inline bool |
285 | switchdev_fdb_is_dynamically_learned(const struct switchdev_notifier_fdb_info *fdb_info) | |
286 | { | |
287 | return !fdb_info->added_by_user && !fdb_info->is_local; | |
288 | } | |
289 | ||
007f790c JP |
290 | #ifdef CONFIG_NET_SWITCHDEV |
291 | ||
957e2235 VO |
292 | int switchdev_bridge_port_offload(struct net_device *brport_dev, |
293 | struct net_device *dev, const void *ctx, | |
294 | struct notifier_block *atomic_nb, | |
295 | struct notifier_block *blocking_nb, | |
296 | bool tx_fwd_offload, | |
297 | struct netlink_ext_ack *extack); | |
298 | void switchdev_bridge_port_unoffload(struct net_device *brport_dev, | |
299 | const void *ctx, | |
300 | struct notifier_block *atomic_nb, | |
301 | struct notifier_block *blocking_nb); | |
302 | ||
793f4014 | 303 | void switchdev_deferred_process(void); |
3094333d | 304 | int switchdev_port_attr_set(struct net_device *dev, |
dcbdf135 VO |
305 | const struct switchdev_attr *attr, |
306 | struct netlink_ext_ack *extack); | |
9e8f4a54 | 307 | int switchdev_port_obj_add(struct net_device *dev, |
69b7320e PM |
308 | const struct switchdev_obj *obj, |
309 | struct netlink_ext_ack *extack); | |
9e8f4a54 | 310 | int switchdev_port_obj_del(struct net_device *dev, |
648b4a99 | 311 | const struct switchdev_obj *obj); |
a93e3b17 | 312 | |
ebb9a03a JP |
313 | int register_switchdev_notifier(struct notifier_block *nb); |
314 | int unregister_switchdev_notifier(struct notifier_block *nb); | |
315 | int call_switchdev_notifiers(unsigned long val, struct net_device *dev, | |
6685987c PM |
316 | struct switchdev_notifier_info *info, |
317 | struct netlink_ext_ack *extack); | |
a93e3b17 PM |
318 | |
319 | int register_switchdev_blocking_notifier(struct notifier_block *nb); | |
320 | int unregister_switchdev_blocking_notifier(struct notifier_block *nb); | |
321 | int call_switchdev_blocking_notifiers(unsigned long val, struct net_device *dev, | |
479c86dc PM |
322 | struct switchdev_notifier_info *info, |
323 | struct netlink_ext_ack *extack); | |
a93e3b17 | 324 | |
1a3b2ec9 SF |
325 | void switchdev_port_fwd_mark_set(struct net_device *dev, |
326 | struct net_device *group_dev, | |
327 | bool joining); | |
5e8d9049 | 328 | |
716a30a9 | 329 | int switchdev_handle_fdb_event_to_device(struct net_device *dev, unsigned long event, |
8ca07176 VO |
330 | const struct switchdev_notifier_fdb_info *fdb_info, |
331 | bool (*check_cb)(const struct net_device *dev), | |
332 | bool (*foreign_dev_check_cb)(const struct net_device *dev, | |
333 | const struct net_device *foreign_dev), | |
716a30a9 VO |
334 | int (*mod_cb)(struct net_device *dev, struct net_device *orig_dev, |
335 | unsigned long event, const void *ctx, | |
ec638740 | 336 | const struct switchdev_notifier_fdb_info *fdb_info)); |
8ca07176 | 337 | |
f30f0601 PM |
338 | int switchdev_handle_port_obj_add(struct net_device *dev, |
339 | struct switchdev_notifier_port_obj_info *port_obj_info, | |
340 | bool (*check_cb)(const struct net_device *dev), | |
69bfac96 | 341 | int (*add_cb)(struct net_device *dev, const void *ctx, |
f30f0601 | 342 | const struct switchdev_obj *obj, |
69213513 | 343 | struct netlink_ext_ack *extack)); |
c4076cdd VO |
344 | int switchdev_handle_port_obj_add_foreign(struct net_device *dev, |
345 | struct switchdev_notifier_port_obj_info *port_obj_info, | |
346 | bool (*check_cb)(const struct net_device *dev), | |
347 | bool (*foreign_dev_check_cb)(const struct net_device *dev, | |
348 | const struct net_device *foreign_dev), | |
349 | int (*add_cb)(struct net_device *dev, const void *ctx, | |
350 | const struct switchdev_obj *obj, | |
351 | struct netlink_ext_ack *extack)); | |
f30f0601 PM |
352 | int switchdev_handle_port_obj_del(struct net_device *dev, |
353 | struct switchdev_notifier_port_obj_info *port_obj_info, | |
354 | bool (*check_cb)(const struct net_device *dev), | |
69bfac96 | 355 | int (*del_cb)(struct net_device *dev, const void *ctx, |
f30f0601 | 356 | const struct switchdev_obj *obj)); |
c4076cdd VO |
357 | int switchdev_handle_port_obj_del_foreign(struct net_device *dev, |
358 | struct switchdev_notifier_port_obj_info *port_obj_info, | |
359 | bool (*check_cb)(const struct net_device *dev), | |
360 | bool (*foreign_dev_check_cb)(const struct net_device *dev, | |
361 | const struct net_device *foreign_dev), | |
362 | int (*del_cb)(struct net_device *dev, const void *ctx, | |
363 | const struct switchdev_obj *obj)); | |
f30f0601 | 364 | |
1cb33af1 FF |
365 | int switchdev_handle_port_attr_set(struct net_device *dev, |
366 | struct switchdev_notifier_port_attr_info *port_attr_info, | |
367 | bool (*check_cb)(const struct net_device *dev), | |
69bfac96 | 368 | int (*set_cb)(struct net_device *dev, const void *ctx, |
4c08c586 VO |
369 | const struct switchdev_attr *attr, |
370 | struct netlink_ext_ack *extack)); | |
007f790c JP |
371 | #else |
372 | ||
957e2235 VO |
373 | static inline int |
374 | switchdev_bridge_port_offload(struct net_device *brport_dev, | |
375 | struct net_device *dev, const void *ctx, | |
376 | struct notifier_block *atomic_nb, | |
377 | struct notifier_block *blocking_nb, | |
378 | bool tx_fwd_offload, | |
379 | struct netlink_ext_ack *extack) | |
380 | { | |
381 | return -EOPNOTSUPP; | |
382 | } | |
383 | ||
384 | static inline void | |
385 | switchdev_bridge_port_unoffload(struct net_device *brport_dev, | |
386 | const void *ctx, | |
387 | struct notifier_block *atomic_nb, | |
388 | struct notifier_block *blocking_nb) | |
389 | { | |
390 | } | |
391 | ||
793f4014 JP |
392 | static inline void switchdev_deferred_process(void) |
393 | { | |
394 | } | |
395 | ||
3094333d | 396 | static inline int switchdev_port_attr_set(struct net_device *dev, |
419dfaed VO |
397 | const struct switchdev_attr *attr, |
398 | struct netlink_ext_ack *extack) | |
3094333d SF |
399 | { |
400 | return -EOPNOTSUPP; | |
401 | } | |
402 | ||
491d0f15 | 403 | static inline int switchdev_port_obj_add(struct net_device *dev, |
69b7320e PM |
404 | const struct switchdev_obj *obj, |
405 | struct netlink_ext_ack *extack) | |
491d0f15 SF |
406 | { |
407 | return -EOPNOTSUPP; | |
408 | } | |
409 | ||
410 | static inline int switchdev_port_obj_del(struct net_device *dev, | |
648b4a99 | 411 | const struct switchdev_obj *obj) |
491d0f15 SF |
412 | { |
413 | return -EOPNOTSUPP; | |
414 | } | |
415 | ||
ebb9a03a | 416 | static inline int register_switchdev_notifier(struct notifier_block *nb) |
03bf0c28 JP |
417 | { |
418 | return 0; | |
419 | } | |
420 | ||
ebb9a03a | 421 | static inline int unregister_switchdev_notifier(struct notifier_block *nb) |
03bf0c28 JP |
422 | { |
423 | return 0; | |
424 | } | |
425 | ||
ebb9a03a JP |
426 | static inline int call_switchdev_notifiers(unsigned long val, |
427 | struct net_device *dev, | |
6685987c PM |
428 | struct switchdev_notifier_info *info, |
429 | struct netlink_ext_ack *extack) | |
03bf0c28 JP |
430 | { |
431 | return NOTIFY_DONE; | |
432 | } | |
433 | ||
a93e3b17 PM |
434 | static inline int |
435 | register_switchdev_blocking_notifier(struct notifier_block *nb) | |
436 | { | |
437 | return 0; | |
438 | } | |
439 | ||
440 | static inline int | |
441 | unregister_switchdev_blocking_notifier(struct notifier_block *nb) | |
442 | { | |
443 | return 0; | |
444 | } | |
445 | ||
446 | static inline int | |
447 | call_switchdev_blocking_notifiers(unsigned long val, | |
448 | struct net_device *dev, | |
479c86dc PM |
449 | struct switchdev_notifier_info *info, |
450 | struct netlink_ext_ack *extack) | |
a93e3b17 PM |
451 | { |
452 | return NOTIFY_DONE; | |
453 | } | |
454 | ||
f30f0601 | 455 | static inline int |
716a30a9 | 456 | switchdev_handle_fdb_event_to_device(struct net_device *dev, unsigned long event, |
8ca07176 VO |
457 | const struct switchdev_notifier_fdb_info *fdb_info, |
458 | bool (*check_cb)(const struct net_device *dev), | |
459 | bool (*foreign_dev_check_cb)(const struct net_device *dev, | |
460 | const struct net_device *foreign_dev), | |
716a30a9 VO |
461 | int (*mod_cb)(struct net_device *dev, struct net_device *orig_dev, |
462 | unsigned long event, const void *ctx, | |
ec638740 | 463 | const struct switchdev_notifier_fdb_info *fdb_info)) |
8ca07176 VO |
464 | { |
465 | return 0; | |
466 | } | |
467 | ||
468 | static inline int | |
f30f0601 PM |
469 | switchdev_handle_port_obj_add(struct net_device *dev, |
470 | struct switchdev_notifier_port_obj_info *port_obj_info, | |
471 | bool (*check_cb)(const struct net_device *dev), | |
69bfac96 | 472 | int (*add_cb)(struct net_device *dev, const void *ctx, |
f30f0601 | 473 | const struct switchdev_obj *obj, |
69213513 | 474 | struct netlink_ext_ack *extack)) |
f30f0601 PM |
475 | { |
476 | return 0; | |
477 | } | |
478 | ||
c4076cdd VO |
479 | static inline int switchdev_handle_port_obj_add_foreign(struct net_device *dev, |
480 | struct switchdev_notifier_port_obj_info *port_obj_info, | |
481 | bool (*check_cb)(const struct net_device *dev), | |
482 | bool (*foreign_dev_check_cb)(const struct net_device *dev, | |
483 | const struct net_device *foreign_dev), | |
484 | int (*add_cb)(struct net_device *dev, const void *ctx, | |
485 | const struct switchdev_obj *obj, | |
486 | struct netlink_ext_ack *extack)) | |
487 | { | |
488 | return 0; | |
489 | } | |
490 | ||
f30f0601 PM |
491 | static inline int |
492 | switchdev_handle_port_obj_del(struct net_device *dev, | |
493 | struct switchdev_notifier_port_obj_info *port_obj_info, | |
494 | bool (*check_cb)(const struct net_device *dev), | |
69bfac96 | 495 | int (*del_cb)(struct net_device *dev, const void *ctx, |
f30f0601 PM |
496 | const struct switchdev_obj *obj)) |
497 | { | |
498 | return 0; | |
499 | } | |
500 | ||
c4076cdd VO |
501 | static inline int |
502 | switchdev_handle_port_obj_del_foreign(struct net_device *dev, | |
503 | struct switchdev_notifier_port_obj_info *port_obj_info, | |
504 | bool (*check_cb)(const struct net_device *dev), | |
505 | bool (*foreign_dev_check_cb)(const struct net_device *dev, | |
506 | const struct net_device *foreign_dev), | |
507 | int (*del_cb)(struct net_device *dev, const void *ctx, | |
508 | const struct switchdev_obj *obj)) | |
509 | { | |
510 | return 0; | |
511 | } | |
512 | ||
1cb33af1 FF |
513 | static inline int |
514 | switchdev_handle_port_attr_set(struct net_device *dev, | |
515 | struct switchdev_notifier_port_attr_info *port_attr_info, | |
516 | bool (*check_cb)(const struct net_device *dev), | |
69bfac96 | 517 | int (*set_cb)(struct net_device *dev, const void *ctx, |
4c08c586 VO |
518 | const struct switchdev_attr *attr, |
519 | struct netlink_ext_ack *extack)) | |
1cb33af1 FF |
520 | { |
521 | return 0; | |
522 | } | |
007f790c JP |
523 | #endif |
524 | ||
525 | #endif /* _LINUX_SWITCHDEV_H_ */ |