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 | ||
957e2235 VO |
204 | struct switchdev_brport { |
205 | struct net_device *dev; | |
206 | const void *ctx; | |
207 | struct notifier_block *atomic_nb; | |
208 | struct notifier_block *blocking_nb; | |
209 | bool tx_fwd_offload; | |
210 | }; | |
211 | ||
ebb9a03a | 212 | enum switchdev_notifier_type { |
6b26b51b AS |
213 | SWITCHDEV_FDB_ADD_TO_BRIDGE = 1, |
214 | SWITCHDEV_FDB_DEL_TO_BRIDGE, | |
215 | SWITCHDEV_FDB_ADD_TO_DEVICE, | |
216 | SWITCHDEV_FDB_DEL_TO_DEVICE, | |
9fe8bcec | 217 | SWITCHDEV_FDB_OFFLOADED, |
d05e8e68 | 218 | SWITCHDEV_FDB_FLUSH_TO_BRIDGE, |
9a997353 | 219 | |
aa4efe21 PM |
220 | SWITCHDEV_PORT_OBJ_ADD, /* Blocking. */ |
221 | SWITCHDEV_PORT_OBJ_DEL, /* Blocking. */ | |
1cb33af1 | 222 | SWITCHDEV_PORT_ATTR_SET, /* May be blocking . */ |
aa4efe21 | 223 | |
5728ae0d PM |
224 | SWITCHDEV_VXLAN_FDB_ADD_TO_BRIDGE, |
225 | SWITCHDEV_VXLAN_FDB_DEL_TO_BRIDGE, | |
9a997353 PM |
226 | SWITCHDEV_VXLAN_FDB_ADD_TO_DEVICE, |
227 | SWITCHDEV_VXLAN_FDB_DEL_TO_DEVICE, | |
0efe1173 | 228 | SWITCHDEV_VXLAN_FDB_OFFLOADED, |
957e2235 VO |
229 | |
230 | SWITCHDEV_BRPORT_OFFLOADED, | |
231 | SWITCHDEV_BRPORT_UNOFFLOADED, | |
f2e2857b | 232 | SWITCHDEV_BRPORT_REPLAY, |
3aeb6617 JP |
233 | }; |
234 | ||
ebb9a03a | 235 | struct switchdev_notifier_info { |
03bf0c28 | 236 | struct net_device *dev; |
479c86dc | 237 | struct netlink_ext_ack *extack; |
69bfac96 | 238 | const void *ctx; |
03bf0c28 JP |
239 | }; |
240 | ||
3eb4a4c3 VO |
241 | /* Remember to update br_switchdev_fdb_populate() when adding |
242 | * new members to this structure | |
243 | */ | |
ebb9a03a JP |
244 | struct switchdev_notifier_fdb_info { |
245 | struct switchdev_notifier_info info; /* must be first */ | |
3aeb6617 JP |
246 | const unsigned char *addr; |
247 | u16 vid; | |
e9ba0fbc | 248 | u8 added_by_user:1, |
2c4eca3e | 249 | is_local:1, |
27fabd02 | 250 | locked: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); | |
f2e2857b PM |
301 | int switchdev_bridge_port_replay(struct net_device *brport_dev, |
302 | struct net_device *dev, const void *ctx, | |
303 | struct notifier_block *atomic_nb, | |
304 | struct notifier_block *blocking_nb, | |
305 | struct netlink_ext_ack *extack); | |
957e2235 | 306 | |
793f4014 | 307 | void switchdev_deferred_process(void); |
3094333d | 308 | int switchdev_port_attr_set(struct net_device *dev, |
dcbdf135 VO |
309 | const struct switchdev_attr *attr, |
310 | struct netlink_ext_ack *extack); | |
dc489f86 TW |
311 | bool switchdev_port_obj_act_is_deferred(struct net_device *dev, |
312 | enum switchdev_notifier_type nt, | |
313 | const struct switchdev_obj *obj); | |
9e8f4a54 | 314 | int switchdev_port_obj_add(struct net_device *dev, |
69b7320e PM |
315 | const struct switchdev_obj *obj, |
316 | struct netlink_ext_ack *extack); | |
9e8f4a54 | 317 | int switchdev_port_obj_del(struct net_device *dev, |
648b4a99 | 318 | const struct switchdev_obj *obj); |
a93e3b17 | 319 | |
ebb9a03a JP |
320 | int register_switchdev_notifier(struct notifier_block *nb); |
321 | int unregister_switchdev_notifier(struct notifier_block *nb); | |
322 | int call_switchdev_notifiers(unsigned long val, struct net_device *dev, | |
6685987c PM |
323 | struct switchdev_notifier_info *info, |
324 | struct netlink_ext_ack *extack); | |
a93e3b17 PM |
325 | |
326 | int register_switchdev_blocking_notifier(struct notifier_block *nb); | |
327 | int unregister_switchdev_blocking_notifier(struct notifier_block *nb); | |
328 | int call_switchdev_blocking_notifiers(unsigned long val, struct net_device *dev, | |
479c86dc PM |
329 | struct switchdev_notifier_info *info, |
330 | struct netlink_ext_ack *extack); | |
a93e3b17 | 331 | |
716a30a9 | 332 | int switchdev_handle_fdb_event_to_device(struct net_device *dev, unsigned long event, |
8ca07176 VO |
333 | const struct switchdev_notifier_fdb_info *fdb_info, |
334 | bool (*check_cb)(const struct net_device *dev), | |
335 | bool (*foreign_dev_check_cb)(const struct net_device *dev, | |
336 | const struct net_device *foreign_dev), | |
716a30a9 VO |
337 | int (*mod_cb)(struct net_device *dev, struct net_device *orig_dev, |
338 | unsigned long event, const void *ctx, | |
ec638740 | 339 | const struct switchdev_notifier_fdb_info *fdb_info)); |
8ca07176 | 340 | |
f30f0601 PM |
341 | int switchdev_handle_port_obj_add(struct net_device *dev, |
342 | struct switchdev_notifier_port_obj_info *port_obj_info, | |
343 | bool (*check_cb)(const struct net_device *dev), | |
69bfac96 | 344 | int (*add_cb)(struct net_device *dev, const void *ctx, |
f30f0601 | 345 | const struct switchdev_obj *obj, |
69213513 | 346 | struct netlink_ext_ack *extack)); |
c4076cdd VO |
347 | int switchdev_handle_port_obj_add_foreign(struct net_device *dev, |
348 | struct switchdev_notifier_port_obj_info *port_obj_info, | |
349 | bool (*check_cb)(const struct net_device *dev), | |
350 | bool (*foreign_dev_check_cb)(const struct net_device *dev, | |
351 | const struct net_device *foreign_dev), | |
352 | int (*add_cb)(struct net_device *dev, const void *ctx, | |
353 | const struct switchdev_obj *obj, | |
354 | struct netlink_ext_ack *extack)); | |
f30f0601 PM |
355 | int switchdev_handle_port_obj_del(struct net_device *dev, |
356 | struct switchdev_notifier_port_obj_info *port_obj_info, | |
357 | bool (*check_cb)(const struct net_device *dev), | |
69bfac96 | 358 | int (*del_cb)(struct net_device *dev, const void *ctx, |
f30f0601 | 359 | const struct switchdev_obj *obj)); |
c4076cdd VO |
360 | int switchdev_handle_port_obj_del_foreign(struct net_device *dev, |
361 | struct switchdev_notifier_port_obj_info *port_obj_info, | |
362 | bool (*check_cb)(const struct net_device *dev), | |
363 | bool (*foreign_dev_check_cb)(const struct net_device *dev, | |
364 | const struct net_device *foreign_dev), | |
365 | int (*del_cb)(struct net_device *dev, const void *ctx, | |
366 | const struct switchdev_obj *obj)); | |
f30f0601 | 367 | |
1cb33af1 FF |
368 | int switchdev_handle_port_attr_set(struct net_device *dev, |
369 | struct switchdev_notifier_port_attr_info *port_attr_info, | |
370 | bool (*check_cb)(const struct net_device *dev), | |
69bfac96 | 371 | int (*set_cb)(struct net_device *dev, const void *ctx, |
4c08c586 VO |
372 | const struct switchdev_attr *attr, |
373 | struct netlink_ext_ack *extack)); | |
007f790c JP |
374 | #else |
375 | ||
957e2235 VO |
376 | static inline int |
377 | switchdev_bridge_port_offload(struct net_device *brport_dev, | |
378 | struct net_device *dev, const void *ctx, | |
379 | struct notifier_block *atomic_nb, | |
380 | struct notifier_block *blocking_nb, | |
381 | bool tx_fwd_offload, | |
382 | struct netlink_ext_ack *extack) | |
383 | { | |
384 | return -EOPNOTSUPP; | |
385 | } | |
386 | ||
387 | static inline void | |
388 | switchdev_bridge_port_unoffload(struct net_device *brport_dev, | |
389 | const void *ctx, | |
390 | struct notifier_block *atomic_nb, | |
391 | struct notifier_block *blocking_nb) | |
392 | { | |
393 | } | |
394 | ||
793f4014 JP |
395 | static inline void switchdev_deferred_process(void) |
396 | { | |
397 | } | |
398 | ||
3094333d | 399 | static inline int switchdev_port_attr_set(struct net_device *dev, |
419dfaed VO |
400 | const struct switchdev_attr *attr, |
401 | struct netlink_ext_ack *extack) | |
3094333d SF |
402 | { |
403 | return -EOPNOTSUPP; | |
404 | } | |
405 | ||
491d0f15 | 406 | static inline int switchdev_port_obj_add(struct net_device *dev, |
69b7320e PM |
407 | const struct switchdev_obj *obj, |
408 | struct netlink_ext_ack *extack) | |
491d0f15 SF |
409 | { |
410 | return -EOPNOTSUPP; | |
411 | } | |
412 | ||
413 | static inline int switchdev_port_obj_del(struct net_device *dev, | |
648b4a99 | 414 | const struct switchdev_obj *obj) |
491d0f15 SF |
415 | { |
416 | return -EOPNOTSUPP; | |
417 | } | |
418 | ||
ebb9a03a | 419 | static inline int register_switchdev_notifier(struct notifier_block *nb) |
03bf0c28 JP |
420 | { |
421 | return 0; | |
422 | } | |
423 | ||
ebb9a03a | 424 | static inline int unregister_switchdev_notifier(struct notifier_block *nb) |
03bf0c28 JP |
425 | { |
426 | return 0; | |
427 | } | |
428 | ||
ebb9a03a JP |
429 | static inline int call_switchdev_notifiers(unsigned long val, |
430 | struct net_device *dev, | |
6685987c PM |
431 | struct switchdev_notifier_info *info, |
432 | struct netlink_ext_ack *extack) | |
03bf0c28 JP |
433 | { |
434 | return NOTIFY_DONE; | |
435 | } | |
436 | ||
a93e3b17 PM |
437 | static inline int |
438 | register_switchdev_blocking_notifier(struct notifier_block *nb) | |
439 | { | |
440 | return 0; | |
441 | } | |
442 | ||
443 | static inline int | |
444 | unregister_switchdev_blocking_notifier(struct notifier_block *nb) | |
445 | { | |
446 | return 0; | |
447 | } | |
448 | ||
449 | static inline int | |
450 | call_switchdev_blocking_notifiers(unsigned long val, | |
451 | struct net_device *dev, | |
479c86dc PM |
452 | struct switchdev_notifier_info *info, |
453 | struct netlink_ext_ack *extack) | |
a93e3b17 PM |
454 | { |
455 | return NOTIFY_DONE; | |
456 | } | |
457 | ||
f30f0601 | 458 | static inline int |
716a30a9 | 459 | switchdev_handle_fdb_event_to_device(struct net_device *dev, unsigned long event, |
8ca07176 VO |
460 | const struct switchdev_notifier_fdb_info *fdb_info, |
461 | bool (*check_cb)(const struct net_device *dev), | |
462 | bool (*foreign_dev_check_cb)(const struct net_device *dev, | |
463 | const struct net_device *foreign_dev), | |
716a30a9 VO |
464 | int (*mod_cb)(struct net_device *dev, struct net_device *orig_dev, |
465 | unsigned long event, const void *ctx, | |
ec638740 | 466 | const struct switchdev_notifier_fdb_info *fdb_info)) |
8ca07176 VO |
467 | { |
468 | return 0; | |
469 | } | |
470 | ||
471 | static inline int | |
f30f0601 PM |
472 | switchdev_handle_port_obj_add(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 (*add_cb)(struct net_device *dev, const void *ctx, |
f30f0601 | 476 | const struct switchdev_obj *obj, |
69213513 | 477 | struct netlink_ext_ack *extack)) |
f30f0601 PM |
478 | { |
479 | return 0; | |
480 | } | |
481 | ||
c4076cdd VO |
482 | static inline int switchdev_handle_port_obj_add_foreign(struct net_device *dev, |
483 | struct switchdev_notifier_port_obj_info *port_obj_info, | |
484 | bool (*check_cb)(const struct net_device *dev), | |
485 | bool (*foreign_dev_check_cb)(const struct net_device *dev, | |
486 | const struct net_device *foreign_dev), | |
487 | int (*add_cb)(struct net_device *dev, const void *ctx, | |
488 | const struct switchdev_obj *obj, | |
489 | struct netlink_ext_ack *extack)) | |
490 | { | |
491 | return 0; | |
492 | } | |
493 | ||
f30f0601 PM |
494 | static inline int |
495 | switchdev_handle_port_obj_del(struct net_device *dev, | |
496 | struct switchdev_notifier_port_obj_info *port_obj_info, | |
497 | bool (*check_cb)(const struct net_device *dev), | |
69bfac96 | 498 | int (*del_cb)(struct net_device *dev, const void *ctx, |
f30f0601 PM |
499 | const struct switchdev_obj *obj)) |
500 | { | |
501 | return 0; | |
502 | } | |
503 | ||
c4076cdd VO |
504 | static inline int |
505 | switchdev_handle_port_obj_del_foreign(struct net_device *dev, | |
506 | struct switchdev_notifier_port_obj_info *port_obj_info, | |
507 | bool (*check_cb)(const struct net_device *dev), | |
508 | bool (*foreign_dev_check_cb)(const struct net_device *dev, | |
509 | const struct net_device *foreign_dev), | |
510 | int (*del_cb)(struct net_device *dev, const void *ctx, | |
511 | const struct switchdev_obj *obj)) | |
512 | { | |
513 | return 0; | |
514 | } | |
515 | ||
1cb33af1 FF |
516 | static inline int |
517 | switchdev_handle_port_attr_set(struct net_device *dev, | |
518 | struct switchdev_notifier_port_attr_info *port_attr_info, | |
519 | bool (*check_cb)(const struct net_device *dev), | |
69bfac96 | 520 | int (*set_cb)(struct net_device *dev, const void *ctx, |
4c08c586 VO |
521 | const struct switchdev_attr *attr, |
522 | struct netlink_ext_ack *extack)) | |
1cb33af1 FF |
523 | { |
524 | return 0; | |
525 | } | |
007f790c JP |
526 | #endif |
527 | ||
528 | #endif /* _LINUX_SWITCHDEV_H_ */ |