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