Linux-net-bridge网桥-br_arp_nd_proxy.c
2021/9/21 7:28:52
本文主要是介绍Linux-net-bridge网桥-br_arp_nd_proxy.c,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
/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
变量就代表了一个数据报,可以在系统中流转。完整地包含了一个数据报所需的全部内容和相关信息与属性。
三、函数
-
br_recalculate_neigh_suppress_enabled
:设置是否允许进行流控。
void br_recalculate_neigh_suppress_enabled(struct net_bridge *br)
-
br_arp_send
:通过src_ip
和dest_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)
-
br_chk_addr_ip
:判断指定设备于IP是否相符。
static int br_chk_addr_ip(struct net_device *dev, struct netdev_nested_priv *priv)
-
br_is_local_ip
:检查IP是否是该设备或上层设备的IP。
static bool br_is_local_ip(struct net_device *dev, __be32 ip)
-
br_do_proxy_suppress_arp
:向支持BR_NEIGH_SUPPRESS
或BR_PROXYARP_WIFI
的端口发送ARP报文。
void br_do_proxy_suppress_arp(struct sk_buff *skb, struct net_bridge *br, u16 vid, struct net_bridge_port *p)
-
br_is_nd_neigh_msg
:打开CONFIG_IPV6
才有效。判断是否是IP6的邻居发现协议。
struct nd_msg *br_is_nd_neigh_msg(struct sk_buff *skb, struct nd_msg *msg)
-
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)
-
br_chk_addr_ip6
:检查设备与IP6的地址是否相符。
static int br_chk_addr_ip6(struct net_device *dev, struct netdev_nested_priv *priv)
-
br_is_local_ip6
:检查IP6地址是否是本设备地址或上层设备地址。
static bool br_is_local_ip6(struct net_device *dev, struct in6_addr *addr)
-
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)
这篇关于Linux-net-bridge网桥-br_arp_nd_proxy.c的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-12如何创建可引导的 ESXi USB 安装介质 (macOS, Linux, Windows)
- 2024-11-08linux的 vi编辑器中搜索关键字有哪些常用的命令和技巧?-icode9专业技术文章分享
- 2024-11-08在 Linux 的 vi 或 vim 编辑器中什么命令可以直接跳到文件的结尾?-icode9专业技术文章分享
- 2024-10-22原生鸿蒙操作系统HarmonyOS NEXT(HarmonyOS 5)正式发布
- 2024-10-18操作系统入门教程:新手必看的基本操作指南
- 2024-10-18初学者必看:操作系统入门全攻略
- 2024-10-17操作系统入门教程:轻松掌握操作系统基础知识
- 2024-09-11Linux部署Scrapy学习:入门级指南
- 2024-09-11Linux部署Scrapy:入门级指南
- 2024-08-21【Linux】分区向左扩容的方法