当前位置:文档之家› linux协议栈之网桥实现之一

linux协议栈之网桥实现之一

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:如果找出口,则此包送至出口。

相关主题