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