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 <[email protected]>
71da177e4SLinus Torvalds */
81da177e4SLinus Torvalds #ifndef _LINUX_IF_BRIDGE_H
91da177e4SLinus Torvalds #define _LINUX_IF_BRIDGE_H
101da177e4SLinus Torvalds
111da177e4SLinus Torvalds
121da177e4SLinus Torvalds #include <linux/netdevice.h>
13607ca46eSDavid Howells #include <uapi/linux/if_bridge.h>
14065c212aSScott Feldman #include <linux/bitops.h>
151da177e4SLinus Torvalds
1607f8ac4aSLinus Lüssing struct br_ip {
1707f8ac4aSLinus Lüssing union {
1807f8ac4aSLinus Lüssing __be32 ip4;
1907f8ac4aSLinus Lüssing #if IS_ENABLED(CONFIG_IPV6)
2007f8ac4aSLinus Lüssing struct in6_addr ip6;
2107f8ac4aSLinus Lüssing #endif
22e1ac1185SNikolay Aleksandrov } src;
23e1ac1185SNikolay Aleksandrov union {
24e1ac1185SNikolay Aleksandrov __be32 ip4;
25e1ac1185SNikolay Aleksandrov #if IS_ENABLED(CONFIG_IPV6)
26e1ac1185SNikolay Aleksandrov struct in6_addr ip6;
27e1ac1185SNikolay Aleksandrov #endif
28955062b0SNikolay Aleksandrov unsigned char mac_addr[ETH_ALEN];
29eab3227bSNikolay Aleksandrov } dst;
3007f8ac4aSLinus Lüssing __be16 proto;
3107f8ac4aSLinus Lüssing __u16 vid;
3207f8ac4aSLinus Lüssing };
3307f8ac4aSLinus Lüssing
3407f8ac4aSLinus Lüssing struct br_ip_list {
3507f8ac4aSLinus Lüssing struct list_head list;
3607f8ac4aSLinus Lüssing struct br_ip addr;
3707f8ac4aSLinus Lüssing };
3807f8ac4aSLinus Lüssing
39065c212aSScott Feldman #define BR_HAIRPIN_MODE BIT(0)
40065c212aSScott Feldman #define BR_BPDU_GUARD BIT(1)
41065c212aSScott Feldman #define BR_ROOT_BLOCK BIT(2)
42065c212aSScott Feldman #define BR_MULTICAST_FAST_LEAVE BIT(3)
43065c212aSScott Feldman #define BR_ADMIN_COST BIT(4)
44065c212aSScott Feldman #define BR_LEARNING BIT(5)
45065c212aSScott Feldman #define BR_FLOOD BIT(6)
46065c212aSScott Feldman #define BR_AUTO_MASK (BR_FLOOD | BR_LEARNING)
47065c212aSScott Feldman #define BR_PROMISC BIT(7)
48065c212aSScott Feldman #define BR_PROXYARP BIT(8)
49efacacdaSScott Feldman #define BR_LEARNING_SYNC BIT(9)
50842a9ae0SJouni Malinen #define BR_PROXYARP_WIFI BIT(10)
51b6cb5ac8SNikolay Aleksandrov #define BR_MCAST_FLOOD BIT(11)
526db6f0eaSFelix Fietkau #define BR_MULTICAST_TO_UNICAST BIT(12)
53b3c7ef0aSRoopa Prabhu #define BR_VLAN_TUNNEL BIT(13)
5499f906e9SMike Manning #define BR_BCAST_FLOOD BIT(14)
55821f1b21SRoopa Prabhu #define BR_NEIGH_SUPPRESS BIT(15)
567d850abdSNikolay Aleksandrov #define BR_ISOLATED BIT(16)
574b8d7d4cSHoratiu Vultur #define BR_MRP_AWARE BIT(17)
584b8d7d4cSHoratiu Vultur #define BR_MRP_LOST_CONT BIT(18)
5943364ef1SHoratiu Vultur #define BR_MRP_LOST_IN_CONT BIT(19)
6047211192STobias Waldekranz #define BR_TX_FWD_OFFLOAD BIT(20)
61a21d9a67SHans Schultz #define BR_PORT_LOCKED BIT(21)
62a35ec8e3SHans J. Schultz #define BR_PORT_MAB BIT(22)
63a714e3ecSIdo Schimmel #define BR_NEIGH_VLAN_SUPPRESS BIT(23)
64065c212aSScott Feldman
65a79e88d9SScott Feldman #define BR_DEFAULT_AGEING_TIME (300 * HZ)
66a79e88d9SScott Feldman
67ad2f99aeSArnd Bergmann struct net_bridge;
68*ed3ba9b6SKuniyuki Iwashima void brioctl_set(int (*hook)(struct net *net, unsigned int cmd,
69ad2f99aeSArnd Bergmann void __user *uarg));
70*ed3ba9b6SKuniyuki Iwashima int br_ioctl_call(struct net *net, unsigned int cmd, void __user *uarg);
71a386f990SEric Dumazet
72f941a6d9SLinus Lüssing #if IS_ENABLED(CONFIG_BRIDGE) && IS_ENABLED(CONFIG_BRIDGE_IGMP_SNOOPING)
7307f8ac4aSLinus Lüssing int br_multicast_list_adjacent(struct net_device *dev,
7407f8ac4aSLinus Lüssing struct list_head *br_ip_list);
75c34963e2SLinus Lüssing bool br_multicast_has_querier_anywhere(struct net_device *dev, int proto);
762cd41431SLinus Lüssing bool br_multicast_has_querier_adjacent(struct net_device *dev, int proto);
773b85f9baSLinus Lüssing bool br_multicast_has_router_adjacent(struct net_device *dev, int proto);
789341b988SIdo Schimmel bool br_multicast_enabled(const struct net_device *dev);
790912bda4SYotam Gigi bool br_multicast_router(const struct net_device *dev);
80f941a6d9SLinus Lüssing #else
br_multicast_list_adjacent(struct net_device * dev,struct list_head * br_ip_list)81f941a6d9SLinus Lüssing static inline int br_multicast_list_adjacent(struct net_device *dev,
82f941a6d9SLinus Lüssing struct list_head *br_ip_list)
83f941a6d9SLinus Lüssing {
84f941a6d9SLinus Lüssing return 0;
85f941a6d9SLinus Lüssing }
br_multicast_has_querier_anywhere(struct net_device * dev,int proto)86c34963e2SLinus Lüssing static inline bool br_multicast_has_querier_anywhere(struct net_device *dev,
87c34963e2SLinus Lüssing int proto)
88c34963e2SLinus Lüssing {
89c34963e2SLinus Lüssing return false;
90c34963e2SLinus Lüssing }
br_multicast_has_querier_adjacent(struct net_device * dev,int proto)91f941a6d9SLinus Lüssing static inline bool br_multicast_has_querier_adjacent(struct net_device *dev,
92f941a6d9SLinus Lüssing int proto)
93f941a6d9SLinus Lüssing {
94f941a6d9SLinus Lüssing return false;
95f941a6d9SLinus Lüssing }
963b85f9baSLinus Lüssing
br_multicast_has_router_adjacent(struct net_device * dev,int proto)973b85f9baSLinus Lüssing static inline bool br_multicast_has_router_adjacent(struct net_device *dev,
983b85f9baSLinus Lüssing int proto)
993b85f9baSLinus Lüssing {
1003b85f9baSLinus Lüssing return true;
1013b85f9baSLinus Lüssing }
1023b85f9baSLinus Lüssing
br_multicast_enabled(const struct net_device * dev)1039341b988SIdo Schimmel static inline bool br_multicast_enabled(const struct net_device *dev)
1049341b988SIdo Schimmel {
1059341b988SIdo Schimmel return false;
1069341b988SIdo Schimmel }
br_multicast_router(const struct net_device * dev)1070912bda4SYotam Gigi static inline bool br_multicast_router(const struct net_device *dev)
1080912bda4SYotam Gigi {
1090912bda4SYotam Gigi return false;
1100912bda4SYotam Gigi }
111f941a6d9SLinus Lüssing #endif
1121da177e4SLinus Torvalds
1131f51445aSIdo Schimmel #if IS_ENABLED(CONFIG_BRIDGE) && IS_ENABLED(CONFIG_BRIDGE_VLAN_FILTERING)
1141f51445aSIdo Schimmel bool br_vlan_enabled(const struct net_device *dev);
1154d4fd361SPetr Machata int br_vlan_get_pvid(const struct net_device *dev, u16 *p_pvid);
1167582f5b7SPablo Neira Ayuso int br_vlan_get_pvid_rcu(const struct net_device *dev, u16 *p_pvid);
11731aed46fSwenxu int br_vlan_get_proto(const struct net_device *dev, u16 *p_proto);
1184d4fd361SPetr Machata int br_vlan_get_info(const struct net_device *dev, u16 vid,
1194d4fd361SPetr Machata struct bridge_vlan_info *p_vinfo);
120ee80dd2eSVladimir Oltean int br_vlan_get_info_rcu(const struct net_device *dev, u16 vid,
121ee80dd2eSVladimir Oltean struct bridge_vlan_info *p_vinfo);
12248d57b2eSTobias Waldekranz bool br_mst_enabled(const struct net_device *dev);
123cceac97aSTobias Waldekranz int br_mst_get_info(const struct net_device *dev, u16 msti, unsigned long *vids);
124f54fd0e1STobias Waldekranz int br_mst_get_state(const struct net_device *dev, u16 msti, u8 *state);
1251f51445aSIdo Schimmel #else
br_vlan_enabled(const struct net_device * dev)1261f51445aSIdo Schimmel static inline bool br_vlan_enabled(const struct net_device *dev)
1271f51445aSIdo Schimmel {
1281f51445aSIdo Schimmel return false;
1291f51445aSIdo Schimmel }
1304d4fd361SPetr Machata
br_vlan_get_pvid(const struct net_device * dev,u16 * p_pvid)1314d4fd361SPetr Machata static inline int br_vlan_get_pvid(const struct net_device *dev, u16 *p_pvid)
1324d4fd361SPetr Machata {
133000244d3SArnd Bergmann return -EINVAL;
1344d4fd361SPetr Machata }
1354d4fd361SPetr Machata
br_vlan_get_proto(const struct net_device * dev,u16 * p_proto)13631aed46fSwenxu static inline int br_vlan_get_proto(const struct net_device *dev, u16 *p_proto)
13731aed46fSwenxu {
13831aed46fSwenxu return -EINVAL;
13931aed46fSwenxu }
14031aed46fSwenxu
br_vlan_get_pvid_rcu(const struct net_device * dev,u16 * p_pvid)1417582f5b7SPablo Neira Ayuso static inline int br_vlan_get_pvid_rcu(const struct net_device *dev, u16 *p_pvid)
1427582f5b7SPablo Neira Ayuso {
1437582f5b7SPablo Neira Ayuso return -EINVAL;
1447582f5b7SPablo Neira Ayuso }
1457582f5b7SPablo Neira Ayuso
br_vlan_get_info(const struct net_device * dev,u16 vid,struct bridge_vlan_info * p_vinfo)1464d4fd361SPetr Machata static inline int br_vlan_get_info(const struct net_device *dev, u16 vid,
1474d4fd361SPetr Machata struct bridge_vlan_info *p_vinfo)
1484d4fd361SPetr Machata {
149000244d3SArnd Bergmann return -EINVAL;
1504d4fd361SPetr Machata }
151ee80dd2eSVladimir Oltean
br_vlan_get_info_rcu(const struct net_device * dev,u16 vid,struct bridge_vlan_info * p_vinfo)152ee80dd2eSVladimir Oltean static inline int br_vlan_get_info_rcu(const struct net_device *dev, u16 vid,
153ee80dd2eSVladimir Oltean struct bridge_vlan_info *p_vinfo)
154ee80dd2eSVladimir Oltean {
155ee80dd2eSVladimir Oltean return -EINVAL;
156ee80dd2eSVladimir Oltean }
157cceac97aSTobias Waldekranz
br_mst_enabled(const struct net_device * dev)15848d57b2eSTobias Waldekranz static inline bool br_mst_enabled(const struct net_device *dev)
15948d57b2eSTobias Waldekranz {
16048d57b2eSTobias Waldekranz return false;
16148d57b2eSTobias Waldekranz }
16248d57b2eSTobias Waldekranz
br_mst_get_info(const struct net_device * dev,u16 msti,unsigned long * vids)163cceac97aSTobias Waldekranz static inline int br_mst_get_info(const struct net_device *dev, u16 msti,
164cceac97aSTobias Waldekranz unsigned long *vids)
165cceac97aSTobias Waldekranz {
166cceac97aSTobias Waldekranz return -EINVAL;
167cceac97aSTobias Waldekranz }
br_mst_get_state(const struct net_device * dev,u16 msti,u8 * state)168f54fd0e1STobias Waldekranz static inline int br_mst_get_state(const struct net_device *dev, u16 msti,
169f54fd0e1STobias Waldekranz u8 *state)
170f54fd0e1STobias Waldekranz {
171f54fd0e1STobias Waldekranz return -EINVAL;
172f54fd0e1STobias Waldekranz }
1734d4fd361SPetr Machata #endif
1744d4fd361SPetr Machata
1754d4fd361SPetr Machata #if IS_ENABLED(CONFIG_BRIDGE)
1764d4fd361SPetr Machata struct net_device *br_fdb_find_port(const struct net_device *br_dev,
1774d4fd361SPetr Machata const unsigned char *addr,
1784d4fd361SPetr Machata __u16 vid);
17943920edfSPetr Machata void br_fdb_clear_offload(const struct net_device *dev, u16 vid);
180085ddc87SIdo Schimmel bool br_port_flag_is_set(const struct net_device *dev, unsigned long flag);
181c0e715bbSVladimir Oltean u8 br_port_get_stp_state(const struct net_device *dev);
182bdf123b4SVladimir Oltean clock_t br_get_ageing_time(const struct net_device *br_dev);
1834d4fd361SPetr Machata #else
1844d4fd361SPetr Machata static inline struct net_device *
br_fdb_find_port(const struct net_device * br_dev,const unsigned char * addr,__u16 vid)1854d4fd361SPetr Machata br_fdb_find_port(const struct net_device *br_dev,
1864d4fd361SPetr Machata const unsigned char *addr,
1874d4fd361SPetr Machata __u16 vid)
1884d4fd361SPetr Machata {
1894d4fd361SPetr Machata return NULL;
1904d4fd361SPetr Machata }
19143920edfSPetr Machata
br_fdb_clear_offload(const struct net_device * dev,u16 vid)19243920edfSPetr Machata static inline void br_fdb_clear_offload(const struct net_device *dev, u16 vid)
19343920edfSPetr Machata {
19443920edfSPetr Machata }
19543920edfSPetr Machata
196085ddc87SIdo Schimmel static inline bool
br_port_flag_is_set(const struct net_device * dev,unsigned long flag)197085ddc87SIdo Schimmel br_port_flag_is_set(const struct net_device *dev, unsigned long flag)
198085ddc87SIdo Schimmel {
199085ddc87SIdo Schimmel return false;
200085ddc87SIdo Schimmel }
201c0e715bbSVladimir Oltean
br_port_get_stp_state(const struct net_device * dev)202c0e715bbSVladimir Oltean static inline u8 br_port_get_stp_state(const struct net_device *dev)
203c0e715bbSVladimir Oltean {
204c0e715bbSVladimir Oltean return BR_STATE_DISABLED;
205c0e715bbSVladimir Oltean }
206f1d42ea1SVladimir Oltean
br_get_ageing_time(const struct net_device * br_dev)207bdf123b4SVladimir Oltean static inline clock_t br_get_ageing_time(const struct net_device *br_dev)
208f1d42ea1SVladimir Oltean {
209f1d42ea1SVladimir Oltean return 0;
210f1d42ea1SVladimir Oltean }
2111f51445aSIdo Schimmel #endif
2121f51445aSIdo Schimmel
2131da177e4SLinus Torvalds #endif
214