linux协议栈之网桥实现之一
网卡驱动最个函数netif_receive_skb.就从说起。简单起见,去掉里面预编译代码int netif_receive_skb(struct
sk_buff *skb) (net/core/dev.c)
{
struct packet_type *ptype, *pt_prev;
int ret = NET_RX_DROP;
unsigned short type;
//打接收时间戳
if (!skb->_sec)
net_timestamp(&skb->stamp);
//如果存dev->master。则更新相应指针
skb_bond(skb);
//更新CPU接收统计数据
__get_cpu_var(netdev_rx_stat).total++;
skb->h.raw = skb->nh.raw = skb->data;
skb->mac_len = skb->nh.raw -
skb->mac.raw;
pt_prev = NULL;
rcu_read_lock();
//处理所有协议模块
list_for_each_entry_rcu(ptype, &ptype_all, list) {
if (!ptype->dev || ptype->dev == skb->dev) {
if (pt_prev)
ret =
deliver_skb(skb, pt_prev);
pt_prev = ptype;
}
}
//分片处理
handle_diverter(skb);
//网桥处理
if (handle_bridge(&skb, &pt_prev,
&ret))
goto out;
type = skb->protocol;
//协议调相应模块处理。
list_for_each_entry_rcu(ptype,
&ptype_base[ntohs(type)&15], list) {
if (ptype->type == type
&&
(!ptype->dev || ptype->dev == skb->dev)) {
if (pt_prev)
ret =
deliver_skb(skb, pt_prev);
pt_prev = ptype;
}
}
if (pt_prev) {
ret = pt_prev->func(skb,
skb->dev, pt_prev);
} else {
kfree_skb(skb);
/* Jamal, now you will not able to escape explaining
* me how you were going to use this. :-)
*/
ret = NET_RX_DROP;
}
out:
rcu_read_unlock();
return ret;
}此函数主完成分片重组,网桥处理,根据不同协议调不同传输层处理模块。本节重点概述linux网桥实现处理。传输层协议分层续章节陆续给出。进入网桥处理代码:#if defined(CONFIG_BRIDGE) || defined
(CONFIG_BRIDGE_MODULE)
(net/core/dev.c)
int (*br_handle_frame_hook)(struct net_bridge_port *p, struct sk_buff **pskb);
static __inline__ int handle_bridge(struct sk_buff **pskb,
struct packet_type **pt_prev, int *ret)
{
struct net_bridge_port *port;
//回环接口?非以太网接口?
if ((*pskb)->pkt_type ==
PACKET_LOOPBACK ||
(port =
rcu_dereference((*pskb)->dev->br_port)) == NULL)
return 0;
if (*pt_prev) {
*ret = deliver_skb(*pskb, *pt_prev);
*pt_prev = NULL;
}
// br_handle_frame_hook个全局函数指针
return br_handle_frame_hook(port, pskb);
}
#else
#define handle_bridge(skb, pt_prev, ret) (0)
#endif
从此以看出。如果编译时候选择网桥模式,则进入网桥处理模块,否则,只个空函数,直接返回。
br_handle_frame_hook代表函数什么呢?网桥数据处理框架又什么样呢?
关于网桥:
网桥个二层设备,深入以当成个二层交换机。二层协议转发数据。网桥转发数据,维持个端口MAC应表,通常通CAM表。根据这张表以数据送往相应端口进行发送.网桥转发过程:1:接收个包。判断自己CAM表否含包此包源地址.如果没有,则源地址端口更新至于CAM表.2:判断包否送给本机,如果,则送往本机层协议栈处理。如果不,则查寻CAM表。找相应出口。3:如果找出口,则此包送至出口。