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_MC_DISABLED,
  42        SWITCHDEV_ATTR_ID_BRIDGE_MROUTER,
  43#if IS_ENABLED(CONFIG_BRIDGE_MRP)
  44        SWITCHDEV_ATTR_ID_MRP_PORT_STATE,
  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                bool mc_disabled;                       /* MC_DISABLED */
  62#if IS_ENABLED(CONFIG_BRIDGE_MRP)
  63                u8 mrp_port_state;                      /* MRP_PORT_STATE */
  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
 207        SWITCHDEV_PORT_OBJ_ADD, /* Blocking. */
 208        SWITCHDEV_PORT_OBJ_DEL, /* Blocking. */
 209        SWITCHDEV_PORT_ATTR_SET, /* May be blocking . */
 210
 211        SWITCHDEV_VXLAN_FDB_ADD_TO_BRIDGE,
 212        SWITCHDEV_VXLAN_FDB_DEL_TO_BRIDGE,
 213        SWITCHDEV_VXLAN_FDB_ADD_TO_DEVICE,
 214        SWITCHDEV_VXLAN_FDB_DEL_TO_DEVICE,
 215        SWITCHDEV_VXLAN_FDB_OFFLOADED,
 216};
 217
 218struct switchdev_notifier_info {
 219        struct net_device *dev;
 220        struct netlink_ext_ack *extack;
 221};
 222
 223struct switchdev_notifier_fdb_info {
 224        struct switchdev_notifier_info info; /* must be first */
 225        const unsigned char *addr;
 226        u16 vid;
 227        u8 added_by_user:1,
 228           offloaded:1;
 229};
 230
 231struct switchdev_notifier_port_obj_info {
 232        struct switchdev_notifier_info info; /* must be first */
 233        const struct switchdev_obj *obj;
 234        struct switchdev_trans *trans;
 235        bool handled;
 236};
 237
 238struct switchdev_notifier_port_attr_info {
 239        struct switchdev_notifier_info info; /* must be first */
 240        const struct switchdev_attr *attr;
 241        struct switchdev_trans *trans;
 242        bool handled;
 243};
 244
 245static inline struct net_device *
 246switchdev_notifier_info_to_dev(const struct switchdev_notifier_info *info)
 247{
 248        return info->dev;
 249}
 250
 251static inline struct netlink_ext_ack *
 252switchdev_notifier_info_to_extack(const struct switchdev_notifier_info *info)
 253{
 254        return info->extack;
 255}
 256
 257#ifdef CONFIG_NET_SWITCHDEV
 258
 259void switchdev_deferred_process(void);
 260int switchdev_port_attr_set(struct net_device *dev,
 261                            const struct switchdev_attr *attr);
 262int switchdev_port_obj_add(struct net_device *dev,
 263                           const struct switchdev_obj *obj,
 264                           struct netlink_ext_ack *extack);
 265int switchdev_port_obj_del(struct net_device *dev,
 266                           const struct switchdev_obj *obj);
 267
 268int register_switchdev_notifier(struct notifier_block *nb);
 269int unregister_switchdev_notifier(struct notifier_block *nb);
 270int call_switchdev_notifiers(unsigned long val, struct net_device *dev,
 271                             struct switchdev_notifier_info *info,
 272                             struct netlink_ext_ack *extack);
 273
 274int register_switchdev_blocking_notifier(struct notifier_block *nb);
 275int unregister_switchdev_blocking_notifier(struct notifier_block *nb);
 276int call_switchdev_blocking_notifiers(unsigned long val, struct net_device *dev,
 277                                      struct switchdev_notifier_info *info,
 278                                      struct netlink_ext_ack *extack);
 279
 280void switchdev_port_fwd_mark_set(struct net_device *dev,
 281                                 struct net_device *group_dev,
 282                                 bool joining);
 283
 284int switchdev_handle_port_obj_add(struct net_device *dev,
 285                        struct switchdev_notifier_port_obj_info *port_obj_info,
 286                        bool (*check_cb)(const struct net_device *dev),
 287                        int (*add_cb)(struct net_device *dev,
 288                                      const struct switchdev_obj *obj,
 289                                      struct switchdev_trans *trans,
 290                                      struct netlink_ext_ack *extack));
 291int switchdev_handle_port_obj_del(struct net_device *dev,
 292                        struct switchdev_notifier_port_obj_info *port_obj_info,
 293                        bool (*check_cb)(const struct net_device *dev),
 294                        int (*del_cb)(struct net_device *dev,
 295                                      const struct switchdev_obj *obj));
 296
 297int switchdev_handle_port_attr_set(struct net_device *dev,
 298                        struct switchdev_notifier_port_attr_info *port_attr_info,
 299                        bool (*check_cb)(const struct net_device *dev),
 300                        int (*set_cb)(struct net_device *dev,
 301                                      const struct switchdev_attr *attr,
 302                                      struct switchdev_trans *trans));
 303#else
 304
 305static inline void switchdev_deferred_process(void)
 306{
 307}
 308
 309static inline int switchdev_port_attr_set(struct net_device *dev,
 310                                          const struct switchdev_attr *attr)
 311{
 312        return -EOPNOTSUPP;
 313}
 314
 315static inline int switchdev_port_obj_add(struct net_device *dev,
 316                                         const struct switchdev_obj *obj,
 317                                         struct netlink_ext_ack *extack)
 318{
 319        return -EOPNOTSUPP;
 320}
 321
 322static inline int switchdev_port_obj_del(struct net_device *dev,
 323                                         const struct switchdev_obj *obj)
 324{
 325        return -EOPNOTSUPP;
 326}
 327
 328static inline int register_switchdev_notifier(struct notifier_block *nb)
 329{
 330        return 0;
 331}
 332
 333static inline int unregister_switchdev_notifier(struct notifier_block *nb)
 334{
 335        return 0;
 336}
 337
 338static inline int call_switchdev_notifiers(unsigned long val,
 339                                           struct net_device *dev,
 340                                           struct switchdev_notifier_info *info,
 341                                           struct netlink_ext_ack *extack)
 342{
 343        return NOTIFY_DONE;
 344}
 345
 346static inline int
 347register_switchdev_blocking_notifier(struct notifier_block *nb)
 348{
 349        return 0;
 350}
 351
 352static inline int
 353unregister_switchdev_blocking_notifier(struct notifier_block *nb)
 354{
 355        return 0;
 356}
 357
 358static inline int
 359call_switchdev_blocking_notifiers(unsigned long val,
 360                                  struct net_device *dev,
 361                                  struct switchdev_notifier_info *info,
 362                                  struct netlink_ext_ack *extack)
 363{
 364        return NOTIFY_DONE;
 365}
 366
 367static inline int
 368switchdev_handle_port_obj_add(struct net_device *dev,
 369                        struct switchdev_notifier_port_obj_info *port_obj_info,
 370                        bool (*check_cb)(const struct net_device *dev),
 371                        int (*add_cb)(struct net_device *dev,
 372                                      const struct switchdev_obj *obj,
 373                                      struct switchdev_trans *trans,
 374                                      struct netlink_ext_ack *extack))
 375{
 376        return 0;
 377}
 378
 379static inline int
 380switchdev_handle_port_obj_del(struct net_device *dev,
 381                        struct switchdev_notifier_port_obj_info *port_obj_info,
 382                        bool (*check_cb)(const struct net_device *dev),
 383                        int (*del_cb)(struct net_device *dev,
 384                                      const struct switchdev_obj *obj))
 385{
 386        return 0;
 387}
 388
 389static inline int
 390switchdev_handle_port_attr_set(struct net_device *dev,
 391                        struct switchdev_notifier_port_attr_info *port_attr_info,
 392                        bool (*check_cb)(const struct net_device *dev),
 393                        int (*set_cb)(struct net_device *dev,
 394                                      const struct switchdev_attr *attr,
 395                                      struct switchdev_trans *trans))
 396{
 397        return 0;
 398}
 399#endif
 400
 401#endif /* _LINUX_SWITCHDEV_H_ */
 402