diff options
Diffstat (limited to 'net/bridge/br_private.h')
-rw-r--r-- | net/bridge/br_private.h | 75 |
1 files changed, 52 insertions, 23 deletions
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h index 59d3a85c5873..23caf5b0309e 100644 --- a/net/bridge/br_private.h +++ b/net/bridge/br_private.h | |||
@@ -35,6 +35,8 @@ | |||
35 | #define BR_GROUPFWD_DEFAULT 0 | 35 | #define BR_GROUPFWD_DEFAULT 0 |
36 | /* Don't allow forwarding control protocols like STP and LLDP */ | 36 | /* Don't allow forwarding control protocols like STP and LLDP */ |
37 | #define BR_GROUPFWD_RESTRICTED 0x4007u | 37 | #define BR_GROUPFWD_RESTRICTED 0x4007u |
38 | /* The Nearest Customer Bridge Group Address, 01-80-C2-00-00-[00,0B,0C,0D,0F] */ | ||
39 | #define BR_GROUPFWD_8021AD 0xB801u | ||
38 | 40 | ||
39 | /* Path to usermode spanning tree program */ | 41 | /* Path to usermode spanning tree program */ |
40 | #define BR_STP_PROG "/sbin/bridge-stp" | 42 | #define BR_STP_PROG "/sbin/bridge-stp" |
@@ -54,30 +56,24 @@ struct mac_addr | |||
54 | unsigned char addr[ETH_ALEN]; | 56 | unsigned char addr[ETH_ALEN]; |
55 | }; | 57 | }; |
56 | 58 | ||
57 | struct br_ip | ||
58 | { | ||
59 | union { | ||
60 | __be32 ip4; | ||
61 | #if IS_ENABLED(CONFIG_IPV6) | ||
62 | struct in6_addr ip6; | ||
63 | #endif | ||
64 | } u; | ||
65 | __be16 proto; | ||
66 | __u16 vid; | ||
67 | }; | ||
68 | |||
69 | #ifdef CONFIG_BRIDGE_IGMP_SNOOPING | 59 | #ifdef CONFIG_BRIDGE_IGMP_SNOOPING |
70 | /* our own querier */ | 60 | /* our own querier */ |
71 | struct bridge_mcast_query { | 61 | struct bridge_mcast_own_query { |
72 | struct timer_list timer; | 62 | struct timer_list timer; |
73 | u32 startup_sent; | 63 | u32 startup_sent; |
74 | }; | 64 | }; |
75 | 65 | ||
76 | /* other querier */ | 66 | /* other querier */ |
77 | struct bridge_mcast_querier { | 67 | struct bridge_mcast_other_query { |
78 | struct timer_list timer; | 68 | struct timer_list timer; |
79 | unsigned long delay_time; | 69 | unsigned long delay_time; |
80 | }; | 70 | }; |
71 | |||
72 | /* selected querier */ | ||
73 | struct bridge_mcast_querier { | ||
74 | struct br_ip addr; | ||
75 | struct net_bridge_port __rcu *port; | ||
76 | }; | ||
81 | #endif | 77 | #endif |
82 | 78 | ||
83 | struct net_port_vlans { | 79 | struct net_port_vlans { |
@@ -174,11 +170,13 @@ struct net_bridge_port | |||
174 | #define BR_ADMIN_COST 0x00000010 | 170 | #define BR_ADMIN_COST 0x00000010 |
175 | #define BR_LEARNING 0x00000020 | 171 | #define BR_LEARNING 0x00000020 |
176 | #define BR_FLOOD 0x00000040 | 172 | #define BR_FLOOD 0x00000040 |
173 | #define BR_AUTO_MASK (BR_FLOOD | BR_LEARNING) | ||
174 | #define BR_PROMISC 0x00000080 | ||
177 | 175 | ||
178 | #ifdef CONFIG_BRIDGE_IGMP_SNOOPING | 176 | #ifdef CONFIG_BRIDGE_IGMP_SNOOPING |
179 | struct bridge_mcast_query ip4_query; | 177 | struct bridge_mcast_own_query ip4_own_query; |
180 | #if IS_ENABLED(CONFIG_IPV6) | 178 | #if IS_ENABLED(CONFIG_IPV6) |
181 | struct bridge_mcast_query ip6_query; | 179 | struct bridge_mcast_own_query ip6_own_query; |
182 | #endif /* IS_ENABLED(CONFIG_IPV6) */ | 180 | #endif /* IS_ENABLED(CONFIG_IPV6) */ |
183 | unsigned char multicast_router; | 181 | unsigned char multicast_router; |
184 | struct timer_list multicast_router_timer; | 182 | struct timer_list multicast_router_timer; |
@@ -198,6 +196,9 @@ struct net_bridge_port | |||
198 | #endif | 196 | #endif |
199 | }; | 197 | }; |
200 | 198 | ||
199 | #define br_auto_port(p) ((p)->flags & BR_AUTO_MASK) | ||
200 | #define br_promisc_port(p) ((p)->flags & BR_PROMISC) | ||
201 | |||
201 | #define br_port_exists(dev) (dev->priv_flags & IFF_BRIDGE_PORT) | 202 | #define br_port_exists(dev) (dev->priv_flags & IFF_BRIDGE_PORT) |
202 | 203 | ||
203 | static inline struct net_bridge_port *br_port_get_rcu(const struct net_device *dev) | 204 | static inline struct net_bridge_port *br_port_get_rcu(const struct net_device *dev) |
@@ -227,6 +228,7 @@ struct net_bridge | |||
227 | bool nf_call_arptables; | 228 | bool nf_call_arptables; |
228 | #endif | 229 | #endif |
229 | u16 group_fwd_mask; | 230 | u16 group_fwd_mask; |
231 | u16 group_fwd_mask_required; | ||
230 | 232 | ||
231 | /* STP */ | 233 | /* STP */ |
232 | bridge_id designated_root; | 234 | bridge_id designated_root; |
@@ -241,6 +243,7 @@ struct net_bridge | |||
241 | unsigned long bridge_forward_delay; | 243 | unsigned long bridge_forward_delay; |
242 | 244 | ||
243 | u8 group_addr[ETH_ALEN]; | 245 | u8 group_addr[ETH_ALEN]; |
246 | bool group_addr_set; | ||
244 | u16 root_port; | 247 | u16 root_port; |
245 | 248 | ||
246 | enum { | 249 | enum { |
@@ -277,11 +280,13 @@ struct net_bridge | |||
277 | struct hlist_head router_list; | 280 | struct hlist_head router_list; |
278 | 281 | ||
279 | struct timer_list multicast_router_timer; | 282 | struct timer_list multicast_router_timer; |
283 | struct bridge_mcast_other_query ip4_other_query; | ||
284 | struct bridge_mcast_own_query ip4_own_query; | ||
280 | struct bridge_mcast_querier ip4_querier; | 285 | struct bridge_mcast_querier ip4_querier; |
281 | struct bridge_mcast_query ip4_query; | ||
282 | #if IS_ENABLED(CONFIG_IPV6) | 286 | #if IS_ENABLED(CONFIG_IPV6) |
287 | struct bridge_mcast_other_query ip6_other_query; | ||
288 | struct bridge_mcast_own_query ip6_own_query; | ||
283 | struct bridge_mcast_querier ip6_querier; | 289 | struct bridge_mcast_querier ip6_querier; |
284 | struct bridge_mcast_query ip6_query; | ||
285 | #endif /* IS_ENABLED(CONFIG_IPV6) */ | 290 | #endif /* IS_ENABLED(CONFIG_IPV6) */ |
286 | #endif | 291 | #endif |
287 | 292 | ||
@@ -290,8 +295,10 @@ struct net_bridge | |||
290 | struct timer_list topology_change_timer; | 295 | struct timer_list topology_change_timer; |
291 | struct timer_list gc_timer; | 296 | struct timer_list gc_timer; |
292 | struct kobject *ifobj; | 297 | struct kobject *ifobj; |
298 | u32 auto_cnt; | ||
293 | #ifdef CONFIG_BRIDGE_VLAN_FILTERING | 299 | #ifdef CONFIG_BRIDGE_VLAN_FILTERING |
294 | u8 vlan_enabled; | 300 | u8 vlan_enabled; |
301 | __be16 vlan_proto; | ||
295 | struct net_port_vlans __rcu *vlan_info; | 302 | struct net_port_vlans __rcu *vlan_info; |
296 | #endif | 303 | #endif |
297 | }; | 304 | }; |
@@ -327,8 +334,6 @@ struct br_input_skb_cb { | |||
327 | #define br_debug(br, format, args...) \ | 334 | #define br_debug(br, format, args...) \ |
328 | pr_debug("%s: " format, (br)->dev->name, ##args) | 335 | pr_debug("%s: " format, (br)->dev->name, ##args) |
329 | 336 | ||
330 | extern struct notifier_block br_device_notifier; | ||
331 | |||
332 | /* called under bridge lock */ | 337 | /* called under bridge lock */ |
333 | static inline int br_is_root_bridge(const struct net_bridge *br) | 338 | static inline int br_is_root_bridge(const struct net_bridge *br) |
334 | { | 339 | { |
@@ -395,6 +400,8 @@ int br_fdb_add(struct ndmsg *nlh, struct nlattr *tb[], struct net_device *dev, | |||
395 | const unsigned char *addr, u16 nlh_flags); | 400 | const unsigned char *addr, u16 nlh_flags); |
396 | int br_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb, | 401 | int br_fdb_dump(struct sk_buff *skb, struct netlink_callback *cb, |
397 | struct net_device *dev, int idx); | 402 | struct net_device *dev, int idx); |
403 | int br_fdb_sync_static(struct net_bridge *br, struct net_bridge_port *p); | ||
404 | void br_fdb_unsync_static(struct net_bridge *br, struct net_bridge_port *p); | ||
398 | 405 | ||
399 | /* br_forward.c */ | 406 | /* br_forward.c */ |
400 | void br_deliver(const struct net_bridge_port *to, struct sk_buff *skb); | 407 | void br_deliver(const struct net_bridge_port *to, struct sk_buff *skb); |
@@ -415,6 +422,8 @@ int br_del_if(struct net_bridge *br, struct net_device *dev); | |||
415 | int br_min_mtu(const struct net_bridge *br); | 422 | int br_min_mtu(const struct net_bridge *br); |
416 | netdev_features_t br_features_recompute(struct net_bridge *br, | 423 | netdev_features_t br_features_recompute(struct net_bridge *br, |
417 | netdev_features_t features); | 424 | netdev_features_t features); |
425 | void br_port_flags_change(struct net_bridge_port *port, unsigned long mask); | ||
426 | void br_manage_promisc(struct net_bridge *br); | ||
418 | 427 | ||
419 | /* br_input.c */ | 428 | /* br_input.c */ |
420 | int br_handle_frame_finish(struct sk_buff *skb); | 429 | int br_handle_frame_finish(struct sk_buff *skb); |
@@ -485,7 +494,7 @@ static inline bool br_multicast_is_router(struct net_bridge *br) | |||
485 | 494 | ||
486 | static inline bool | 495 | static inline bool |
487 | __br_multicast_querier_exists(struct net_bridge *br, | 496 | __br_multicast_querier_exists(struct net_bridge *br, |
488 | struct bridge_mcast_querier *querier) | 497 | struct bridge_mcast_other_query *querier) |
489 | { | 498 | { |
490 | return time_is_before_jiffies(querier->delay_time) && | 499 | return time_is_before_jiffies(querier->delay_time) && |
491 | (br->multicast_querier || timer_pending(&querier->timer)); | 500 | (br->multicast_querier || timer_pending(&querier->timer)); |
@@ -496,10 +505,10 @@ static inline bool br_multicast_querier_exists(struct net_bridge *br, | |||
496 | { | 505 | { |
497 | switch (eth->h_proto) { | 506 | switch (eth->h_proto) { |
498 | case (htons(ETH_P_IP)): | 507 | case (htons(ETH_P_IP)): |
499 | return __br_multicast_querier_exists(br, &br->ip4_querier); | 508 | return __br_multicast_querier_exists(br, &br->ip4_other_query); |
500 | #if IS_ENABLED(CONFIG_IPV6) | 509 | #if IS_ENABLED(CONFIG_IPV6) |
501 | case (htons(ETH_P_IPV6)): | 510 | case (htons(ETH_P_IPV6)): |
502 | return __br_multicast_querier_exists(br, &br->ip6_querier); | 511 | return __br_multicast_querier_exists(br, &br->ip6_other_query); |
503 | #endif | 512 | #endif |
504 | default: | 513 | default: |
505 | return false; | 514 | return false; |
@@ -589,7 +598,10 @@ int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags); | |||
589 | int br_vlan_delete(struct net_bridge *br, u16 vid); | 598 | int br_vlan_delete(struct net_bridge *br, u16 vid); |
590 | void br_vlan_flush(struct net_bridge *br); | 599 | void br_vlan_flush(struct net_bridge *br); |
591 | bool br_vlan_find(struct net_bridge *br, u16 vid); | 600 | bool br_vlan_find(struct net_bridge *br, u16 vid); |
601 | void br_recalculate_fwd_mask(struct net_bridge *br); | ||
592 | int br_vlan_filter_toggle(struct net_bridge *br, unsigned long val); | 602 | int br_vlan_filter_toggle(struct net_bridge *br, unsigned long val); |
603 | int br_vlan_set_proto(struct net_bridge *br, unsigned long val); | ||
604 | void br_vlan_init(struct net_bridge *br); | ||
593 | int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags); | 605 | int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags); |
594 | int nbp_vlan_delete(struct net_bridge_port *port, u16 vid); | 606 | int nbp_vlan_delete(struct net_bridge_port *port, u16 vid); |
595 | void nbp_vlan_flush(struct net_bridge_port *port); | 607 | void nbp_vlan_flush(struct net_bridge_port *port); |
@@ -633,6 +645,10 @@ static inline u16 br_get_pvid(const struct net_port_vlans *v) | |||
633 | return v->pvid ?: VLAN_N_VID; | 645 | return v->pvid ?: VLAN_N_VID; |
634 | } | 646 | } |
635 | 647 | ||
648 | static inline int br_vlan_enabled(struct net_bridge *br) | ||
649 | { | ||
650 | return br->vlan_enabled; | ||
651 | } | ||
636 | #else | 652 | #else |
637 | static inline bool br_allowed_ingress(struct net_bridge *br, | 653 | static inline bool br_allowed_ingress(struct net_bridge *br, |
638 | struct net_port_vlans *v, | 654 | struct net_port_vlans *v, |
@@ -681,6 +697,14 @@ static inline bool br_vlan_find(struct net_bridge *br, u16 vid) | |||
681 | return false; | 697 | return false; |
682 | } | 698 | } |
683 | 699 | ||
700 | static inline void br_recalculate_fwd_mask(struct net_bridge *br) | ||
701 | { | ||
702 | } | ||
703 | |||
704 | static inline void br_vlan_init(struct net_bridge *br) | ||
705 | { | ||
706 | } | ||
707 | |||
684 | static inline int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags) | 708 | static inline int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags) |
685 | { | 709 | { |
686 | return -EOPNOTSUPP; | 710 | return -EOPNOTSUPP; |
@@ -719,6 +743,11 @@ static inline u16 br_get_pvid(const struct net_port_vlans *v) | |||
719 | { | 743 | { |
720 | return VLAN_N_VID; /* Returns invalid vid */ | 744 | return VLAN_N_VID; /* Returns invalid vid */ |
721 | } | 745 | } |
746 | |||
747 | static inline int br_vlan_enabled(struct net_bridge *br) | ||
748 | { | ||
749 | return 0; | ||
750 | } | ||
722 | #endif | 751 | #endif |
723 | 752 | ||
724 | /* br_netfilter.c */ | 753 | /* br_netfilter.c */ |