linux/net/bridge/br_private.h
<<
>>
Prefs
   1/*
   2 *      Linux ethernet bridge
   3 *
   4 *      Authors:
   5 *      Lennert Buytenhek               <buytenh@gnu.org>
   6 *
   7 *      This program is free software; you can redistribute it and/or
   8 *      modify it under the terms of the GNU General Public License
   9 *      as published by the Free Software Foundation; either version
  10 *      2 of the License, or (at your option) any later version.
  11 */
  12
  13#ifndef _BR_PRIVATE_H
  14#define _BR_PRIVATE_H
  15
  16#include <linux/netdevice.h>
  17#include <linux/if_bridge.h>
  18#include <linux/netpoll.h>
  19#include <linux/u64_stats_sync.h>
  20#include <net/route.h>
  21#include <net/ip6_fib.h>
  22#include <linux/if_vlan.h>
  23#include <linux/rhashtable.h>
  24#include <linux/refcount.h>
  25
  26#define BR_HASH_BITS 8
  27#define BR_HASH_SIZE (1 << BR_HASH_BITS)
  28
  29#define BR_HOLD_TIME (1*HZ)
  30
  31#define BR_PORT_BITS    10
  32#define BR_MAX_PORTS    (1<<BR_PORT_BITS)
  33
  34#define BR_MULTICAST_DEFAULT_HASH_MAX 4096
  35
  36#define BR_VERSION      "2.3"
  37
  38/* Control of forwarding link local multicast */
  39#define BR_GROUPFWD_DEFAULT     0
  40/* Don't allow forwarding of control protocols like STP, MAC PAUSE and LACP */
  41enum {
  42        BR_GROUPFWD_STP         = BIT(0),
  43        BR_GROUPFWD_MACPAUSE    = BIT(1),
  44        BR_GROUPFWD_LACP        = BIT(2),
  45};
  46
  47#define BR_GROUPFWD_RESTRICTED (BR_GROUPFWD_STP | BR_GROUPFWD_MACPAUSE | \
  48                                BR_GROUPFWD_LACP)
  49/* The Nearest Customer Bridge Group Address, 01-80-C2-00-00-[00,0B,0C,0D,0F] */
  50#define BR_GROUPFWD_8021AD      0xB801u
  51
  52/* Path to usermode spanning tree program */
  53#define BR_STP_PROG     "/sbin/bridge-stp"
  54
  55typedef struct bridge_id bridge_id;
  56typedef struct mac_addr mac_addr;
  57typedef __u16 port_id;
  58
  59struct bridge_id {
  60        unsigned char   prio[2];
  61        unsigned char   addr[ETH_ALEN];
  62};
  63
  64struct mac_addr {
  65        unsigned char   addr[ETH_ALEN];
  66};
  67
  68#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
  69/* our own querier */
  70struct bridge_mcast_own_query {
  71        struct timer_list       timer;
  72        u32                     startup_sent;
  73};
  74
  75/* other querier */
  76struct bridge_mcast_other_query {
  77        struct timer_list               timer;
  78        unsigned long                   delay_time;
  79};
  80
  81/* selected querier */
  82struct bridge_mcast_querier {
  83        struct br_ip addr;
  84        struct net_bridge_port __rcu    *port;
  85};
  86
  87/* IGMP/MLD statistics */
  88struct bridge_mcast_stats {
  89        struct br_mcast_stats mstats;
  90        struct u64_stats_sync syncp;
  91};
  92#endif
  93
  94struct br_vlan_stats {
  95        u64 rx_bytes;
  96        u64 rx_packets;
  97        u64 tx_bytes;
  98        u64 tx_packets;
  99        struct u64_stats_sync syncp;
 100};
 101
 102struct br_tunnel_info {
 103        __be64                  tunnel_id;
 104        struct metadata_dst     *tunnel_dst;
 105};
 106
 107/* private vlan flags */
 108enum {
 109        BR_VLFLAG_PER_PORT_STATS = BIT(0),
 110        BR_VLFLAG_ADDED_BY_SWITCHDEV = BIT(1),
 111};
 112
 113/**
 114 * struct net_bridge_vlan - per-vlan entry
 115 *
 116 * @vnode: rhashtable member
 117 * @vid: VLAN id
 118 * @flags: bridge vlan flags
 119 * @priv_flags: private (in-kernel) bridge vlan flags
 120 * @stats: per-cpu VLAN statistics
 121 * @br: if MASTER flag set, this points to a bridge struct
 122 * @port: if MASTER flag unset, this points to a port struct
 123 * @refcnt: if MASTER flag set, this is bumped for each port referencing it
 124 * @brvlan: if MASTER flag unset, this points to the global per-VLAN context
 125 *          for this VLAN entry
 126 * @vlist: sorted list of VLAN entries
 127 * @rcu: used for entry destruction
 128 *
 129 * This structure is shared between the global per-VLAN entries contained in
 130 * the bridge rhashtable and the local per-port per-VLAN entries contained in
 131 * the port's rhashtable. The union entries should be interpreted depending on
 132 * the entry flags that are set.
 133 */
 134struct net_bridge_vlan {
 135        struct rhash_head               vnode;
 136        struct rhash_head               tnode;
 137        u16                             vid;
 138        u16                             flags;
 139        u16                             priv_flags;
 140        struct br_vlan_stats __percpu   *stats;
 141        union {
 142                struct net_bridge       *br;
 143                struct net_bridge_port  *port;
 144        };
 145        union {
 146                refcount_t              refcnt;
 147                struct net_bridge_vlan  *brvlan;
 148        };
 149
 150        struct br_tunnel_info           tinfo;
 151
 152        struct list_head                vlist;
 153
 154        struct rcu_head                 rcu;
 155};
 156
 157/**
 158 * struct net_bridge_vlan_group
 159 *
 160 * @vlan_hash: VLAN entry rhashtable
 161 * @vlan_list: sorted VLAN entry list
 162 * @num_vlans: number of total VLAN entries
 163 * @pvid: PVID VLAN id
 164 *
 165 * IMPORTANT: Be careful when checking if there're VLAN entries using list
 166 *            primitives because the bridge can have entries in its list which
 167 *            are just for global context but not for filtering, i.e. they have
 168 *            the master flag set but not the brentry flag. If you have to check
 169 *            if there're "real" entries in the bridge please test @num_vlans
 170 */
 171struct net_bridge_vlan_group {
 172        struct rhashtable               vlan_hash;
 173        struct rhashtable               tunnel_hash;
 174        struct list_head                vlan_list;
 175        u16                             num_vlans;
 176        u16                             pvid;
 177};
 178
 179struct net_bridge_fdb_key {
 180        mac_addr addr;
 181        u16 vlan_id;
 182};
 183
 184struct net_bridge_fdb_entry {
 185        struct rhash_head               rhnode;
 186        struct net_bridge_port          *dst;
 187
 188        struct net_bridge_fdb_key       key;
 189        struct hlist_node               fdb_node;
 190        unsigned char                   is_local:1,
 191                                        is_static:1,
 192                                        is_sticky:1,
 193                                        added_by_user:1,
 194                                        added_by_external_learn:1,
 195                                        offloaded:1;
 196
 197        /* write-heavy members should not affect lookups */
 198        unsigned long                   updated ____cacheline_aligned_in_smp;
 199        unsigned long                   used;
 200
 201        struct rcu_head                 rcu;
 202};
 203
 204#define MDB_PG_FLAGS_PERMANENT  BIT(0)
 205#define MDB_PG_FLAGS_OFFLOAD    BIT(1)
 206
 207struct net_bridge_port_group {
 208        struct net_bridge_port          *port;
 209        struct net_bridge_port_group __rcu *next;
 210        struct hlist_node               mglist;
 211        struct rcu_head                 rcu;
 212        struct timer_list               timer;
 213        struct br_ip                    addr;
 214        unsigned char                   flags;
 215        unsigned char                   eth_addr[ETH_ALEN];
 216};
 217
 218struct net_bridge_mdb_entry {
 219        struct rhash_head               rhnode;
 220        struct net_bridge               *br;
 221        struct net_bridge_port_group __rcu *ports;
 222        struct rcu_head                 rcu;
 223        struct timer_list               timer;
 224        struct br_ip                    addr;
 225        bool                            host_joined;
 226        struct hlist_node               mdb_node;
 227};
 228
 229struct net_bridge_port {
 230        struct net_bridge               *br;
 231        struct net_device               *dev;
 232        struct list_head                list;
 233
 234        unsigned long                   flags;
 235#ifdef CONFIG_BRIDGE_VLAN_FILTERING
 236        struct net_bridge_vlan_group    __rcu *vlgrp;
 237#endif
 238
 239        /* STP */
 240        u8                              priority;
 241        u8                              state;
 242        u16                             port_no;
 243        unsigned char                   topology_change_ack;
 244        unsigned char                   config_pending;
 245        port_id                         port_id;
 246        port_id                         designated_port;
 247        bridge_id                       designated_root;
 248        bridge_id                       designated_bridge;
 249        u32                             path_cost;
 250        u32                             designated_cost;
 251        unsigned long                   designated_age;
 252
 253        struct timer_list               forward_delay_timer;
 254        struct timer_list               hold_timer;
 255        struct timer_list               message_age_timer;
 256        struct kobject                  kobj;
 257        struct rcu_head                 rcu;
 258
 259#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
 260        struct bridge_mcast_own_query   ip4_own_query;
 261#if IS_ENABLED(CONFIG_IPV6)
 262        struct bridge_mcast_own_query   ip6_own_query;
 263#endif /* IS_ENABLED(CONFIG_IPV6) */
 264        unsigned char                   multicast_router;
 265        struct bridge_mcast_stats       __percpu *mcast_stats;
 266        struct timer_list               multicast_router_timer;
 267        struct hlist_head               mglist;
 268        struct hlist_node               rlist;
 269#endif
 270
 271#ifdef CONFIG_SYSFS
 272        char                            sysfs_name[IFNAMSIZ];
 273#endif
 274
 275#ifdef CONFIG_NET_POLL_CONTROLLER
 276        struct netpoll                  *np;
 277#endif
 278#ifdef CONFIG_NET_SWITCHDEV
 279        int                             offload_fwd_mark;
 280#endif
 281        u16                             group_fwd_mask;
 282};
 283
 284#define br_auto_port(p) ((p)->flags & BR_AUTO_MASK)
 285#define br_promisc_port(p) ((p)->flags & BR_PROMISC)
 286
 287#define br_port_exists(dev) (dev->priv_flags & IFF_BRIDGE_PORT)
 288
 289static inline struct net_bridge_port *br_port_get_rcu(const struct net_device *dev)
 290{
 291        return rcu_dereference(dev->rx_handler_data);
 292}
 293
 294static inline struct net_bridge_port *br_port_get_rtnl(const struct net_device *dev)
 295{
 296        return br_port_exists(dev) ?
 297                rtnl_dereference(dev->rx_handler_data) : NULL;
 298}
 299
 300static inline struct net_bridge_port *br_port_get_rtnl_rcu(const struct net_device *dev)
 301{
 302        return br_port_exists(dev) ?
 303                rcu_dereference_rtnl(dev->rx_handler_data) : NULL;
 304}
 305
 306enum net_bridge_opts {
 307        BROPT_VLAN_ENABLED,
 308        BROPT_VLAN_STATS_ENABLED,
 309        BROPT_NF_CALL_IPTABLES,
 310        BROPT_NF_CALL_IP6TABLES,
 311        BROPT_NF_CALL_ARPTABLES,
 312        BROPT_GROUP_ADDR_SET,
 313        BROPT_MULTICAST_ENABLED,
 314        BROPT_MULTICAST_QUERIER,
 315        BROPT_MULTICAST_QUERY_USE_IFADDR,
 316        BROPT_MULTICAST_STATS_ENABLED,
 317        BROPT_HAS_IPV6_ADDR,
 318        BROPT_NEIGH_SUPPRESS_ENABLED,
 319        BROPT_MTU_SET_BY_USER,
 320        BROPT_VLAN_STATS_PER_PORT,
 321};
 322
 323struct net_bridge {
 324        spinlock_t                      lock;
 325        spinlock_t                      hash_lock;
 326        struct list_head                port_list;
 327        struct net_device               *dev;
 328        struct pcpu_sw_netstats         __percpu *stats;
 329        unsigned long                   options;
 330        /* These fields are accessed on each packet */
 331#ifdef CONFIG_BRIDGE_VLAN_FILTERING
 332        __be16                          vlan_proto;
 333        u16                             default_pvid;
 334        struct net_bridge_vlan_group    __rcu *vlgrp;
 335#endif
 336
 337        struct rhashtable               fdb_hash_tbl;
 338#if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
 339        union {
 340                struct rtable           fake_rtable;
 341                struct rt6_info         fake_rt6_info;
 342        };
 343#endif
 344        u16                             group_fwd_mask;
 345        u16                             group_fwd_mask_required;
 346
 347        /* STP */
 348        bridge_id                       designated_root;
 349        bridge_id                       bridge_id;
 350        unsigned char                   topology_change;
 351        unsigned char                   topology_change_detected;
 352        u16                             root_port;
 353        unsigned long                   max_age;
 354        unsigned long                   hello_time;
 355        unsigned long                   forward_delay;
 356        unsigned long                   ageing_time;
 357        unsigned long                   bridge_max_age;
 358        unsigned long                   bridge_hello_time;
 359        unsigned long                   bridge_forward_delay;
 360        unsigned long                   bridge_ageing_time;
 361        u32                             root_path_cost;
 362
 363        u8                              group_addr[ETH_ALEN];
 364
 365        enum {
 366                BR_NO_STP,              /* no spanning tree */
 367                BR_KERNEL_STP,          /* old STP in kernel */
 368                BR_USER_STP,            /* new RSTP in userspace */
 369        } stp_enabled;
 370
 371#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
 372
 373        u32                             hash_max;
 374
 375        u32                             multicast_last_member_count;
 376        u32                             multicast_startup_query_count;
 377
 378        u8                              multicast_igmp_version;
 379        u8                              multicast_router;
 380#if IS_ENABLED(CONFIG_IPV6)
 381        u8                              multicast_mld_version;
 382#endif
 383        spinlock_t                      multicast_lock;
 384        unsigned long                   multicast_last_member_interval;
 385        unsigned long                   multicast_membership_interval;
 386        unsigned long                   multicast_querier_interval;
 387        unsigned long                   multicast_query_interval;
 388        unsigned long                   multicast_query_response_interval;
 389        unsigned long                   multicast_startup_query_interval;
 390
 391        struct rhashtable               mdb_hash_tbl;
 392
 393        struct hlist_head               mdb_list;
 394        struct hlist_head               router_list;
 395
 396        struct timer_list               multicast_router_timer;
 397        struct bridge_mcast_other_query ip4_other_query;
 398        struct bridge_mcast_own_query   ip4_own_query;
 399        struct bridge_mcast_querier     ip4_querier;
 400        struct bridge_mcast_stats       __percpu *mcast_stats;
 401#if IS_ENABLED(CONFIG_IPV6)
 402        struct bridge_mcast_other_query ip6_other_query;
 403        struct bridge_mcast_own_query   ip6_own_query;
 404        struct bridge_mcast_querier     ip6_querier;
 405#endif /* IS_ENABLED(CONFIG_IPV6) */
 406#endif
 407
 408        struct timer_list               hello_timer;
 409        struct timer_list               tcn_timer;
 410        struct timer_list               topology_change_timer;
 411        struct delayed_work             gc_work;
 412        struct kobject                  *ifobj;
 413        u32                             auto_cnt;
 414
 415#ifdef CONFIG_NET_SWITCHDEV
 416        int offload_fwd_mark;
 417#endif
 418        struct hlist_head               fdb_list;
 419};
 420
 421struct br_input_skb_cb {
 422        struct net_device *brdev;
 423
 424#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
 425        int igmp;
 426        int mrouters_only;
 427#endif
 428
 429        bool proxyarp_replied;
 430        bool src_port_isolated;
 431
 432#ifdef CONFIG_BRIDGE_VLAN_FILTERING
 433        bool vlan_filtered;
 434#endif
 435
 436#ifdef CONFIG_NET_SWITCHDEV
 437        int offload_fwd_mark;
 438#endif
 439};
 440
 441#define BR_INPUT_SKB_CB(__skb)  ((struct br_input_skb_cb *)(__skb)->cb)
 442
 443#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
 444# define BR_INPUT_SKB_CB_MROUTERS_ONLY(__skb)   (BR_INPUT_SKB_CB(__skb)->mrouters_only)
 445#else
 446# define BR_INPUT_SKB_CB_MROUTERS_ONLY(__skb)   (0)
 447#endif
 448
 449#define br_printk(level, br, format, args...)   \
 450        printk(level "%s: " format, (br)->dev->name, ##args)
 451
 452#define br_err(__br, format, args...)                   \
 453        br_printk(KERN_ERR, __br, format, ##args)
 454#define br_warn(__br, format, args...)                  \
 455        br_printk(KERN_WARNING, __br, format, ##args)
 456#define br_notice(__br, format, args...)                \
 457        br_printk(KERN_NOTICE, __br, format, ##args)
 458#define br_info(__br, format, args...)                  \
 459        br_printk(KERN_INFO, __br, format, ##args)
 460
 461#define br_debug(br, format, args...)                   \
 462        pr_debug("%s: " format,  (br)->dev->name, ##args)
 463
 464/* called under bridge lock */
 465static inline int br_is_root_bridge(const struct net_bridge *br)
 466{
 467        return !memcmp(&br->bridge_id, &br->designated_root, 8);
 468}
 469
 470/* check if a VLAN entry is global */
 471static inline bool br_vlan_is_master(const struct net_bridge_vlan *v)
 472{
 473        return v->flags & BRIDGE_VLAN_INFO_MASTER;
 474}
 475
 476/* check if a VLAN entry is used by the bridge */
 477static inline bool br_vlan_is_brentry(const struct net_bridge_vlan *v)
 478{
 479        return v->flags & BRIDGE_VLAN_INFO_BRENTRY;
 480}
 481
 482/* check if we should use the vlan entry, returns false if it's only context */
 483static inline bool br_vlan_should_use(const struct net_bridge_vlan *v)
 484{
 485        if (br_vlan_is_master(v)) {
 486                if (br_vlan_is_brentry(v))
 487                        return true;
 488                else
 489                        return false;
 490        }
 491
 492        return true;
 493}
 494
 495static inline int br_opt_get(const struct net_bridge *br,
 496                             enum net_bridge_opts opt)
 497{
 498        return test_bit(opt, &br->options);
 499}
 500
 501void br_opt_toggle(struct net_bridge *br, enum net_bridge_opts opt, bool on);
 502
 503/* br_device.c */
 504void br_dev_setup(struct net_device *dev);
 505void br_dev_delete(struct net_device *dev, struct list_head *list);
 506netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev);
 507#ifdef CONFIG_NET_POLL_CONTROLLER
 508static inline void br_netpoll_send_skb(const struct net_bridge_port *p,
 509                                       struct sk_buff *skb)
 510{
 511        netpoll_send_skb(p->np, skb);
 512}
 513
 514int br_netpoll_enable(struct net_bridge_port *p);
 515void br_netpoll_disable(struct net_bridge_port *p);
 516#else
 517static inline void br_netpoll_send_skb(const struct net_bridge_port *p,
 518                                       struct sk_buff *skb)
 519{
 520}
 521
 522static inline int br_netpoll_enable(struct net_bridge_port *p)
 523{
 524        return 0;
 525}
 526
 527static inline void br_netpoll_disable(struct net_bridge_port *p)
 528{
 529}
 530#endif
 531
 532/* br_fdb.c */
 533int br_fdb_init(void);
 534void br_fdb_fini(void);
 535int br_fdb_hash_init(struct net_bridge *br);
 536void br_fdb_hash_fini(struct net_bridge *br);
 537void br_fdb_flush(struct net_bridge *br);
 538void br_fdb_find_delete_local(struct net_bridge *br,
 539                              const struct net_bridge_port *p,
 540                              const unsigned char *addr, u16 vid);
 541void br_fdb_changeaddr(struct net_bridge_port *p, const unsigned char *newaddr);
 542void br_fdb_change_mac_address(struct net_bridge *br, const u8 *newaddr);
 543void br_fdb_cleanup(struct work_struct *work);
 544void br_fdb_delete_by_port(struct net_bridge *br,
 545                           const struct net_bridge_port *p, u16 vid, int do_all);
 546struct net_bridge_fdb_entry *br_fdb_find_rcu(struct net_bridge *br,
 547                                             const unsigned char *addr,
 548                                             __u16 vid);
 549int br_fdb_test_addr(struct net_device *dev, unsigned char *addr);
 550int br_fdb_fillbuf(struct net_bridge *br, void *buf, unsigned long count,
 551                   unsigned long off);
 552int br_fdb_insert(struct net_bridge *br, struct net_bridge_port *source,
 553                  const unsigned char *addr, u16 vid);
 554void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source,
 555                   const unsigned char *addr, u16 vid, bool added_by_user);
 556
 557int br_fdb_delete(struct ndmsg *ndm, struct nlattr *tb[],
 558                  struct net_device *dev, const unsigned char *addr, u16 vid);
 559int br_fdb_add(struct ndmsg *nlh, struct nlattr *tb[], struct net_device *dev,
 560               const unsigned char *addr, u16 vid, u16 nlh_flags,
 561               struct netlink_ext_ack *extack);
 562int br_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb,
 563                struct net_device *dev, struct net_device *fdev, int *idx);
 564int br_fdb_get(struct sk_buff *skb, struct nlattr *tb[], struct net_device *dev,
 565               const unsigned char *addr, u16 vid, u32 portid, u32 seq,
 566               struct netlink_ext_ack *extack);
 567int br_fdb_sync_static(struct net_bridge *br, struct net_bridge_port *p);
 568void br_fdb_unsync_static(struct net_bridge *br, struct net_bridge_port *p);
 569int br_fdb_external_learn_add(struct net_bridge *br, struct net_bridge_port *p,
 570                              const unsigned char *addr, u16 vid,
 571                              bool swdev_notify);
 572int br_fdb_external_learn_del(struct net_bridge *br, struct net_bridge_port *p,
 573                              const unsigned char *addr, u16 vid,
 574                              bool swdev_notify);
 575void br_fdb_offloaded_set(struct net_bridge *br, struct net_bridge_port *p,
 576                          const unsigned char *addr, u16 vid, bool offloaded);
 577
 578/* br_forward.c */
 579enum br_pkt_type {
 580        BR_PKT_UNICAST,
 581        BR_PKT_MULTICAST,
 582        BR_PKT_BROADCAST
 583};
 584int br_dev_queue_push_xmit(struct net *net, struct sock *sk, struct sk_buff *skb);
 585void br_forward(const struct net_bridge_port *to, struct sk_buff *skb,
 586                bool local_rcv, bool local_orig);
 587int br_forward_finish(struct net *net, struct sock *sk, struct sk_buff *skb);
 588void br_flood(struct net_bridge *br, struct sk_buff *skb,
 589              enum br_pkt_type pkt_type, bool local_rcv, bool local_orig);
 590
 591/* return true if both source port and dest port are isolated */
 592static inline bool br_skb_isolated(const struct net_bridge_port *to,
 593                                   const struct sk_buff *skb)
 594{
 595        return BR_INPUT_SKB_CB(skb)->src_port_isolated &&
 596               (to->flags & BR_ISOLATED);
 597}
 598
 599/* br_if.c */
 600void br_port_carrier_check(struct net_bridge_port *p, bool *notified);
 601int br_add_bridge(struct net *net, const char *name);
 602int br_del_bridge(struct net *net, const char *name);
 603int br_add_if(struct net_bridge *br, struct net_device *dev,
 604              struct netlink_ext_ack *extack);
 605int br_del_if(struct net_bridge *br, struct net_device *dev);
 606void br_mtu_auto_adjust(struct net_bridge *br);
 607netdev_features_t br_features_recompute(struct net_bridge *br,
 608                                        netdev_features_t features);
 609void br_port_flags_change(struct net_bridge_port *port, unsigned long mask);
 610void br_manage_promisc(struct net_bridge *br);
 611
 612/* br_input.c */
 613int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb);
 614rx_handler_result_t br_handle_frame(struct sk_buff **pskb);
 615
 616static inline bool br_rx_handler_check_rcu(const struct net_device *dev)
 617{
 618        return rcu_dereference(dev->rx_handler) == br_handle_frame;
 619}
 620
 621static inline bool br_rx_handler_check_rtnl(const struct net_device *dev)
 622{
 623        return rcu_dereference_rtnl(dev->rx_handler) == br_handle_frame;
 624}
 625
 626static inline struct net_bridge_port *br_port_get_check_rcu(const struct net_device *dev)
 627{
 628        return br_rx_handler_check_rcu(dev) ? br_port_get_rcu(dev) : NULL;
 629}
 630
 631static inline struct net_bridge_port *
 632br_port_get_check_rtnl(const struct net_device *dev)
 633{
 634        return br_rx_handler_check_rtnl(dev) ? br_port_get_rtnl_rcu(dev) : NULL;
 635}
 636
 637/* br_ioctl.c */
 638int br_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
 639int br_ioctl_deviceless_stub(struct net *net, unsigned int cmd,
 640                             void __user *arg);
 641
 642/* br_multicast.c */
 643#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
 644int br_multicast_rcv(struct net_bridge *br, struct net_bridge_port *port,
 645                     struct sk_buff *skb, u16 vid);
 646struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br,
 647                                        struct sk_buff *skb, u16 vid);
 648int br_multicast_add_port(struct net_bridge_port *port);
 649void br_multicast_del_port(struct net_bridge_port *port);
 650void br_multicast_enable_port(struct net_bridge_port *port);
 651void br_multicast_disable_port(struct net_bridge_port *port);
 652void br_multicast_init(struct net_bridge *br);
 653void br_multicast_open(struct net_bridge *br);
 654void br_multicast_stop(struct net_bridge *br);
 655void br_multicast_dev_del(struct net_bridge *br);
 656void br_multicast_flood(struct net_bridge_mdb_entry *mdst,
 657                        struct sk_buff *skb, bool local_rcv, bool local_orig);
 658int br_multicast_set_router(struct net_bridge *br, unsigned long val);
 659int br_multicast_set_port_router(struct net_bridge_port *p, unsigned long val);
 660int br_multicast_toggle(struct net_bridge *br, unsigned long val);
 661int br_multicast_set_querier(struct net_bridge *br, unsigned long val);
 662int br_multicast_set_hash_max(struct net_bridge *br, unsigned long val);
 663int br_multicast_set_igmp_version(struct net_bridge *br, unsigned long val);
 664#if IS_ENABLED(CONFIG_IPV6)
 665int br_multicast_set_mld_version(struct net_bridge *br, unsigned long val);
 666#endif
 667struct net_bridge_mdb_entry *
 668br_mdb_ip_get(struct net_bridge *br, struct br_ip *dst);
 669struct net_bridge_mdb_entry *
 670br_multicast_new_group(struct net_bridge *br, struct br_ip *group);
 671struct net_bridge_port_group *
 672br_multicast_new_port_group(struct net_bridge_port *port, struct br_ip *group,
 673                            struct net_bridge_port_group __rcu *next,
 674                            unsigned char flags, const unsigned char *src);
 675int br_mdb_hash_init(struct net_bridge *br);
 676void br_mdb_hash_fini(struct net_bridge *br);
 677void br_mdb_notify(struct net_device *dev, struct net_bridge_port *port,
 678                   struct br_ip *group, int type, u8 flags);
 679void br_rtr_notify(struct net_device *dev, struct net_bridge_port *port,
 680                   int type);
 681void br_multicast_count(struct net_bridge *br, const struct net_bridge_port *p,
 682                        const struct sk_buff *skb, u8 type, u8 dir);
 683int br_multicast_init_stats(struct net_bridge *br);
 684void br_multicast_uninit_stats(struct net_bridge *br);
 685void br_multicast_get_stats(const struct net_bridge *br,
 686                            const struct net_bridge_port *p,
 687                            struct br_mcast_stats *dest);
 688void br_mdb_init(void);
 689void br_mdb_uninit(void);
 690
 691#define mlock_dereference(X, br) \
 692        rcu_dereference_protected(X, lockdep_is_held(&br->multicast_lock))
 693
 694static inline bool br_multicast_is_router(struct net_bridge *br)
 695{
 696        return br->multicast_router == 2 ||
 697               (br->multicast_router == 1 &&
 698                timer_pending(&br->multicast_router_timer));
 699}
 700
 701static inline bool
 702__br_multicast_querier_exists(struct net_bridge *br,
 703                                struct bridge_mcast_other_query *querier,
 704                                const bool is_ipv6)
 705{
 706        bool own_querier_enabled;
 707
 708        if (br_opt_get(br, BROPT_MULTICAST_QUERIER)) {
 709                if (is_ipv6 && !br_opt_get(br, BROPT_HAS_IPV6_ADDR))
 710                        own_querier_enabled = false;
 711                else
 712                        own_querier_enabled = true;
 713        } else {
 714                own_querier_enabled = false;
 715        }
 716
 717        return time_is_before_jiffies(querier->delay_time) &&
 718               (own_querier_enabled || timer_pending(&querier->timer));
 719}
 720
 721static inline bool br_multicast_querier_exists(struct net_bridge *br,
 722                                               struct ethhdr *eth)
 723{
 724        switch (eth->h_proto) {
 725        case (htons(ETH_P_IP)):
 726                return __br_multicast_querier_exists(br,
 727                        &br->ip4_other_query, false);
 728#if IS_ENABLED(CONFIG_IPV6)
 729        case (htons(ETH_P_IPV6)):
 730                return __br_multicast_querier_exists(br,
 731                        &br->ip6_other_query, true);
 732#endif
 733        default:
 734                return false;
 735        }
 736}
 737
 738static inline int br_multicast_igmp_type(const struct sk_buff *skb)
 739{
 740        return BR_INPUT_SKB_CB(skb)->igmp;
 741}
 742#else
 743static inline int br_multicast_rcv(struct net_bridge *br,
 744                                   struct net_bridge_port *port,
 745                                   struct sk_buff *skb,
 746                                   u16 vid)
 747{
 748        return 0;
 749}
 750
 751static inline struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br,
 752                                                      struct sk_buff *skb, u16 vid)
 753{
 754        return NULL;
 755}
 756
 757static inline int br_multicast_add_port(struct net_bridge_port *port)
 758{
 759        return 0;
 760}
 761
 762static inline void br_multicast_del_port(struct net_bridge_port *port)
 763{
 764}
 765
 766static inline void br_multicast_enable_port(struct net_bridge_port *port)
 767{
 768}
 769
 770static inline void br_multicast_disable_port(struct net_bridge_port *port)
 771{
 772}
 773
 774static inline void br_multicast_init(struct net_bridge *br)
 775{
 776}
 777
 778static inline void br_multicast_open(struct net_bridge *br)
 779{
 780}
 781
 782static inline void br_multicast_stop(struct net_bridge *br)
 783{
 784}
 785
 786static inline void br_multicast_dev_del(struct net_bridge *br)
 787{
 788}
 789
 790static inline void br_multicast_flood(struct net_bridge_mdb_entry *mdst,
 791                                      struct sk_buff *skb,
 792                                      bool local_rcv, bool local_orig)
 793{
 794}
 795
 796static inline bool br_multicast_is_router(struct net_bridge *br)
 797{
 798        return false;
 799}
 800
 801static inline bool br_multicast_querier_exists(struct net_bridge *br,
 802                                               struct ethhdr *eth)
 803{
 804        return false;
 805}
 806
 807static inline void br_mdb_init(void)
 808{
 809}
 810
 811static inline void br_mdb_uninit(void)
 812{
 813}
 814
 815static inline int br_mdb_hash_init(struct net_bridge *br)
 816{
 817        return 0;
 818}
 819
 820static inline void br_mdb_hash_fini(struct net_bridge *br)
 821{
 822}
 823
 824static inline void br_multicast_count(struct net_bridge *br,
 825                                      const struct net_bridge_port *p,
 826                                      const struct sk_buff *skb,
 827                                      u8 type, u8 dir)
 828{
 829}
 830
 831static inline int br_multicast_init_stats(struct net_bridge *br)
 832{
 833        return 0;
 834}
 835
 836static inline void br_multicast_uninit_stats(struct net_bridge *br)
 837{
 838}
 839
 840static inline int br_multicast_igmp_type(const struct sk_buff *skb)
 841{
 842        return 0;
 843}
 844#endif
 845
 846/* br_vlan.c */
 847#ifdef CONFIG_BRIDGE_VLAN_FILTERING
 848bool br_allowed_ingress(const struct net_bridge *br,
 849                        struct net_bridge_vlan_group *vg, struct sk_buff *skb,
 850                        u16 *vid);
 851bool br_allowed_egress(struct net_bridge_vlan_group *vg,
 852                       const struct sk_buff *skb);
 853bool br_should_learn(struct net_bridge_port *p, struct sk_buff *skb, u16 *vid);
 854struct sk_buff *br_handle_vlan(struct net_bridge *br,
 855                               const struct net_bridge_port *port,
 856                               struct net_bridge_vlan_group *vg,
 857                               struct sk_buff *skb);
 858int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags,
 859                bool *changed, struct netlink_ext_ack *extack);
 860int br_vlan_delete(struct net_bridge *br, u16 vid);
 861void br_vlan_flush(struct net_bridge *br);
 862struct net_bridge_vlan *br_vlan_find(struct net_bridge_vlan_group *vg, u16 vid);
 863void br_recalculate_fwd_mask(struct net_bridge *br);
 864int __br_vlan_filter_toggle(struct net_bridge *br, unsigned long val);
 865int br_vlan_filter_toggle(struct net_bridge *br, unsigned long val);
 866int __br_vlan_set_proto(struct net_bridge *br, __be16 proto);
 867int br_vlan_set_proto(struct net_bridge *br, unsigned long val);
 868int br_vlan_set_stats(struct net_bridge *br, unsigned long val);
 869int br_vlan_set_stats_per_port(struct net_bridge *br, unsigned long val);
 870int br_vlan_init(struct net_bridge *br);
 871int br_vlan_set_default_pvid(struct net_bridge *br, unsigned long val);
 872int __br_vlan_set_default_pvid(struct net_bridge *br, u16 pvid,
 873                               struct netlink_ext_ack *extack);
 874int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags,
 875                 bool *changed, struct netlink_ext_ack *extack);
 876int nbp_vlan_delete(struct net_bridge_port *port, u16 vid);
 877void nbp_vlan_flush(struct net_bridge_port *port);
 878int nbp_vlan_init(struct net_bridge_port *port, struct netlink_ext_ack *extack);
 879int nbp_get_num_vlan_infos(struct net_bridge_port *p, u32 filter_mask);
 880void br_vlan_get_stats(const struct net_bridge_vlan *v,
 881                       struct br_vlan_stats *stats);
 882
 883static inline struct net_bridge_vlan_group *br_vlan_group(
 884                                        const struct net_bridge *br)
 885{
 886        return rtnl_dereference(br->vlgrp);
 887}
 888
 889static inline struct net_bridge_vlan_group *nbp_vlan_group(
 890                                        const struct net_bridge_port *p)
 891{
 892        return rtnl_dereference(p->vlgrp);
 893}
 894
 895static inline struct net_bridge_vlan_group *br_vlan_group_rcu(
 896                                        const struct net_bridge *br)
 897{
 898        return rcu_dereference(br->vlgrp);
 899}
 900
 901static inline struct net_bridge_vlan_group *nbp_vlan_group_rcu(
 902                                        const struct net_bridge_port *p)
 903{
 904        return rcu_dereference(p->vlgrp);
 905}
 906
 907/* Since bridge now depends on 8021Q module, but the time bridge sees the
 908 * skb, the vlan tag will always be present if the frame was tagged.
 909 */
 910static inline int br_vlan_get_tag(const struct sk_buff *skb, u16 *vid)
 911{
 912        int err = 0;
 913
 914        if (skb_vlan_tag_present(skb)) {
 915                *vid = skb_vlan_tag_get(skb) & VLAN_VID_MASK;
 916        } else {
 917                *vid = 0;
 918                err = -EINVAL;
 919        }
 920
 921        return err;
 922}
 923
 924static inline u16 br_get_pvid(const struct net_bridge_vlan_group *vg)
 925{
 926        if (!vg)
 927                return 0;
 928
 929        smp_rmb();
 930        return vg->pvid;
 931}
 932
 933#else
 934static inline bool br_allowed_ingress(const struct net_bridge *br,
 935                                      struct net_bridge_vlan_group *vg,
 936                                      struct sk_buff *skb,
 937                                      u16 *vid)
 938{
 939        return true;
 940}
 941
 942static inline bool br_allowed_egress(struct net_bridge_vlan_group *vg,
 943                                     const struct sk_buff *skb)
 944{
 945        return true;
 946}
 947
 948static inline bool br_should_learn(struct net_bridge_port *p,
 949                                   struct sk_buff *skb, u16 *vid)
 950{
 951        return true;
 952}
 953
 954static inline struct sk_buff *br_handle_vlan(struct net_bridge *br,
 955                                             const struct net_bridge_port *port,
 956                                             struct net_bridge_vlan_group *vg,
 957                                             struct sk_buff *skb)
 958{
 959        return skb;
 960}
 961
 962static inline int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags,
 963                              bool *changed, struct netlink_ext_ack *extack)
 964{
 965        *changed = false;
 966        return -EOPNOTSUPP;
 967}
 968
 969static inline int br_vlan_delete(struct net_bridge *br, u16 vid)
 970{
 971        return -EOPNOTSUPP;
 972}
 973
 974static inline void br_vlan_flush(struct net_bridge *br)
 975{
 976}
 977
 978static inline void br_recalculate_fwd_mask(struct net_bridge *br)
 979{
 980}
 981
 982static inline int br_vlan_init(struct net_bridge *br)
 983{
 984        return 0;
 985}
 986
 987static inline int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags,
 988                               bool *changed, struct netlink_ext_ack *extack)
 989{
 990        *changed = false;
 991        return -EOPNOTSUPP;
 992}
 993
 994static inline int nbp_vlan_delete(struct net_bridge_port *port, u16 vid)
 995{
 996        return -EOPNOTSUPP;
 997}
 998
 999static inline void nbp_vlan_flush(struct net_bridge_port *port)
