^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * include/net/switchdev.h - Switch device API
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (c) 2014-2015 Jiri Pirko <jiri@resnulli.us>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (c) 2014-2015 Scott Feldman <sfeldma@gmail.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #ifndef _LINUX_SWITCHDEV_H_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #define _LINUX_SWITCHDEV_H_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/netdevice.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/notifier.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/list.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <net/ip_fib.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define SWITCHDEV_F_NO_RECURSE BIT(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #define SWITCHDEV_F_SKIP_EOPNOTSUPP BIT(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define SWITCHDEV_F_DEFER BIT(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) struct switchdev_trans {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) bool ph_prepare;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) static inline bool switchdev_trans_ph_prepare(struct switchdev_trans *trans)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) return trans && trans->ph_prepare;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) static inline bool switchdev_trans_ph_commit(struct switchdev_trans *trans)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) return trans && !trans->ph_prepare;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) enum switchdev_attr_id {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) SWITCHDEV_ATTR_ID_UNDEFINED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) SWITCHDEV_ATTR_ID_PORT_STP_STATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) SWITCHDEV_ATTR_ID_PORT_MROUTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) SWITCHDEV_ATTR_ID_BRIDGE_MROUTER,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #if IS_ENABLED(CONFIG_BRIDGE_MRP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) SWITCHDEV_ATTR_ID_MRP_PORT_ROLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) struct switchdev_attr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) struct net_device *orig_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) enum switchdev_attr_id id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) u32 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) void *complete_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) void (*complete)(struct net_device *dev, int err, void *priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) u8 stp_state; /* PORT_STP_STATE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) unsigned long brport_flags; /* PORT_{PRE}_BRIDGE_FLAGS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) bool mrouter; /* PORT_MROUTER */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) clock_t ageing_time; /* BRIDGE_AGEING_TIME */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) bool vlan_filtering; /* BRIDGE_VLAN_FILTERING */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) bool mc_disabled; /* MC_DISABLED */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #if IS_ENABLED(CONFIG_BRIDGE_MRP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) u8 mrp_port_role; /* MRP_PORT_ROLE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) } u;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) enum switchdev_obj_id {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) SWITCHDEV_OBJ_ID_UNDEFINED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) SWITCHDEV_OBJ_ID_PORT_VLAN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) SWITCHDEV_OBJ_ID_PORT_MDB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) SWITCHDEV_OBJ_ID_HOST_MDB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #if IS_ENABLED(CONFIG_BRIDGE_MRP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) SWITCHDEV_OBJ_ID_MRP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) SWITCHDEV_OBJ_ID_RING_TEST_MRP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) SWITCHDEV_OBJ_ID_RING_ROLE_MRP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) SWITCHDEV_OBJ_ID_RING_STATE_MRP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) SWITCHDEV_OBJ_ID_IN_TEST_MRP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) SWITCHDEV_OBJ_ID_IN_ROLE_MRP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) SWITCHDEV_OBJ_ID_IN_STATE_MRP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) struct switchdev_obj {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) struct net_device *orig_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) enum switchdev_obj_id id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) u32 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) void *complete_priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) void (*complete)(struct net_device *dev, int err, void *priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) /* SWITCHDEV_OBJ_ID_PORT_VLAN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) struct switchdev_obj_port_vlan {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) struct switchdev_obj obj;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) u16 flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) u16 vid_begin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) u16 vid_end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define SWITCHDEV_OBJ_PORT_VLAN(OBJ) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) container_of((OBJ), struct switchdev_obj_port_vlan, obj)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) /* SWITCHDEV_OBJ_ID_PORT_MDB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) struct switchdev_obj_port_mdb {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) struct switchdev_obj obj;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) unsigned char addr[ETH_ALEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) u16 vid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define SWITCHDEV_OBJ_PORT_MDB(OBJ) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) container_of((OBJ), struct switchdev_obj_port_mdb, obj)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #if IS_ENABLED(CONFIG_BRIDGE_MRP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) /* SWITCHDEV_OBJ_ID_MRP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) struct switchdev_obj_mrp {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) struct switchdev_obj obj;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) struct net_device *p_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) struct net_device *s_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) u32 ring_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) u16 prio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #define SWITCHDEV_OBJ_MRP(OBJ) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) container_of((OBJ), struct switchdev_obj_mrp, obj)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) /* SWITCHDEV_OBJ_ID_RING_TEST_MRP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) struct switchdev_obj_ring_test_mrp {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) struct switchdev_obj obj;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) /* The value is in us and a value of 0 represents to stop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) u32 interval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) u8 max_miss;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) u32 ring_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) u32 period;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) bool monitor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #define SWITCHDEV_OBJ_RING_TEST_MRP(OBJ) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) container_of((OBJ), struct switchdev_obj_ring_test_mrp, obj)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) /* SWICHDEV_OBJ_ID_RING_ROLE_MRP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) struct switchdev_obj_ring_role_mrp {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) struct switchdev_obj obj;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) u8 ring_role;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) u32 ring_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) #define SWITCHDEV_OBJ_RING_ROLE_MRP(OBJ) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) container_of((OBJ), struct switchdev_obj_ring_role_mrp, obj)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) struct switchdev_obj_ring_state_mrp {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) struct switchdev_obj obj;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) u8 ring_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) u32 ring_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #define SWITCHDEV_OBJ_RING_STATE_MRP(OBJ) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) container_of((OBJ), struct switchdev_obj_ring_state_mrp, obj)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) /* SWITCHDEV_OBJ_ID_IN_TEST_MRP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) struct switchdev_obj_in_test_mrp {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) struct switchdev_obj obj;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) /* The value is in us and a value of 0 represents to stop */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) u32 interval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) u32 in_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) u32 period;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) u8 max_miss;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) #define SWITCHDEV_OBJ_IN_TEST_MRP(OBJ) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) container_of((OBJ), struct switchdev_obj_in_test_mrp, obj)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) /* SWICHDEV_OBJ_ID_IN_ROLE_MRP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) struct switchdev_obj_in_role_mrp {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) struct switchdev_obj obj;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) struct net_device *i_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) u32 ring_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) u16 in_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) u8 in_role;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) #define SWITCHDEV_OBJ_IN_ROLE_MRP(OBJ) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) container_of((OBJ), struct switchdev_obj_in_role_mrp, obj)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) struct switchdev_obj_in_state_mrp {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) struct switchdev_obj obj;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) u32 in_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) u8 in_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) #define SWITCHDEV_OBJ_IN_STATE_MRP(OBJ) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) container_of((OBJ), struct switchdev_obj_in_state_mrp, obj)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) typedef int switchdev_obj_dump_cb_t(struct switchdev_obj *obj);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) enum switchdev_notifier_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) SWITCHDEV_FDB_ADD_TO_BRIDGE = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) SWITCHDEV_FDB_DEL_TO_BRIDGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) SWITCHDEV_FDB_ADD_TO_DEVICE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) SWITCHDEV_FDB_DEL_TO_DEVICE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) SWITCHDEV_FDB_OFFLOADED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) SWITCHDEV_FDB_FLUSH_TO_BRIDGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) SWITCHDEV_PORT_OBJ_ADD, /* Blocking. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) SWITCHDEV_PORT_OBJ_DEL, /* Blocking. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) SWITCHDEV_PORT_ATTR_SET, /* May be blocking . */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) SWITCHDEV_VXLAN_FDB_ADD_TO_BRIDGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) SWITCHDEV_VXLAN_FDB_DEL_TO_BRIDGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) SWITCHDEV_VXLAN_FDB_ADD_TO_DEVICE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) SWITCHDEV_VXLAN_FDB_DEL_TO_DEVICE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) SWITCHDEV_VXLAN_FDB_OFFLOADED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) struct switchdev_notifier_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) struct net_device *dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) struct netlink_ext_ack *extack;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) struct switchdev_notifier_fdb_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) struct switchdev_notifier_info info; /* must be first */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) const unsigned char *addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) u16 vid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) u8 added_by_user:1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) offloaded:1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) struct switchdev_notifier_port_obj_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) struct switchdev_notifier_info info; /* must be first */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) const struct switchdev_obj *obj;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) struct switchdev_trans *trans;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) bool handled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) struct switchdev_notifier_port_attr_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) struct switchdev_notifier_info info; /* must be first */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) const struct switchdev_attr *attr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) struct switchdev_trans *trans;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) bool handled;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) static inline struct net_device *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) switchdev_notifier_info_to_dev(const struct switchdev_notifier_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) return info->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) static inline struct netlink_ext_ack *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) switchdev_notifier_info_to_extack(const struct switchdev_notifier_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) return info->extack;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) #ifdef CONFIG_NET_SWITCHDEV
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) void switchdev_deferred_process(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) int switchdev_port_attr_set(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) const struct switchdev_attr *attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) int switchdev_port_obj_add(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) const struct switchdev_obj *obj,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) struct netlink_ext_ack *extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) int switchdev_port_obj_del(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) const struct switchdev_obj *obj);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) int register_switchdev_notifier(struct notifier_block *nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) int unregister_switchdev_notifier(struct notifier_block *nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) int call_switchdev_notifiers(unsigned long val, struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) struct switchdev_notifier_info *info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) struct netlink_ext_ack *extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) int register_switchdev_blocking_notifier(struct notifier_block *nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) int unregister_switchdev_blocking_notifier(struct notifier_block *nb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) int call_switchdev_blocking_notifiers(unsigned long val, struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) struct switchdev_notifier_info *info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) struct netlink_ext_ack *extack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) void switchdev_port_fwd_mark_set(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) struct net_device *group_dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) bool joining);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) int switchdev_handle_port_obj_add(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) struct switchdev_notifier_port_obj_info *port_obj_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) bool (*check_cb)(const struct net_device *dev),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) int (*add_cb)(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) const struct switchdev_obj *obj,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) struct switchdev_trans *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) struct netlink_ext_ack *extack));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) int switchdev_handle_port_obj_del(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) struct switchdev_notifier_port_obj_info *port_obj_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) bool (*check_cb)(const struct net_device *dev),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) int (*del_cb)(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) const struct switchdev_obj *obj));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) int switchdev_handle_port_attr_set(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) struct switchdev_notifier_port_attr_info *port_attr_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) bool (*check_cb)(const struct net_device *dev),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) int (*set_cb)(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) const struct switchdev_attr *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) struct switchdev_trans *trans));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) static inline void switchdev_deferred_process(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) static inline int switchdev_port_attr_set(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) const struct switchdev_attr *attr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) static inline int switchdev_port_obj_add(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) const struct switchdev_obj *obj,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) static inline int switchdev_port_obj_del(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) const struct switchdev_obj *obj)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) return -EOPNOTSUPP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) static inline int register_switchdev_notifier(struct notifier_block *nb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) static inline int unregister_switchdev_notifier(struct notifier_block *nb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) static inline int call_switchdev_notifiers(unsigned long val,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) struct switchdev_notifier_info *info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) return NOTIFY_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) static inline int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) register_switchdev_blocking_notifier(struct notifier_block *nb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) static inline int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) unregister_switchdev_blocking_notifier(struct notifier_block *nb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) static inline int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) call_switchdev_blocking_notifiers(unsigned long val,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) struct switchdev_notifier_info *info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) struct netlink_ext_ack *extack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) return NOTIFY_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) static inline int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) switchdev_handle_port_obj_add(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) struct switchdev_notifier_port_obj_info *port_obj_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) bool (*check_cb)(const struct net_device *dev),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) int (*add_cb)(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) const struct switchdev_obj *obj,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) struct switchdev_trans *trans,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) struct netlink_ext_ack *extack))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) static inline int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) switchdev_handle_port_obj_del(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) struct switchdev_notifier_port_obj_info *port_obj_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) bool (*check_cb)(const struct net_device *dev),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) int (*del_cb)(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) const struct switchdev_obj *obj))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) static inline int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) switchdev_handle_port_attr_set(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) struct switchdev_notifier_port_attr_info *port_attr_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) bool (*check_cb)(const struct net_device *dev),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) int (*set_cb)(struct net_device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) const struct switchdev_attr *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) struct switchdev_trans *trans))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) #endif /* _LINUX_SWITCHDEV_H_ */