您现在的位置:首页 >> IPv6技术前沿 >> 内容

Linux中ipv6代码阅读(1)

时间:2010/3/4 15:46:53 点击:2414

  核心提示:1. 从网络中接收数据报文的时候,涉及到两个终端。一个是硬中断,一个是软中断。 (1).硬中断的中断处理函数是在驱动中注册,一般在device open()函数或者 device init()函数中注册,使用request_irq()来注册硬中断处理函数。当网卡接收到数据的时候,就会调用这个终端处理...

1. 从网络中接收数据报文的时候,涉及到两个终端。一个是硬中断,一个是软中断。
(1).硬中断的中断处理函数是在驱动中注册,一般在device open()函数或者 device init()函数中注册,使用request_irq()来注册硬中断处理函数。当网卡接收到数据的时候,就会调用这个终端处理函数来处理。比如8139too.c函数就用  retval = request_irq (dev->irq, rtl8139_interrupt, SA_SHIRQ, dev->name, dev)来注册硬中断处理函数。

(2)软中断是通过NET_RX_SOFTIRQ信号来触发的,处理函数是net_rx_action。注册函数是open_softirq(NET_RX_SOFTIRQ, net_rx_action, NULL)。触发这个中断信号(raise irq)一般是在硬中断处理流程中,当硬中断处理基本结束的时候,通过调用__raise_softirq_irqoff(NET_RX_SOFTIRQ)来触发这个中断。

2.接收软中断(net_rx_action)主要还是通过调用驱动中的poll的方法进行接收。在poll方法中,会提取接收包,根据它所在的设备和协议类型传递给各自的包处理器。以rtl8139_poll为例,它会调用rtl8139_rx()来把尽可能多的数据在一次中断处理中处理完,而不是一个软中断只处理一个数据包,这样可以提高效率。每个数据包都会通过netif_receive_skb()函数,根据报文的协议类型,调用上层的包处理器。如果网卡本身驱动没有poll函数,将是调用bakclog_dev的process_backlog函数。

3.包处理器用dev_add_pack()注册,如果注册的设备号是零则表明它接收所有设备的包, 如果注册的包类型是(ETH_P_ALL), 则表示它接收所有类型的包。在netif_receive_skb()中将数据包传递给对应的协议处理函数。对于ipv4,就是在af_inet.c中的inet_init()函数中,初始化了ip_packet_type.func = ip_rcv,因此,ip_rcv()将接收ipv4的报文。对于ipv6,则在af_inet6.c中的inet6_init()函数中完成初始化。

4. 扣除tc模块,linux内核网络部分的收发结构图。

作者:IPv6edu.com 来源:网络


共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • IPv6教育(www.ipv6edu.com) © 2017 版权所有 All Rights Reserved.
  • Email:master@ipv6edu.com 京ICP备09058832号
  • Powered by ipv6edu!