1000{
1001}
1002
1003static inline struct net_bridge_vlan *br_vlan_find(struct net_bridge_vlan_group *vg,
1004                                                   u16 vid)
1005{
1006        return NULL;
1007}
1008
1009static inline int nbp_vlan_init(struct net_bridge_port *port,
1010                                struct netlink_ext_ack *extack)
1011{
1012        return 0;
1013}
1014
1015static inline u16 br_vlan_get_tag(const struct sk_buff *skb, u16 *tag)
1016{
1017        return 0;
1018}
1019
1020static inline u16 br_get_pvid(const struct net_bridge_vlan_group *vg)
1021{
1022        return 0;
1023}
1024
1025static inline int __br_vlan_filter_toggle(struct net_bridge *br,
1026                                          unsigned long val)
1027{
1028        return -EOPNOTSUPP;
1029}
1030
1031static inline int nbp_get_num_vlan_infos(struct net_bridge_port *p,
1032                                         u32 filter_mask)
1033{
1034        return 0;
1035}
1036
1037static inline struct net_bridge_vlan_group *br_vlan_group(
1038                                        const struct net_bridge *br)
1039{
1040        return NULL;
1041}
1042
1043static inline struct net_bridge_vlan_group *nbp_vlan_group(
1044                                        const struct net_bridge_port *p)
1045{
1046        return NULL;
1047}
1048
1049static inline struct net_bridge_vlan_group *br_vlan_group_rcu(
1050                                        const struct net_bridge *br)
1051{
1052        return NULL;
1053}
1054
1055static inline struct net_bridge_vlan_group *nbp_vlan_group_rcu(
1056                                        const struct net_bridge_port *p)
1057{
1058        return NULL;
1059}
1060
1061static inline void br_vlan_get_stats(const struct net_bridge_vlan *v,
1062                                     struct br_vlan_stats *stats)
1063{
1064}
1065#endif
1066
1067struct nf_br_ops {
1068        int (*br_dev_xmit_hook)(struct sk_buff *skb);
1069};
1070extern const struct nf_br_ops __rcu *nf_br_ops;
1071
1072/* br_netfilter.c */
1073#if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
1074int br_nf_core_init(void);
1075void br_nf_core_fini(void);
1076void br_netfilter_rtable_init(struct net_bridge *);
1077#else
1078static inline int br_nf_core_init(void) { return 0; }
1079static inline void br_nf_core_fini(void) {}
1080#define br_netfilter_rtable_init(x)
1081#endif
1082
1083/* br_stp.c */
1084void br_set_state(struct net_bridge_port *p, unsigned int state);
1085struct net_bridge_port *br_get_port(struct net_bridge *br, u16 port_no);
1086void br_init_port(struct net_bridge_port *p);
1087void br_become_designated_port(struct net_bridge_port *p);
1088
1089void __br_set_forward_delay(struct net_bridge *br, unsigned long t);
1090int br_set_forward_delay(struct net_bridge *br, unsigned long x);
1091int br_set_hello_time(struct net_bridge *br, unsigned long x);
1092int br_set_max_age(struct net_bridge *br, unsigned long x);
1093int __set_ageing_time(struct net_device *dev, unsigned long t);
1094int br_set_ageing_time(struct net_bridge *br, clock_t ageing_time);
1095
1096
1097/* br_stp_if.c */
1098void br_stp_enable_bridge(struct net_bridge *br);
1099void br_stp_disable_bridge(struct net_bridge *br);
1100void br_stp_set_enabled(struct net_bridge *br, unsigned long val);
1101void br_stp_enable_port(struct net_bridge_port *p);
1102void br_stp_disable_port(struct net_bridge_port *p);
1103bool br_stp_recalculate_bridge_id(struct net_bridge *br);
1104void br_stp_change_bridge_id(struct net_bridge *br, const unsigned char *a);
1105void br_stp_set_bridge_priority(struct net_bridge *br, u16 newprio);
1106int br_stp_set_port_priority(struct net_bridge_port *p, unsigned long newprio);
1107int br_stp_set_path_cost(struct net_bridge_port *p, unsigned long path_cost);
1108ssize_t br_show_bridge_id(char *buf, const struct bridge_id *id);
1109
1110/* br_stp_bpdu.c */
1111struct stp_proto;
1112void br_stp_rcv(const struct stp_proto *proto, struct sk_buff *skb,
1113                struct net_device *dev);
1114
1115/* br_stp_timer.c */
1116void br_stp_timer_init(struct net_bridge *br);
1117void br_stp_port_timer_init(struct net_bridge_port *p);
1118unsigned long br_timer_value(const struct timer_list *timer);
1119
1120/* br.c */
1121#if IS_ENABLED(CONFIG_ATM_LANE)
1122extern int (*br_fdb_test_addr_hook)(struct net_device *dev, unsigned char *addr);
1123#endif
1124
1125/* br_netlink.c */
1126extern struct rtnl_link_ops br_link_ops;
1127int br_netlink_init(void);
1128void br_netlink_fini(void);
1129void br_ifinfo_notify(int event, const struct net_bridge *br,
1130                      const struct net_bridge_port *port);
1131int br_setlink(struct net_device *dev, struct nlmsghdr *nlmsg, u16 flags,
1132               struct netlink_ext_ack *extack);
1133int br_dellink(struct net_device *dev, struct nlmsghdr *nlmsg, u16 flags);
1134int br_getlink(struct sk_buff *skb, u32 pid, u32 seq, struct net_device *dev,
1135               u32 filter_mask, int nlflags);
1136
1137#ifdef CONFIG_SYSFS
1138/* br_sysfs_if.c */
1139extern const struct sysfs_ops brport_sysfs_ops;
1140int br_sysfs_addif(struct net_bridge_port *p);
1141int br_sysfs_renameif(struct net_bridge_port *p);
1142
1143/* br_sysfs_br.c */
1144int br_sysfs_addbr(struct net_device *dev);
1145void br_sysfs_delbr(struct net_device *dev);
1146
1147#else
1148
1149static inline int br_sysfs_addif(struct net_bridge_port *p) { return 0; }
1150static inline int br_sysfs_renameif(struct net_bridge_port *p) { return 0; }
1151static inline int br_sysfs_addbr(struct net_device *dev) { return 0; }
1152static inline void br_sysfs_delbr(struct net_device *dev) { return; }
1153#endif /* CONFIG_SYSFS */
1154
1155/* br_switchdev.c */
1156#ifdef CONFIG_NET_SWITCHDEV
1157int nbp_switchdev_mark_set(struct net_bridge_port *p);
1158void nbp_switchdev_frame_mark(const struct net_bridge_port *p,
1159                              struct sk_buff *skb);
1160bool nbp_switchdev_allowed_egress(const struct net_bridge_port *p,
1161                                  const struct sk_buff *skb);
1162int br_switchdev_set_port_flag(struct net_bridge_port *p,
1163                               unsigned long flags,
1164                               unsigned long mask);
1165void br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb,
1166                             int type);
1167int br_switchdev_port_vlan_add(struct net_device *dev, u16 vid, u16 flags,
1168                               struct netlink_ext_ack *extack);
1169int br_switchdev_port_vlan_del(struct net_device *dev, u16 vid);
1170
1171static inline void br_switchdev_frame_unmark(struct sk_buff *skb)
1172{
1173        skb->offload_fwd_mark = 0;
1174}
1175#else
1176static inline int nbp_switchdev_mark_set(struct net_bridge_port *p)
1177{
1178        return 0;
1179}
1180
1181static inline void nbp_switchdev_frame_mark(const struct net_bridge_port *p,
1182                                            struct sk_buff *skb)
1183{
1184}
1185
1186static inline bool nbp_switchdev_allowed_egress(const struct net_bridge_port *p,
1187                                                const struct sk_buff *skb)
1188{
1189        return true;
1190}
1191
1192static inline int br_switchdev_set_port_flag(struct net_bridge_port *p,
1193                                             unsigned long flags,
1194                                             unsigned long mask)
1195{
1196        return 0;
1197}
1198
1199static inline int br_switchdev_port_vlan_add(struct net_device *dev,
1200                                             u16 vid, u16 flags,
1201                                             struct netlink_ext_ack *extack)
1202{
1203        return -EOPNOTSUPP;
1204}
1205
1206static inline int br_switchdev_port_vlan_del(struct net_device *dev, u16 vid)
1207{
1208        return -EOPNOTSUPP;
1209}
1210
1211static inline void
1212br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb, int type)
1213{
1214}
1215
1216static inline void br_switchdev_frame_unmark(struct sk_buff *skb)
1217{
1218}
1219#endif /* CONFIG_NET_SWITCHDEV */
1220
1221/* br_arp_nd_proxy.c */
1222void br_recalculate_neigh_suppress_enabled(struct net_bridge *br);
1223void br_do_proxy_suppress_arp(struct sk_buff *skb, struct net_bridge *br,
1224                              u16 vid, struct net_bridge_port *p);
1225void br_do_suppress_nd(struct sk_buff *skb, struct net_bridge *br,
1226                       u16 vid, struct net_bridge_port *p, struct nd_msg *msg);
1227struct nd_msg *br_is_nd_neigh_msg(struct sk_buff *skb, struct nd_msg *m);
1228#endif
1229