WEB开发网
开发学院软件开发Java ip层和4层的接口实现分析 阅读

ip层和4层的接口实现分析

 2009-09-10 00:00:00 来源:WEB开发网   
核心提示: 这里要上面列出的协议,并不是所有的都在内核态handle的,其中一些经常在用户态handle的例如(IPPROTO_RSVP). 内核是通过inet_add_protocol来添加协议到inet_protos数组中的,相应的还有一个删除方法,我们先来看inet_protos的结构: 图片看不清楚

这里要上面列出的协议,并不是所有的都在内核态handle的,其中一些经常在用户态handle的例如(IPPROTO_RSVP).

内核是通过inet_add_protocol来添加协议到inet_protos数组中的,相应的还有一个删除方法,我们先来看inet_protos的结构:

ip层和4层的接口实现分析

图片看不清楚?请点击这里查看原图(大图)。 

这里要注意的就是读写inet_protos时,使用的是自旋锁,而只读时,使用的是RCU(Read-Copy Update).

然后来看inet_add_protocol的源码:

Java代码

struct net_protocol *inet_protos[MAX_INET_PROTOS] ____cacheline_aligned_in_smp; 
 
 
///这里只是举两个例子,tcp和udp的协议注册函数.我们这次暂时就不分析tcp和udp的处理函数了(我会在3层结束后,分析4层源码) 
static struct net_protocol tcp_protocol = { 
 .handler = tcp_v4_rcv, 
 .err_handler = tcp_v4_err, 
 .gso_send_check = tcp_v4_gso_send_check, 
 .gso_segment = tcp_tso_segment, 
 .no_policy = 1, 
 .netns_ok = 1, 
}; 
 
static struct net_protocol udp_protocol = { 
 .handler = udp_rcv, 
 .err_handler = udp_err, 
 .no_policy = 1, 
 .netns_ok = 1, 
}; 
 
 
int inet_add_protocol(struct net_protocol *prot, unsigned char protocol) 
{ 
 int hash, ret; 
 
///计算当前协议在数组中的slot. 
 hash = protocol & (MAX_INET_PROTOS - 1); 
 
///使用自旋锁. 
 spin_lock_bh(&inet_proto_lock); 
 if (inet_protos[hash]) { 
 ret = -1; 
 } else { 
///将相应的prot添加到数组 
 inet_protos[hash] = prot; 
 ret = 0; 
 } 
 spin_unlock_bh(&inet_proto_lock); 
 return ret; 
} 
 
 

上一页  1 2 3 4 5  下一页

Tags:ip 接口 实现

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接