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, |
e9ba0fbc | 251 | offloaded:1; |
3aeb6617 JP |
252 | }; |
253 | ||
aa4efe21 PM |
254 | struct switchdev_notifier_port_obj_info { |
255 | struct switchdev_notifier_info info; /* must be first */ | |
256 | const struct switchdev_obj *obj; | |
aa4efe21 PM |
257 | bool handled; |
258 | }; | |
259 | ||
1cb33af1 FF |
260 | struct switchdev_notifier_port_attr_info { |
261 | struct switchdev_notifier_info info; /* must be first */ | |
262 | const struct switchdev_attr *attr; | |
1cb33af1 FF |
263 | bool handled; |
264 | }; | |
265 | ||
957e2235 VO |
266 | struct switchdev_notifier_brport_info { |
267 | struct switchdev_notifier_info info; /* must be first */ | |
268 | const struct switchdev_brport brport; | |
269 | }; | |
270 | ||
03bf0c28 | 271 | static inline struct net_device * |
ebb9a03a | 272 | switchdev_notifier_info_to_dev(const struct switchdev_notifier_info *info) |
03bf0c28 JP |
273 | { |
274 | return info->dev; | |
275 | } | |
007f790c | 276 | |
479c86dc PM |
277 | static inline struct netlink_ext_ack * |
278 | switchdev_notifier_info_to_extack(const struct switchdev_notifier_info *info) | |
279 | { | |
280 | return info->extack; | |
281 | } | |
282 | ||
c6451cda VO |
283 | static inline bool |
284 | switchdev_fdb_is_dynamically_learned(const struct switchdev_notifier_fdb_info *fdb_info) | |
285 | { | |
286 | return !fdb_info->added_by_user && !fdb_info->is_local; | |
287 | } | |
288 | ||
007f790c JP |
289 | #ifdef CONFIG_NET_SWITCHDEV |
290 | ||
957e2235 VO |
291 | int switchdev_bridge_port_offload(struct net_device *brport_dev, |
292 | struct net_device *dev, const void *ctx, | |
293 | struct notifier_block *atomic_nb, | |
294 | struct notifier_block *blocking_nb, | |
295 | bool tx_fwd_offload, | |
296 | struct netlink_ext_ack *extack); | |
297 | void switchdev_bridge_port_unoffload(struct net_device *brport_dev, | |
298 | const void *ctx, | |
299 | struct notifier_block *atomic_nb, | |
300 | struct notifier_block *blocking_nb); | |
301 | ||
793f4014 | 302 | void switchdev_deferred_process(void); |
3094333d | 303 | int switchdev_port_attr_set(struct net_device *dev, |
dcbdf135 VO |
304 | const struct switchdev_attr *attr, |
305 | struct netlink_ext_ack *extack); | |
9e8f4a54 | 306 | int switchdev_port_obj_add(struct net_device *dev, |
69b7320e PM |
307 | const struct switchdev_obj *obj, |
308 | struct netlink_ext_ack *extack); | |
9e8f4a54 | 309 | int switchdev_port_obj_del(struct net_device *dev, |
648b4a99 | 310 | const struct switchdev_obj *obj); |
a93e3b17 | 311 | |
ebb9a03a JP |
312 | int register_switchdev_notifier(struct notifier_block *nb); |
313 | int unregister_switchdev_notifier(struct notifier_block *nb); | |
314 | int call_switchdev_notifiers(unsigned long val, struct net_device *dev, | |
6685987c PM |
315 | struct switchdev_notifier_info *info, |
316 | struct netlink_ext_ack *extack); | |
a93e3b17 PM |
317 | |
318 | int register_switchdev_blocking_notifier(struct notifier_block *nb); | |
319 | int unregister_switchdev_blocking_notifier(struct notifier_block *nb); | |
320 | int call_switchdev_blocking_notifiers(unsigned long val, struct net_device *dev, | |
479c86dc PM |
321 | struct switchdev_notifier_info *info, |
322 | struct netlink_ext_ack *extack); | |
a93e3b17 | 323 | |
1a3b2ec9 SF |
324 | void switchdev_port_fwd_mark_set(struct net_device *dev, |
325 | struct net_device *group_dev, | |
326 | bool joining); | |
5e8d9049 | 327 | |
716a30a9 | 328 | int switchdev_handle_fdb_event_to_device(struct net_device *dev, unsigned long event, |
8ca07176 VO |
329 | const struct switchdev_notifier_fdb_info *fdb_info, |
330 | bool (*check_cb)(const struct net_device *dev), | |
331 | bool (*foreign_dev_check_cb)(const struct net_device *dev, | |
332 | const struct net_device *foreign_dev), | |
716a30a9 VO |
333 | int (*mod_cb)(struct net_device *dev, struct net_device *orig_dev, |
334 | unsigned long event, const void *ctx, | |
ec638740 | 335 | const struct switchdev_notifier_fdb_info *fdb_info)); |
8ca07176 | 336 | |
f30f0601 PM |
337 | int switchdev_handle_port_obj_add(struct net_device *dev, |
338 | struct switchdev_notifier_port_obj_info *port_obj_info, | |
339 | bool (*check_cb)(const struct net_device *dev), | |
69bfac96 | 340 | int (*add_cb)(struct net_device *dev, const void *ctx, |
f30f0601 | 341 | const struct switchdev_obj *obj, |
69213513 | 342 | struct netlink_ext_ack *extack)); |
c4076cdd VO |
343 | int switchdev_handle_port_obj_add_foreign(struct net_device *dev, |
344 | struct switchdev_notifier_port_obj_info *port_obj_info, | |
345 | bool (*check_cb)(const struct net_device *dev), | |
346 | bool (*foreign_dev_check_cb)(const struct net_device *dev, | |
347 | const struct net_device *foreign_dev), | |
348 | int (*add_cb)(struct net_device *dev, const void *ctx, | |
349 | const struct switchdev_obj *obj, | |
350 | struct netlink_ext_ack *extack)); | |
f30f0601 PM |
351 | int switchdev_handle_port_obj_del(struct net_device *dev, |
352 | struct switchdev_notifier_port_obj_info *port_obj_info, | |
353 | bool (*check_cb)(const struct net_device *dev), | |
69bfac96 | 354 | int (*del_cb)(struct net_device *dev, const void *ctx, |
f30f0601 | 355 | const struct switchdev_obj *obj)); |
c4076cdd VO |
356 | int switchdev_handle_port_obj_del_foreign(struct net_device *dev, |
357 | struct switchdev_notifier_port_obj_info *port_obj_info, | |
358 | bool (*check_cb)(const struct net_device *dev), | |
359 | bool (*foreign_dev_check_cb)(const struct net_device *dev, | |
360 | const struct net_device *foreign_dev), | |
361 | int (*del_cb)(struct net_device *dev, const void *ctx, | |
362 | const struct switchdev_obj *obj)); | |
f30f0601 | 363 | |
1cb33af1 FF |
364 | int switchdev_handle_port_attr_set(struct net_device *dev, |
365 | struct switchdev_notifier_port_attr_info *port_attr_info, | |
366 | bool (*check_cb)(const struct net_device *dev), | |
69bfac96 | 367 | int (*set_cb)(struct net_device *dev, const void *ctx, |
4c08c586 VO |
368 | const struct switchdev_attr *attr, |
369 | struct netlink_ext_ack *extack)); | |
007f790c JP |
370 | #else |
371 | ||
957e2235 VO |
372 | static inline int |
373 | switchdev_bridge_port_offload(struct net_device *brport_dev, | |
374 | struct net_device *dev, const void *ctx, | |
375 | struct notifier_block *atomic_nb, | |
376 | struct notifier_block *blocking_nb, | |
377 | bool tx_fwd_offload, | |
378 | struct netlink_ext_ack *extack) | |
379 | { | |
380 | return -EOPNOTSUPP; | |
381 | } | |
382 | ||
383 | static inline void | |
384 | switchdev_bridge_port_unoffload(struct net_device *brport_dev, | |
385 | const void *ctx, | |
386 | struct notifier_block *atomic_nb, | |
387 | struct notifier_block *blocking_nb) | |
388 | { | |
389 | } | |
390 | ||
793f4014 JP |
391 | static inline void switchdev_deferred_process(void) |
392 | { | |
393 | } | |
394 | ||
3094333d | 395 | static inline int switchdev_port_attr_set(struct net_device *dev, |
419dfaed VO |
396 | const struct switchdev_attr *attr, |
397 | struct netlink_ext_ack *extack) | |
3094333d SF |
398 | { |
399 | return -EOPNOTSUPP; | |
400 | } | |
401 | ||
491d0f15 | 402 | static inline int switchdev_port_obj_add(struct net_device *dev, |
69b7320e PM |
403 | const struct switchdev_obj *obj, |
404 | struct netlink_ext_ack *extack) | |
491d0f15 SF |
405 | { |
406 | return -EOPNOTSUPP; | |
407 | } | |
408 | ||
409 | static inline int switchdev_port_obj_del(struct net_device *dev, | |
648b4a99 | 410 | const struct switchdev_obj *obj) |
491d0f15 SF |
411 | { |
412 | return -EOPNOTSUPP; | |
413 | } | |
414 | ||
ebb9a03a | 415 | static inline int register_switchdev_notifier(struct notifier_block *nb) |
03bf0c28 JP |
416 | { |
417 | return 0; | |
418 | } | |
419 | ||
ebb9a03a | 420 | static inline int unregister_switchdev_notifier(struct notifier_block *nb) |
03bf0c28 JP |
421 | { |
422 | return 0; | |
423 | } | |
424 | ||
ebb9a03a JP |
425 | static inline int call_switchdev_notifiers(unsigned long val, |
426 | struct net_device *dev, | |
6685987c PM |
427 | struct switchdev_notifier_info *info, |
428 | struct netlink_ext_ack *extack) | |
03bf0c28 JP |
429 | { |
430 | return NOTIFY_DONE; | |
431 | } | |
432 | ||
a93e3b17 PM |
433 | static inline int |
434 | register_switchdev_blocking_notifier(struct notifier_block *nb) | |
435 | { | |
436 | return 0; | |
437 | } | |
438 | ||
439 | static inline int | |
440 | unregister_switchdev_blocking_notifier(struct notifier_block *nb) | |
441 | { | |
442 | return 0; | |
443 | } | |
444 | ||
445 | static inline int | |
446 | call_switchdev_blocking_notifiers(unsigned long val, | |
447 | struct net_device *dev, | |
479c86dc PM |
448 | struct switchdev_notifier_info *info, |
449 | struct netlink_ext_ack *extack) | |
a93e3b17 PM |
450 | { |
451 | return NOTIFY_DONE; | |
452 | } | |
453 | ||
f30f0601 | 454 | static inline int |
716a30a9 | 455 | switchdev_handle_fdb_event_to_device(struct net_device *dev, unsigned long event, |
8ca07176 VO |
456 | const struct switchdev_notifier_fdb_info *fdb_info, |
457 | bool (*check_cb)(const struct net_device *dev), | |
458 | bool (*foreign_dev_check_cb)(const struct net_device *dev, | |
459 | const struct net_device *foreign_dev), | |
716a30a9 VO |
460 | int (*mod_cb)(struct net_device *dev, struct net_device *orig_dev, |
461 | unsigned long event, const void *ctx, | |
ec638740 | 462 | const struct switchdev_notifier_fdb_info *fdb_info)) |
8ca07176 VO |
463 | { |
464 | return 0; | |
465 | } | |
466 | ||
467 | static inline int | |
f30f0601 PM |
468 | switchdev_handle_port_obj_add(struct net_device *dev, |
469 | struct switchdev_notifier_port_obj_info *port_obj_info, | |
470 | bool (*check_cb)(const struct net_device *dev), | |
69bfac96 | 471 | int (*add_cb)(struct net_device *dev, const void *ctx, |
f30f0601 | 472 | const struct switchdev_obj *obj, |
69213513 | 473 | struct netlink_ext_ack *extack)) |
f30f0601 PM |
474 | { |
475 | return 0; | |
476 | } | |
477 | ||
c4076cdd VO |
478 | static inline int switchdev_handle_port_obj_add_foreign(struct net_device *dev, |
479 | struct switchdev_notifier_port_obj_info *port_obj_info, | |
480 | bool (*check_cb)(const struct net_device *dev), | |
481 | bool (*foreign_dev_check_cb)(const struct net_device *dev, | |
482 | const struct net_device *foreign_dev), | |
483 | int (*add_cb)(struct net_device *dev, const void *ctx, | |
484 | const struct switchdev_obj *obj, | |
485 | struct netlink_ext_ack *extack)) | |
486 | { | |
487 | return 0; | |
488 | } | |
489 | ||
f30f0601 PM |
490 | static inline int |
491 | switchdev_handle_port_obj_del(struct net_device *dev, | |
492 | struct switchdev_notifier_port_obj_info *port_obj_info, | |
493 | bool (*check_cb)(const struct net_device *dev), | |
69bfac96 | 494 | int (*del_cb)(struct net_device *dev, const void *ctx, |
f30f0601 PM |
495 | const struct switchdev_obj *obj)) |
496 | { | |
497 | return 0; | |
498 | } | |
499 | ||
c4076cdd VO |
500 | static inline int |
501 | switchdev_handle_port_obj_del_foreign(struct net_device *dev, | |
502 | struct switchdev_notifier_port_obj_info *port_obj_info, | |
503 | bool (*check_cb)(const struct net_device *dev), | |
504 | bool (*foreign_dev_check_cb)(const struct net_device *dev, | |
505 | const struct net_device *foreign_dev), | |
506 | int (*del_cb)(struct net_device *dev, const void *ctx, | |
507 | const struct switchdev_obj *obj)) | |
508 | { | |
509 | return 0; | |
510 | } | |
511 | ||
1cb33af1 FF |
512 | static inline int |
513 | switchdev_handle_port_attr_set(struct net_device *dev, | |
514 | struct switchdev_notifier_port_attr_info *port_attr_info, | |
515 | bool (*check_cb)(const struct net_device *dev), | |
69bfac96 | 516 | int (*set_cb)(struct net_device *dev, const void *ctx, |
4c08c586 VO |
517 | const struct switchdev_attr *attr, |
518 | struct netlink_ext_ack *extack)) | |
1cb33af1 FF |
519 | { |
520 | return 0; | |
521 | } | |
007f790c JP |
522 | #endif |
523 | ||
524 | #endif /* _LINUX_SWITCHDEV_H_ */ |