cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

switchdev.h (15135B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/*
      3 * include/net/switchdev.h - Switch device API
      4 * Copyright (c) 2014-2015 Jiri Pirko <jiri@resnulli.us>
      5 * Copyright (c) 2014-2015 Scott Feldman <sfeldma@gmail.com>
      6 */
      7#ifndef _LINUX_SWITCHDEV_H_
      8#define _LINUX_SWITCHDEV_H_
      9
     10#include <linux/netdevice.h>
     11#include <linux/notifier.h>
     12#include <linux/list.h>
     13#include <net/ip_fib.h>
     14
     15#define SWITCHDEV_F_NO_RECURSE		BIT(0)
     16#define SWITCHDEV_F_SKIP_EOPNOTSUPP	BIT(1)
     17#define SWITCHDEV_F_DEFER		BIT(2)
     18
     19enum switchdev_attr_id {
     20	SWITCHDEV_ATTR_ID_UNDEFINED,
     21	SWITCHDEV_ATTR_ID_PORT_STP_STATE,
     22	SWITCHDEV_ATTR_ID_PORT_MST_STATE,
     23	SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS,
     24	SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS,
     25	SWITCHDEV_ATTR_ID_PORT_MROUTER,
     26	SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME,
     27	SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING,
     28	SWITCHDEV_ATTR_ID_BRIDGE_VLAN_PROTOCOL,
     29	SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED,
     30	SWITCHDEV_ATTR_ID_BRIDGE_MROUTER,
     31	SWITCHDEV_ATTR_ID_BRIDGE_MST,
     32	SWITCHDEV_ATTR_ID_MRP_PORT_ROLE,
     33	SWITCHDEV_ATTR_ID_VLAN_MSTI,
     34};
     35
     36struct switchdev_mst_state {
     37	u16 msti;
     38	u8 state;
     39};
     40
     41struct switchdev_brport_flags {
     42	unsigned long val;
     43	unsigned long mask;
     44};
     45
     46struct switchdev_vlan_msti {
     47	u16 vid;
     48	u16 msti;
     49};
     50
     51struct switchdev_attr {
     52	struct net_device *orig_dev;
     53	enum switchdev_attr_id id;
     54	u32 flags;
     55	void *complete_priv;
     56	void (*complete)(struct net_device *dev, int err, void *priv);
     57	union {
     58		u8 stp_state;				/* PORT_STP_STATE */
     59		struct switchdev_mst_state mst_state;	/* PORT_MST_STATE */
     60		struct switchdev_brport_flags brport_flags; /* PORT_BRIDGE_FLAGS */
     61		bool mrouter;				/* PORT_MROUTER */
     62		clock_t ageing_time;			/* BRIDGE_AGEING_TIME */
     63		bool vlan_filtering;			/* BRIDGE_VLAN_FILTERING */
     64		u16 vlan_protocol;			/* BRIDGE_VLAN_PROTOCOL */
     65		bool mst;				/* BRIDGE_MST */
     66		bool mc_disabled;			/* MC_DISABLED */
     67		u8 mrp_port_role;			/* MRP_PORT_ROLE */
     68		struct switchdev_vlan_msti vlan_msti;	/* VLAN_MSTI */
     69	} u;
     70};
     71
     72enum switchdev_obj_id {
     73	SWITCHDEV_OBJ_ID_UNDEFINED,
     74	SWITCHDEV_OBJ_ID_PORT_VLAN,
     75	SWITCHDEV_OBJ_ID_PORT_MDB,
     76	SWITCHDEV_OBJ_ID_HOST_MDB,
     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,
     81	SWITCHDEV_OBJ_ID_IN_TEST_MRP,
     82	SWITCHDEV_OBJ_ID_IN_ROLE_MRP,
     83	SWITCHDEV_OBJ_ID_IN_STATE_MRP,
     84};
     85
     86struct switchdev_obj {
     87	struct list_head list;
     88	struct net_device *orig_dev;
     89	enum switchdev_obj_id id;
     90	u32 flags;
     91	void *complete_priv;
     92	void (*complete)(struct net_device *dev, int err, void *priv);
     93};
     94
     95/* SWITCHDEV_OBJ_ID_PORT_VLAN */
     96struct switchdev_obj_port_vlan {
     97	struct switchdev_obj obj;
     98	u16 flags;
     99	u16 vid;
    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;
    107};
    108
    109#define SWITCHDEV_OBJ_PORT_VLAN(OBJ) \
    110	container_of((OBJ), struct switchdev_obj_port_vlan, obj)
    111
    112/* SWITCHDEV_OBJ_ID_PORT_MDB */
    113struct switchdev_obj_port_mdb {
    114	struct switchdev_obj obj;
    115	unsigned char addr[ETH_ALEN];
    116	u16 vid;
    117};
    118
    119#define SWITCHDEV_OBJ_PORT_MDB(OBJ) \
    120	container_of((OBJ), struct switchdev_obj_port_mdb, obj)
    121
    122
    123/* SWITCHDEV_OBJ_ID_MRP */
    124struct switchdev_obj_mrp {
    125	struct switchdev_obj obj;
    126	struct net_device *p_port;
    127	struct net_device *s_port;
    128	u32 ring_id;
    129	u16 prio;
    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 */
    136struct 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;
    143	bool monitor;
    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 */
    150struct switchdev_obj_ring_role_mrp {
    151	struct switchdev_obj obj;
    152	u8 ring_role;
    153	u32 ring_id;
    154	u8 sw_backup;
    155};
    156
    157#define SWITCHDEV_OBJ_RING_ROLE_MRP(OBJ) \
    158	container_of((OBJ), struct switchdev_obj_ring_role_mrp, obj)
    159
    160struct 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
    169/* SWITCHDEV_OBJ_ID_IN_TEST_MRP */
    170struct 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 */
    183struct 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;
    189	u8 sw_backup;
    190};
    191
    192#define SWITCHDEV_OBJ_IN_ROLE_MRP(OBJ) \
    193	container_of((OBJ), struct switchdev_obj_in_role_mrp, obj)
    194
    195struct 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
    204typedef int switchdev_obj_dump_cb_t(struct switchdev_obj *obj);
    205
    206struct switchdev_brport {
    207	struct net_device *dev;
    208	const void *ctx;
    209	struct notifier_block *atomic_nb;
    210	struct notifier_block *blocking_nb;
    211	bool tx_fwd_offload;
    212};
    213
    214enum switchdev_notifier_type {
    215	SWITCHDEV_FDB_ADD_TO_BRIDGE = 1,
    216	SWITCHDEV_FDB_DEL_TO_BRIDGE,
    217	SWITCHDEV_FDB_ADD_TO_DEVICE,
    218	SWITCHDEV_FDB_DEL_TO_DEVICE,
    219	SWITCHDEV_FDB_OFFLOADED,
    220	SWITCHDEV_FDB_FLUSH_TO_BRIDGE,
    221
    222	SWITCHDEV_PORT_OBJ_ADD, /* Blocking. */
    223	SWITCHDEV_PORT_OBJ_DEL, /* Blocking. */
    224	SWITCHDEV_PORT_ATTR_SET, /* May be blocking . */
    225
    226	SWITCHDEV_VXLAN_FDB_ADD_TO_BRIDGE,
    227	SWITCHDEV_VXLAN_FDB_DEL_TO_BRIDGE,
    228	SWITCHDEV_VXLAN_FDB_ADD_TO_DEVICE,
    229	SWITCHDEV_VXLAN_FDB_DEL_TO_DEVICE,
    230	SWITCHDEV_VXLAN_FDB_OFFLOADED,
    231
    232	SWITCHDEV_BRPORT_OFFLOADED,
    233	SWITCHDEV_BRPORT_UNOFFLOADED,
    234};
    235
    236struct switchdev_notifier_info {
    237	struct net_device *dev;
    238	struct netlink_ext_ack *extack;
    239	const void *ctx;
    240};
    241
    242struct switchdev_notifier_fdb_info {
    243	struct switchdev_notifier_info info; /* must be first */
    244	const unsigned char *addr;
    245	u16 vid;
    246	u8 added_by_user:1,
    247	   is_local:1,
    248	   offloaded:1;
    249};
    250
    251struct switchdev_notifier_port_obj_info {
    252	struct switchdev_notifier_info info; /* must be first */
    253	const struct switchdev_obj *obj;
    254	bool handled;
    255};
    256
    257struct switchdev_notifier_port_attr_info {
    258	struct switchdev_notifier_info info; /* must be first */
    259	const struct switchdev_attr *attr;
    260	bool handled;
    261};
    262
    263struct switchdev_notifier_brport_info {
    264	struct switchdev_notifier_info info; /* must be first */
    265	const struct switchdev_brport brport;
    266};
    267
    268static inline struct net_device *
    269switchdev_notifier_info_to_dev(const struct switchdev_notifier_info *info)
    270{
    271	return info->dev;
    272}
    273
    274static inline struct netlink_ext_ack *
    275switchdev_notifier_info_to_extack(const struct switchdev_notifier_info *info)
    276{
    277	return info->extack;
    278}
    279
    280static inline bool
    281switchdev_fdb_is_dynamically_learned(const struct switchdev_notifier_fdb_info *fdb_info)
    282{
    283	return !fdb_info->added_by_user && !fdb_info->is_local;
    284}
    285
    286#ifdef CONFIG_NET_SWITCHDEV
    287
    288int switchdev_bridge_port_offload(struct net_device *brport_dev,
    289				  struct net_device *dev, const void *ctx,
    290				  struct notifier_block *atomic_nb,
    291				  struct notifier_block *blocking_nb,
    292				  bool tx_fwd_offload,
    293				  struct netlink_ext_ack *extack);
    294void switchdev_bridge_port_unoffload(struct net_device *brport_dev,
    295				     const void *ctx,
    296				     struct notifier_block *atomic_nb,
    297				     struct notifier_block *blocking_nb);
    298
    299void switchdev_deferred_process(void);
    300int switchdev_port_attr_set(struct net_device *dev,
    301			    const struct switchdev_attr *attr,
    302			    struct netlink_ext_ack *extack);
    303int switchdev_port_obj_add(struct net_device *dev,
    304			   const struct switchdev_obj *obj,
    305			   struct netlink_ext_ack *extack);
    306int switchdev_port_obj_del(struct net_device *dev,
    307			   const struct switchdev_obj *obj);
    308
    309int register_switchdev_notifier(struct notifier_block *nb);
    310int unregister_switchdev_notifier(struct notifier_block *nb);
    311int call_switchdev_notifiers(unsigned long val, struct net_device *dev,
    312			     struct switchdev_notifier_info *info,
    313			     struct netlink_ext_ack *extack);
    314
    315int register_switchdev_blocking_notifier(struct notifier_block *nb);
    316int unregister_switchdev_blocking_notifier(struct notifier_block *nb);
    317int call_switchdev_blocking_notifiers(unsigned long val, struct net_device *dev,
    318				      struct switchdev_notifier_info *info,
    319				      struct netlink_ext_ack *extack);
    320
    321void switchdev_port_fwd_mark_set(struct net_device *dev,
    322				 struct net_device *group_dev,
    323				 bool joining);
    324
    325int switchdev_handle_fdb_event_to_device(struct net_device *dev, unsigned long event,
    326		const struct switchdev_notifier_fdb_info *fdb_info,
    327		bool (*check_cb)(const struct net_device *dev),
    328		bool (*foreign_dev_check_cb)(const struct net_device *dev,
    329					     const struct net_device *foreign_dev),
    330		int (*mod_cb)(struct net_device *dev, struct net_device *orig_dev,
    331			      unsigned long event, const void *ctx,
    332			      const struct switchdev_notifier_fdb_info *fdb_info));
    333
    334int switchdev_handle_port_obj_add(struct net_device *dev,
    335			struct switchdev_notifier_port_obj_info *port_obj_info,
    336			bool (*check_cb)(const struct net_device *dev),
    337			int (*add_cb)(struct net_device *dev, const void *ctx,
    338				      const struct switchdev_obj *obj,
    339				      struct netlink_ext_ack *extack));
    340int switchdev_handle_port_obj_add_foreign(struct net_device *dev,
    341			struct switchdev_notifier_port_obj_info *port_obj_info,
    342			bool (*check_cb)(const struct net_device *dev),
    343			bool (*foreign_dev_check_cb)(const struct net_device *dev,
    344						     const struct net_device *foreign_dev),
    345			int (*add_cb)(struct net_device *dev, const void *ctx,
    346				      const struct switchdev_obj *obj,
    347				      struct netlink_ext_ack *extack));
    348int switchdev_handle_port_obj_del(struct net_device *dev,
    349			struct switchdev_notifier_port_obj_info *port_obj_info,
    350			bool (*check_cb)(const struct net_device *dev),
    351			int (*del_cb)(struct net_device *dev, const void *ctx,
    352				      const struct switchdev_obj *obj));
    353int switchdev_handle_port_obj_del_foreign(struct net_device *dev,
    354			struct switchdev_notifier_port_obj_info *port_obj_info,
    355			bool (*check_cb)(const struct net_device *dev),
    356			bool (*foreign_dev_check_cb)(const struct net_device *dev,
    357						     const struct net_device *foreign_dev),
    358			int (*del_cb)(struct net_device *dev, const void *ctx,
    359				      const struct switchdev_obj *obj));
    360
    361int switchdev_handle_port_attr_set(struct net_device *dev,
    362			struct switchdev_notifier_port_attr_info *port_attr_info,
    363			bool (*check_cb)(const struct net_device *dev),
    364			int (*set_cb)(struct net_device *dev, const void *ctx,
    365				      const struct switchdev_attr *attr,
    366				      struct netlink_ext_ack *extack));
    367#else
    368
    369static inline int
    370switchdev_bridge_port_offload(struct net_device *brport_dev,
    371			      struct net_device *dev, const void *ctx,
    372			      struct notifier_block *atomic_nb,
    373			      struct notifier_block *blocking_nb,
    374			      bool tx_fwd_offload,
    375			      struct netlink_ext_ack *extack)
    376{
    377	return -EOPNOTSUPP;
    378}
    379
    380static inline void
    381switchdev_bridge_port_unoffload(struct net_device *brport_dev,
    382				const void *ctx,
    383				struct notifier_block *atomic_nb,
    384				struct notifier_block *blocking_nb)
    385{
    386}
    387
    388static inline void switchdev_deferred_process(void)
    389{
    390}
    391
    392static inline int switchdev_port_attr_set(struct net_device *dev,
    393					  const struct switchdev_attr *attr,
    394					  struct netlink_ext_ack *extack)
    395{
    396	return -EOPNOTSUPP;
    397}
    398
    399static inline int switchdev_port_obj_add(struct net_device *dev,
    400					 const struct switchdev_obj *obj,
    401					 struct netlink_ext_ack *extack)
    402{
    403	return -EOPNOTSUPP;
    404}
    405
    406static inline int switchdev_port_obj_del(struct net_device *dev,
    407					 const struct switchdev_obj *obj)
    408{
    409	return -EOPNOTSUPP;
    410}
    411
    412static inline int register_switchdev_notifier(struct notifier_block *nb)
    413{
    414	return 0;
    415}
    416
    417static inline int unregister_switchdev_notifier(struct notifier_block *nb)
    418{
    419	return 0;
    420}
    421
    422static inline int call_switchdev_notifiers(unsigned long val,
    423					   struct net_device *dev,
    424					   struct switchdev_notifier_info *info,
    425					   struct netlink_ext_ack *extack)
    426{
    427	return NOTIFY_DONE;
    428}
    429
    430static inline int
    431register_switchdev_blocking_notifier(struct notifier_block *nb)
    432{
    433	return 0;
    434}
    435
    436static inline int
    437unregister_switchdev_blocking_notifier(struct notifier_block *nb)
    438{
    439	return 0;
    440}
    441
    442static inline int
    443call_switchdev_blocking_notifiers(unsigned long val,
    444				  struct net_device *dev,
    445				  struct switchdev_notifier_info *info,
    446				  struct netlink_ext_ack *extack)
    447{
    448	return NOTIFY_DONE;
    449}
    450
    451static inline int
    452switchdev_handle_fdb_event_to_device(struct net_device *dev, unsigned long event,
    453		const struct switchdev_notifier_fdb_info *fdb_info,
    454		bool (*check_cb)(const struct net_device *dev),
    455		bool (*foreign_dev_check_cb)(const struct net_device *dev,
    456					     const struct net_device *foreign_dev),
    457		int (*mod_cb)(struct net_device *dev, struct net_device *orig_dev,
    458			      unsigned long event, const void *ctx,
    459			      const struct switchdev_notifier_fdb_info *fdb_info))
    460{
    461	return 0;
    462}
    463
    464static inline int
    465switchdev_handle_port_obj_add(struct net_device *dev,
    466			struct switchdev_notifier_port_obj_info *port_obj_info,
    467			bool (*check_cb)(const struct net_device *dev),
    468			int (*add_cb)(struct net_device *dev, const void *ctx,
    469				      const struct switchdev_obj *obj,
    470				      struct netlink_ext_ack *extack))
    471{
    472	return 0;
    473}
    474
    475static inline int switchdev_handle_port_obj_add_foreign(struct net_device *dev,
    476			struct switchdev_notifier_port_obj_info *port_obj_info,
    477			bool (*check_cb)(const struct net_device *dev),
    478			bool (*foreign_dev_check_cb)(const struct net_device *dev,
    479						     const struct net_device *foreign_dev),
    480			int (*add_cb)(struct net_device *dev, const void *ctx,
    481				      const struct switchdev_obj *obj,
    482				      struct netlink_ext_ack *extack))
    483{
    484	return 0;
    485}
    486
    487static inline int
    488switchdev_handle_port_obj_del(struct net_device *dev,
    489			struct switchdev_notifier_port_obj_info *port_obj_info,
    490			bool (*check_cb)(const struct net_device *dev),
    491			int (*del_cb)(struct net_device *dev, const void *ctx,
    492				      const struct switchdev_obj *obj))
    493{
    494	return 0;
    495}
    496
    497static inline int
    498switchdev_handle_port_obj_del_foreign(struct net_device *dev,
    499			struct switchdev_notifier_port_obj_info *port_obj_info,
    500			bool (*check_cb)(const struct net_device *dev),
    501			bool (*foreign_dev_check_cb)(const struct net_device *dev,
    502						     const struct net_device *foreign_dev),
    503			int (*del_cb)(struct net_device *dev, const void *ctx,
    504				      const struct switchdev_obj *obj))
    505{
    506	return 0;
    507}
    508
    509static inline int
    510switchdev_handle_port_attr_set(struct net_device *dev,
    511			struct switchdev_notifier_port_attr_info *port_attr_info,
    512			bool (*check_cb)(const struct net_device *dev),
    513			int (*set_cb)(struct net_device *dev, const void *ctx,
    514				      const struct switchdev_attr *attr,
    515				      struct netlink_ext_ack *extack))
    516{
    517	return 0;
    518}
    519#endif
    520
    521#endif /* _LINUX_SWITCHDEV_H_ */