12874c5fdSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 21da177e4SLinus Torvalds /* 31da177e4SLinus Torvalds * Linux ethernet bridge 41da177e4SLinus Torvalds * 51da177e4SLinus Torvalds * Authors: 61da177e4SLinus Torvalds * Lennert Buytenhek <buytenh@gnu.org> 71da177e4SLinus Torvalds */ 81da177e4SLinus Torvalds 91da177e4SLinus Torvalds #ifndef _BR_PRIVATE_H 101da177e4SLinus Torvalds #define _BR_PRIVATE_H 111da177e4SLinus Torvalds 121da177e4SLinus Torvalds #include <linux/netdevice.h> 131da177e4SLinus Torvalds #include <linux/if_bridge.h> 1491d2c34aSHerbert Xu #include <linux/netpoll.h> 15406818ffSEric Dumazet #include <linux/u64_stats_sync.h> 164adf0af6SSimon Wunderlich #include <net/route.h> 17efb6de9bSBernhard Thaler #include <net/ip6_fib.h> 18243a2e63SVlad Yasevich #include <linux/if_vlan.h> 192594e906SNikolay Aleksandrov #include <linux/rhashtable.h> 2025127759SReshetova, Elena #include <linux/refcount.h> 211da177e4SLinus Torvalds 221da177e4SLinus Torvalds #define BR_HASH_BITS 8 231da177e4SLinus Torvalds #define BR_HASH_SIZE (1 << BR_HASH_BITS) 241da177e4SLinus Torvalds 251da177e4SLinus Torvalds #define BR_HOLD_TIME (1*HZ) 261da177e4SLinus Torvalds 271da177e4SLinus Torvalds #define BR_PORT_BITS 10 281da177e4SLinus Torvalds #define BR_MAX_PORTS (1<<BR_PORT_BITS) 291da177e4SLinus Torvalds 30d08c6bc0SNikolay Aleksandrov #define BR_MULTICAST_DEFAULT_HASH_MAX 4096 31d08c6bc0SNikolay Aleksandrov 329cde0708SStephen Hemminger #define BR_VERSION "2.3" 339cde0708SStephen Hemminger 34515853ccSstephen hemminger /* Control of forwarding link local multicast */ 35515853ccSstephen hemminger #define BR_GROUPFWD_DEFAULT 0 36784b58a3SBernhard Thaler /* Don't allow forwarding of control protocols like STP, MAC PAUSE and LACP */ 375af48b59SNikolay Aleksandrov enum { 385af48b59SNikolay Aleksandrov BR_GROUPFWD_STP = BIT(0), 395af48b59SNikolay Aleksandrov BR_GROUPFWD_MACPAUSE = BIT(1), 405af48b59SNikolay Aleksandrov BR_GROUPFWD_LACP = BIT(2), 415af48b59SNikolay Aleksandrov }; 425af48b59SNikolay Aleksandrov 435af48b59SNikolay Aleksandrov #define BR_GROUPFWD_RESTRICTED (BR_GROUPFWD_STP | BR_GROUPFWD_MACPAUSE | \ 445af48b59SNikolay Aleksandrov BR_GROUPFWD_LACP) 45f2808d22SToshiaki Makita /* The Nearest Customer Bridge Group Address, 01-80-C2-00-00-[00,0B,0C,0D,0F] */ 46f2808d22SToshiaki Makita #define BR_GROUPFWD_8021AD 0xB801u 47515853ccSstephen hemminger 489cde0708SStephen Hemminger /* Path to usermode spanning tree program */ 499cde0708SStephen Hemminger #define BR_STP_PROG "/sbin/bridge-stp" 508cbb512eSStephen Hemminger 5131cbc39bSNikolay Aleksandrov #define BR_FDB_NOTIFY_SETTABLE_BITS (FDB_NOTIFY_BIT | FDB_NOTIFY_INACTIVE_BIT) 5231cbc39bSNikolay Aleksandrov 531da177e4SLinus Torvalds typedef struct bridge_id bridge_id; 541da177e4SLinus Torvalds typedef struct mac_addr mac_addr; 551da177e4SLinus Torvalds typedef __u16 port_id; 561da177e4SLinus Torvalds 571c1cb6d0SNikolay Aleksandrov struct bridge_id { 581da177e4SLinus Torvalds unsigned char prio[2]; 59e5a727f6SJoe Perches unsigned char addr[ETH_ALEN]; 601da177e4SLinus Torvalds }; 611da177e4SLinus Torvalds 621c1cb6d0SNikolay Aleksandrov struct mac_addr { 63e5a727f6SJoe Perches unsigned char addr[ETH_ALEN]; 641da177e4SLinus Torvalds }; 651da177e4SLinus Torvalds 66cc0fdd80SLinus Lüssing #ifdef CONFIG_BRIDGE_IGMP_SNOOPING 67cc0fdd80SLinus Lüssing /* our own querier */ 6890010b36SLinus Lüssing struct bridge_mcast_own_query { 69cc0fdd80SLinus Lüssing struct timer_list timer; 70cc0fdd80SLinus Lüssing u32 startup_sent; 71cc0fdd80SLinus Lüssing }; 72cc0fdd80SLinus Lüssing 73cc0fdd80SLinus Lüssing /* other querier */ 7490010b36SLinus Lüssing struct bridge_mcast_other_query { 75cc0fdd80SLinus Lüssing struct timer_list timer; 76cc0fdd80SLinus Lüssing unsigned long delay_time; 77cc0fdd80SLinus Lüssing }; 78dc4eb53aSLinus Lüssing 79dc4eb53aSLinus Lüssing /* selected querier */ 80dc4eb53aSLinus Lüssing struct bridge_mcast_querier { 81dc4eb53aSLinus Lüssing struct br_ip addr; 822cd41431SLinus Lüssing struct net_bridge_port __rcu *port; 83dc4eb53aSLinus Lüssing }; 841080ab95SNikolay Aleksandrov 851080ab95SNikolay Aleksandrov /* IGMP/MLD statistics */ 861080ab95SNikolay Aleksandrov struct bridge_mcast_stats { 871080ab95SNikolay Aleksandrov struct br_mcast_stats mstats; 881080ab95SNikolay Aleksandrov struct u64_stats_sync syncp; 891080ab95SNikolay Aleksandrov }; 90cc0fdd80SLinus Lüssing #endif 91cc0fdd80SLinus Lüssing 92*9632233eSNikolay Aleksandrov /* net_bridge_mcast_port must be always defined due to forwarding stubs */ 93*9632233eSNikolay Aleksandrov struct net_bridge_mcast_port { 94*9632233eSNikolay Aleksandrov #ifdef CONFIG_BRIDGE_IGMP_SNOOPING 95*9632233eSNikolay Aleksandrov struct net_bridge_port *port; 96*9632233eSNikolay Aleksandrov 97*9632233eSNikolay Aleksandrov struct bridge_mcast_own_query ip4_own_query; 98*9632233eSNikolay Aleksandrov struct timer_list ip4_mc_router_timer; 99*9632233eSNikolay Aleksandrov struct hlist_node ip4_rlist; 100*9632233eSNikolay Aleksandrov #if IS_ENABLED(CONFIG_IPV6) 101*9632233eSNikolay Aleksandrov struct bridge_mcast_own_query ip6_own_query; 102*9632233eSNikolay Aleksandrov struct timer_list ip6_mc_router_timer; 103*9632233eSNikolay Aleksandrov struct hlist_node ip6_rlist; 104*9632233eSNikolay Aleksandrov #endif /* IS_ENABLED(CONFIG_IPV6) */ 105*9632233eSNikolay Aleksandrov unsigned char multicast_router; 106*9632233eSNikolay Aleksandrov #endif /* CONFIG_BRIDGE_IGMP_SNOOPING */ 107*9632233eSNikolay Aleksandrov }; 108*9632233eSNikolay Aleksandrov 109efa5356bSRoopa Prabhu struct br_tunnel_info { 110efa5356bSRoopa Prabhu __be64 tunnel_id; 11158e20717SNikolay Aleksandrov struct metadata_dst __rcu *tunnel_dst; 112efa5356bSRoopa Prabhu }; 113efa5356bSRoopa Prabhu 1149d332e69SNikolay Aleksandrov /* private vlan flags */ 1159d332e69SNikolay Aleksandrov enum { 1169d332e69SNikolay Aleksandrov BR_VLFLAG_PER_PORT_STATS = BIT(0), 11727973793SIdo Schimmel BR_VLFLAG_ADDED_BY_SWITCHDEV = BIT(1), 1189d332e69SNikolay Aleksandrov }; 1199d332e69SNikolay Aleksandrov 1202594e906SNikolay Aleksandrov /** 1212594e906SNikolay Aleksandrov * struct net_bridge_vlan - per-vlan entry 1222594e906SNikolay Aleksandrov * 1232594e906SNikolay Aleksandrov * @vnode: rhashtable member 1242594e906SNikolay Aleksandrov * @vid: VLAN id 1252594e906SNikolay Aleksandrov * @flags: bridge vlan flags 1269d332e69SNikolay Aleksandrov * @priv_flags: private (in-kernel) bridge vlan flags 127a580c76dSNikolay Aleksandrov * @state: STP state (e.g. blocking, learning, forwarding) 1286dada9b1SNikolay Aleksandrov * @stats: per-cpu VLAN statistics 1292594e906SNikolay Aleksandrov * @br: if MASTER flag set, this points to a bridge struct 1302594e906SNikolay Aleksandrov * @port: if MASTER flag unset, this points to a port struct 1312594e906SNikolay Aleksandrov * @refcnt: if MASTER flag set, this is bumped for each port referencing it 1322594e906SNikolay Aleksandrov * @brvlan: if MASTER flag unset, this points to the global per-VLAN context 1332594e906SNikolay Aleksandrov * for this VLAN entry 1342594e906SNikolay Aleksandrov * @vlist: sorted list of VLAN entries 1352594e906SNikolay Aleksandrov * @rcu: used for entry destruction 1362594e906SNikolay Aleksandrov * 1372594e906SNikolay Aleksandrov * This structure is shared between the global per-VLAN entries contained in 1382594e906SNikolay Aleksandrov * the bridge rhashtable and the local per-port per-VLAN entries contained in 1392594e906SNikolay Aleksandrov * the port's rhashtable. The union entries should be interpreted depending on 1402594e906SNikolay Aleksandrov * the entry flags that are set. 1412594e906SNikolay Aleksandrov */ 1422594e906SNikolay Aleksandrov struct net_bridge_vlan { 1432594e906SNikolay Aleksandrov struct rhash_head vnode; 144efa5356bSRoopa Prabhu struct rhash_head tnode; 1452594e906SNikolay Aleksandrov u16 vid; 1462594e906SNikolay Aleksandrov u16 flags; 1479d332e69SNikolay Aleksandrov u16 priv_flags; 148a580c76dSNikolay Aleksandrov u8 state; 149281cc284SHeiner Kallweit struct pcpu_sw_netstats __percpu *stats; 150243a2e63SVlad Yasevich union { 151243a2e63SVlad Yasevich struct net_bridge *br; 1522594e906SNikolay Aleksandrov struct net_bridge_port *port; 1532594e906SNikolay Aleksandrov }; 1542594e906SNikolay Aleksandrov union { 15525127759SReshetova, Elena refcount_t refcnt; 1562594e906SNikolay Aleksandrov struct net_bridge_vlan *brvlan; 1572594e906SNikolay Aleksandrov }; 158efa5356bSRoopa Prabhu 159efa5356bSRoopa Prabhu struct br_tunnel_info tinfo; 160efa5356bSRoopa Prabhu 1612594e906SNikolay Aleksandrov struct list_head vlist; 1622594e906SNikolay Aleksandrov 163243a2e63SVlad Yasevich struct rcu_head rcu; 1642594e906SNikolay Aleksandrov }; 1652594e906SNikolay Aleksandrov 1662594e906SNikolay Aleksandrov /** 1672594e906SNikolay Aleksandrov * struct net_bridge_vlan_group 1682594e906SNikolay Aleksandrov * 1692594e906SNikolay Aleksandrov * @vlan_hash: VLAN entry rhashtable 1702594e906SNikolay Aleksandrov * @vlan_list: sorted VLAN entry list 1712594e906SNikolay Aleksandrov * @num_vlans: number of total VLAN entries 17277751ee8SNikolay Aleksandrov * @pvid: PVID VLAN id 173a580c76dSNikolay Aleksandrov * @pvid_state: PVID's STP state (e.g. forwarding, learning, blocking) 1742594e906SNikolay Aleksandrov * 1752594e906SNikolay Aleksandrov * IMPORTANT: Be careful when checking if there're VLAN entries using list 1762594e906SNikolay Aleksandrov * primitives because the bridge can have entries in its list which 1772594e906SNikolay Aleksandrov * are just for global context but not for filtering, i.e. they have 1782594e906SNikolay Aleksandrov * the master flag set but not the brentry flag. If you have to check 1792594e906SNikolay Aleksandrov * if there're "real" entries in the bridge please test @num_vlans 1802594e906SNikolay Aleksandrov */ 1812594e906SNikolay Aleksandrov struct net_bridge_vlan_group { 1822594e906SNikolay Aleksandrov struct rhashtable vlan_hash; 183efa5356bSRoopa Prabhu struct rhashtable tunnel_hash; 1842594e906SNikolay Aleksandrov struct list_head vlan_list; 1856cbdceebSVlad Yasevich u16 num_vlans; 18677751ee8SNikolay Aleksandrov u16 pvid; 187a580c76dSNikolay Aleksandrov u8 pvid_state; 188243a2e63SVlad Yasevich }; 189243a2e63SVlad Yasevich 1906869c3b0SNikolay Aleksandrov /* bridge fdb flags */ 1916869c3b0SNikolay Aleksandrov enum { 1926869c3b0SNikolay Aleksandrov BR_FDB_LOCAL, 19329e63fffSNikolay Aleksandrov BR_FDB_STATIC, 194e0458d9aSNikolay Aleksandrov BR_FDB_STICKY, 195ac3ca6afSNikolay Aleksandrov BR_FDB_ADDED_BY_USER, 196b5cd9f7cSNikolay Aleksandrov BR_FDB_ADDED_BY_EXT_LEARN, 197d38c6e3dSNikolay Aleksandrov BR_FDB_OFFLOADED, 19831cbc39bSNikolay Aleksandrov BR_FDB_NOTIFY, 19931cbc39bSNikolay Aleksandrov BR_FDB_NOTIFY_INACTIVE 2006869c3b0SNikolay Aleksandrov }; 2016869c3b0SNikolay Aleksandrov 202eb793583SNikolay Aleksandrov struct net_bridge_fdb_key { 203eb793583SNikolay Aleksandrov mac_addr addr; 204eb793583SNikolay Aleksandrov u16 vlan_id; 205eb793583SNikolay Aleksandrov }; 206eb793583SNikolay Aleksandrov 2071214628cSNikolay Aleksandrov struct net_bridge_fdb_entry { 208eb793583SNikolay Aleksandrov struct rhash_head rhnode; 2091da177e4SLinus Torvalds struct net_bridge_port *dst; 2101da177e4SLinus Torvalds 211eb793583SNikolay Aleksandrov struct net_bridge_fdb_key key; 212eb793583SNikolay Aleksandrov struct hlist_node fdb_node; 2136869c3b0SNikolay Aleksandrov unsigned long flags; 2141214628cSNikolay Aleksandrov 2151214628cSNikolay Aleksandrov /* write-heavy members should not affect lookups */ 2161214628cSNikolay Aleksandrov unsigned long updated ____cacheline_aligned_in_smp; 2171214628cSNikolay Aleksandrov unsigned long used; 2181214628cSNikolay Aleksandrov 219b22fbf22SNikolay Aleksandrov struct rcu_head rcu; 2201da177e4SLinus Torvalds }; 2211da177e4SLinus Torvalds 2229d06b6d8SElad Raz #define MDB_PG_FLAGS_PERMANENT BIT(0) 2239d06b6d8SElad Raz #define MDB_PG_FLAGS_OFFLOAD BIT(1) 2243247b272SNikolay Aleksandrov #define MDB_PG_FLAGS_FAST_LEAVE BIT(2) 2258266a049SNikolay Aleksandrov #define MDB_PG_FLAGS_STAR_EXCL BIT(3) 2269116ffbfSNikolay Aleksandrov #define MDB_PG_FLAGS_BLOCKED BIT(4) 2279d06b6d8SElad Raz 2288b671779SNikolay Aleksandrov #define PG_SRC_ENT_LIMIT 32 2298b671779SNikolay Aleksandrov 2308b671779SNikolay Aleksandrov #define BR_SGRP_F_DELETE BIT(0) 2318b671779SNikolay Aleksandrov #define BR_SGRP_F_SEND BIT(1) 232b0812368SNikolay Aleksandrov #define BR_SGRP_F_INSTALLED BIT(2) 2338b671779SNikolay Aleksandrov 234e12cec65SNikolay Aleksandrov struct net_bridge_mcast_gc { 235e12cec65SNikolay Aleksandrov struct hlist_node gc_node; 236e12cec65SNikolay Aleksandrov void (*destroy)(struct net_bridge_mcast_gc *gc); 237e12cec65SNikolay Aleksandrov }; 238e12cec65SNikolay Aleksandrov 2398b671779SNikolay Aleksandrov struct net_bridge_group_src { 2408b671779SNikolay Aleksandrov struct hlist_node node; 2418b671779SNikolay Aleksandrov 2428b671779SNikolay Aleksandrov struct br_ip addr; 2438b671779SNikolay Aleksandrov struct net_bridge_port_group *pg; 2448b671779SNikolay Aleksandrov u8 flags; 245438ef2d0SNikolay Aleksandrov u8 src_query_rexmit_cnt; 2468b671779SNikolay Aleksandrov struct timer_list timer; 2478b671779SNikolay Aleksandrov 2488b671779SNikolay Aleksandrov struct net_bridge *br; 249e12cec65SNikolay Aleksandrov struct net_bridge_mcast_gc mcast_gc; 2508b671779SNikolay Aleksandrov struct rcu_head rcu; 2518b671779SNikolay Aleksandrov }; 2528b671779SNikolay Aleksandrov 253085b53c8SNikolay Aleksandrov struct net_bridge_port_group_sg_key { 254eb1d1641SHerbert Xu struct net_bridge_port *port; 2558ef2a9a5SYOSHIFUJI Hideaki struct br_ip addr; 256085b53c8SNikolay Aleksandrov }; 257085b53c8SNikolay Aleksandrov 258085b53c8SNikolay Aleksandrov struct net_bridge_port_group { 259085b53c8SNikolay Aleksandrov struct net_bridge_port_group __rcu *next; 260085b53c8SNikolay Aleksandrov struct net_bridge_port_group_sg_key key; 261206e7323SThomas Martitz unsigned char eth_addr[ETH_ALEN] __aligned(2); 2629d06b6d8SElad Raz unsigned char flags; 2638b671779SNikolay Aleksandrov unsigned char filter_mode; 26442c11ccfSNikolay Aleksandrov unsigned char grp_query_rexmit_cnt; 2658f8cb77eSNikolay Aleksandrov unsigned char rt_protocol; 2666ec0d0eeSNikolay Aleksandrov 2678b671779SNikolay Aleksandrov struct hlist_head src_list; 2688b671779SNikolay Aleksandrov unsigned int src_ents; 2696ec0d0eeSNikolay Aleksandrov struct timer_list timer; 27042c11ccfSNikolay Aleksandrov struct timer_list rexmit_timer; 2716ec0d0eeSNikolay Aleksandrov struct hlist_node mglist; 2728f07b831SNikolay Aleksandrov struct rb_root eht_set_tree; 2738f07b831SNikolay Aleksandrov struct rb_root eht_host_tree; 2746ec0d0eeSNikolay Aleksandrov 275085b53c8SNikolay Aleksandrov struct rhash_head rhnode; 276e12cec65SNikolay Aleksandrov struct net_bridge_mcast_gc mcast_gc; 2776ec0d0eeSNikolay Aleksandrov struct rcu_head rcu; 278eb1d1641SHerbert Xu }; 279eb1d1641SHerbert Xu 2801c1cb6d0SNikolay Aleksandrov struct net_bridge_mdb_entry { 28119e3a9c9SNikolay Aleksandrov struct rhash_head rhnode; 282eb1d1641SHerbert Xu struct net_bridge *br; 283e8051688SEric Dumazet struct net_bridge_port_group __rcu *ports; 2848ef2a9a5SYOSHIFUJI Hideaki struct br_ip addr; 285ff0fd34eSAndrew Lunn bool host_joined; 2866ec0d0eeSNikolay Aleksandrov 2876ec0d0eeSNikolay Aleksandrov struct timer_list timer; 28819e3a9c9SNikolay Aleksandrov struct hlist_node mdb_node; 2896ec0d0eeSNikolay Aleksandrov 290e12cec65SNikolay Aleksandrov struct net_bridge_mcast_gc mcast_gc; 2916ec0d0eeSNikolay Aleksandrov struct rcu_head rcu; 292eb1d1641SHerbert Xu }; 293eb1d1641SHerbert Xu 2941f90c7f3SNikolay Aleksandrov struct net_bridge_port { 2951da177e4SLinus Torvalds struct net_bridge *br; 2961da177e4SLinus Torvalds struct net_device *dev; 2971da177e4SLinus Torvalds struct list_head list; 2981da177e4SLinus Torvalds 2991f90c7f3SNikolay Aleksandrov unsigned long flags; 3001f90c7f3SNikolay Aleksandrov #ifdef CONFIG_BRIDGE_VLAN_FILTERING 3011f90c7f3SNikolay Aleksandrov struct net_bridge_vlan_group __rcu *vlgrp; 3021f90c7f3SNikolay Aleksandrov #endif 3032756f68cSNikolay Aleksandrov struct net_bridge_port __rcu *backup_port; 3041f90c7f3SNikolay Aleksandrov 3051da177e4SLinus Torvalds /* STP */ 3061da177e4SLinus Torvalds u8 priority; 3071da177e4SLinus Torvalds u8 state; 3081da177e4SLinus Torvalds u16 port_no; 3091da177e4SLinus Torvalds unsigned char topology_change_ack; 3101da177e4SLinus Torvalds unsigned char config_pending; 3111da177e4SLinus Torvalds port_id port_id; 3121da177e4SLinus Torvalds port_id designated_port; 3131da177e4SLinus Torvalds bridge_id designated_root; 3141da177e4SLinus Torvalds bridge_id designated_bridge; 3151da177e4SLinus Torvalds u32 path_cost; 3161da177e4SLinus Torvalds u32 designated_cost; 3170c03150eSstephen hemminger unsigned long designated_age; 3181da177e4SLinus Torvalds 3191da177e4SLinus Torvalds struct timer_list forward_delay_timer; 3201da177e4SLinus Torvalds struct timer_list hold_timer; 3211da177e4SLinus Torvalds struct timer_list message_age_timer; 3221da177e4SLinus Torvalds struct kobject kobj; 3231da177e4SLinus Torvalds struct rcu_head rcu; 3243982d3d2SFischer, Anna 325*9632233eSNikolay Aleksandrov struct net_bridge_mcast_port multicast_ctx; 326*9632233eSNikolay Aleksandrov 327eb1d1641SHerbert Xu #ifdef CONFIG_BRIDGE_IGMP_SNOOPING 328*9632233eSNikolay Aleksandrov struct bridge_mcast_stats __percpu *mcast_stats; 329*9632233eSNikolay Aleksandrov 33089268b05SNikolay Aleksandrov u32 multicast_eht_hosts_limit; 33189268b05SNikolay Aleksandrov u32 multicast_eht_hosts_cnt; 332eb1d1641SHerbert Xu struct hlist_head mglist; 333eb1d1641SHerbert Xu #endif 334e0f43752SSimon Arlott 335e0f43752SSimon Arlott #ifdef CONFIG_SYSFS 336e0f43752SSimon Arlott char sysfs_name[IFNAMSIZ]; 337e0f43752SSimon Arlott #endif 33891d2c34aSHerbert Xu 33991d2c34aSHerbert Xu #ifdef CONFIG_NET_POLL_CONTROLLER 34091d2c34aSHerbert Xu struct netpoll *np; 34191d2c34aSHerbert Xu #endif 3426bc506b4SIdo Schimmel #ifdef CONFIG_NET_SWITCHDEV 3436bc506b4SIdo Schimmel int offload_fwd_mark; 3446bc506b4SIdo Schimmel #endif 3455af48b59SNikolay Aleksandrov u16 group_fwd_mask; 3462756f68cSNikolay Aleksandrov u16 backup_redirected_cnt; 347de179966SVivien Didelot 348de179966SVivien Didelot struct bridge_stp_xstats stp_xstats; 3491da177e4SLinus Torvalds }; 3501da177e4SLinus Torvalds 351705e0deaSTyler Hicks #define kobj_to_brport(obj) container_of(obj, struct net_bridge_port, kobj) 352705e0deaSTyler Hicks 353e028e4b8SVlad Yasevich #define br_auto_port(p) ((p)->flags & BR_AUTO_MASK) 354f3a6ddf1SVlad Yasevich #define br_promisc_port(p) ((p)->flags & BR_PROMISC) 355e028e4b8SVlad Yasevich 356b5ed54e9Sstephen hemminger static inline struct net_bridge_port *br_port_get_rcu(const struct net_device *dev) 357b5ed54e9Sstephen hemminger { 358716ec052SHong Zhiguo return rcu_dereference(dev->rx_handler_data); 359b5ed54e9Sstephen hemminger } 360b5ed54e9Sstephen hemminger 3611fb1754aSHong Zhiguo static inline struct net_bridge_port *br_port_get_rtnl(const struct net_device *dev) 362b5ed54e9Sstephen hemminger { 36335f861e3SJulian Wiedmann return netif_is_bridge_port(dev) ? 364ec1e5610SEric Dumazet rtnl_dereference(dev->rx_handler_data) : NULL; 365b5ed54e9Sstephen hemminger } 366b5ed54e9Sstephen hemminger 3670baa10ffSArkadi Sharshevsky static inline struct net_bridge_port *br_port_get_rtnl_rcu(const struct net_device *dev) 3680baa10ffSArkadi Sharshevsky { 36935f861e3SJulian Wiedmann return netif_is_bridge_port(dev) ? 3700baa10ffSArkadi Sharshevsky rcu_dereference_rtnl(dev->rx_handler_data) : NULL; 3710baa10ffSArkadi Sharshevsky } 3720baa10ffSArkadi Sharshevsky 373ae75767eSNikolay Aleksandrov enum net_bridge_opts { 374ae75767eSNikolay Aleksandrov BROPT_VLAN_ENABLED, 375ae75767eSNikolay Aleksandrov BROPT_VLAN_STATS_ENABLED, 3768df3510fSNikolay Aleksandrov BROPT_NF_CALL_IPTABLES, 3778df3510fSNikolay Aleksandrov BROPT_NF_CALL_IP6TABLES, 3788df3510fSNikolay Aleksandrov BROPT_NF_CALL_ARPTABLES, 379be3664a0SNikolay Aleksandrov BROPT_GROUP_ADDR_SET, 38013cefad2SNikolay Aleksandrov BROPT_MULTICAST_ENABLED, 381675779adSNikolay Aleksandrov BROPT_MULTICAST_QUERIER, 382675779adSNikolay Aleksandrov BROPT_MULTICAST_QUERY_USE_IFADDR, 383675779adSNikolay Aleksandrov BROPT_MULTICAST_STATS_ENABLED, 384675779adSNikolay Aleksandrov BROPT_HAS_IPV6_ADDR, 385c69c2cd4SNikolay Aleksandrov BROPT_NEIGH_SUPPRESS_ENABLED, 3863341d917SNikolay Aleksandrov BROPT_MTU_SET_BY_USER, 3879163a0fcSNikolay Aleksandrov BROPT_VLAN_STATS_PER_PORT, 38870e4272bSNikolay Aleksandrov BROPT_NO_LL_LEARN, 3899c0ec2e7SMike Manning BROPT_VLAN_BRIDGE_BINDING, 390ae75767eSNikolay Aleksandrov }; 391ae75767eSNikolay Aleksandrov 3921f90c7f3SNikolay Aleksandrov struct net_bridge { 3931da177e4SLinus Torvalds spinlock_t lock; 3941f90c7f3SNikolay Aleksandrov spinlock_t hash_lock; 39590c628ddSHenrik Bjoernlund struct hlist_head frame_type_list; 3961da177e4SLinus Torvalds struct net_device *dev; 397ae75767eSNikolay Aleksandrov unsigned long options; 3981f90c7f3SNikolay Aleksandrov /* These fields are accessed on each packet */ 3991f90c7f3SNikolay Aleksandrov #ifdef CONFIG_BRIDGE_VLAN_FILTERING 4001f90c7f3SNikolay Aleksandrov __be16 vlan_proto; 4011f90c7f3SNikolay Aleksandrov u16 default_pvid; 4021f90c7f3SNikolay Aleksandrov struct net_bridge_vlan_group __rcu *vlgrp; 4031f90c7f3SNikolay Aleksandrov #endif 4041f90c7f3SNikolay Aleksandrov 405eb793583SNikolay Aleksandrov struct rhashtable fdb_hash_tbl; 40690c628ddSHenrik Bjoernlund struct list_head port_list; 40734666d46SPablo Neira Ayuso #if IS_ENABLED(CONFIG_BRIDGE_NETFILTER) 408efb6de9bSBernhard Thaler union { 4094adf0af6SSimon Wunderlich struct rtable fake_rtable; 410efb6de9bSBernhard Thaler struct rt6_info fake_rt6_info; 411efb6de9bSBernhard Thaler }; 4124adf0af6SSimon Wunderlich #endif 413515853ccSstephen hemminger u16 group_fwd_mask; 414f2808d22SToshiaki Makita u16 group_fwd_mask_required; 415515853ccSstephen hemminger 4161da177e4SLinus Torvalds /* STP */ 4171da177e4SLinus Torvalds bridge_id designated_root; 4181da177e4SLinus Torvalds bridge_id bridge_id; 4191f90c7f3SNikolay Aleksandrov unsigned char topology_change; 4201f90c7f3SNikolay Aleksandrov unsigned char topology_change_detected; 4211f90c7f3SNikolay Aleksandrov u16 root_port; 4221da177e4SLinus Torvalds unsigned long max_age; 4231da177e4SLinus Torvalds unsigned long hello_time; 4241da177e4SLinus Torvalds unsigned long forward_delay; 4251da177e4SLinus Torvalds unsigned long ageing_time; 42634d8acd8SVivien Didelot unsigned long bridge_max_age; 4271da177e4SLinus Torvalds unsigned long bridge_hello_time; 4281da177e4SLinus Torvalds unsigned long bridge_forward_delay; 42934d8acd8SVivien Didelot unsigned long bridge_ageing_time; 43035750b0bSNikolay Aleksandrov u32 root_path_cost; 4311da177e4SLinus Torvalds 432fda93d92SStephen Hemminger u8 group_addr[ETH_ALEN]; 4339cde0708SStephen Hemminger 4349cde0708SStephen Hemminger enum { 4359cde0708SStephen Hemminger BR_NO_STP, /* no spanning tree */ 4369cde0708SStephen Hemminger BR_KERNEL_STP, /* old STP in kernel */ 4379cde0708SStephen Hemminger BR_USER_STP, /* new RSTP in userspace */ 4389cde0708SStephen Hemminger } stp_enabled; 4399cde0708SStephen Hemminger 440eb1d1641SHerbert Xu #ifdef CONFIG_BRIDGE_IGMP_SNOOPING 441eb1d1641SHerbert Xu 442eb1d1641SHerbert Xu u32 hash_max; 443eb1d1641SHerbert Xu 444eb1d1641SHerbert Xu u32 multicast_last_member_count; 445eb1d1641SHerbert Xu u32 multicast_startup_query_count; 446eb1d1641SHerbert Xu 4475e923585SNikolay Aleksandrov u8 multicast_igmp_version; 448675779adSNikolay Aleksandrov u8 multicast_router; 449675779adSNikolay Aleksandrov #if IS_ENABLED(CONFIG_IPV6) 450675779adSNikolay Aleksandrov u8 multicast_mld_version; 451675779adSNikolay Aleksandrov #endif 45235750b0bSNikolay Aleksandrov spinlock_t multicast_lock; 453eb1d1641SHerbert Xu unsigned long multicast_last_member_interval; 454eb1d1641SHerbert Xu unsigned long multicast_membership_interval; 455eb1d1641SHerbert Xu unsigned long multicast_querier_interval; 456eb1d1641SHerbert Xu unsigned long multicast_query_interval; 457eb1d1641SHerbert Xu unsigned long multicast_query_response_interval; 458eb1d1641SHerbert Xu unsigned long multicast_startup_query_interval; 459eb1d1641SHerbert Xu 46019e3a9c9SNikolay Aleksandrov struct rhashtable mdb_hash_tbl; 461085b53c8SNikolay Aleksandrov struct rhashtable sg_port_tbl; 46219e3a9c9SNikolay Aleksandrov 463e12cec65SNikolay Aleksandrov struct hlist_head mcast_gc_list; 46419e3a9c9SNikolay Aleksandrov struct hlist_head mdb_list; 465eb1d1641SHerbert Xu 466ce6f7097SLinus Lüssing struct hlist_head ip4_mc_router_list; 467ce6f7097SLinus Lüssing struct timer_list ip4_mc_router_timer; 46890010b36SLinus Lüssing struct bridge_mcast_other_query ip4_other_query; 46990010b36SLinus Lüssing struct bridge_mcast_own_query ip4_own_query; 470dc4eb53aSLinus Lüssing struct bridge_mcast_querier ip4_querier; 4711080ab95SNikolay Aleksandrov struct bridge_mcast_stats __percpu *mcast_stats; 472cc0fdd80SLinus Lüssing #if IS_ENABLED(CONFIG_IPV6) 473a3c02e76SLinus Lüssing struct hlist_head ip6_mc_router_list; 474a3c02e76SLinus Lüssing struct timer_list ip6_mc_router_timer; 47590010b36SLinus Lüssing struct bridge_mcast_other_query ip6_other_query; 47690010b36SLinus Lüssing struct bridge_mcast_own_query ip6_own_query; 477dc4eb53aSLinus Lüssing struct bridge_mcast_querier ip6_querier; 478cc0fdd80SLinus Lüssing #endif /* IS_ENABLED(CONFIG_IPV6) */ 479e12cec65SNikolay Aleksandrov struct work_struct mcast_gc_work; 480eb1d1641SHerbert Xu #endif 481eb1d1641SHerbert Xu 4821da177e4SLinus Torvalds struct timer_list hello_timer; 4831da177e4SLinus Torvalds struct timer_list tcn_timer; 4841da177e4SLinus Torvalds struct timer_list topology_change_timer; 485f7cdee8aSNikolay Aleksandrov struct delayed_work gc_work; 48643b98c4aSGreg Kroah-Hartman struct kobject *ifobj; 487e028e4b8SVlad Yasevich u32 auto_cnt; 4886bc506b4SIdo Schimmel 4896bc506b4SIdo Schimmel #ifdef CONFIG_NET_SWITCHDEV 4906bc506b4SIdo Schimmel int offload_fwd_mark; 4916bc506b4SIdo Schimmel #endif 492eb793583SNikolay Aleksandrov struct hlist_head fdb_list; 4934b8d7d4cSHoratiu Vultur 4944b8d7d4cSHoratiu Vultur #if IS_ENABLED(CONFIG_BRIDGE_MRP) 4950169b820SHoratiu Vultur struct hlist_head mrp_list; 4964b8d7d4cSHoratiu Vultur #endif 497f323aa54SHenrik Bjoernlund #if IS_ENABLED(CONFIG_BRIDGE_CFM) 498f323aa54SHenrik Bjoernlund struct hlist_head mep_list; 499f323aa54SHenrik Bjoernlund #endif 5001da177e4SLinus Torvalds }; 5011da177e4SLinus Torvalds 50268b7c895SHerbert Xu struct br_input_skb_cb { 50368b7c895SHerbert Xu struct net_device *brdev; 50493fdd47eSHerbert Xu 5053c171f49SPablo Neira Ayuso u16 frag_max_size; 50632dec5ddSYOSHIFUJI Hideaki / 吉藤英明 #ifdef CONFIG_BRIDGE_IGMP_SNOOPING 507f12064d1SFlorian Westphal u8 igmp; 508f12064d1SFlorian Westphal u8 mrouters_only:1; 50932dec5ddSYOSHIFUJI Hideaki / 吉藤英明 #endif 510f12064d1SFlorian Westphal u8 proxyarp_replied:1; 511f12064d1SFlorian Westphal u8 src_port_isolated:1; 51220adfa1aSVlad Yasevich #ifdef CONFIG_BRIDGE_VLAN_FILTERING 513f12064d1SFlorian Westphal u8 vlan_filtered:1; 51420adfa1aSVlad Yasevich #endif 515223fd0adSFlorian Westphal #ifdef CONFIG_NETFILTER_FAMILY_BRIDGE 516223fd0adSFlorian Westphal u8 br_netfilter_broute:1; 517223fd0adSFlorian Westphal #endif 5186bc506b4SIdo Schimmel 5196bc506b4SIdo Schimmel #ifdef CONFIG_NET_SWITCHDEV 5206bc506b4SIdo Schimmel int offload_fwd_mark; 5216bc506b4SIdo Schimmel #endif 52268b7c895SHerbert Xu }; 52368b7c895SHerbert Xu 52468b7c895SHerbert Xu #define BR_INPUT_SKB_CB(__skb) ((struct br_input_skb_cb *)(__skb)->cb) 52568b7c895SHerbert Xu 52632dec5ddSYOSHIFUJI Hideaki / 吉藤英明 #ifdef CONFIG_BRIDGE_IGMP_SNOOPING 52732dec5ddSYOSHIFUJI Hideaki / 吉藤英明 # define BR_INPUT_SKB_CB_MROUTERS_ONLY(__skb) (BR_INPUT_SKB_CB(__skb)->mrouters_only) 52832dec5ddSYOSHIFUJI Hideaki / 吉藤英明 #else 52932dec5ddSYOSHIFUJI Hideaki / 吉藤英明 # define BR_INPUT_SKB_CB_MROUTERS_ONLY(__skb) (0) 53032dec5ddSYOSHIFUJI Hideaki / 吉藤英明 #endif 53132dec5ddSYOSHIFUJI Hideaki / 吉藤英明 53228a16c97Sstephen hemminger #define br_printk(level, br, format, args...) \ 53328a16c97Sstephen hemminger printk(level "%s: " format, (br)->dev->name, ##args) 53428a16c97Sstephen hemminger 53528a16c97Sstephen hemminger #define br_err(__br, format, args...) \ 53628a16c97Sstephen hemminger br_printk(KERN_ERR, __br, format, ##args) 53728a16c97Sstephen hemminger #define br_warn(__br, format, args...) \ 53828a16c97Sstephen hemminger br_printk(KERN_WARNING, __br, format, ##args) 53928a16c97Sstephen hemminger #define br_notice(__br, format, args...) \ 54028a16c97Sstephen hemminger br_printk(KERN_NOTICE, __br, format, ##args) 54128a16c97Sstephen hemminger #define br_info(__br, format, args...) \ 54228a16c97Sstephen hemminger br_printk(KERN_INFO, __br, format, ##args) 54328a16c97Sstephen hemminger 54428a16c97Sstephen hemminger #define br_debug(br, format, args...) \ 54528a16c97Sstephen hemminger pr_debug("%s: " format, (br)->dev->name, ##args) 54628a16c97Sstephen hemminger 5471da177e4SLinus Torvalds /* called under bridge lock */ 5481da177e4SLinus Torvalds static inline int br_is_root_bridge(const struct net_bridge *br) 5491da177e4SLinus Torvalds { 5501da177e4SLinus Torvalds return !memcmp(&br->bridge_id, &br->designated_root, 8); 5511da177e4SLinus Torvalds } 5521da177e4SLinus Torvalds 5532594e906SNikolay Aleksandrov /* check if a VLAN entry is global */ 5542594e906SNikolay Aleksandrov static inline bool br_vlan_is_master(const struct net_bridge_vlan *v) 5552594e906SNikolay Aleksandrov { 5562594e906SNikolay Aleksandrov return v->flags & BRIDGE_VLAN_INFO_MASTER; 5572594e906SNikolay Aleksandrov } 5582594e906SNikolay Aleksandrov 5592594e906SNikolay Aleksandrov /* check if a VLAN entry is used by the bridge */ 5602594e906SNikolay Aleksandrov static inline bool br_vlan_is_brentry(const struct net_bridge_vlan *v) 5612594e906SNikolay Aleksandrov { 5622594e906SNikolay Aleksandrov return v->flags & BRIDGE_VLAN_INFO_BRENTRY; 5632594e906SNikolay Aleksandrov } 5642594e906SNikolay Aleksandrov 5656be144f6SNikolay Aleksandrov /* check if we should use the vlan entry, returns false if it's only context */ 5662594e906SNikolay Aleksandrov static inline bool br_vlan_should_use(const struct net_bridge_vlan *v) 5672594e906SNikolay Aleksandrov { 5682594e906SNikolay Aleksandrov if (br_vlan_is_master(v)) { 5692594e906SNikolay Aleksandrov if (br_vlan_is_brentry(v)) 5702594e906SNikolay Aleksandrov return true; 5712594e906SNikolay Aleksandrov else 5722594e906SNikolay Aleksandrov return false; 5732594e906SNikolay Aleksandrov } 5742594e906SNikolay Aleksandrov 5752594e906SNikolay Aleksandrov return true; 5762594e906SNikolay Aleksandrov } 5772594e906SNikolay Aleksandrov 5785d1fcaf3SNikolay Aleksandrov static inline bool nbp_state_should_learn(const struct net_bridge_port *p) 5795d1fcaf3SNikolay Aleksandrov { 5805d1fcaf3SNikolay Aleksandrov return p->state == BR_STATE_LEARNING || p->state == BR_STATE_FORWARDING; 5815d1fcaf3SNikolay Aleksandrov } 5825d1fcaf3SNikolay Aleksandrov 5838f4cc940SNikolay Aleksandrov static inline bool br_vlan_valid_id(u16 vid, struct netlink_ext_ack *extack) 5845a46facbSNikolay Aleksandrov { 5858f4cc940SNikolay Aleksandrov bool ret = vid > 0 && vid < VLAN_VID_MASK; 5868f4cc940SNikolay Aleksandrov 5878f4cc940SNikolay Aleksandrov if (!ret) 5888f4cc940SNikolay Aleksandrov NL_SET_ERR_MSG_MOD(extack, "Vlan id is invalid"); 5898f4cc940SNikolay Aleksandrov 5908f4cc940SNikolay Aleksandrov return ret; 5915a46facbSNikolay Aleksandrov } 5925a46facbSNikolay Aleksandrov 5935a46facbSNikolay Aleksandrov static inline bool br_vlan_valid_range(const struct bridge_vlan_info *cur, 5948f4cc940SNikolay Aleksandrov const struct bridge_vlan_info *last, 5958f4cc940SNikolay Aleksandrov struct netlink_ext_ack *extack) 5965a46facbSNikolay Aleksandrov { 5975a46facbSNikolay Aleksandrov /* pvid flag is not allowed in ranges */ 5988f4cc940SNikolay Aleksandrov if (cur->flags & BRIDGE_VLAN_INFO_PVID) { 5998f4cc940SNikolay Aleksandrov NL_SET_ERR_MSG_MOD(extack, "Pvid isn't allowed in a range"); 6005a46facbSNikolay Aleksandrov return false; 6018f4cc940SNikolay Aleksandrov } 6025a46facbSNikolay Aleksandrov 6035a46facbSNikolay Aleksandrov /* when cur is the range end, check if: 6045a46facbSNikolay Aleksandrov * - it has range start flag 6055a46facbSNikolay Aleksandrov * - range ids are invalid (end is equal to or before start) 6065a46facbSNikolay Aleksandrov */ 6075a46facbSNikolay Aleksandrov if (last) { 6088f4cc940SNikolay Aleksandrov if (cur->flags & BRIDGE_VLAN_INFO_RANGE_BEGIN) { 6098f4cc940SNikolay Aleksandrov NL_SET_ERR_MSG_MOD(extack, "Found a new vlan range start while processing one"); 6105a46facbSNikolay Aleksandrov return false; 6118f4cc940SNikolay Aleksandrov } else if (!(cur->flags & BRIDGE_VLAN_INFO_RANGE_END)) { 6128f4cc940SNikolay Aleksandrov NL_SET_ERR_MSG_MOD(extack, "Vlan range end flag is missing"); 6138f4cc940SNikolay Aleksandrov return false; 6148f4cc940SNikolay Aleksandrov } else if (cur->vid <= last->vid) { 6158f4cc940SNikolay Aleksandrov NL_SET_ERR_MSG_MOD(extack, "End vlan id is less than or equal to start vlan id"); 6168f4cc940SNikolay Aleksandrov return false; 6178f4cc940SNikolay Aleksandrov } 6188f4cc940SNikolay Aleksandrov } 6198f4cc940SNikolay Aleksandrov 6208f4cc940SNikolay Aleksandrov /* check for required range flags */ 6218f4cc940SNikolay Aleksandrov if (!(cur->flags & (BRIDGE_VLAN_INFO_RANGE_BEGIN | 6228f4cc940SNikolay Aleksandrov BRIDGE_VLAN_INFO_RANGE_END))) { 6238f4cc940SNikolay Aleksandrov NL_SET_ERR_MSG_MOD(extack, "Both vlan range flags are missing"); 6245a46facbSNikolay Aleksandrov return false; 6255a46facbSNikolay Aleksandrov } 6265a46facbSNikolay Aleksandrov 6275a46facbSNikolay Aleksandrov return true; 6285a46facbSNikolay Aleksandrov } 6295a46facbSNikolay Aleksandrov 630f545923bSNikolay Aleksandrov static inline int br_afspec_cmd_to_rtm(int cmd) 631f545923bSNikolay Aleksandrov { 632f545923bSNikolay Aleksandrov switch (cmd) { 633f545923bSNikolay Aleksandrov case RTM_SETLINK: 634f545923bSNikolay Aleksandrov return RTM_NEWVLAN; 635f545923bSNikolay Aleksandrov case RTM_DELLINK: 636f545923bSNikolay Aleksandrov return RTM_DELVLAN; 637f545923bSNikolay Aleksandrov } 638f545923bSNikolay Aleksandrov 639f545923bSNikolay Aleksandrov return 0; 640f545923bSNikolay Aleksandrov } 641f545923bSNikolay Aleksandrov 642ae75767eSNikolay Aleksandrov static inline int br_opt_get(const struct net_bridge *br, 643ae75767eSNikolay Aleksandrov enum net_bridge_opts opt) 644ae75767eSNikolay Aleksandrov { 645ae75767eSNikolay Aleksandrov return test_bit(opt, &br->options); 646ae75767eSNikolay Aleksandrov } 647ae75767eSNikolay Aleksandrov 648a428afe8SNikolay Aleksandrov int br_boolopt_toggle(struct net_bridge *br, enum br_boolopt_id opt, bool on, 649a428afe8SNikolay Aleksandrov struct netlink_ext_ack *extack); 650a428afe8SNikolay Aleksandrov int br_boolopt_get(const struct net_bridge *br, enum br_boolopt_id opt); 651a428afe8SNikolay Aleksandrov int br_boolopt_multi_toggle(struct net_bridge *br, 652a428afe8SNikolay Aleksandrov struct br_boolopt_multi *bm, 653a428afe8SNikolay Aleksandrov struct netlink_ext_ack *extack); 654a428afe8SNikolay Aleksandrov void br_boolopt_multi_get(const struct net_bridge *br, 655a428afe8SNikolay Aleksandrov struct br_boolopt_multi *bm); 656ae75767eSNikolay Aleksandrov void br_opt_toggle(struct net_bridge *br, enum net_bridge_opts opt, bool on); 657ae75767eSNikolay Aleksandrov 6581da177e4SLinus Torvalds /* br_device.c */ 659348662a1SJoe Perches void br_dev_setup(struct net_device *dev); 660348662a1SJoe Perches void br_dev_delete(struct net_device *dev, struct list_head *list); 661348662a1SJoe Perches netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev); 662cfb478daSstephen hemminger #ifdef CONFIG_NET_POLL_CONTROLLER 66391d2c34aSHerbert Xu static inline void br_netpoll_send_skb(const struct net_bridge_port *p, 66491d2c34aSHerbert Xu struct sk_buff *skb) 66591d2c34aSHerbert Xu { 666f78ed220SEric Dumazet netpoll_send_skb(p->np, skb); 66791d2c34aSHerbert Xu } 66891d2c34aSHerbert Xu 669a8779ec1SEric W. Biederman int br_netpoll_enable(struct net_bridge_port *p); 670348662a1SJoe Perches void br_netpoll_disable(struct net_bridge_port *p); 67191d2c34aSHerbert Xu #else 6729f70b0fcSHerbert Xu static inline void br_netpoll_send_skb(const struct net_bridge_port *p, 67391d2c34aSHerbert Xu struct sk_buff *skb) 67491d2c34aSHerbert Xu { 67591d2c34aSHerbert Xu } 67691d2c34aSHerbert Xu 677a8779ec1SEric W. Biederman static inline int br_netpoll_enable(struct net_bridge_port *p) 67891d2c34aSHerbert Xu { 67991d2c34aSHerbert Xu return 0; 68091d2c34aSHerbert Xu } 68191d2c34aSHerbert Xu 68291d2c34aSHerbert Xu static inline void br_netpoll_disable(struct net_bridge_port *p) 68391d2c34aSHerbert Xu { 68491d2c34aSHerbert Xu } 685cfb478daSstephen hemminger #endif 6861da177e4SLinus Torvalds 6871da177e4SLinus Torvalds /* br_fdb.c */ 688348662a1SJoe Perches int br_fdb_init(void); 689348662a1SJoe Perches void br_fdb_fini(void); 690eb793583SNikolay Aleksandrov int br_fdb_hash_init(struct net_bridge *br); 691eb793583SNikolay Aleksandrov void br_fdb_hash_fini(struct net_bridge *br); 692348662a1SJoe Perches void br_fdb_flush(struct net_bridge *br); 693424bb9c9SToshiaki Makita void br_fdb_find_delete_local(struct net_bridge *br, 694424bb9c9SToshiaki Makita const struct net_bridge_port *p, 695424bb9c9SToshiaki Makita const unsigned char *addr, u16 vid); 696348662a1SJoe Perches void br_fdb_changeaddr(struct net_bridge_port *p, const unsigned char *newaddr); 697348662a1SJoe Perches void br_fdb_change_mac_address(struct net_bridge *br, const u8 *newaddr); 698f7cdee8aSNikolay Aleksandrov void br_fdb_cleanup(struct work_struct *work); 699348662a1SJoe Perches void br_fdb_delete_by_port(struct net_bridge *br, 7001ea2d020SNikolay Aleksandrov const struct net_bridge_port *p, u16 vid, int do_all); 701bfd0aeacSNikolay Aleksandrov struct net_bridge_fdb_entry *br_fdb_find_rcu(struct net_bridge *br, 702bfd0aeacSNikolay Aleksandrov const unsigned char *addr, 703bfd0aeacSNikolay Aleksandrov __u16 vid); 704348662a1SJoe Perches int br_fdb_test_addr(struct net_device *dev, unsigned char *addr); 705348662a1SJoe Perches int br_fdb_fillbuf(struct net_bridge *br, void *buf, unsigned long count, 706348662a1SJoe Perches unsigned long off); 707348662a1SJoe Perches int br_fdb_insert(struct net_bridge *br, struct net_bridge_port *source, 708348662a1SJoe Perches const unsigned char *addr, u16 vid); 709348662a1SJoe Perches void br_fdb_update(struct net_bridge *br, struct net_bridge_port *source, 710be0c5677SNikolay Aleksandrov const unsigned char *addr, u16 vid, unsigned long flags); 71177162022SJohn Fastabend 712348662a1SJoe Perches int br_fdb_delete(struct ndmsg *ndm, struct nlattr *tb[], 713f6f6424bSJiri Pirko struct net_device *dev, const unsigned char *addr, u16 vid); 714348662a1SJoe Perches int br_fdb_add(struct ndmsg *nlh, struct nlattr *tb[], struct net_device *dev, 71587b0984eSPetr Machata const unsigned char *addr, u16 vid, u16 nlh_flags, 71687b0984eSPetr Machata struct netlink_ext_ack *extack); 717348662a1SJoe Perches int br_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb, 718d297653dSRoopa Prabhu struct net_device *dev, struct net_device *fdev, int *idx); 71947674562SRoopa Prabhu int br_fdb_get(struct sk_buff *skb, struct nlattr *tb[], struct net_device *dev, 72047674562SRoopa Prabhu const unsigned char *addr, u16 vid, u32 portid, u32 seq, 72147674562SRoopa Prabhu struct netlink_ext_ack *extack); 7228db24af7SVlad Yasevich int br_fdb_sync_static(struct net_bridge *br, struct net_bridge_port *p); 7238db24af7SVlad Yasevich void br_fdb_unsync_static(struct net_bridge *br, struct net_bridge_port *p); 7243aeb6617SJiri Pirko int br_fdb_external_learn_add(struct net_bridge *br, struct net_bridge_port *p, 725161d82deSPetr Machata const unsigned char *addr, u16 vid, 726161d82deSPetr Machata bool swdev_notify); 7273aeb6617SJiri Pirko int br_fdb_external_learn_del(struct net_bridge *br, struct net_bridge_port *p, 728161d82deSPetr Machata const unsigned char *addr, u16 vid, 729161d82deSPetr Machata bool swdev_notify); 7309fe8bcecSArkadi Sharshevsky void br_fdb_offloaded_set(struct net_bridge *br, struct net_bridge_port *p, 731e9ba0fbcSIdo Schimmel const unsigned char *addr, u16 vid, bool offloaded); 7321da177e4SLinus Torvalds 7331da177e4SLinus Torvalds /* br_forward.c */ 7348addd5e7SNikolay Aleksandrov enum br_pkt_type { 7358addd5e7SNikolay Aleksandrov BR_PKT_UNICAST, 7368addd5e7SNikolay Aleksandrov BR_PKT_MULTICAST, 7378addd5e7SNikolay Aleksandrov BR_PKT_BROADCAST 7388addd5e7SNikolay Aleksandrov }; 7390c4b51f0SEric W. Biederman int br_dev_queue_push_xmit(struct net *net, struct sock *sk, struct sk_buff *skb); 740b35c5f63SNikolay Aleksandrov void br_forward(const struct net_bridge_port *to, struct sk_buff *skb, 74137b090e6SNikolay Aleksandrov bool local_rcv, bool local_orig); 7420c4b51f0SEric W. Biederman int br_forward_finish(struct net *net, struct sock *sk, struct sk_buff *skb); 74337b090e6SNikolay Aleksandrov void br_flood(struct net_bridge *br, struct sk_buff *skb, 7448addd5e7SNikolay Aleksandrov enum br_pkt_type pkt_type, bool local_rcv, bool local_orig); 7451da177e4SLinus Torvalds 7467d850abdSNikolay Aleksandrov /* return true if both source port and dest port are isolated */ 7477d850abdSNikolay Aleksandrov static inline bool br_skb_isolated(const struct net_bridge_port *to, 7487d850abdSNikolay Aleksandrov const struct sk_buff *skb) 7497d850abdSNikolay Aleksandrov { 7507d850abdSNikolay Aleksandrov return BR_INPUT_SKB_CB(skb)->src_port_isolated && 7517d850abdSNikolay Aleksandrov (to->flags & BR_ISOLATED); 7527d850abdSNikolay Aleksandrov } 7537d850abdSNikolay Aleksandrov 7541da177e4SLinus Torvalds /* br_if.c */ 755faa1cd82SNikolay Aleksandrov void br_port_carrier_check(struct net_bridge_port *p, bool *notified); 756348662a1SJoe Perches int br_add_bridge(struct net *net, const char *name); 757348662a1SJoe Perches int br_del_bridge(struct net *net, const char *name); 758ca752be0SDavid Ahern int br_add_if(struct net_bridge *br, struct net_device *dev, 759ca752be0SDavid Ahern struct netlink_ext_ack *extack); 760348662a1SJoe Perches int br_del_if(struct net_bridge *br, struct net_device *dev); 761804b854dSNikolay Aleksandrov void br_mtu_auto_adjust(struct net_bridge *br); 762348662a1SJoe Perches netdev_features_t br_features_recompute(struct net_bridge *br, 763c8f44affSMichał Mirosław netdev_features_t features); 764e028e4b8SVlad Yasevich void br_port_flags_change(struct net_bridge_port *port, unsigned long mask); 7652796d0c6SVlad Yasevich void br_manage_promisc(struct net_bridge *br); 7662756f68cSNikolay Aleksandrov int nbp_backup_change(struct net_bridge_port *p, struct net_device *backup_dev); 7671da177e4SLinus Torvalds 7681da177e4SLinus Torvalds /* br_input.c */ 7690c4b51f0SEric W. Biederman int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb); 7709eb8eff0SVladimir Oltean rx_handler_func_t *br_get_rx_handler(const struct net_device *dev); 7711da177e4SLinus Torvalds 77290c628ddSHenrik Bjoernlund struct br_frame_type { 77390c628ddSHenrik Bjoernlund __be16 type; 77490c628ddSHenrik Bjoernlund int (*frame_handler)(struct net_bridge_port *port, 77590c628ddSHenrik Bjoernlund struct sk_buff *skb); 77690c628ddSHenrik Bjoernlund struct hlist_node list; 77790c628ddSHenrik Bjoernlund }; 77890c628ddSHenrik Bjoernlund 77990c628ddSHenrik Bjoernlund void br_add_frame(struct net_bridge *br, struct br_frame_type *ft); 78090c628ddSHenrik Bjoernlund void br_del_frame(struct net_bridge *br, struct br_frame_type *ft); 78190c628ddSHenrik Bjoernlund 782859828c0SJiri Pirko static inline bool br_rx_handler_check_rcu(const struct net_device *dev) 783859828c0SJiri Pirko { 7849eb8eff0SVladimir Oltean return rcu_dereference(dev->rx_handler) == br_get_rx_handler(dev); 785859828c0SJiri Pirko } 786859828c0SJiri Pirko 7874d4fd361SPetr Machata static inline bool br_rx_handler_check_rtnl(const struct net_device *dev) 7884d4fd361SPetr Machata { 7899eb8eff0SVladimir Oltean return rcu_dereference_rtnl(dev->rx_handler) == br_get_rx_handler(dev); 7904d4fd361SPetr Machata } 7914d4fd361SPetr Machata 792859828c0SJiri Pirko static inline struct net_bridge_port *br_port_get_check_rcu(const struct net_device *dev) 793859828c0SJiri Pirko { 794859828c0SJiri Pirko return br_rx_handler_check_rcu(dev) ? br_port_get_rcu(dev) : NULL; 795859828c0SJiri Pirko } 796859828c0SJiri Pirko 7974d4fd361SPetr Machata static inline struct net_bridge_port * 7984d4fd361SPetr Machata br_port_get_check_rtnl(const struct net_device *dev) 7994d4fd361SPetr Machata { 8004d4fd361SPetr Machata return br_rx_handler_check_rtnl(dev) ? br_port_get_rtnl_rcu(dev) : NULL; 8014d4fd361SPetr Machata } 8024d4fd361SPetr Machata 8031da177e4SLinus Torvalds /* br_ioctl.c */ 804348662a1SJoe Perches int br_dev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); 805348662a1SJoe Perches int br_ioctl_deviceless_stub(struct net *net, unsigned int cmd, 806348662a1SJoe Perches void __user *arg); 8071da177e4SLinus Torvalds 808eb1d1641SHerbert Xu /* br_multicast.c */ 809eb1d1641SHerbert Xu #ifdef CONFIG_BRIDGE_IGMP_SNOOPING 810348662a1SJoe Perches int br_multicast_rcv(struct net_bridge *br, struct net_bridge_port *port, 811fbca58a2SCong Wang struct sk_buff *skb, u16 vid); 812348662a1SJoe Perches struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br, 813eb1d1641SHerbert Xu struct sk_buff *skb, u16 vid); 8141080ab95SNikolay Aleksandrov int br_multicast_add_port(struct net_bridge_port *port); 815348662a1SJoe Perches void br_multicast_del_port(struct net_bridge_port *port); 816348662a1SJoe Perches void br_multicast_enable_port(struct net_bridge_port *port); 817348662a1SJoe Perches void br_multicast_disable_port(struct net_bridge_port *port); 818348662a1SJoe Perches void br_multicast_init(struct net_bridge *br); 819851d0a73SJoseph Huang void br_multicast_join_snoopers(struct net_bridge *br); 820851d0a73SJoseph Huang void br_multicast_leave_snoopers(struct net_bridge *br); 821348662a1SJoe Perches void br_multicast_open(struct net_bridge *br); 822348662a1SJoe Perches void br_multicast_stop(struct net_bridge *br); 823e10177abSSatish Ashok void br_multicast_dev_del(struct net_bridge *br); 82437b090e6SNikolay Aleksandrov void br_multicast_flood(struct net_bridge_mdb_entry *mdst, 82537b090e6SNikolay Aleksandrov struct sk_buff *skb, bool local_rcv, bool local_orig); 826348662a1SJoe Perches int br_multicast_set_router(struct net_bridge *br, unsigned long val); 827348662a1SJoe Perches int br_multicast_set_port_router(struct net_bridge_port *p, unsigned long val); 828ae1ea84bSFlorian Fainelli int br_multicast_toggle(struct net_bridge *br, unsigned long val, 829ae1ea84bSFlorian Fainelli struct netlink_ext_ack *extack); 830348662a1SJoe Perches int br_multicast_set_querier(struct net_bridge *br, unsigned long val); 831348662a1SJoe Perches int br_multicast_set_hash_max(struct net_bridge *br, unsigned long val); 8325e923585SNikolay Aleksandrov int br_multicast_set_igmp_version(struct net_bridge *br, unsigned long val); 833aa2ae3e7SNikolay Aleksandrov #if IS_ENABLED(CONFIG_IPV6) 834aa2ae3e7SNikolay Aleksandrov int br_multicast_set_mld_version(struct net_bridge *br, unsigned long val); 835aa2ae3e7SNikolay Aleksandrov #endif 836348662a1SJoe Perches struct net_bridge_mdb_entry * 83719e3a9c9SNikolay Aleksandrov br_mdb_ip_get(struct net_bridge *br, struct br_ip *dst); 838348662a1SJoe Perches struct net_bridge_mdb_entry * 83919e3a9c9SNikolay Aleksandrov br_multicast_new_group(struct net_bridge *br, struct br_ip *group); 840348662a1SJoe Perches struct net_bridge_port_group * 841348662a1SJoe Perches br_multicast_new_port_group(struct net_bridge_port *port, struct br_ip *group, 842762a3d89Sstephen hemminger struct net_bridge_port_group __rcu *next, 8438b671779SNikolay Aleksandrov unsigned char flags, const unsigned char *src, 8448f8cb77eSNikolay Aleksandrov u8 filter_mode, u8 rt_protocol); 84519e3a9c9SNikolay Aleksandrov int br_mdb_hash_init(struct net_bridge *br); 84619e3a9c9SNikolay Aleksandrov void br_mdb_hash_fini(struct net_bridge *br); 84781f19838SNikolay Aleksandrov void br_mdb_notify(struct net_device *dev, struct net_bridge_mdb_entry *mp, 84881f19838SNikolay Aleksandrov struct net_bridge_port_group *pg, int type); 849949f1e39SSatish Ashok void br_rtr_notify(struct net_device *dev, struct net_bridge_port *port, 850949f1e39SSatish Ashok int type); 851681590bdSNikolay Aleksandrov void br_multicast_del_pg(struct net_bridge_mdb_entry *mp, 852681590bdSNikolay Aleksandrov struct net_bridge_port_group *pg, 853681590bdSNikolay Aleksandrov struct net_bridge_port_group __rcu **pp); 8541080ab95SNikolay Aleksandrov void br_multicast_count(struct net_bridge *br, const struct net_bridge_port *p, 855a65056ecSNikolay Aleksandrov const struct sk_buff *skb, u8 type, u8 dir); 8561080ab95SNikolay Aleksandrov int br_multicast_init_stats(struct net_bridge *br); 857b6fe0440SIdo Schimmel void br_multicast_uninit_stats(struct net_bridge *br); 8581080ab95SNikolay Aleksandrov void br_multicast_get_stats(const struct net_bridge *br, 8591080ab95SNikolay Aleksandrov const struct net_bridge_port *p, 8601080ab95SNikolay Aleksandrov struct br_mcast_stats *dest); 86119e3a9c9SNikolay Aleksandrov void br_mdb_init(void); 86219e3a9c9SNikolay Aleksandrov void br_mdb_uninit(void); 8631bc844eeSNikolay Aleksandrov void br_multicast_host_join(struct net_bridge_mdb_entry *mp, bool notify); 8641bc844eeSNikolay Aleksandrov void br_multicast_host_leave(struct net_bridge_mdb_entry *mp, bool notify); 8658266a049SNikolay Aleksandrov void br_multicast_star_g_handle_mode(struct net_bridge_port_group *pg, 8668266a049SNikolay Aleksandrov u8 filter_mode); 8678266a049SNikolay Aleksandrov void br_multicast_sg_add_exclude_ports(struct net_bridge_mdb_entry *star_mp, 8688266a049SNikolay Aleksandrov struct net_bridge_port_group *sg); 869474ddb37SNikolay Aleksandrov struct net_bridge_group_src * 870474ddb37SNikolay Aleksandrov br_multicast_find_group_src(struct net_bridge_port_group *pg, struct br_ip *ip); 871d5a10222SNikolay Aleksandrov void br_multicast_del_group_src(struct net_bridge_group_src *src, 872d5a10222SNikolay Aleksandrov bool fastleave); 87385b35269SSridhar Samudrala 874955062b0SNikolay Aleksandrov static inline bool br_group_is_l2(const struct br_ip *group) 875955062b0SNikolay Aleksandrov { 876955062b0SNikolay Aleksandrov return group->proto == 0; 877955062b0SNikolay Aleksandrov } 878955062b0SNikolay Aleksandrov 879cfd56754SCong Wang #define mlock_dereference(X, br) \ 880cfd56754SCong Wang rcu_dereference_protected(X, lockdep_is_held(&br->multicast_lock)) 881cfd56754SCong Wang 88244ebb081SLinus Lüssing static inline struct hlist_node * 88344ebb081SLinus Lüssing br_multicast_get_first_rport_node(struct net_bridge *b, struct sk_buff *skb) { 884a3c02e76SLinus Lüssing #if IS_ENABLED(CONFIG_IPV6) 885a3c02e76SLinus Lüssing if (skb->protocol == htons(ETH_P_IPV6)) 886a3c02e76SLinus Lüssing return rcu_dereference(hlist_first_rcu(&b->ip6_mc_router_list)); 887a3c02e76SLinus Lüssing #endif 88844ebb081SLinus Lüssing return rcu_dereference(hlist_first_rcu(&b->ip4_mc_router_list)); 88944ebb081SLinus Lüssing } 89044ebb081SLinus Lüssing 89144ebb081SLinus Lüssing static inline struct net_bridge_port * 89244ebb081SLinus Lüssing br_multicast_rport_from_node_skb(struct hlist_node *rp, struct sk_buff *skb) { 893*9632233eSNikolay Aleksandrov struct net_bridge_mcast_port *mctx; 894*9632233eSNikolay Aleksandrov 895a3c02e76SLinus Lüssing #if IS_ENABLED(CONFIG_IPV6) 896a3c02e76SLinus Lüssing if (skb->protocol == htons(ETH_P_IPV6)) 897*9632233eSNikolay Aleksandrov mctx = hlist_entry_safe(rp, struct net_bridge_mcast_port, 898*9632233eSNikolay Aleksandrov ip6_rlist); 899*9632233eSNikolay Aleksandrov else 900a3c02e76SLinus Lüssing #endif 901*9632233eSNikolay Aleksandrov mctx = hlist_entry_safe(rp, struct net_bridge_mcast_port, 902*9632233eSNikolay Aleksandrov ip4_rlist); 903*9632233eSNikolay Aleksandrov 904*9632233eSNikolay Aleksandrov if (mctx) 905*9632233eSNikolay Aleksandrov return mctx->port; 906*9632233eSNikolay Aleksandrov else 907*9632233eSNikolay Aleksandrov return NULL; 90844ebb081SLinus Lüssing } 90944ebb081SLinus Lüssing 9101a3065a2SLinus Lüssing static inline bool br_ip4_multicast_is_router(struct net_bridge *br) 91185b35269SSridhar Samudrala { 9121a3065a2SLinus Lüssing return timer_pending(&br->ip4_mc_router_timer); 9131a3065a2SLinus Lüssing } 9141a3065a2SLinus Lüssing 9151a3065a2SLinus Lüssing static inline bool br_ip6_multicast_is_router(struct net_bridge *br) 9161a3065a2SLinus Lüssing { 9171a3065a2SLinus Lüssing #if IS_ENABLED(CONFIG_IPV6) 918a3c02e76SLinus Lüssing return timer_pending(&br->ip6_mc_router_timer); 9191a3065a2SLinus Lüssing #else 9201a3065a2SLinus Lüssing return false; 9211a3065a2SLinus Lüssing #endif 9221a3065a2SLinus Lüssing } 9231a3065a2SLinus Lüssing 9241a3065a2SLinus Lüssing static inline bool 9251a3065a2SLinus Lüssing br_multicast_is_router(struct net_bridge *br, struct sk_buff *skb) 9261a3065a2SLinus Lüssing { 9271a3065a2SLinus Lüssing switch (br->multicast_router) { 9281a3065a2SLinus Lüssing case MDB_RTR_TYPE_PERM: 9291a3065a2SLinus Lüssing return true; 9301a3065a2SLinus Lüssing case MDB_RTR_TYPE_TEMP_QUERY: 9311a3065a2SLinus Lüssing if (skb) { 9321a3065a2SLinus Lüssing if (skb->protocol == htons(ETH_P_IP)) 9331a3065a2SLinus Lüssing return br_ip4_multicast_is_router(br); 9341a3065a2SLinus Lüssing else if (skb->protocol == htons(ETH_P_IPV6)) 9351a3065a2SLinus Lüssing return br_ip6_multicast_is_router(br); 9361a3065a2SLinus Lüssing } else { 9371a3065a2SLinus Lüssing return br_ip4_multicast_is_router(br) || 9381a3065a2SLinus Lüssing br_ip6_multicast_is_router(br); 9391a3065a2SLinus Lüssing } 9401a3065a2SLinus Lüssing fallthrough; 9411a3065a2SLinus Lüssing default: 9421a3065a2SLinus Lüssing return false; 9431a3065a2SLinus Lüssing } 94485b35269SSridhar Samudrala } 945b00589afSLinus Lüssing 946cc0fdd80SLinus Lüssing static inline bool 947cc0fdd80SLinus Lüssing __br_multicast_querier_exists(struct net_bridge *br, 9480888d5f3Sdaniel struct bridge_mcast_other_query *querier, 9490888d5f3Sdaniel const bool is_ipv6) 950b00589afSLinus Lüssing { 9510888d5f3Sdaniel bool own_querier_enabled; 9520888d5f3Sdaniel 953675779adSNikolay Aleksandrov if (br_opt_get(br, BROPT_MULTICAST_QUERIER)) { 954675779adSNikolay Aleksandrov if (is_ipv6 && !br_opt_get(br, BROPT_HAS_IPV6_ADDR)) 9550888d5f3Sdaniel own_querier_enabled = false; 9560888d5f3Sdaniel else 9570888d5f3Sdaniel own_querier_enabled = true; 9580888d5f3Sdaniel } else { 9590888d5f3Sdaniel own_querier_enabled = false; 9600888d5f3Sdaniel } 9610888d5f3Sdaniel 962cc0fdd80SLinus Lüssing return time_is_before_jiffies(querier->delay_time) && 9630888d5f3Sdaniel (own_querier_enabled || timer_pending(&querier->timer)); 964cc0fdd80SLinus Lüssing } 965cc0fdd80SLinus Lüssing 966cc0fdd80SLinus Lüssing static inline bool br_multicast_querier_exists(struct net_bridge *br, 967955062b0SNikolay Aleksandrov struct ethhdr *eth, 968955062b0SNikolay Aleksandrov const struct net_bridge_mdb_entry *mdb) 969cc0fdd80SLinus Lüssing { 970cc0fdd80SLinus Lüssing switch (eth->h_proto) { 971cc0fdd80SLinus Lüssing case (htons(ETH_P_IP)): 9720888d5f3Sdaniel return __br_multicast_querier_exists(br, 9730888d5f3Sdaniel &br->ip4_other_query, false); 974cc0fdd80SLinus Lüssing #if IS_ENABLED(CONFIG_IPV6) 975cc0fdd80SLinus Lüssing case (htons(ETH_P_IPV6)): 9760888d5f3Sdaniel return __br_multicast_querier_exists(br, 9770888d5f3Sdaniel &br->ip6_other_query, true); 978cc0fdd80SLinus Lüssing #endif 979cc0fdd80SLinus Lüssing default: 980955062b0SNikolay Aleksandrov return !!mdb && br_group_is_l2(&mdb->addr); 981cc0fdd80SLinus Lüssing } 982b00589afSLinus Lüssing } 9831080ab95SNikolay Aleksandrov 98488d4bd18SNikolay Aleksandrov static inline bool br_multicast_is_star_g(const struct br_ip *ip) 98588d4bd18SNikolay Aleksandrov { 98688d4bd18SNikolay Aleksandrov switch (ip->proto) { 98788d4bd18SNikolay Aleksandrov case htons(ETH_P_IP): 98888d4bd18SNikolay Aleksandrov return ipv4_is_zeronet(ip->src.ip4); 98988d4bd18SNikolay Aleksandrov #if IS_ENABLED(CONFIG_IPV6) 99088d4bd18SNikolay Aleksandrov case htons(ETH_P_IPV6): 99188d4bd18SNikolay Aleksandrov return ipv6_addr_any(&ip->src.ip6); 99288d4bd18SNikolay Aleksandrov #endif 99388d4bd18SNikolay Aleksandrov default: 99488d4bd18SNikolay Aleksandrov return false; 99588d4bd18SNikolay Aleksandrov } 99688d4bd18SNikolay Aleksandrov } 99788d4bd18SNikolay Aleksandrov 9988266a049SNikolay Aleksandrov static inline bool br_multicast_should_handle_mode(const struct net_bridge *br, 9998266a049SNikolay Aleksandrov __be16 proto) 10008266a049SNikolay Aleksandrov { 10018266a049SNikolay Aleksandrov switch (proto) { 10028266a049SNikolay Aleksandrov case htons(ETH_P_IP): 10038266a049SNikolay Aleksandrov return !!(br->multicast_igmp_version == 3); 10048266a049SNikolay Aleksandrov #if IS_ENABLED(CONFIG_IPV6) 10058266a049SNikolay Aleksandrov case htons(ETH_P_IPV6): 10068266a049SNikolay Aleksandrov return !!(br->multicast_mld_version == 2); 10078266a049SNikolay Aleksandrov #endif 10088266a049SNikolay Aleksandrov default: 10098266a049SNikolay Aleksandrov return false; 10108266a049SNikolay Aleksandrov } 10118266a049SNikolay Aleksandrov } 10128266a049SNikolay Aleksandrov 10131080ab95SNikolay Aleksandrov static inline int br_multicast_igmp_type(const struct sk_buff *skb) 10141080ab95SNikolay Aleksandrov { 10151080ab95SNikolay Aleksandrov return BR_INPUT_SKB_CB(skb)->igmp; 10161080ab95SNikolay Aleksandrov } 101742c11ccfSNikolay Aleksandrov 101842c11ccfSNikolay Aleksandrov static inline unsigned long br_multicast_lmqt(const struct net_bridge *br) 101942c11ccfSNikolay Aleksandrov { 102042c11ccfSNikolay Aleksandrov return br->multicast_last_member_interval * 102142c11ccfSNikolay Aleksandrov br->multicast_last_member_count; 102242c11ccfSNikolay Aleksandrov } 10230436862eSNikolay Aleksandrov 10240436862eSNikolay Aleksandrov static inline unsigned long br_multicast_gmi(const struct net_bridge *br) 10250436862eSNikolay Aleksandrov { 10260436862eSNikolay Aleksandrov /* use the RFC default of 2 for QRV */ 10270436862eSNikolay Aleksandrov return 2 * br->multicast_query_interval + 10280436862eSNikolay Aleksandrov br->multicast_query_response_interval; 10290436862eSNikolay Aleksandrov } 1030eb1d1641SHerbert Xu #else 1031eb1d1641SHerbert Xu static inline int br_multicast_rcv(struct net_bridge *br, 1032eb1d1641SHerbert Xu struct net_bridge_port *port, 103306499098SVlad Yasevich struct sk_buff *skb, 103406499098SVlad Yasevich u16 vid) 1035eb1d1641SHerbert Xu { 1036eb1d1641SHerbert Xu return 0; 1037eb1d1641SHerbert Xu } 1038eb1d1641SHerbert Xu 1039eb1d1641SHerbert Xu static inline struct net_bridge_mdb_entry *br_mdb_get(struct net_bridge *br, 1040fbca58a2SCong Wang struct sk_buff *skb, u16 vid) 1041eb1d1641SHerbert Xu { 1042eb1d1641SHerbert Xu return NULL; 1043eb1d1641SHerbert Xu } 1044eb1d1641SHerbert Xu 10451080ab95SNikolay Aleksandrov static inline int br_multicast_add_port(struct net_bridge_port *port) 1046eb1d1641SHerbert Xu { 10471080ab95SNikolay Aleksandrov return 0; 1048eb1d1641SHerbert Xu } 1049eb1d1641SHerbert Xu 1050eb1d1641SHerbert Xu static inline void br_multicast_del_port(struct net_bridge_port *port) 1051eb1d1641SHerbert Xu { 1052eb1d1641SHerbert Xu } 1053eb1d1641SHerbert Xu 1054eb1d1641SHerbert Xu static inline void br_multicast_enable_port(struct net_bridge_port *port) 1055eb1d1641SHerbert Xu { 1056eb1d1641SHerbert Xu } 1057eb1d1641SHerbert Xu 1058eb1d1641SHerbert Xu static inline void br_multicast_disable_port(struct net_bridge_port *port) 1059eb1d1641SHerbert Xu { 1060eb1d1641SHerbert Xu } 1061eb1d1641SHerbert Xu 1062eb1d1641SHerbert Xu static inline void br_multicast_init(struct net_bridge *br) 1063eb1d1641SHerbert Xu { 1064eb1d1641SHerbert Xu } 1065eb1d1641SHerbert Xu 1066851d0a73SJoseph Huang static inline void br_multicast_join_snoopers(struct net_bridge *br) 1067851d0a73SJoseph Huang { 1068851d0a73SJoseph Huang } 1069851d0a73SJoseph Huang 1070851d0a73SJoseph Huang static inline void br_multicast_leave_snoopers(struct net_bridge *br) 1071851d0a73SJoseph Huang { 1072851d0a73SJoseph Huang } 1073851d0a73SJoseph Huang 1074eb1d1641SHerbert Xu static inline void br_multicast_open(struct net_bridge *br) 1075eb1d1641SHerbert Xu { 1076eb1d1641SHerbert Xu } 1077eb1d1641SHerbert Xu 1078eb1d1641SHerbert Xu static inline void br_multicast_stop(struct net_bridge *br) 1079eb1d1641SHerbert Xu { 1080eb1d1641SHerbert Xu } 10815cb5e947SHerbert Xu 1082a7ce45a7SNikolay Aleksandrov static inline void br_multicast_dev_del(struct net_bridge *br) 1083a7ce45a7SNikolay Aleksandrov { 1084a7ce45a7SNikolay Aleksandrov } 1085a7ce45a7SNikolay Aleksandrov 108637b090e6SNikolay Aleksandrov static inline void br_multicast_flood(struct net_bridge_mdb_entry *mdst, 108737b090e6SNikolay Aleksandrov struct sk_buff *skb, 108837b090e6SNikolay Aleksandrov bool local_rcv, bool local_orig) 10895cb5e947SHerbert Xu { 10905cb5e947SHerbert Xu } 10915cb5e947SHerbert Xu 1092bbc6f2ccSNikolay Aleksandrov static inline bool br_multicast_is_router(struct net_bridge *br, 1093bbc6f2ccSNikolay Aleksandrov struct sk_buff *skb) 1094eb1d1641SHerbert Xu { 109503aaa9e2SGustavo A. R. Silva return false; 1096eb1d1641SHerbert Xu } 109737b090e6SNikolay Aleksandrov 1098cc0fdd80SLinus Lüssing static inline bool br_multicast_querier_exists(struct net_bridge *br, 1099c43fd36fSVladimir Oltean struct ethhdr *eth, 1100c43fd36fSVladimir Oltean const struct net_bridge_mdb_entry *mdb) 1101b00589afSLinus Lüssing { 1102b00589afSLinus Lüssing return false; 1103b00589afSLinus Lüssing } 110437b090e6SNikolay Aleksandrov 1105fdb184d1SRami Rosen static inline void br_mdb_init(void) 1106fdb184d1SRami Rosen { 1107fdb184d1SRami Rosen } 110837b090e6SNikolay Aleksandrov 1109fdb184d1SRami Rosen static inline void br_mdb_uninit(void) 1110fdb184d1SRami Rosen { 1111fdb184d1SRami Rosen } 11121080ab95SNikolay Aleksandrov 111319e3a9c9SNikolay Aleksandrov static inline int br_mdb_hash_init(struct net_bridge *br) 111419e3a9c9SNikolay Aleksandrov { 111519e3a9c9SNikolay Aleksandrov return 0; 111619e3a9c9SNikolay Aleksandrov } 111719e3a9c9SNikolay Aleksandrov 111819e3a9c9SNikolay Aleksandrov static inline void br_mdb_hash_fini(struct net_bridge *br) 111919e3a9c9SNikolay Aleksandrov { 112019e3a9c9SNikolay Aleksandrov } 112119e3a9c9SNikolay Aleksandrov 11221080ab95SNikolay Aleksandrov static inline void br_multicast_count(struct net_bridge *br, 11231080ab95SNikolay Aleksandrov const struct net_bridge_port *p, 1124a65056ecSNikolay Aleksandrov const struct sk_buff *skb, 1125a65056ecSNikolay Aleksandrov u8 type, u8 dir) 11261080ab95SNikolay Aleksandrov { 11271080ab95SNikolay Aleksandrov } 11281080ab95SNikolay Aleksandrov 11291080ab95SNikolay Aleksandrov static inline int br_multicast_init_stats(struct net_bridge *br) 11301080ab95SNikolay Aleksandrov { 11311080ab95SNikolay Aleksandrov return 0; 11321080ab95SNikolay Aleksandrov } 11331080ab95SNikolay Aleksandrov 1134b6fe0440SIdo Schimmel static inline void br_multicast_uninit_stats(struct net_bridge *br) 1135b6fe0440SIdo Schimmel { 1136b6fe0440SIdo Schimmel } 1137b6fe0440SIdo Schimmel 11381080ab95SNikolay Aleksandrov static inline int br_multicast_igmp_type(const struct sk_buff *skb) 11391080ab95SNikolay Aleksandrov { 11401080ab95SNikolay Aleksandrov return 0; 11411080ab95SNikolay Aleksandrov } 114285b35269SSridhar Samudrala #endif 1143eb1d1641SHerbert Xu 1144243a2e63SVlad Yasevich /* br_vlan.c */ 1145243a2e63SVlad Yasevich #ifdef CONFIG_BRIDGE_VLAN_FILTERING 114677751ee8SNikolay Aleksandrov bool br_allowed_ingress(const struct net_bridge *br, 114777751ee8SNikolay Aleksandrov struct net_bridge_vlan_group *vg, struct sk_buff *skb, 1148a580c76dSNikolay Aleksandrov u16 *vid, u8 *state); 114977751ee8SNikolay Aleksandrov bool br_allowed_egress(struct net_bridge_vlan_group *vg, 115085f46c6bSVlad Yasevich const struct sk_buff *skb); 1151e0d7968aSToshiaki Makita bool br_should_learn(struct net_bridge_port *p, struct sk_buff *skb, u16 *vid); 1152348662a1SJoe Perches struct sk_buff *br_handle_vlan(struct net_bridge *br, 115311538d03SRoopa Prabhu const struct net_bridge_port *port, 11542594e906SNikolay Aleksandrov struct net_bridge_vlan_group *vg, 115578851988SVlad Yasevich struct sk_buff *skb); 1156f418af63SNikolay Aleksandrov int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags, 1157169327d5SPetr Machata bool *changed, struct netlink_ext_ack *extack); 1158348662a1SJoe Perches int br_vlan_delete(struct net_bridge *br, u16 vid); 1159348662a1SJoe Perches void br_vlan_flush(struct net_bridge *br); 11602594e906SNikolay Aleksandrov struct net_bridge_vlan *br_vlan_find(struct net_bridge_vlan_group *vg, u16 vid); 1161204177f3SToshiaki Makita void br_recalculate_fwd_mask(struct net_bridge *br); 11629e781401SVladimir Oltean int br_vlan_filter_toggle(struct net_bridge *br, unsigned long val, 11639e781401SVladimir Oltean struct netlink_ext_ack *extack); 1164dcbdf135SVladimir Oltean int __br_vlan_set_proto(struct net_bridge *br, __be16 proto, 1165dcbdf135SVladimir Oltean struct netlink_ext_ack *extack); 11669e781401SVladimir Oltean int br_vlan_set_proto(struct net_bridge *br, unsigned long val, 11679e781401SVladimir Oltean struct netlink_ext_ack *extack); 11686dada9b1SNikolay Aleksandrov int br_vlan_set_stats(struct net_bridge *br, unsigned long val); 11699163a0fcSNikolay Aleksandrov int br_vlan_set_stats_per_port(struct net_bridge *br, unsigned long val); 11705be5a2dfSVlad Yasevich int br_vlan_init(struct net_bridge *br); 11719e781401SVladimir Oltean int br_vlan_set_default_pvid(struct net_bridge *br, unsigned long val, 11729e781401SVladimir Oltean struct netlink_ext_ack *extack); 1173169327d5SPetr Machata int __br_vlan_set_default_pvid(struct net_bridge *br, u16 pvid, 1174169327d5SPetr Machata struct netlink_ext_ack *extack); 1175f418af63SNikolay Aleksandrov int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags, 1176169327d5SPetr Machata bool *changed, struct netlink_ext_ack *extack); 1177348662a1SJoe Perches int nbp_vlan_delete(struct net_bridge_port *port, u16 vid); 1178348662a1SJoe Perches void nbp_vlan_flush(struct net_bridge_port *port); 1179169327d5SPetr Machata int nbp_vlan_init(struct net_bridge_port *port, struct netlink_ext_ack *extack); 11802594e906SNikolay Aleksandrov int nbp_get_num_vlan_infos(struct net_bridge_port *p, u32 filter_mask); 1181a60c0903SNikolay Aleksandrov void br_vlan_get_stats(const struct net_bridge_vlan *v, 1182281cc284SHeiner Kallweit struct pcpu_sw_netstats *stats); 11839c0ec2e7SMike Manning void br_vlan_port_event(struct net_bridge_port *p, unsigned long event); 1184091adf9bSNikolay Aleksandrov int br_vlan_bridge_event(struct net_device *dev, unsigned long event, 11859c0ec2e7SMike Manning void *ptr); 11868dcea187SNikolay Aleksandrov void br_vlan_rtnl_init(void); 11878dcea187SNikolay Aleksandrov void br_vlan_rtnl_uninit(void); 1188cf5bddb9SNikolay Aleksandrov void br_vlan_notify(const struct net_bridge *br, 1189cf5bddb9SNikolay Aleksandrov const struct net_bridge_port *p, 1190cf5bddb9SNikolay Aleksandrov u16 vid, u16 vid_range, 1191cf5bddb9SNikolay Aleksandrov int cmd); 1192a5d29ae2SNikolay Aleksandrov bool br_vlan_can_enter_range(const struct net_bridge_vlan *v_curr, 1193a5d29ae2SNikolay Aleksandrov const struct net_bridge_vlan *range_end); 1194a37b85c9SVlad Yasevich 1195bcf2766bSFelix Fietkau void br_vlan_fill_forward_path_pvid(struct net_bridge *br, 1196bcf2766bSFelix Fietkau struct net_device_path_ctx *ctx, 1197bcf2766bSFelix Fietkau struct net_device_path *path); 1198bcf2766bSFelix Fietkau int br_vlan_fill_forward_path_mode(struct net_bridge *br, 1199bcf2766bSFelix Fietkau struct net_bridge_port *dst, 1200bcf2766bSFelix Fietkau struct net_device_path *path); 1201bcf2766bSFelix Fietkau 12022594e906SNikolay Aleksandrov static inline struct net_bridge_vlan_group *br_vlan_group( 1203a37b85c9SVlad Yasevich const struct net_bridge *br) 1204a37b85c9SVlad Yasevich { 1205907b1e6eSNikolay Aleksandrov return rtnl_dereference(br->vlgrp); 1206a37b85c9SVlad Yasevich } 1207a37b85c9SVlad Yasevich 12082594e906SNikolay Aleksandrov static inline struct net_bridge_vlan_group *nbp_vlan_group( 1209a37b85c9SVlad Yasevich const struct net_bridge_port *p) 1210a37b85c9SVlad Yasevich { 1211907b1e6eSNikolay Aleksandrov return rtnl_dereference(p->vlgrp); 1212907b1e6eSNikolay Aleksandrov } 1213907b1e6eSNikolay Aleksandrov 1214907b1e6eSNikolay Aleksandrov static inline struct net_bridge_vlan_group *br_vlan_group_rcu( 1215907b1e6eSNikolay Aleksandrov const struct net_bridge *br) 1216907b1e6eSNikolay Aleksandrov { 1217907b1e6eSNikolay Aleksandrov return rcu_dereference(br->vlgrp); 1218907b1e6eSNikolay Aleksandrov } 1219907b1e6eSNikolay Aleksandrov 1220907b1e6eSNikolay Aleksandrov static inline struct net_bridge_vlan_group *nbp_vlan_group_rcu( 1221907b1e6eSNikolay Aleksandrov const struct net_bridge_port *p) 1222907b1e6eSNikolay Aleksandrov { 1223907b1e6eSNikolay Aleksandrov return rcu_dereference(p->vlgrp); 1224a37b85c9SVlad Yasevich } 1225a37b85c9SVlad Yasevich 1226a37b85c9SVlad Yasevich /* Since bridge now depends on 8021Q module, but the time bridge sees the 1227a37b85c9SVlad Yasevich * skb, the vlan tag will always be present if the frame was tagged. 1228a37b85c9SVlad Yasevich */ 1229a37b85c9SVlad Yasevich static inline int br_vlan_get_tag(const struct sk_buff *skb, u16 *vid) 1230a37b85c9SVlad Yasevich { 1231a37b85c9SVlad Yasevich int err = 0; 1232a37b85c9SVlad Yasevich 12332594e906SNikolay Aleksandrov if (skb_vlan_tag_present(skb)) { 12345978f8a9SMichał Mirosław *vid = skb_vlan_tag_get_id(skb); 12352594e906SNikolay Aleksandrov } else { 1236a37b85c9SVlad Yasevich *vid = 0; 1237a37b85c9SVlad Yasevich err = -EINVAL; 1238a37b85c9SVlad Yasevich } 1239a37b85c9SVlad Yasevich 1240a37b85c9SVlad Yasevich return err; 1241a37b85c9SVlad Yasevich } 124278851988SVlad Yasevich 124377751ee8SNikolay Aleksandrov static inline u16 br_get_pvid(const struct net_bridge_vlan_group *vg) 124478851988SVlad Yasevich { 124577751ee8SNikolay Aleksandrov if (!vg) 12465be5a2dfSVlad Yasevich return 0; 12475be5a2dfSVlad Yasevich 124878851988SVlad Yasevich smp_rmb(); 124977751ee8SNikolay Aleksandrov return vg->pvid; 125078851988SVlad Yasevich } 125178851988SVlad Yasevich 12528dcea187SNikolay Aleksandrov static inline u16 br_vlan_flags(const struct net_bridge_vlan *v, u16 pvid) 12538dcea187SNikolay Aleksandrov { 12548dcea187SNikolay Aleksandrov return v->vid == pvid ? v->flags | BRIDGE_VLAN_INFO_PVID : v->flags; 12558dcea187SNikolay Aleksandrov } 1256243a2e63SVlad Yasevich #else 125777751ee8SNikolay Aleksandrov static inline bool br_allowed_ingress(const struct net_bridge *br, 125877751ee8SNikolay Aleksandrov struct net_bridge_vlan_group *vg, 12592594e906SNikolay Aleksandrov struct sk_buff *skb, 1260a580c76dSNikolay Aleksandrov u16 *vid, u8 *state) 12612594e906SNikolay Aleksandrov { 12622594e906SNikolay Aleksandrov return true; 12632594e906SNikolay Aleksandrov } 12642594e906SNikolay Aleksandrov 12652594e906SNikolay Aleksandrov static inline bool br_allowed_egress(struct net_bridge_vlan_group *vg, 126685f46c6bSVlad Yasevich const struct sk_buff *skb) 126785f46c6bSVlad Yasevich { 126885f46c6bSVlad Yasevich return true; 126985f46c6bSVlad Yasevich } 127085f46c6bSVlad Yasevich 1271e0d7968aSToshiaki Makita static inline bool br_should_learn(struct net_bridge_port *p, 1272e0d7968aSToshiaki Makita struct sk_buff *skb, u16 *vid) 1273e0d7968aSToshiaki Makita { 1274e0d7968aSToshiaki Makita return true; 1275e0d7968aSToshiaki Makita } 1276e0d7968aSToshiaki Makita 127778851988SVlad Yasevich static inline struct sk_buff *br_handle_vlan(struct net_bridge *br, 127811538d03SRoopa Prabhu const struct net_bridge_port *port, 12792594e906SNikolay Aleksandrov struct net_bridge_vlan_group *vg, 128078851988SVlad Yasevich struct sk_buff *skb) 128178851988SVlad Yasevich { 128278851988SVlad Yasevich return skb; 128378851988SVlad Yasevich } 128478851988SVlad Yasevich 1285f418af63SNikolay Aleksandrov static inline int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags, 1286169327d5SPetr Machata bool *changed, struct netlink_ext_ack *extack) 1287243a2e63SVlad Yasevich { 1288f418af63SNikolay Aleksandrov *changed = false; 1289243a2e63SVlad Yasevich return -EOPNOTSUPP; 1290243a2e63SVlad Yasevich } 1291243a2e63SVlad Yasevich 1292243a2e63SVlad Yasevich static inline int br_vlan_delete(struct net_bridge *br, u16 vid) 1293243a2e63SVlad Yasevich { 1294243a2e63SVlad Yasevich return -EOPNOTSUPP; 1295243a2e63SVlad Yasevich } 1296243a2e63SVlad Yasevich 1297243a2e63SVlad Yasevich static inline void br_vlan_flush(struct net_bridge *br) 1298243a2e63SVlad Yasevich { 1299243a2e63SVlad Yasevich } 1300243a2e63SVlad Yasevich 1301204177f3SToshiaki Makita static inline void br_recalculate_fwd_mask(struct net_bridge *br) 1302204177f3SToshiaki Makita { 1303204177f3SToshiaki Makita } 1304204177f3SToshiaki Makita 13055be5a2dfSVlad Yasevich static inline int br_vlan_init(struct net_bridge *br) 13068580e211SToshiaki Makita { 13075be5a2dfSVlad Yasevich return 0; 13088580e211SToshiaki Makita } 13098580e211SToshiaki Makita 1310f418af63SNikolay Aleksandrov static inline int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags, 1311169327d5SPetr Machata bool *changed, struct netlink_ext_ack *extack) 1312243a2e63SVlad Yasevich { 1313f418af63SNikolay Aleksandrov *changed = false; 1314243a2e63SVlad Yasevich return -EOPNOTSUPP; 1315243a2e63SVlad Yasevich } 1316243a2e63SVlad Yasevich 1317243a2e63SVlad Yasevich static inline int nbp_vlan_delete(struct net_bridge_port *port, u16 vid) 1318243a2e63SVlad Yasevich { 1319243a2e63SVlad Yasevich return -EOPNOTSUPP; 1320243a2e63SVlad Yasevich } 1321243a2e63SVlad Yasevich 1322243a2e63SVlad Yasevich static inline void nbp_vlan_flush(struct net_bridge_port *port) 1323243a2e63SVlad Yasevich { 1324243a2e63SVlad Yasevich } 1325243a2e63SVlad Yasevich 13262594e906SNikolay Aleksandrov static inline struct net_bridge_vlan *br_vlan_find(struct net_bridge_vlan_group *vg, 13272594e906SNikolay Aleksandrov u16 vid) 1328a37b85c9SVlad Yasevich { 1329a37b85c9SVlad Yasevich return NULL; 1330a37b85c9SVlad Yasevich } 1331bc9a25d2SVlad Yasevich 1332169327d5SPetr Machata static inline int nbp_vlan_init(struct net_bridge_port *port, 1333169327d5SPetr Machata struct netlink_ext_ack *extack) 13345be5a2dfSVlad Yasevich { 13355be5a2dfSVlad Yasevich return 0; 13365be5a2dfSVlad Yasevich } 13375be5a2dfSVlad Yasevich 133878851988SVlad Yasevich static inline u16 br_vlan_get_tag(const struct sk_buff *skb, u16 *tag) 1339a37b85c9SVlad Yasevich { 1340a37b85c9SVlad Yasevich return 0; 1341a37b85c9SVlad Yasevich } 13422594e906SNikolay Aleksandrov 134377751ee8SNikolay Aleksandrov static inline u16 br_get_pvid(const struct net_bridge_vlan_group *vg) 134478851988SVlad Yasevich { 13453df6bf45SVlad Yasevich return 0; 134678851988SVlad Yasevich } 13472796d0c6SVlad Yasevich 13487a572964SVladimir Oltean static inline int br_vlan_filter_toggle(struct net_bridge *br, 1349c97f47e3SVladimir Oltean unsigned long val, 1350c97f47e3SVladimir Oltean struct netlink_ext_ack *extack) 1351a7854037SNikolay Aleksandrov { 1352a7854037SNikolay Aleksandrov return -EOPNOTSUPP; 1353a7854037SNikolay Aleksandrov } 13542594e906SNikolay Aleksandrov 13552594e906SNikolay Aleksandrov static inline int nbp_get_num_vlan_infos(struct net_bridge_port *p, 13562594e906SNikolay Aleksandrov u32 filter_mask) 13572594e906SNikolay Aleksandrov { 13582594e906SNikolay Aleksandrov return 0; 13592594e906SNikolay Aleksandrov } 13602594e906SNikolay Aleksandrov 1361bcf2766bSFelix Fietkau static inline void br_vlan_fill_forward_path_pvid(struct net_bridge *br, 1362bcf2766bSFelix Fietkau struct net_device_path_ctx *ctx, 1363bcf2766bSFelix Fietkau struct net_device_path *path) 1364bcf2766bSFelix Fietkau { 1365bcf2766bSFelix Fietkau } 1366bcf2766bSFelix Fietkau 1367bcf2766bSFelix Fietkau static inline int br_vlan_fill_forward_path_mode(struct net_bridge *br, 1368bcf2766bSFelix Fietkau struct net_bridge_port *dst, 1369bcf2766bSFelix Fietkau struct net_device_path *path) 1370bcf2766bSFelix Fietkau { 1371bcf2766bSFelix Fietkau return 0; 1372bcf2766bSFelix Fietkau } 1373bcf2766bSFelix Fietkau 13742594e906SNikolay Aleksandrov static inline struct net_bridge_vlan_group *br_vlan_group( 13752594e906SNikolay Aleksandrov const struct net_bridge *br) 13762594e906SNikolay Aleksandrov { 13772594e906SNikolay Aleksandrov return NULL; 13782594e906SNikolay Aleksandrov } 13792594e906SNikolay Aleksandrov 13802594e906SNikolay Aleksandrov static inline struct net_bridge_vlan_group *nbp_vlan_group( 13812594e906SNikolay Aleksandrov const struct net_bridge_port *p) 13822594e906SNikolay Aleksandrov { 13832594e906SNikolay Aleksandrov return NULL; 13842594e906SNikolay Aleksandrov } 1385907b1e6eSNikolay Aleksandrov 1386907b1e6eSNikolay Aleksandrov static inline struct net_bridge_vlan_group *br_vlan_group_rcu( 1387907b1e6eSNikolay Aleksandrov const struct net_bridge *br) 1388907b1e6eSNikolay Aleksandrov { 1389907b1e6eSNikolay Aleksandrov return NULL; 1390907b1e6eSNikolay Aleksandrov } 1391907b1e6eSNikolay Aleksandrov 1392907b1e6eSNikolay Aleksandrov static inline struct net_bridge_vlan_group *nbp_vlan_group_rcu( 1393907b1e6eSNikolay Aleksandrov const struct net_bridge_port *p) 1394907b1e6eSNikolay Aleksandrov { 1395907b1e6eSNikolay Aleksandrov return NULL; 1396907b1e6eSNikolay Aleksandrov } 1397a60c0903SNikolay Aleksandrov 1398a60c0903SNikolay Aleksandrov static inline void br_vlan_get_stats(const struct net_bridge_vlan *v, 1399281cc284SHeiner Kallweit struct pcpu_sw_netstats *stats) 1400a60c0903SNikolay Aleksandrov { 1401a60c0903SNikolay Aleksandrov } 14029c0ec2e7SMike Manning 14039c0ec2e7SMike Manning static inline void br_vlan_port_event(struct net_bridge_port *p, 14049c0ec2e7SMike Manning unsigned long event) 14059c0ec2e7SMike Manning { 14069c0ec2e7SMike Manning } 14079c0ec2e7SMike Manning 1408091adf9bSNikolay Aleksandrov static inline int br_vlan_bridge_event(struct net_device *dev, 14099c0ec2e7SMike Manning unsigned long event, void *ptr) 14109c0ec2e7SMike Manning { 1411091adf9bSNikolay Aleksandrov return 0; 14129c0ec2e7SMike Manning } 14138dcea187SNikolay Aleksandrov 14148dcea187SNikolay Aleksandrov static inline void br_vlan_rtnl_init(void) 14158dcea187SNikolay Aleksandrov { 14168dcea187SNikolay Aleksandrov } 14178dcea187SNikolay Aleksandrov 14188dcea187SNikolay Aleksandrov static inline void br_vlan_rtnl_uninit(void) 14198dcea187SNikolay Aleksandrov { 14208dcea187SNikolay Aleksandrov } 1421cf5bddb9SNikolay Aleksandrov 1422cf5bddb9SNikolay Aleksandrov static inline void br_vlan_notify(const struct net_bridge *br, 1423cf5bddb9SNikolay Aleksandrov const struct net_bridge_port *p, 1424cf5bddb9SNikolay Aleksandrov u16 vid, u16 vid_range, 1425cf5bddb9SNikolay Aleksandrov int cmd) 1426cf5bddb9SNikolay Aleksandrov { 1427cf5bddb9SNikolay Aleksandrov } 1428528ae84aSNikolay Aleksandrov 1429528ae84aSNikolay Aleksandrov static inline bool br_vlan_can_enter_range(const struct net_bridge_vlan *v_curr, 1430528ae84aSNikolay Aleksandrov const struct net_bridge_vlan *range_end) 1431528ae84aSNikolay Aleksandrov { 1432528ae84aSNikolay Aleksandrov return true; 1433528ae84aSNikolay Aleksandrov } 1434243a2e63SVlad Yasevich #endif 1435243a2e63SVlad Yasevich 14367a53e718SNikolay Aleksandrov /* br_vlan_options.c */ 14377a53e718SNikolay Aleksandrov #ifdef CONFIG_BRIDGE_VLAN_FILTERING 143899f7c5e0SNikolay Aleksandrov bool br_vlan_opts_eq_range(const struct net_bridge_vlan *v_curr, 143999f7c5e0SNikolay Aleksandrov const struct net_bridge_vlan *range_end); 14407a53e718SNikolay Aleksandrov bool br_vlan_opts_fill(struct sk_buff *skb, const struct net_bridge_vlan *v); 14417a53e718SNikolay Aleksandrov size_t br_vlan_opts_nl_size(void); 1442a5d29ae2SNikolay Aleksandrov int br_vlan_process_options(const struct net_bridge *br, 1443a5d29ae2SNikolay Aleksandrov const struct net_bridge_port *p, 1444a5d29ae2SNikolay Aleksandrov struct net_bridge_vlan *range_start, 1445a5d29ae2SNikolay Aleksandrov struct net_bridge_vlan *range_end, 1446a5d29ae2SNikolay Aleksandrov struct nlattr **tb, 1447a5d29ae2SNikolay Aleksandrov struct netlink_ext_ack *extack); 1448a580c76dSNikolay Aleksandrov 1449a580c76dSNikolay Aleksandrov /* vlan state manipulation helpers using *_ONCE to annotate lock-free access */ 1450a580c76dSNikolay Aleksandrov static inline u8 br_vlan_get_state(const struct net_bridge_vlan *v) 1451a580c76dSNikolay Aleksandrov { 1452a580c76dSNikolay Aleksandrov return READ_ONCE(v->state); 1453a580c76dSNikolay Aleksandrov } 1454a580c76dSNikolay Aleksandrov 1455a580c76dSNikolay Aleksandrov static inline void br_vlan_set_state(struct net_bridge_vlan *v, u8 state) 1456a580c76dSNikolay Aleksandrov { 1457a580c76dSNikolay Aleksandrov WRITE_ONCE(v->state, state); 1458a580c76dSNikolay Aleksandrov } 1459a580c76dSNikolay Aleksandrov 1460a580c76dSNikolay Aleksandrov static inline u8 br_vlan_get_pvid_state(const struct net_bridge_vlan_group *vg) 1461a580c76dSNikolay Aleksandrov { 1462a580c76dSNikolay Aleksandrov return READ_ONCE(vg->pvid_state); 1463a580c76dSNikolay Aleksandrov } 1464a580c76dSNikolay Aleksandrov 1465a580c76dSNikolay Aleksandrov static inline void br_vlan_set_pvid_state(struct net_bridge_vlan_group *vg, 1466a580c76dSNikolay Aleksandrov u8 state) 1467a580c76dSNikolay Aleksandrov { 1468a580c76dSNikolay Aleksandrov WRITE_ONCE(vg->pvid_state, state); 1469a580c76dSNikolay Aleksandrov } 1470a580c76dSNikolay Aleksandrov 1471a580c76dSNikolay Aleksandrov /* learn_allow is true at ingress and false at egress */ 1472a580c76dSNikolay Aleksandrov static inline bool br_vlan_state_allowed(u8 state, bool learn_allow) 1473a580c76dSNikolay Aleksandrov { 1474a580c76dSNikolay Aleksandrov switch (state) { 1475a580c76dSNikolay Aleksandrov case BR_STATE_LEARNING: 1476a580c76dSNikolay Aleksandrov return learn_allow; 1477a580c76dSNikolay Aleksandrov case BR_STATE_FORWARDING: 1478a580c76dSNikolay Aleksandrov return true; 1479a580c76dSNikolay Aleksandrov default: 1480a580c76dSNikolay Aleksandrov return false; 1481a580c76dSNikolay Aleksandrov } 1482a580c76dSNikolay Aleksandrov } 14837a53e718SNikolay Aleksandrov #endif 14847a53e718SNikolay Aleksandrov 14851a4ba64dSPablo Neira Ayuso struct nf_br_ops { 14861a4ba64dSPablo Neira Ayuso int (*br_dev_xmit_hook)(struct sk_buff *skb); 14871a4ba64dSPablo Neira Ayuso }; 14881a4ba64dSPablo Neira Ayuso extern const struct nf_br_ops __rcu *nf_br_ops; 14891a4ba64dSPablo Neira Ayuso 14901da177e4SLinus Torvalds /* br_netfilter.c */ 149134666d46SPablo Neira Ayuso #if IS_ENABLED(CONFIG_BRIDGE_NETFILTER) 149234666d46SPablo Neira Ayuso int br_nf_core_init(void); 149334666d46SPablo Neira Ayuso void br_nf_core_fini(void); 1494348662a1SJoe Perches void br_netfilter_rtable_init(struct net_bridge *); 1495c0909713SStephen Hemminger #else 149634666d46SPablo Neira Ayuso static inline int br_nf_core_init(void) { return 0; } 149734666d46SPablo Neira Ayuso static inline void br_nf_core_fini(void) {} 14984adf0af6SSimon Wunderlich #define br_netfilter_rtable_init(x) 1499c0909713SStephen Hemminger #endif 15001da177e4SLinus Torvalds 15011da177e4SLinus Torvalds /* br_stp.c */ 1502775dd692SFlorian Fainelli void br_set_state(struct net_bridge_port *p, unsigned int state); 1503348662a1SJoe Perches struct net_bridge_port *br_get_port(struct net_bridge *br, u16 port_no); 1504348662a1SJoe Perches void br_init_port(struct net_bridge_port *p); 1505348662a1SJoe Perches void br_become_designated_port(struct net_bridge_port *p); 15061da177e4SLinus Torvalds 1507348662a1SJoe Perches void __br_set_forward_delay(struct net_bridge *br, unsigned long t); 1508348662a1SJoe Perches int br_set_forward_delay(struct net_bridge *br, unsigned long x); 1509348662a1SJoe Perches int br_set_hello_time(struct net_bridge *br, unsigned long x); 1510348662a1SJoe Perches int br_set_max_age(struct net_bridge *br, unsigned long x); 151182dd4332SVivien Didelot int __set_ageing_time(struct net_device *dev, unsigned long t); 15129e0b27feSVivien Didelot int br_set_ageing_time(struct net_bridge *br, clock_t ageing_time); 151314f98f25Sstephen hemminger 151414f98f25Sstephen hemminger 15151da177e4SLinus Torvalds /* br_stp_if.c */ 1516348662a1SJoe Perches void br_stp_enable_bridge(struct net_bridge *br); 1517348662a1SJoe Perches void br_stp_disable_bridge(struct net_bridge *br); 1518419dba8aSHoratiu Vultur int br_stp_set_enabled(struct net_bridge *br, unsigned long val, 1519419dba8aSHoratiu Vultur struct netlink_ext_ack *extack); 1520348662a1SJoe Perches void br_stp_enable_port(struct net_bridge_port *p); 1521348662a1SJoe Perches void br_stp_disable_port(struct net_bridge_port *p); 1522348662a1SJoe Perches bool br_stp_recalculate_bridge_id(struct net_bridge *br); 1523348662a1SJoe Perches void br_stp_change_bridge_id(struct net_bridge *br, const unsigned char *a); 1524348662a1SJoe Perches void br_stp_set_bridge_priority(struct net_bridge *br, u16 newprio); 1525348662a1SJoe Perches int br_stp_set_port_priority(struct net_bridge_port *p, unsigned long newprio); 1526348662a1SJoe Perches int br_stp_set_path_cost(struct net_bridge_port *p, unsigned long path_cost); 1527348662a1SJoe Perches ssize_t br_show_bridge_id(char *buf, const struct bridge_id *id); 15281da177e4SLinus Torvalds 15291da177e4SLinus Torvalds /* br_stp_bpdu.c */ 15307c85fbf0SPatrick McHardy struct stp_proto; 1531348662a1SJoe Perches void br_stp_rcv(const struct stp_proto *proto, struct sk_buff *skb, 15327c85fbf0SPatrick McHardy struct net_device *dev); 15331da177e4SLinus Torvalds 15341da177e4SLinus Torvalds /* br_stp_timer.c */ 1535348662a1SJoe Perches void br_stp_timer_init(struct net_bridge *br); 1536348662a1SJoe Perches void br_stp_port_timer_init(struct net_bridge_port *p); 1537348662a1SJoe Perches unsigned long br_timer_value(const struct timer_list *timer); 15381da177e4SLinus Torvalds 15391da177e4SLinus Torvalds /* br.c */ 1540e6373c4cSIgor Maravić #if IS_ENABLED(CONFIG_ATM_LANE) 1541da678292SMichał Mirosław extern int (*br_fdb_test_addr_hook)(struct net_device *dev, unsigned char *addr); 1542da678292SMichał Mirosław #endif 15431da177e4SLinus Torvalds 154465369933SHoratiu Vultur /* br_mrp.c */ 154565369933SHoratiu Vultur #if IS_ENABLED(CONFIG_BRIDGE_MRP) 154665369933SHoratiu Vultur int br_mrp_parse(struct net_bridge *br, struct net_bridge_port *p, 154765369933SHoratiu Vultur struct nlattr *attr, int cmd, struct netlink_ext_ack *extack); 154865369933SHoratiu Vultur bool br_mrp_enabled(struct net_bridge *br); 154965369933SHoratiu Vultur void br_mrp_port_del(struct net_bridge *br, struct net_bridge_port *p); 1550df42ef22SHoratiu Vultur int br_mrp_fill_info(struct sk_buff *skb, struct net_bridge *br); 155165369933SHoratiu Vultur #else 155265369933SHoratiu Vultur static inline int br_mrp_parse(struct net_bridge *br, struct net_bridge_port *p, 155365369933SHoratiu Vultur struct nlattr *attr, int cmd, 155465369933SHoratiu Vultur struct netlink_ext_ack *extack) 155565369933SHoratiu Vultur { 155665369933SHoratiu Vultur return -EOPNOTSUPP; 155765369933SHoratiu Vultur } 155865369933SHoratiu Vultur 155965369933SHoratiu Vultur static inline bool br_mrp_enabled(struct net_bridge *br) 156065369933SHoratiu Vultur { 15618741e184SJason Yan return false; 156265369933SHoratiu Vultur } 156365369933SHoratiu Vultur 156465369933SHoratiu Vultur static inline void br_mrp_port_del(struct net_bridge *br, 156565369933SHoratiu Vultur struct net_bridge_port *p) 156665369933SHoratiu Vultur { 156765369933SHoratiu Vultur } 1568df42ef22SHoratiu Vultur 1569df42ef22SHoratiu Vultur static inline int br_mrp_fill_info(struct sk_buff *skb, struct net_bridge *br) 1570df42ef22SHoratiu Vultur { 1571df42ef22SHoratiu Vultur return 0; 1572df42ef22SHoratiu Vultur } 1573df42ef22SHoratiu Vultur 157465369933SHoratiu Vultur #endif 157565369933SHoratiu Vultur 15762be665c3SHenrik Bjoernlund /* br_cfm.c */ 157786a14b79SHenrik Bjoernlund #if IS_ENABLED(CONFIG_BRIDGE_CFM) 15782be665c3SHenrik Bjoernlund int br_cfm_parse(struct net_bridge *br, struct net_bridge_port *p, 15792be665c3SHenrik Bjoernlund struct nlattr *attr, int cmd, struct netlink_ext_ack *extack); 15802be665c3SHenrik Bjoernlund bool br_cfm_created(struct net_bridge *br); 158186a14b79SHenrik Bjoernlund void br_cfm_port_del(struct net_bridge *br, struct net_bridge_port *p); 15825e312fc0SHenrik Bjoernlund int br_cfm_config_fill_info(struct sk_buff *skb, struct net_bridge *br); 1583b6d0425bSHenrik Bjoernlund int br_cfm_status_fill_info(struct sk_buff *skb, 1584b6d0425bSHenrik Bjoernlund struct net_bridge *br, 1585b6d0425bSHenrik Bjoernlund bool getlink); 1586b6d0425bSHenrik Bjoernlund int br_cfm_mep_count(struct net_bridge *br, u32 *count); 1587b6d0425bSHenrik Bjoernlund int br_cfm_peer_mep_count(struct net_bridge *br, u32 *count); 158886a14b79SHenrik Bjoernlund #else 15892be665c3SHenrik Bjoernlund static inline int br_cfm_parse(struct net_bridge *br, struct net_bridge_port *p, 15902be665c3SHenrik Bjoernlund struct nlattr *attr, int cmd, 15912be665c3SHenrik Bjoernlund struct netlink_ext_ack *extack) 15922be665c3SHenrik Bjoernlund { 15932be665c3SHenrik Bjoernlund return -EOPNOTSUPP; 15942be665c3SHenrik Bjoernlund } 15952be665c3SHenrik Bjoernlund 15962be665c3SHenrik Bjoernlund static inline bool br_cfm_created(struct net_bridge *br) 15972be665c3SHenrik Bjoernlund { 15982be665c3SHenrik Bjoernlund return false; 15992be665c3SHenrik Bjoernlund } 16002be665c3SHenrik Bjoernlund 160186a14b79SHenrik Bjoernlund static inline void br_cfm_port_del(struct net_bridge *br, 160286a14b79SHenrik Bjoernlund struct net_bridge_port *p) 160386a14b79SHenrik Bjoernlund { 160486a14b79SHenrik Bjoernlund } 16055e312fc0SHenrik Bjoernlund 16065e312fc0SHenrik Bjoernlund static inline int br_cfm_config_fill_info(struct sk_buff *skb, struct net_bridge *br) 16075e312fc0SHenrik Bjoernlund { 16085e312fc0SHenrik Bjoernlund return -EOPNOTSUPP; 16095e312fc0SHenrik Bjoernlund } 1610e77824d8SHenrik Bjoernlund 1611b6d0425bSHenrik Bjoernlund static inline int br_cfm_status_fill_info(struct sk_buff *skb, 1612b6d0425bSHenrik Bjoernlund struct net_bridge *br, 1613b6d0425bSHenrik Bjoernlund bool getlink) 1614b6d0425bSHenrik Bjoernlund { 1615b6d0425bSHenrik Bjoernlund return -EOPNOTSUPP; 1616b6d0425bSHenrik Bjoernlund } 1617b6d0425bSHenrik Bjoernlund 1618b6d0425bSHenrik Bjoernlund static inline int br_cfm_mep_count(struct net_bridge *br, u32 *count) 1619b6d0425bSHenrik Bjoernlund { 1620b6d0425bSHenrik Bjoernlund return -EOPNOTSUPP; 1621b6d0425bSHenrik Bjoernlund } 1622b6d0425bSHenrik Bjoernlund 1623b6d0425bSHenrik Bjoernlund static inline int br_cfm_peer_mep_count(struct net_bridge *br, u32 *count) 1624e77824d8SHenrik Bjoernlund { 1625e77824d8SHenrik Bjoernlund return -EOPNOTSUPP; 1626e77824d8SHenrik Bjoernlund } 162786a14b79SHenrik Bjoernlund #endif 162886a14b79SHenrik Bjoernlund 162911dc1f36SStephen Hemminger /* br_netlink.c */ 1630149ddd83Sstephen hemminger extern struct rtnl_link_ops br_link_ops; 1631348662a1SJoe Perches int br_netlink_init(void); 1632348662a1SJoe Perches void br_netlink_fini(void); 163392899063SNikolay Aleksandrov void br_ifinfo_notify(int event, const struct net_bridge *br, 163492899063SNikolay Aleksandrov const struct net_bridge_port *port); 1635b6d0425bSHenrik Bjoernlund void br_info_notify(int event, const struct net_bridge *br, 1636b6d0425bSHenrik Bjoernlund const struct net_bridge_port *port, u32 filter); 16372fd527b7SPetr Machata int br_setlink(struct net_device *dev, struct nlmsghdr *nlmsg, u16 flags, 16382fd527b7SPetr Machata struct netlink_ext_ack *extack); 1639add511b3SRoopa Prabhu int br_dellink(struct net_device *dev, struct nlmsghdr *nlmsg, u16 flags); 1640348662a1SJoe Perches int br_getlink(struct sk_buff *skb, u32 pid, u32 seq, struct net_device *dev, 164146c264daSNicolas Dichtel u32 filter_mask, int nlflags); 1642f26b2965SNikolay Aleksandrov int br_process_vlan_info(struct net_bridge *br, 1643f26b2965SNikolay Aleksandrov struct net_bridge_port *p, int cmd, 1644f26b2965SNikolay Aleksandrov struct bridge_vlan_info *vinfo_curr, 1645f26b2965SNikolay Aleksandrov struct bridge_vlan_info **vinfo_last, 1646f26b2965SNikolay Aleksandrov bool *changed, 1647f26b2965SNikolay Aleksandrov struct netlink_ext_ack *extack); 164811dc1f36SStephen Hemminger 16491da177e4SLinus Torvalds #ifdef CONFIG_SYSFS 16501da177e4SLinus Torvalds /* br_sysfs_if.c */ 165152cf25d0SEmese Revfy extern const struct sysfs_ops brport_sysfs_ops; 1652348662a1SJoe Perches int br_sysfs_addif(struct net_bridge_port *p); 1653348662a1SJoe Perches int br_sysfs_renameif(struct net_bridge_port *p); 16541da177e4SLinus Torvalds 16551da177e4SLinus Torvalds /* br_sysfs_br.c */ 1656348662a1SJoe Perches int br_sysfs_addbr(struct net_device *dev); 1657348662a1SJoe Perches void br_sysfs_delbr(struct net_device *dev); 16581da177e4SLinus Torvalds 16591da177e4SLinus Torvalds #else 16601da177e4SLinus Torvalds 16610cb2bbbeSLee Jones static inline int br_sysfs_addif(struct net_bridge_port *p) { return 0; } 16620cb2bbbeSLee Jones static inline int br_sysfs_renameif(struct net_bridge_port *p) { return 0; } 16630cb2bbbeSLee Jones static inline int br_sysfs_addbr(struct net_device *dev) { return 0; } 16640cb2bbbeSLee Jones static inline void br_sysfs_delbr(struct net_device *dev) { return; } 16651da177e4SLinus Torvalds #endif /* CONFIG_SYSFS */ 16661da177e4SLinus Torvalds 16676bc506b4SIdo Schimmel /* br_switchdev.c */ 16686bc506b4SIdo Schimmel #ifdef CONFIG_NET_SWITCHDEV 16696bc506b4SIdo Schimmel int nbp_switchdev_mark_set(struct net_bridge_port *p); 16706bc506b4SIdo Schimmel void nbp_switchdev_frame_mark(const struct net_bridge_port *p, 16716bc506b4SIdo Schimmel struct sk_buff *skb); 16726bc506b4SIdo Schimmel bool nbp_switchdev_allowed_egress(const struct net_bridge_port *p, 16736bc506b4SIdo Schimmel const struct sk_buff *skb); 16743922285dSArkadi Sharshevsky int br_switchdev_set_port_flag(struct net_bridge_port *p, 16753922285dSArkadi Sharshevsky unsigned long flags, 1676078bbb85SVladimir Oltean unsigned long mask, 1677078bbb85SVladimir Oltean struct netlink_ext_ack *extack); 16786eb38bf8STobias Waldekranz void br_switchdev_fdb_notify(struct net_bridge *br, 16796eb38bf8STobias Waldekranz const struct net_bridge_fdb_entry *fdb, int type); 1680169327d5SPetr Machata int br_switchdev_port_vlan_add(struct net_device *dev, u16 vid, u16 flags, 1681169327d5SPetr Machata struct netlink_ext_ack *extack); 1682d66e4348SPetr Machata int br_switchdev_port_vlan_del(struct net_device *dev, u16 vid); 1683f1c2eddfSIdo Schimmel 1684f1c2eddfSIdo Schimmel static inline void br_switchdev_frame_unmark(struct sk_buff *skb) 1685f1c2eddfSIdo Schimmel { 1686f1c2eddfSIdo Schimmel skb->offload_fwd_mark = 0; 1687f1c2eddfSIdo Schimmel } 16886bc506b4SIdo Schimmel #else 16896bc506b4SIdo Schimmel static inline int nbp_switchdev_mark_set(struct net_bridge_port *p) 16906bc506b4SIdo Schimmel { 16916bc506b4SIdo Schimmel return 0; 16926bc506b4SIdo Schimmel } 16936bc506b4SIdo Schimmel 16946bc506b4SIdo Schimmel static inline void nbp_switchdev_frame_mark(const struct net_bridge_port *p, 16956bc506b4SIdo Schimmel struct sk_buff *skb) 16966bc506b4SIdo Schimmel { 16976bc506b4SIdo Schimmel } 16986bc506b4SIdo Schimmel 16996bc506b4SIdo Schimmel static inline bool nbp_switchdev_allowed_egress(const struct net_bridge_port *p, 17006bc506b4SIdo Schimmel const struct sk_buff *skb) 17016bc506b4SIdo Schimmel { 17026bc506b4SIdo Schimmel return true; 17036bc506b4SIdo Schimmel } 17043922285dSArkadi Sharshevsky 17053922285dSArkadi Sharshevsky static inline int br_switchdev_set_port_flag(struct net_bridge_port *p, 17063922285dSArkadi Sharshevsky unsigned long flags, 1707078bbb85SVladimir Oltean unsigned long mask, 1708078bbb85SVladimir Oltean struct netlink_ext_ack *extack) 17093922285dSArkadi Sharshevsky { 17103922285dSArkadi Sharshevsky return 0; 17113922285dSArkadi Sharshevsky } 17126b26b51bSArkadi Sharshevsky 1713d66e4348SPetr Machata static inline int br_switchdev_port_vlan_add(struct net_device *dev, 1714169327d5SPetr Machata u16 vid, u16 flags, 1715169327d5SPetr Machata struct netlink_ext_ack *extack) 1716d66e4348SPetr Machata { 1717d66e4348SPetr Machata return -EOPNOTSUPP; 1718d66e4348SPetr Machata } 1719d66e4348SPetr Machata 1720d66e4348SPetr Machata static inline int br_switchdev_port_vlan_del(struct net_device *dev, u16 vid) 1721d66e4348SPetr Machata { 1722d66e4348SPetr Machata return -EOPNOTSUPP; 1723d66e4348SPetr Machata } 1724d66e4348SPetr Machata 17256b26b51bSArkadi Sharshevsky static inline void 17266eb38bf8STobias Waldekranz br_switchdev_fdb_notify(struct net_bridge *br, 17276eb38bf8STobias Waldekranz const struct net_bridge_fdb_entry *fdb, int type) 17286b26b51bSArkadi Sharshevsky { 17296b26b51bSArkadi Sharshevsky } 1730f1c2eddfSIdo Schimmel 1731f1c2eddfSIdo Schimmel static inline void br_switchdev_frame_unmark(struct sk_buff *skb) 1732f1c2eddfSIdo Schimmel { 1733f1c2eddfSIdo Schimmel } 17346bc506b4SIdo Schimmel #endif /* CONFIG_NET_SWITCHDEV */ 17356bc506b4SIdo Schimmel 1736057658cbSRoopa Prabhu /* br_arp_nd_proxy.c */ 1737821f1b21SRoopa Prabhu void br_recalculate_neigh_suppress_enabled(struct net_bridge *br); 1738057658cbSRoopa Prabhu void br_do_proxy_suppress_arp(struct sk_buff *skb, struct net_bridge *br, 1739057658cbSRoopa Prabhu u16 vid, struct net_bridge_port *p); 1740ed842faeSRoopa Prabhu void br_do_suppress_nd(struct sk_buff *skb, struct net_bridge *br, 1741ed842faeSRoopa Prabhu u16 vid, struct net_bridge_port *p, struct nd_msg *msg); 1742ed842faeSRoopa Prabhu struct nd_msg *br_is_nd_neigh_msg(struct sk_buff *skb, struct nd_msg *m); 17431da177e4SLinus Torvalds #endif 1744