br_private.h (320424c7d44f54c18df9812fd7c45f6963524002) br_private.h (9632233e7de8da43711bb7cd3e054af32fedcc38)
1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/*
3 * Linux ethernet bridge
4 *
5 * Authors:
6 * Lennert Buytenhek <buytenh@gnu.org>
7 */
8

--- 75 unchanged lines hidden (view full) ---

84
85/* IGMP/MLD statistics */
86struct bridge_mcast_stats {
87 struct br_mcast_stats mstats;
88 struct u64_stats_sync syncp;
89};
90#endif
91
1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/*
3 * Linux ethernet bridge
4 *
5 * Authors:
6 * Lennert Buytenhek <buytenh@gnu.org>
7 */
8

--- 75 unchanged lines hidden (view full) ---

84
85/* IGMP/MLD statistics */
86struct bridge_mcast_stats {
87 struct br_mcast_stats mstats;
88 struct u64_stats_sync syncp;
89};
90#endif
91
92/* net_bridge_mcast_port must be always defined due to forwarding stubs */
93struct net_bridge_mcast_port {
94#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
95 struct net_bridge_port *port;
96
97 struct bridge_mcast_own_query ip4_own_query;
98 struct timer_list ip4_mc_router_timer;
99 struct hlist_node ip4_rlist;
100#if IS_ENABLED(CONFIG_IPV6)
101 struct bridge_mcast_own_query ip6_own_query;
102 struct timer_list ip6_mc_router_timer;
103 struct hlist_node ip6_rlist;
104#endif /* IS_ENABLED(CONFIG_IPV6) */
105 unsigned char multicast_router;
106#endif /* CONFIG_BRIDGE_IGMP_SNOOPING */
107};
108
92struct br_tunnel_info {
93 __be64 tunnel_id;
94 struct metadata_dst __rcu *tunnel_dst;
95};
96
97/* private vlan flags */
98enum {
99 BR_VLFLAG_PER_PORT_STATS = BIT(0),

--- 200 unchanged lines hidden (view full) ---

300 unsigned long designated_age;
301
302 struct timer_list forward_delay_timer;
303 struct timer_list hold_timer;
304 struct timer_list message_age_timer;
305 struct kobject kobj;
306 struct rcu_head rcu;
307
109struct br_tunnel_info {
110 __be64 tunnel_id;
111 struct metadata_dst __rcu *tunnel_dst;
112};
113
114/* private vlan flags */
115enum {
116 BR_VLFLAG_PER_PORT_STATS = BIT(0),

--- 200 unchanged lines hidden (view full) ---

317 unsigned long designated_age;
318
319 struct timer_list forward_delay_timer;
320 struct timer_list hold_timer;
321 struct timer_list message_age_timer;
322 struct kobject kobj;
323 struct rcu_head rcu;
324
325 struct net_bridge_mcast_port multicast_ctx;
326
308#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
327#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
309 struct bridge_mcast_own_query ip4_own_query;
310#if IS_ENABLED(CONFIG_IPV6)
311 struct bridge_mcast_own_query ip6_own_query;
312#endif /* IS_ENABLED(CONFIG_IPV6) */
328 struct bridge_mcast_stats __percpu *mcast_stats;
329
313 u32 multicast_eht_hosts_limit;
314 u32 multicast_eht_hosts_cnt;
330 u32 multicast_eht_hosts_limit;
331 u32 multicast_eht_hosts_cnt;
315 unsigned char multicast_router;
316 struct bridge_mcast_stats __percpu *mcast_stats;
317 struct timer_list multicast_router_timer;
318 struct hlist_head mglist;
332 struct hlist_head mglist;
319 struct hlist_node rlist;
320#endif
321
322#ifdef CONFIG_SYSFS
323 char sysfs_name[IFNAMSIZ];
324#endif
325
326#ifdef CONFIG_NET_POLL_CONTROLLER
327 struct netpoll *np;

--- 116 unchanged lines hidden (view full) ---

444 unsigned long multicast_query_response_interval;
445 unsigned long multicast_startup_query_interval;
446
447 struct rhashtable mdb_hash_tbl;
448 struct rhashtable sg_port_tbl;
449
450 struct hlist_head mcast_gc_list;
451 struct hlist_head mdb_list;
333#endif
334
335#ifdef CONFIG_SYSFS
336 char sysfs_name[IFNAMSIZ];
337#endif
338
339#ifdef CONFIG_NET_POLL_CONTROLLER
340 struct netpoll *np;

--- 116 unchanged lines hidden (view full) ---

457 unsigned long multicast_query_response_interval;
458 unsigned long multicast_startup_query_interval;
459
460 struct rhashtable mdb_hash_tbl;
461 struct rhashtable sg_port_tbl;
462
463 struct hlist_head mcast_gc_list;
464 struct hlist_head mdb_list;
452 struct hlist_head router_list;
453
465
454 struct timer_list multicast_router_timer;
466 struct hlist_head ip4_mc_router_list;
467 struct timer_list ip4_mc_router_timer;
455 struct bridge_mcast_other_query ip4_other_query;
456 struct bridge_mcast_own_query ip4_own_query;
457 struct bridge_mcast_querier ip4_querier;
458 struct bridge_mcast_stats __percpu *mcast_stats;
459#if IS_ENABLED(CONFIG_IPV6)
468 struct bridge_mcast_other_query ip4_other_query;
469 struct bridge_mcast_own_query ip4_own_query;
470 struct bridge_mcast_querier ip4_querier;
471 struct bridge_mcast_stats __percpu *mcast_stats;
472#if IS_ENABLED(CONFIG_IPV6)
473 struct hlist_head ip6_mc_router_list;
474 struct timer_list ip6_mc_router_timer;
460 struct bridge_mcast_other_query ip6_other_query;
461 struct bridge_mcast_own_query ip6_own_query;
462 struct bridge_mcast_querier ip6_querier;
463#endif /* IS_ENABLED(CONFIG_IPV6) */
464 struct work_struct mcast_gc_work;
465#endif
466
467 struct timer_list hello_timer;

--- 391 unchanged lines hidden (view full) ---

859static inline bool br_group_is_l2(const struct br_ip *group)
860{
861 return group->proto == 0;
862}
863
864#define mlock_dereference(X, br) \
865 rcu_dereference_protected(X, lockdep_is_held(&br->multicast_lock))
866
475 struct bridge_mcast_other_query ip6_other_query;
476 struct bridge_mcast_own_query ip6_own_query;
477 struct bridge_mcast_querier ip6_querier;
478#endif /* IS_ENABLED(CONFIG_IPV6) */
479 struct work_struct mcast_gc_work;
480#endif
481
482 struct timer_list hello_timer;

--- 391 unchanged lines hidden (view full) ---

874static inline bool br_group_is_l2(const struct br_ip *group)
875{
876 return group->proto == 0;
877}
878
879#define mlock_dereference(X, br) \
880 rcu_dereference_protected(X, lockdep_is_held(&br->multicast_lock))
881
867static inline bool br_multicast_is_router(struct net_bridge *br)
882static inline struct hlist_node *
883br_multicast_get_first_rport_node(struct net_bridge *b, struct sk_buff *skb) {
884#if IS_ENABLED(CONFIG_IPV6)
885 if (skb->protocol == htons(ETH_P_IPV6))
886 return rcu_dereference(hlist_first_rcu(&b->ip6_mc_router_list));
887#endif
888 return rcu_dereference(hlist_first_rcu(&b->ip4_mc_router_list));
889}
890
891static inline struct net_bridge_port *
892br_multicast_rport_from_node_skb(struct hlist_node *rp, struct sk_buff *skb) {
893 struct net_bridge_mcast_port *mctx;
894
895#if IS_ENABLED(CONFIG_IPV6)
896 if (skb->protocol == htons(ETH_P_IPV6))
897 mctx = hlist_entry_safe(rp, struct net_bridge_mcast_port,
898 ip6_rlist);
899 else
900#endif
901 mctx = hlist_entry_safe(rp, struct net_bridge_mcast_port,
902 ip4_rlist);
903
904 if (mctx)
905 return mctx->port;
906 else
907 return NULL;
908}
909
910static inline bool br_ip4_multicast_is_router(struct net_bridge *br)
868{
911{
869 return br->multicast_router == 2 ||
870 (br->multicast_router == 1 &&
871 timer_pending(&br->multicast_router_timer));
912 return timer_pending(&br->ip4_mc_router_timer);
872}
873
913}
914
915static inline bool br_ip6_multicast_is_router(struct net_bridge *br)
916{
917#if IS_ENABLED(CONFIG_IPV6)
918 return timer_pending(&br->ip6_mc_router_timer);
919#else
920 return false;
921#endif
922}
923
874static inline bool
924static inline bool
925br_multicast_is_router(struct net_bridge *br, struct sk_buff *skb)
926{
927 switch (br->multicast_router) {
928 case MDB_RTR_TYPE_PERM:
929 return true;
930 case MDB_RTR_TYPE_TEMP_QUERY:
931 if (skb) {
932 if (skb->protocol == htons(ETH_P_IP))
933 return br_ip4_multicast_is_router(br);
934 else if (skb->protocol == htons(ETH_P_IPV6))
935 return br_ip6_multicast_is_router(br);
936 } else {
937 return br_ip4_multicast_is_router(br) ||
938 br_ip6_multicast_is_router(br);
939 }
940 fallthrough;
941 default:
942 return false;
943 }
944}
945
946static inline bool
875__br_multicast_querier_exists(struct net_bridge *br,
876 struct bridge_mcast_other_query *querier,
877 const bool is_ipv6)
878{
879 bool own_querier_enabled;
880
881 if (br_opt_get(br, BROPT_MULTICAST_QUERIER)) {
882 if (is_ipv6 && !br_opt_get(br, BROPT_HAS_IPV6_ADDR))

--- 129 unchanged lines hidden (view full) ---

1012}
1013
1014static inline void br_multicast_flood(struct net_bridge_mdb_entry *mdst,
1015 struct sk_buff *skb,
1016 bool local_rcv, bool local_orig)
1017{
1018}
1019
947__br_multicast_querier_exists(struct net_bridge *br,
948 struct bridge_mcast_other_query *querier,
949 const bool is_ipv6)
950{
951 bool own_querier_enabled;
952
953 if (br_opt_get(br, BROPT_MULTICAST_QUERIER)) {
954 if (is_ipv6 && !br_opt_get(br, BROPT_HAS_IPV6_ADDR))

--- 129 unchanged lines hidden (view full) ---

1084}
1085
1086static inline void br_multicast_flood(struct net_bridge_mdb_entry *mdst,
1087 struct sk_buff *skb,
1088 bool local_rcv, bool local_orig)
1089{
1090}
1091
1020static inline bool br_multicast_is_router(struct net_bridge *br)
1092static inline bool br_multicast_is_router(struct net_bridge *br,
1093 struct sk_buff *skb)
1021{
1022 return false;
1023}
1024
1025static inline bool br_multicast_querier_exists(struct net_bridge *br,
1026 struct ethhdr *eth,
1027 const struct net_bridge_mdb_entry *mdb)
1028{

--- 568 unchanged lines hidden (view full) ---

1597void nbp_switchdev_frame_mark(const struct net_bridge_port *p,
1598 struct sk_buff *skb);
1599bool nbp_switchdev_allowed_egress(const struct net_bridge_port *p,
1600 const struct sk_buff *skb);
1601int br_switchdev_set_port_flag(struct net_bridge_port *p,
1602 unsigned long flags,
1603 unsigned long mask,
1604 struct netlink_ext_ack *extack);
1094{
1095 return false;
1096}
1097
1098static inline bool br_multicast_querier_exists(struct net_bridge *br,
1099 struct ethhdr *eth,
1100 const struct net_bridge_mdb_entry *mdb)
1101{

--- 568 unchanged lines hidden (view full) ---

1670void nbp_switchdev_frame_mark(const struct net_bridge_port *p,
1671 struct sk_buff *skb);
1672bool nbp_switchdev_allowed_egress(const struct net_bridge_port *p,
1673 const struct sk_buff *skb);
1674int br_switchdev_set_port_flag(struct net_bridge_port *p,
1675 unsigned long flags,
1676 unsigned long mask,
1677 struct netlink_ext_ack *extack);
1605void br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb,
1606 int type);
1678void br_switchdev_fdb_notify(struct net_bridge *br,
1679 const struct net_bridge_fdb_entry *fdb, int type);
1607int br_switchdev_port_vlan_add(struct net_device *dev, u16 vid, u16 flags,
1608 struct netlink_ext_ack *extack);
1609int br_switchdev_port_vlan_del(struct net_device *dev, u16 vid);
1610
1611static inline void br_switchdev_frame_unmark(struct sk_buff *skb)
1612{
1613 skb->offload_fwd_mark = 0;
1614}

--- 30 unchanged lines hidden (view full) ---

1645}
1646
1647static inline int br_switchdev_port_vlan_del(struct net_device *dev, u16 vid)
1648{
1649 return -EOPNOTSUPP;
1650}
1651
1652static inline void
1680int br_switchdev_port_vlan_add(struct net_device *dev, u16 vid, u16 flags,
1681 struct netlink_ext_ack *extack);
1682int br_switchdev_port_vlan_del(struct net_device *dev, u16 vid);
1683
1684static inline void br_switchdev_frame_unmark(struct sk_buff *skb)
1685{
1686 skb->offload_fwd_mark = 0;
1687}

--- 30 unchanged lines hidden (view full) ---

1718}
1719
1720static inline int br_switchdev_port_vlan_del(struct net_device *dev, u16 vid)
1721{
1722 return -EOPNOTSUPP;
1723}
1724
1725static inline void
1653br_switchdev_fdb_notify(const struct net_bridge_fdb_entry *fdb, int type)
1726br_switchdev_fdb_notify(struct net_bridge *br,
1727 const struct net_bridge_fdb_entry *fdb, int type)
1654{
1655}
1656
1657static inline void br_switchdev_frame_unmark(struct sk_buff *skb)
1658{
1659}
1660#endif /* CONFIG_NET_SWITCHDEV */
1661
1662/* br_arp_nd_proxy.c */
1663void br_recalculate_neigh_suppress_enabled(struct net_bridge *br);
1664void br_do_proxy_suppress_arp(struct sk_buff *skb, struct net_bridge *br,
1665 u16 vid, struct net_bridge_port *p);
1666void br_do_suppress_nd(struct sk_buff *skb, struct net_bridge *br,
1667 u16 vid, struct net_bridge_port *p, struct nd_msg *msg);
1668struct nd_msg *br_is_nd_neigh_msg(struct sk_buff *skb, struct nd_msg *m);
1669#endif
1728{
1729}
1730
1731static inline void br_switchdev_frame_unmark(struct sk_buff *skb)
1732{
1733}
1734#endif /* CONFIG_NET_SWITCHDEV */
1735
1736/* br_arp_nd_proxy.c */
1737void br_recalculate_neigh_suppress_enabled(struct net_bridge *br);
1738void br_do_proxy_suppress_arp(struct sk_buff *skb, struct net_bridge *br,
1739 u16 vid, struct net_bridge_port *p);
1740void br_do_suppress_nd(struct sk_buff *skb, struct net_bridge *br,
1741 u16 vid, struct net_bridge_port *p, struct nd_msg *msg);
1742struct nd_msg *br_is_nd_neigh_msg(struct sk_buff *skb, struct nd_msg *m);
1743#endif