12874c5fdSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
2007f790cSJiri Pirko /*
3007f790cSJiri Pirko * include/net/switchdev.h - Switch device API
47ea6eb3fSJiri Pirko * Copyright (c) 2014-2015 Jiri Pirko <[email protected]>
5f8f21471SScott Feldman * Copyright (c) 2014-2015 Scott Feldman <[email protected]>
6007f790cSJiri Pirko */
7007f790cSJiri Pirko #ifndef _LINUX_SWITCHDEV_H_
8007f790cSJiri Pirko #define _LINUX_SWITCHDEV_H_
9007f790cSJiri Pirko
10007f790cSJiri Pirko #include <linux/netdevice.h>
1103bf0c28SJiri Pirko #include <linux/notifier.h>
127ea6eb3fSJiri Pirko #include <linux/list.h>
13850d0cbcSJiri Pirko #include <net/ip_fib.h>
1403bf0c28SJiri Pirko
153094333dSScott Feldman #define SWITCHDEV_F_NO_RECURSE BIT(0)
16464314eaSScott Feldman #define SWITCHDEV_F_SKIP_EOPNOTSUPP BIT(1)
170bc05d58SJiri Pirko #define SWITCHDEV_F_DEFER BIT(2)
183094333dSScott Feldman
193094333dSScott Feldman enum switchdev_attr_id {
201f868398SJiri Pirko SWITCHDEV_ATTR_ID_UNDEFINED,
211f868398SJiri Pirko SWITCHDEV_ATTR_ID_PORT_STP_STATE,
227ae9147fSTobias Waldekranz SWITCHDEV_ATTR_ID_PORT_MST_STATE,
231f868398SJiri Pirko SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS,
24746dc184SFlorian Fainelli SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS,
256d549648SNogah Frankel SWITCHDEV_ATTR_ID_PORT_MROUTER,
26f55ac58aSScott Feldman SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME,
2781435c33SElad Raz SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING,
2822ec19f3SDanielle Ratson SWITCHDEV_ATTR_ID_BRIDGE_VLAN_PROTOCOL,
29147c1e9bSNogah Frankel SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED,
3077041420SYotam Gigi SWITCHDEV_ATTR_ID_BRIDGE_MROUTER,
3187c167bbSTobias Waldekranz SWITCHDEV_ATTR_ID_BRIDGE_MST,
32c284b545SHoratiu Vultur SWITCHDEV_ATTR_ID_MRP_PORT_ROLE,
336284c723STobias Waldekranz SWITCHDEV_ATTR_ID_VLAN_MSTI,
343094333dSScott Feldman };
353094333dSScott Feldman
367ae9147fSTobias Waldekranz struct switchdev_mst_state {
377ae9147fSTobias Waldekranz u16 msti;
387ae9147fSTobias Waldekranz u8 state;
397ae9147fSTobias Waldekranz };
407ae9147fSTobias Waldekranz
41e18f4c18SVladimir Oltean struct switchdev_brport_flags {
42e18f4c18SVladimir Oltean unsigned long val;
43e18f4c18SVladimir Oltean unsigned long mask;
44e18f4c18SVladimir Oltean };
45e18f4c18SVladimir Oltean
466284c723STobias Waldekranz struct switchdev_vlan_msti {
476284c723STobias Waldekranz u16 vid;
486284c723STobias Waldekranz u16 msti;
496284c723STobias Waldekranz };
506284c723STobias Waldekranz
513094333dSScott Feldman struct switchdev_attr {
526ff64f6fSIdo Schimmel struct net_device *orig_dev;
533094333dSScott Feldman enum switchdev_attr_id id;
543094333dSScott Feldman u32 flags;
557ceb2afbSElad Raz void *complete_priv;
567ceb2afbSElad Raz void (*complete)(struct net_device *dev, int err, void *priv);
57f8e20a9fSScott Feldman union {
5835636062SScott Feldman u8 stp_state; /* PORT_STP_STATE */
597ae9147fSTobias Waldekranz struct switchdev_mst_state mst_state; /* PORT_MST_STATE */
60e18f4c18SVladimir Oltean struct switchdev_brport_flags brport_flags; /* PORT_BRIDGE_FLAGS */
616d549648SNogah Frankel bool mrouter; /* PORT_MROUTER */
62eabfdda9SVivien Didelot clock_t ageing_time; /* BRIDGE_AGEING_TIME */
6381435c33SElad Raz bool vlan_filtering; /* BRIDGE_VLAN_FILTERING */
6422ec19f3SDanielle Ratson u16 vlan_protocol; /* BRIDGE_VLAN_PROTOCOL */
6587c167bbSTobias Waldekranz bool mst; /* BRIDGE_MST */
66147c1e9bSNogah Frankel bool mc_disabled; /* MC_DISABLED */
67c284b545SHoratiu Vultur u8 mrp_port_role; /* MRP_PORT_ROLE */
686284c723STobias Waldekranz struct switchdev_vlan_msti vlan_msti; /* VLAN_MSTI */
6942275bd8SScott Feldman } u;
703094333dSScott Feldman };
713094333dSScott Feldman
72491d0f15SScott Feldman enum switchdev_obj_id {
7357d80838SJiri Pirko SWITCHDEV_OBJ_ID_UNDEFINED,
7457d80838SJiri Pirko SWITCHDEV_OBJ_ID_PORT_VLAN,
754d41e125SElad Raz SWITCHDEV_OBJ_ID_PORT_MDB,
7647d5b6dbSAndrew Lunn SWITCHDEV_OBJ_ID_HOST_MDB,
77c284b545SHoratiu Vultur SWITCHDEV_OBJ_ID_MRP,
78c284b545SHoratiu Vultur SWITCHDEV_OBJ_ID_RING_TEST_MRP,
79c284b545SHoratiu Vultur SWITCHDEV_OBJ_ID_RING_ROLE_MRP,
80c284b545SHoratiu Vultur SWITCHDEV_OBJ_ID_RING_STATE_MRP,
81cf7c5274SHoratiu Vultur SWITCHDEV_OBJ_ID_IN_TEST_MRP,
82cf7c5274SHoratiu Vultur SWITCHDEV_OBJ_ID_IN_ROLE_MRP,
83cf7c5274SHoratiu Vultur SWITCHDEV_OBJ_ID_IN_STATE_MRP,
84491d0f15SScott Feldman };
85491d0f15SScott Feldman
86648b4a99SJiri Pirko struct switchdev_obj {
874f2673b3SVladimir Oltean struct list_head list;
886ff64f6fSIdo Schimmel struct net_device *orig_dev;
899e8f4a54SJiri Pirko enum switchdev_obj_id id;
904d429c5dSJiri Pirko u32 flags;
917ceb2afbSElad Raz void *complete_priv;
927ceb2afbSElad Raz void (*complete)(struct net_device *dev, int err, void *priv);
93648b4a99SJiri Pirko };
94648b4a99SJiri Pirko
9557d80838SJiri Pirko /* SWITCHDEV_OBJ_ID_PORT_VLAN */
968f24f309SJiri Pirko struct switchdev_obj_port_vlan {
97648b4a99SJiri Pirko struct switchdev_obj obj;
986fc3016dSScott Feldman u16 flags;
99b7a9e0daSVladimir Oltean u16 vid;
1008d23a54fSVladimir Oltean /* If set, the notifier signifies a change of one of the following
1018d23a54fSVladimir Oltean * flags for a VLAN that already exists:
1028d23a54fSVladimir Oltean * - BRIDGE_VLAN_INFO_PVID
1038d23a54fSVladimir Oltean * - BRIDGE_VLAN_INFO_UNTAGGED
1048d23a54fSVladimir Oltean * Entries with BRIDGE_VLAN_INFO_BRENTRY unset are not notified at all.
1058d23a54fSVladimir Oltean */
1068d23a54fSVladimir Oltean bool changed;
10744bbcf5cSVivien Didelot };
10844bbcf5cSVivien Didelot
109ec394af5SPetr Machata #define SWITCHDEV_OBJ_PORT_VLAN(OBJ) \
110ec394af5SPetr Machata container_of((OBJ), struct switchdev_obj_port_vlan, obj)
111648b4a99SJiri Pirko
1124d41e125SElad Raz /* SWITCHDEV_OBJ_ID_PORT_MDB */
1134d41e125SElad Raz struct switchdev_obj_port_mdb {
1144d41e125SElad Raz struct switchdev_obj obj;
1154d41e125SElad Raz unsigned char addr[ETH_ALEN];
1164d41e125SElad Raz u16 vid;
1174d41e125SElad Raz };
1184d41e125SElad Raz
119ec394af5SPetr Machata #define SWITCHDEV_OBJ_PORT_MDB(OBJ) \
120ec394af5SPetr Machata container_of((OBJ), struct switchdev_obj_port_mdb, obj)
1214d41e125SElad Raz
122c284b545SHoratiu Vultur
123c284b545SHoratiu Vultur /* SWITCHDEV_OBJ_ID_MRP */
124c284b545SHoratiu Vultur struct switchdev_obj_mrp {
125c284b545SHoratiu Vultur struct switchdev_obj obj;
126c284b545SHoratiu Vultur struct net_device *p_port;
127c284b545SHoratiu Vultur struct net_device *s_port;
128c284b545SHoratiu Vultur u32 ring_id;
1294b3a61b0SHoratiu Vultur u16 prio;
130c284b545SHoratiu Vultur };
131c284b545SHoratiu Vultur
132c284b545SHoratiu Vultur #define SWITCHDEV_OBJ_MRP(OBJ) \
133c284b545SHoratiu Vultur container_of((OBJ), struct switchdev_obj_mrp, obj)
134c284b545SHoratiu Vultur
135c284b545SHoratiu Vultur /* SWITCHDEV_OBJ_ID_RING_TEST_MRP */
136c284b545SHoratiu Vultur struct switchdev_obj_ring_test_mrp {
137c284b545SHoratiu Vultur struct switchdev_obj obj;
138c284b545SHoratiu Vultur /* The value is in us and a value of 0 represents to stop */
139c284b545SHoratiu Vultur u32 interval;
140c284b545SHoratiu Vultur u8 max_miss;
141c284b545SHoratiu Vultur u32 ring_id;
142c284b545SHoratiu Vultur u32 period;
143c6676e7dSHoratiu Vultur bool monitor;
144c284b545SHoratiu Vultur };
145c284b545SHoratiu Vultur
146c284b545SHoratiu Vultur #define SWITCHDEV_OBJ_RING_TEST_MRP(OBJ) \
147c284b545SHoratiu Vultur container_of((OBJ), struct switchdev_obj_ring_test_mrp, obj)
148c284b545SHoratiu Vultur
149c284b545SHoratiu Vultur /* SWICHDEV_OBJ_ID_RING_ROLE_MRP */
150c284b545SHoratiu Vultur struct switchdev_obj_ring_role_mrp {
151c284b545SHoratiu Vultur struct switchdev_obj obj;
152c284b545SHoratiu Vultur u8 ring_role;
153c284b545SHoratiu Vultur u32 ring_id;
154c513efa2SHoratiu Vultur u8 sw_backup;
155c284b545SHoratiu Vultur };
156c284b545SHoratiu Vultur
157c284b545SHoratiu Vultur #define SWITCHDEV_OBJ_RING_ROLE_MRP(OBJ) \
158c284b545SHoratiu Vultur container_of((OBJ), struct switchdev_obj_ring_role_mrp, obj)
159c284b545SHoratiu Vultur
160c284b545SHoratiu Vultur struct switchdev_obj_ring_state_mrp {
161c284b545SHoratiu Vultur struct switchdev_obj obj;
162c284b545SHoratiu Vultur u8 ring_state;
163c284b545SHoratiu Vultur u32 ring_id;
164c284b545SHoratiu Vultur };
165c284b545SHoratiu Vultur
166c284b545SHoratiu Vultur #define SWITCHDEV_OBJ_RING_STATE_MRP(OBJ) \
167c284b545SHoratiu Vultur container_of((OBJ), struct switchdev_obj_ring_state_mrp, obj)
168c284b545SHoratiu Vultur
169cf7c5274SHoratiu Vultur /* SWITCHDEV_OBJ_ID_IN_TEST_MRP */
170cf7c5274SHoratiu Vultur struct switchdev_obj_in_test_mrp {
171cf7c5274SHoratiu Vultur struct switchdev_obj obj;
172cf7c5274SHoratiu Vultur /* The value is in us and a value of 0 represents to stop */
173cf7c5274SHoratiu Vultur u32 interval;
174cf7c5274SHoratiu Vultur u32 in_id;
175cf7c5274SHoratiu Vultur u32 period;
176cf7c5274SHoratiu Vultur u8 max_miss;
177cf7c5274SHoratiu Vultur };
178cf7c5274SHoratiu Vultur
179cf7c5274SHoratiu Vultur #define SWITCHDEV_OBJ_IN_TEST_MRP(OBJ) \
180cf7c5274SHoratiu Vultur container_of((OBJ), struct switchdev_obj_in_test_mrp, obj)
181cf7c5274SHoratiu Vultur
182cf7c5274SHoratiu Vultur /* SWICHDEV_OBJ_ID_IN_ROLE_MRP */
183cf7c5274SHoratiu Vultur struct switchdev_obj_in_role_mrp {
184cf7c5274SHoratiu Vultur struct switchdev_obj obj;
185cf7c5274SHoratiu Vultur struct net_device *i_port;
186cf7c5274SHoratiu Vultur u32 ring_id;
187cf7c5274SHoratiu Vultur u16 in_id;
188cf7c5274SHoratiu Vultur u8 in_role;
189c513efa2SHoratiu Vultur u8 sw_backup;
190cf7c5274SHoratiu Vultur };
191cf7c5274SHoratiu Vultur
192cf7c5274SHoratiu Vultur #define SWITCHDEV_OBJ_IN_ROLE_MRP(OBJ) \
193cf7c5274SHoratiu Vultur container_of((OBJ), struct switchdev_obj_in_role_mrp, obj)
194cf7c5274SHoratiu Vultur
195cf7c5274SHoratiu Vultur struct switchdev_obj_in_state_mrp {
196cf7c5274SHoratiu Vultur struct switchdev_obj obj;
197cf7c5274SHoratiu Vultur u32 in_id;
198cf7c5274SHoratiu Vultur u8 in_state;
199cf7c5274SHoratiu Vultur };
200cf7c5274SHoratiu Vultur
201cf7c5274SHoratiu Vultur #define SWITCHDEV_OBJ_IN_STATE_MRP(OBJ) \
202cf7c5274SHoratiu Vultur container_of((OBJ), struct switchdev_obj_in_state_mrp, obj)
203cf7c5274SHoratiu Vultur
204957e2235SVladimir Oltean struct switchdev_brport {
205957e2235SVladimir Oltean struct net_device *dev;
206957e2235SVladimir Oltean const void *ctx;
207957e2235SVladimir Oltean struct notifier_block *atomic_nb;
208957e2235SVladimir Oltean struct notifier_block *blocking_nb;
209957e2235SVladimir Oltean bool tx_fwd_offload;
210957e2235SVladimir Oltean };
211957e2235SVladimir Oltean
212ebb9a03aSJiri Pirko enum switchdev_notifier_type {
2136b26b51bSArkadi Sharshevsky SWITCHDEV_FDB_ADD_TO_BRIDGE = 1,
2146b26b51bSArkadi Sharshevsky SWITCHDEV_FDB_DEL_TO_BRIDGE,
2156b26b51bSArkadi Sharshevsky SWITCHDEV_FDB_ADD_TO_DEVICE,
2166b26b51bSArkadi Sharshevsky SWITCHDEV_FDB_DEL_TO_DEVICE,
2179fe8bcecSArkadi Sharshevsky SWITCHDEV_FDB_OFFLOADED,
218d05e8e68SAlexandra Winter SWITCHDEV_FDB_FLUSH_TO_BRIDGE,
2199a997353SPetr Machata
220aa4efe21SPetr Machata SWITCHDEV_PORT_OBJ_ADD, /* Blocking. */
221aa4efe21SPetr Machata SWITCHDEV_PORT_OBJ_DEL, /* Blocking. */
2221cb33af1SFlorian Fainelli SWITCHDEV_PORT_ATTR_SET, /* May be blocking . */
223aa4efe21SPetr Machata
2245728ae0dSPetr Machata SWITCHDEV_VXLAN_FDB_ADD_TO_BRIDGE,
2255728ae0dSPetr Machata SWITCHDEV_VXLAN_FDB_DEL_TO_BRIDGE,
2269a997353SPetr Machata SWITCHDEV_VXLAN_FDB_ADD_TO_DEVICE,
2279a997353SPetr Machata SWITCHDEV_VXLAN_FDB_DEL_TO_DEVICE,
2280efe1173SPetr Machata SWITCHDEV_VXLAN_FDB_OFFLOADED,
229957e2235SVladimir Oltean
230957e2235SVladimir Oltean SWITCHDEV_BRPORT_OFFLOADED,
231957e2235SVladimir Oltean SWITCHDEV_BRPORT_UNOFFLOADED,
232f2e2857bSPetr Machata SWITCHDEV_BRPORT_REPLAY,
2333aeb6617SJiri Pirko };
2343aeb6617SJiri Pirko
235ebb9a03aSJiri Pirko struct switchdev_notifier_info {
23603bf0c28SJiri Pirko struct net_device *dev;
237479c86dcSPetr Machata struct netlink_ext_ack *extack;
23869bfac96SVladimir Oltean const void *ctx;
23903bf0c28SJiri Pirko };
24003bf0c28SJiri Pirko
2413eb4a4c3SVladimir Oltean /* Remember to update br_switchdev_fdb_populate() when adding
2423eb4a4c3SVladimir Oltean * new members to this structure
2433eb4a4c3SVladimir Oltean */
244ebb9a03aSJiri Pirko struct switchdev_notifier_fdb_info {
245ebb9a03aSJiri Pirko struct switchdev_notifier_info info; /* must be first */
2463aeb6617SJiri Pirko const unsigned char *addr;
2473aeb6617SJiri Pirko u16 vid;
248e9ba0fbcSIdo Schimmel u8 added_by_user:1,
2492c4eca3eSVladimir Oltean is_local:1,
25027fabd02SHans J. Schultz locked:1,
251e9ba0fbcSIdo Schimmel offloaded:1;
2523aeb6617SJiri Pirko };
2533aeb6617SJiri Pirko
254aa4efe21SPetr Machata struct switchdev_notifier_port_obj_info {
255aa4efe21SPetr Machata struct switchdev_notifier_info info; /* must be first */
256aa4efe21SPetr Machata const struct switchdev_obj *obj;
257aa4efe21SPetr Machata bool handled;
258aa4efe21SPetr Machata };
259aa4efe21SPetr Machata
2601cb33af1SFlorian Fainelli struct switchdev_notifier_port_attr_info {
2611cb33af1SFlorian Fainelli struct switchdev_notifier_info info; /* must be first */
2621cb33af1SFlorian Fainelli const struct switchdev_attr *attr;
2631cb33af1SFlorian Fainelli bool handled;
2641cb33af1SFlorian Fainelli };
2651cb33af1SFlorian Fainelli
266957e2235SVladimir Oltean struct switchdev_notifier_brport_info {
267957e2235SVladimir Oltean struct switchdev_notifier_info info; /* must be first */
268957e2235SVladimir Oltean const struct switchdev_brport brport;
269957e2235SVladimir Oltean };
270957e2235SVladimir Oltean
27103bf0c28SJiri Pirko static inline struct net_device *
switchdev_notifier_info_to_dev(const struct switchdev_notifier_info * info)272ebb9a03aSJiri Pirko switchdev_notifier_info_to_dev(const struct switchdev_notifier_info *info)
27303bf0c28SJiri Pirko {
27403bf0c28SJiri Pirko return info->dev;
27503bf0c28SJiri Pirko }
276007f790cSJiri Pirko
277479c86dcSPetr Machata static inline struct netlink_ext_ack *
switchdev_notifier_info_to_extack(const struct switchdev_notifier_info * info)278479c86dcSPetr Machata switchdev_notifier_info_to_extack(const struct switchdev_notifier_info *info)
279479c86dcSPetr Machata {
280479c86dcSPetr Machata return info->extack;
281479c86dcSPetr Machata }
282479c86dcSPetr Machata
283c6451cdaSVladimir Oltean static inline bool
switchdev_fdb_is_dynamically_learned(const struct switchdev_notifier_fdb_info * fdb_info)284c6451cdaSVladimir Oltean switchdev_fdb_is_dynamically_learned(const struct switchdev_notifier_fdb_info *fdb_info)
285c6451cdaSVladimir Oltean {
286c6451cdaSVladimir Oltean return !fdb_info->added_by_user && !fdb_info->is_local;
287c6451cdaSVladimir Oltean }
288c6451cdaSVladimir Oltean
289007f790cSJiri Pirko #ifdef CONFIG_NET_SWITCHDEV
290007f790cSJiri Pirko
291957e2235SVladimir Oltean int switchdev_bridge_port_offload(struct net_device *brport_dev,
292957e2235SVladimir Oltean struct net_device *dev, const void *ctx,
293957e2235SVladimir Oltean struct notifier_block *atomic_nb,
294957e2235SVladimir Oltean struct notifier_block *blocking_nb,
295957e2235SVladimir Oltean bool tx_fwd_offload,
296957e2235SVladimir Oltean struct netlink_ext_ack *extack);
297957e2235SVladimir Oltean void switchdev_bridge_port_unoffload(struct net_device *brport_dev,
298957e2235SVladimir Oltean const void *ctx,
299957e2235SVladimir Oltean struct notifier_block *atomic_nb,
300957e2235SVladimir Oltean struct notifier_block *blocking_nb);
301f2e2857bSPetr Machata int switchdev_bridge_port_replay(struct net_device *brport_dev,
302f2e2857bSPetr Machata struct net_device *dev, const void *ctx,
303f2e2857bSPetr Machata struct notifier_block *atomic_nb,
304f2e2857bSPetr Machata struct notifier_block *blocking_nb,
305f2e2857bSPetr Machata struct netlink_ext_ack *extack);
306957e2235SVladimir Oltean
307793f4014SJiri Pirko void switchdev_deferred_process(void);
3083094333dSScott Feldman int switchdev_port_attr_set(struct net_device *dev,
309dcbdf135SVladimir Oltean const struct switchdev_attr *attr,
310dcbdf135SVladimir Oltean struct netlink_ext_ack *extack);
311*dc489f86STobias Waldekranz bool switchdev_port_obj_act_is_deferred(struct net_device *dev,
312*dc489f86STobias Waldekranz enum switchdev_notifier_type nt,
313*dc489f86STobias Waldekranz const struct switchdev_obj *obj);
3149e8f4a54SJiri Pirko int switchdev_port_obj_add(struct net_device *dev,
31569b7320eSPetr Machata const struct switchdev_obj *obj,
31669b7320eSPetr Machata struct netlink_ext_ack *extack);
3179e8f4a54SJiri Pirko int switchdev_port_obj_del(struct net_device *dev,
318648b4a99SJiri Pirko const struct switchdev_obj *obj);
319a93e3b17SPetr Machata
320ebb9a03aSJiri Pirko int register_switchdev_notifier(struct notifier_block *nb);
321ebb9a03aSJiri Pirko int unregister_switchdev_notifier(struct notifier_block *nb);
322ebb9a03aSJiri Pirko int call_switchdev_notifiers(unsigned long val, struct net_device *dev,
3236685987cSPetr Machata struct switchdev_notifier_info *info,
3246685987cSPetr Machata struct netlink_ext_ack *extack);
325a93e3b17SPetr Machata
326a93e3b17SPetr Machata int register_switchdev_blocking_notifier(struct notifier_block *nb);
327a93e3b17SPetr Machata int unregister_switchdev_blocking_notifier(struct notifier_block *nb);
328a93e3b17SPetr Machata int call_switchdev_blocking_notifiers(unsigned long val, struct net_device *dev,
329479c86dcSPetr Machata struct switchdev_notifier_info *info,
330479c86dcSPetr Machata struct netlink_ext_ack *extack);
331a93e3b17SPetr Machata
332716a30a9SVladimir Oltean int switchdev_handle_fdb_event_to_device(struct net_device *dev, unsigned long event,
3338ca07176SVladimir Oltean const struct switchdev_notifier_fdb_info *fdb_info,
3348ca07176SVladimir Oltean bool (*check_cb)(const struct net_device *dev),
3358ca07176SVladimir Oltean bool (*foreign_dev_check_cb)(const struct net_device *dev,
3368ca07176SVladimir Oltean const struct net_device *foreign_dev),
337716a30a9SVladimir Oltean int (*mod_cb)(struct net_device *dev, struct net_device *orig_dev,
338716a30a9SVladimir Oltean unsigned long event, const void *ctx,
3398ca07176SVladimir Oltean const struct switchdev_notifier_fdb_info *fdb_info));
3408ca07176SVladimir Oltean
341f30f0601SPetr Machata int switchdev_handle_port_obj_add(struct net_device *dev,
342f30f0601SPetr Machata struct switchdev_notifier_port_obj_info *port_obj_info,
343f30f0601SPetr Machata bool (*check_cb)(const struct net_device *dev),
34469bfac96SVladimir Oltean int (*add_cb)(struct net_device *dev, const void *ctx,
345f30f0601SPetr Machata const struct switchdev_obj *obj,
34669213513SPetr Machata struct netlink_ext_ack *extack));
347c4076cddSVladimir Oltean int switchdev_handle_port_obj_add_foreign(struct net_device *dev,
348c4076cddSVladimir Oltean struct switchdev_notifier_port_obj_info *port_obj_info,
349c4076cddSVladimir Oltean bool (*check_cb)(const struct net_device *dev),
350c4076cddSVladimir Oltean bool (*foreign_dev_check_cb)(const struct net_device *dev,
351c4076cddSVladimir Oltean const struct net_device *foreign_dev),
352c4076cddSVladimir Oltean int (*add_cb)(struct net_device *dev, const void *ctx,
353c4076cddSVladimir Oltean const struct switchdev_obj *obj,
354c4076cddSVladimir Oltean struct netlink_ext_ack *extack));
355f30f0601SPetr Machata int switchdev_handle_port_obj_del(struct net_device *dev,
356f30f0601SPetr Machata struct switchdev_notifier_port_obj_info *port_obj_info,
357f30f0601SPetr Machata bool (*check_cb)(const struct net_device *dev),
35869bfac96SVladimir Oltean int (*del_cb)(struct net_device *dev, const void *ctx,
359f30f0601SPetr Machata const struct switchdev_obj *obj));
360c4076cddSVladimir Oltean int switchdev_handle_port_obj_del_foreign(struct net_device *dev,
361c4076cddSVladimir Oltean struct switchdev_notifier_port_obj_info *port_obj_info,
362c4076cddSVladimir Oltean bool (*check_cb)(const struct net_device *dev),
363c4076cddSVladimir Oltean bool (*foreign_dev_check_cb)(const struct net_device *dev,
364c4076cddSVladimir Oltean const struct net_device *foreign_dev),
365c4076cddSVladimir Oltean int (*del_cb)(struct net_device *dev, const void *ctx,
366c4076cddSVladimir Oltean const struct switchdev_obj *obj));
367f30f0601SPetr Machata
3681cb33af1SFlorian Fainelli int switchdev_handle_port_attr_set(struct net_device *dev,
3691cb33af1SFlorian Fainelli struct switchdev_notifier_port_attr_info *port_attr_info,
3701cb33af1SFlorian Fainelli bool (*check_cb)(const struct net_device *dev),
37169bfac96SVladimir Oltean int (*set_cb)(struct net_device *dev, const void *ctx,
3724c08c586SVladimir Oltean const struct switchdev_attr *attr,
3734c08c586SVladimir Oltean struct netlink_ext_ack *extack));
374007f790cSJiri Pirko #else
375007f790cSJiri Pirko
376957e2235SVladimir Oltean static inline int
switchdev_bridge_port_offload(struct net_device * brport_dev,struct net_device * dev,const void * ctx,struct notifier_block * atomic_nb,struct notifier_block * blocking_nb,bool tx_fwd_offload,struct netlink_ext_ack * extack)377957e2235SVladimir Oltean switchdev_bridge_port_offload(struct net_device *brport_dev,
378957e2235SVladimir Oltean struct net_device *dev, const void *ctx,
379957e2235SVladimir Oltean struct notifier_block *atomic_nb,
380957e2235SVladimir Oltean struct notifier_block *blocking_nb,
381957e2235SVladimir Oltean bool tx_fwd_offload,
382957e2235SVladimir Oltean struct netlink_ext_ack *extack)
383957e2235SVladimir Oltean {
384957e2235SVladimir Oltean return -EOPNOTSUPP;
385957e2235SVladimir Oltean }
386957e2235SVladimir Oltean
387957e2235SVladimir Oltean static inline void
switchdev_bridge_port_unoffload(struct net_device * brport_dev,const void * ctx,struct notifier_block * atomic_nb,struct notifier_block * blocking_nb)388957e2235SVladimir Oltean switchdev_bridge_port_unoffload(struct net_device *brport_dev,
389957e2235SVladimir Oltean const void *ctx,
390957e2235SVladimir Oltean struct notifier_block *atomic_nb,
391957e2235SVladimir Oltean struct notifier_block *blocking_nb)
392957e2235SVladimir Oltean {
393957e2235SVladimir Oltean }
394957e2235SVladimir Oltean
switchdev_deferred_process(void)395793f4014SJiri Pirko static inline void switchdev_deferred_process(void)
396793f4014SJiri Pirko {
397793f4014SJiri Pirko }
398793f4014SJiri Pirko
switchdev_port_attr_set(struct net_device * dev,const struct switchdev_attr * attr,struct netlink_ext_ack * extack)3993094333dSScott Feldman static inline int switchdev_port_attr_set(struct net_device *dev,
400419dfaedSVladimir Oltean const struct switchdev_attr *attr,
401419dfaedSVladimir Oltean struct netlink_ext_ack *extack)
4023094333dSScott Feldman {
4033094333dSScott Feldman return -EOPNOTSUPP;
4043094333dSScott Feldman }
4053094333dSScott Feldman
switchdev_port_obj_add(struct net_device * dev,const struct switchdev_obj * obj,struct netlink_ext_ack * extack)406491d0f15SScott Feldman static inline int switchdev_port_obj_add(struct net_device *dev,
40769b7320eSPetr Machata const struct switchdev_obj *obj,
40869b7320eSPetr Machata struct netlink_ext_ack *extack)
409491d0f15SScott Feldman {
410491d0f15SScott Feldman return -EOPNOTSUPP;
411491d0f15SScott Feldman }
412491d0f15SScott Feldman
switchdev_port_obj_del(struct net_device * dev,const struct switchdev_obj * obj)413491d0f15SScott Feldman static inline int switchdev_port_obj_del(struct net_device *dev,
414648b4a99SJiri Pirko const struct switchdev_obj *obj)
415491d0f15SScott Feldman {
416491d0f15SScott Feldman return -EOPNOTSUPP;
417491d0f15SScott Feldman }
418491d0f15SScott Feldman
register_switchdev_notifier(struct notifier_block * nb)419ebb9a03aSJiri Pirko static inline int register_switchdev_notifier(struct notifier_block *nb)
42003bf0c28SJiri Pirko {
42103bf0c28SJiri Pirko return 0;
42203bf0c28SJiri Pirko }
42303bf0c28SJiri Pirko
unregister_switchdev_notifier(struct notifier_block * nb)424ebb9a03aSJiri Pirko static inline int unregister_switchdev_notifier(struct notifier_block *nb)
42503bf0c28SJiri Pirko {
42603bf0c28SJiri Pirko return 0;
42703bf0c28SJiri Pirko }
42803bf0c28SJiri Pirko
call_switchdev_notifiers(unsigned long val,struct net_device * dev,struct switchdev_notifier_info * info,struct netlink_ext_ack * extack)429ebb9a03aSJiri Pirko static inline int call_switchdev_notifiers(unsigned long val,
430ebb9a03aSJiri Pirko struct net_device *dev,
4316685987cSPetr Machata struct switchdev_notifier_info *info,
4326685987cSPetr Machata struct netlink_ext_ack *extack)
43303bf0c28SJiri Pirko {
43403bf0c28SJiri Pirko return NOTIFY_DONE;
43503bf0c28SJiri Pirko }
43603bf0c28SJiri Pirko
437a93e3b17SPetr Machata static inline int
register_switchdev_blocking_notifier(struct notifier_block * nb)438a93e3b17SPetr Machata register_switchdev_blocking_notifier(struct notifier_block *nb)
439a93e3b17SPetr Machata {
440a93e3b17SPetr Machata return 0;
441a93e3b17SPetr Machata }
442a93e3b17SPetr Machata
443a93e3b17SPetr Machata static inline int
unregister_switchdev_blocking_notifier(struct notifier_block * nb)444a93e3b17SPetr Machata unregister_switchdev_blocking_notifier(struct notifier_block *nb)
445a93e3b17SPetr Machata {
446a93e3b17SPetr Machata return 0;
447a93e3b17SPetr Machata }
448a93e3b17SPetr Machata
449a93e3b17SPetr Machata static inline int
call_switchdev_blocking_notifiers(unsigned long val,struct net_device * dev,struct switchdev_notifier_info * info,struct netlink_ext_ack * extack)450a93e3b17SPetr Machata call_switchdev_blocking_notifiers(unsigned long val,
451a93e3b17SPetr Machata struct net_device *dev,
452479c86dcSPetr Machata struct switchdev_notifier_info *info,
453479c86dcSPetr Machata struct netlink_ext_ack *extack)
454a93e3b17SPetr Machata {
455a93e3b17SPetr Machata return NOTIFY_DONE;
456a93e3b17SPetr Machata }
457a93e3b17SPetr Machata
458f30f0601SPetr Machata static inline int
switchdev_handle_fdb_event_to_device(struct net_device * dev,unsigned long event,const struct switchdev_notifier_fdb_info * fdb_info,bool (* check_cb)(const struct net_device * dev),bool (* foreign_dev_check_cb)(const struct net_device * dev,const struct net_device * foreign_dev),int (* mod_cb)(struct net_device * dev,struct net_device * orig_dev,unsigned long event,const void * ctx,const struct switchdev_notifier_fdb_info * fdb_info))459716a30a9SVladimir Oltean switchdev_handle_fdb_event_to_device(struct net_device *dev, unsigned long event,
4608ca07176SVladimir Oltean const struct switchdev_notifier_fdb_info *fdb_info,
4618ca07176SVladimir Oltean bool (*check_cb)(const struct net_device *dev),
4628ca07176SVladimir Oltean bool (*foreign_dev_check_cb)(const struct net_device *dev,
4638ca07176SVladimir Oltean const struct net_device *foreign_dev),
464716a30a9SVladimir Oltean int (*mod_cb)(struct net_device *dev, struct net_device *orig_dev,
465716a30a9SVladimir Oltean unsigned long event, const void *ctx,
46694111dfcSVladimir Oltean const struct switchdev_notifier_fdb_info *fdb_info))
4678ca07176SVladimir Oltean {
4688ca07176SVladimir Oltean return 0;
4698ca07176SVladimir Oltean }
4708ca07176SVladimir Oltean
4718ca07176SVladimir Oltean 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 void * ctx,const struct switchdev_obj * obj,struct netlink_ext_ack * extack))472f30f0601SPetr Machata switchdev_handle_port_obj_add(struct net_device *dev,
473f30f0601SPetr Machata struct switchdev_notifier_port_obj_info *port_obj_info,
474f30f0601SPetr Machata bool (*check_cb)(const struct net_device *dev),
47569bfac96SVladimir Oltean int (*add_cb)(struct net_device *dev, const void *ctx,
476f30f0601SPetr Machata const struct switchdev_obj *obj,
47769213513SPetr Machata struct netlink_ext_ack *extack))
478f30f0601SPetr Machata {
479f30f0601SPetr Machata return 0;
480f30f0601SPetr Machata }
481f30f0601SPetr Machata
switchdev_handle_port_obj_add_foreign(struct net_device * dev,struct switchdev_notifier_port_obj_info * port_obj_info,bool (* check_cb)(const struct net_device * dev),bool (* foreign_dev_check_cb)(const struct net_device * dev,const struct net_device * foreign_dev),int (* add_cb)(struct net_device * dev,const void * ctx,const struct switchdev_obj * obj,struct netlink_ext_ack * extack))482c4076cddSVladimir Oltean static inline int switchdev_handle_port_obj_add_foreign(struct net_device *dev,
483c4076cddSVladimir Oltean struct switchdev_notifier_port_obj_info *port_obj_info,
484c4076cddSVladimir Oltean bool (*check_cb)(const struct net_device *dev),
485c4076cddSVladimir Oltean bool (*foreign_dev_check_cb)(const struct net_device *dev,
486c4076cddSVladimir Oltean const struct net_device *foreign_dev),
487c4076cddSVladimir Oltean int (*add_cb)(struct net_device *dev, const void *ctx,
488c4076cddSVladimir Oltean const struct switchdev_obj *obj,
489c4076cddSVladimir Oltean struct netlink_ext_ack *extack))
490c4076cddSVladimir Oltean {
491c4076cddSVladimir Oltean return 0;
492c4076cddSVladimir Oltean }
493c4076cddSVladimir Oltean
494f30f0601SPetr Machata 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 void * ctx,const struct switchdev_obj * obj))495f30f0601SPetr Machata switchdev_handle_port_obj_del(struct net_device *dev,
496f30f0601SPetr Machata struct switchdev_notifier_port_obj_info *port_obj_info,
497f30f0601SPetr Machata bool (*check_cb)(const struct net_device *dev),
49869bfac96SVladimir Oltean int (*del_cb)(struct net_device *dev, const void *ctx,
499f30f0601SPetr Machata const struct switchdev_obj *obj))
500f30f0601SPetr Machata {
501f30f0601SPetr Machata return 0;
502f30f0601SPetr Machata }
503f30f0601SPetr Machata
5041cb33af1SFlorian Fainelli static inline int
switchdev_handle_port_obj_del_foreign(struct net_device * dev,struct switchdev_notifier_port_obj_info * port_obj_info,bool (* check_cb)(const struct net_device * dev),bool (* foreign_dev_check_cb)(const struct net_device * dev,const struct net_device * foreign_dev),int (* del_cb)(struct net_device * dev,const void * ctx,const struct switchdev_obj * obj))505c4076cddSVladimir Oltean switchdev_handle_port_obj_del_foreign(struct net_device *dev,
506c4076cddSVladimir Oltean struct switchdev_notifier_port_obj_info *port_obj_info,
507c4076cddSVladimir Oltean bool (*check_cb)(const struct net_device *dev),
508c4076cddSVladimir Oltean bool (*foreign_dev_check_cb)(const struct net_device *dev,
509c4076cddSVladimir Oltean const struct net_device *foreign_dev),
510c4076cddSVladimir Oltean int (*del_cb)(struct net_device *dev, const void *ctx,
511c4076cddSVladimir Oltean const struct switchdev_obj *obj))
512c4076cddSVladimir Oltean {
513c4076cddSVladimir Oltean return 0;
514c4076cddSVladimir Oltean }
515c4076cddSVladimir Oltean
516c4076cddSVladimir Oltean 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 void * ctx,const struct switchdev_attr * attr,struct netlink_ext_ack * extack))5171cb33af1SFlorian Fainelli switchdev_handle_port_attr_set(struct net_device *dev,
5181cb33af1SFlorian Fainelli struct switchdev_notifier_port_attr_info *port_attr_info,
5191cb33af1SFlorian Fainelli bool (*check_cb)(const struct net_device *dev),
52069bfac96SVladimir Oltean int (*set_cb)(struct net_device *dev, const void *ctx,
5214c08c586SVladimir Oltean const struct switchdev_attr *attr,
5224c08c586SVladimir Oltean struct netlink_ext_ack *extack))
5231cb33af1SFlorian Fainelli {
5241cb33af1SFlorian Fainelli return 0;
5251cb33af1SFlorian Fainelli }
526007f790cSJiri Pirko #endif
527007f790cSJiri Pirko
528007f790cSJiri Pirko #endif /* _LINUX_SWITCHDEV_H_ */
529