ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Linux-net-bridge网桥-br_arp_nd_proxy.c

2021-09-20 14:34:10  阅读:230  来源: 互联网

标签:arp bridge struct nd 网桥 br net port


/net/bridge/br_arp_nd_proxy.c

一、介绍

br_arp_nd_proxy.c包括网桥上的ARP协议与IP6的邻居发现协议相关操作。

二、重要结构体

(一)net_bridge

br.c解析

(二)net_bridge_port

网桥端口数据结构,代表某一个端口。

struct net_bridge_port {
	struct net_bridge		*br;
	struct net_device		*dev;
	struct list_head		list;

	unsigned long			flags;
#ifdef CONFIG_BRIDGE_VLAN_FILTERING
	struct net_bridge_vlan_group	__rcu *vlgrp;
#endif
	struct net_bridge_port		__rcu *backup_port;

	/* STP */
	u8				priority;
	u8				state;
	u16				port_no;
	unsigned char			topology_change_ack;
	unsigned char			config_pending;
	port_id				port_id;
	port_id				designated_port;
	bridge_id			designated_root;
	bridge_id			designated_bridge;
	u32				path_cost;
	u32				designated_cost;
	unsigned long			designated_age;

	struct timer_list		forward_delay_timer;
	struct timer_list		hold_timer;
	struct timer_list		message_age_timer;
	struct kobject			kobj;
	struct rcu_head			rcu;

#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
	struct bridge_mcast_own_query	ip4_own_query;
	struct timer_list		ip4_mc_router_timer;
	struct hlist_node		ip4_rlist;
#if IS_ENABLED(CONFIG_IPV6)
	struct bridge_mcast_own_query	ip6_own_query;
	struct timer_list		ip6_mc_router_timer;
	struct hlist_node		ip6_rlist;
#endif /* IS_ENABLED(CONFIG_IPV6) */
	u32				multicast_eht_hosts_limit;
	u32				multicast_eht_hosts_cnt;
	unsigned char			multicast_router;
	struct bridge_mcast_stats	__percpu *mcast_stats;
	struct hlist_head		mglist;
#endif

#ifdef CONFIG_SYSFS
	char				sysfs_name[IFNAMSIZ];
#endif

#ifdef CONFIG_NET_POLL_CONTROLLER
	struct netpoll			*np;
#endif
#ifdef CONFIG_NET_SWITCHDEV
	int				offload_fwd_mark;
#endif
	u16				group_fwd_mask;
	u16				backup_redirected_cnt;

	struct bridge_stp_xstats	stp_xstats;
};

(三)sk_buff

sk_buff的定义在/include/linux/skbuff.h里,内容发非常多。

简单的说,一个skb_buff变量就代表了一个数据报,可以在系统中流转。完整地包含了一个数据报所需的全部内容和相关信息与属性。

三、函数

  1. br_recalculate_neigh_suppress_enabled:设置是否允许进行流控。
    void br_recalculate_neigh_suppress_enabled(struct net_bridge *br)

  2. br_arp_send:通过src_ipdest_ip数据发送ARP报文。

static void br_arp_send(struct net_bridge *br, struct net_bridge_port *p,
			struct net_device *dev, __be32 dest_ip, __be32 src_ip,
			const unsigned char *dest_hw,
			const unsigned char *src_hw,
			const unsigned char *target_hw,
			__be16 vlan_proto, u16 vlan_tci)
  1. br_chk_addr_ip:判断指定设备于IP是否相符。
    static int br_chk_addr_ip(struct net_device *dev, struct netdev_nested_priv *priv)

  2. br_is_local_ip:检查IP是否是该设备或上层设备的IP。
    static bool br_is_local_ip(struct net_device *dev, __be32 ip)

  3. br_do_proxy_suppress_arp:向支持BR_NEIGH_SUPPRESSBR_PROXYARP_WIFI的端口发送ARP报文。

void br_do_proxy_suppress_arp(struct sk_buff *skb, struct net_bridge *br,
			      u16 vid, struct net_bridge_port *p)
  1. br_is_nd_neigh_msg:打开CONFIG_IPV6才有效。判断是否是IP6的邻居发现协议。
    struct nd_msg *br_is_nd_neigh_msg(struct sk_buff *skb, struct nd_msg *msg)

  2. br_nd_send:发送IP6的邻居发现协议报文。

static void br_nd_send(struct net_bridge *br, struct net_bridge_port *p,
		       struct sk_buff *request, struct neighbour *n,
		       __be16 vlan_proto, u16 vlan_tci, struct nd_msg *ns)
  1. br_chk_addr_ip6:检查设备与IP6的地址是否相符。
    static int br_chk_addr_ip6(struct net_device *dev, struct netdev_nested_priv *priv)

  2. br_is_local_ip6:检查IP6地址是否是本设备地址或上层设备地址。
    static bool br_is_local_ip6(struct net_device *dev, struct in6_addr *addr)

  3. br_do_suppress_nd:发送IP6的流控帧。

void br_do_suppress_nd(struct sk_buff *skb, struct net_bridge *br,
		       u16 vid, struct net_bridge_port *p, struct nd_msg *msg)

标签:arp,bridge,struct,nd,网桥,br,net,port
来源: https://blog.csdn.net/qq_41627408/article/details/120390899

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有