Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags   |
^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_ */