LINUX协议栈详解 协议处理

来源:互联网 发布:潮男淘宝店 编辑:程序博客网 时间:2024/04/29 13:14

协议处理,主要介绍了从驱动中获取数据后,如何进行分发给不同的协议处理,包括IP协议、ARP协议等处理。

__netif_receive_skb协议处理的开始,主要的数据结构是ptype_all和ptype_base,其中ptype_all是一个链表结构,ptype_base则是一个数组,并通过hash来type来实现索引。

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, orig_dev);pt_prev = ptype;}}
其中ptype_all通常用于例如抓包之类的数据处理,也就是不管什么数据包都会被接收。


type = skb->protocol;list_for_each_entry_rcu(ptype,&ptype_base[ntohs(type) & PTYPE_HASH_MASK], list) {if (ptype->type == type &&    (ptype->dev == null_or_dev || ptype->dev == skb->dev ||     ptype->dev == orig_dev)) {if (pt_prev)ret = deliver_skb(skb, pt_prev, orig_dev);pt_prev = ptype;}}
ptype_base则是通过具体的type来索引处理函数。

现在有几个问题,

1,什么时候注册的?

注册是通过dev_add_pack来实现的,

IP协议 

static struct packet_type ip_packet_type __read_mostly = {.type = cpu_to_be16(ETH_P_IP),.func = ip_rcv,.gso_send_check = inet_gso_send_check,.gso_segment = inet_gso_segment,.gro_receive = inet_gro_receive,.gro_complete = inet_gro_complete,};

在inet_init调用dev_add_pack来注册。

ARP协议

static struct packet_type arp_packet_type __read_mostly = {.type =cpu_to_be16(ETH_P_ARP),.func =arp_rcv,};

所有处理的协议号

/* *These are the defined Ethernet Protocol ID's. */#define ETH_P_LOOP0x0060/* Ethernet Loopback packet*/#define ETH_P_PUP0x0200/* Xerox PUP packet*/#define ETH_P_PUPAT0x0201/* Xerox PUP Addr Trans packet*/#define ETH_P_IP0x0800/* Internet Protocol packet*/#define ETH_P_X250x0805/* CCITT X.25*/#define ETH_P_ARP0x0806/* Address Resolution packet*/#defineETH_P_BPQ0x08FF/* G8BPQ AX.25 Ethernet Packet[ NOT AN OFFICIALLY REGISTERED ID ] */#define ETH_P_IEEEPUP0x0a00/* Xerox IEEE802.3 PUP packet */#define ETH_P_IEEEPUPAT0x0a01/* Xerox IEEE802.3 PUP Addr Trans packet */#define ETH_P_DEC       0x6000          /* DEC Assigned proto           */#define ETH_P_DNA_DL    0x6001          /* DEC DNA Dump/Load            */#define ETH_P_DNA_RC    0x6002          /* DEC DNA Remote Console       */#define ETH_P_DNA_RT    0x6003          /* DEC DNA Routing              */#define ETH_P_LAT       0x6004          /* DEC LAT                      */#define ETH_P_DIAG      0x6005          /* DEC Diagnostics              */#define ETH_P_CUST      0x6006          /* DEC Customer use             */#define ETH_P_SCA       0x6007          /* DEC Systems Comms Arch       */#define ETH_P_TEB0x6558/* Trans Ether Bridging*/#define ETH_P_RARP      0x8035/* Reverse Addr Res packet*/#define ETH_P_ATALK0x809B/* Appletalk DDP*/#define ETH_P_AARP0x80F3/* Appletalk AARP*/#define ETH_P_8021Q0x8100          /* 802.1Q VLAN Extended Header  */#define ETH_P_IPX0x8137/* IPX over DIX*/#define ETH_P_IPV60x86DD/* IPv6 over bluebook*/#define ETH_P_PAUSE0x8808/* IEEE Pause frames. See 802.3 31B */#define ETH_P_SLOW0x8809/* Slow Protocol. See 802.3ad 43B */#define ETH_P_WCCP0x883E/* Web-cache coordination protocol * defined in draft-wilson-wrec-wccp-v2-00.txt */#define ETH_P_PPP_DISC0x8863/* PPPoE discovery messages     */#define ETH_P_PPP_SES0x8864/* PPPoE session messages*/#define ETH_P_MPLS_UC0x8847/* MPLS Unicast traffic*/#define ETH_P_MPLS_MC0x8848/* MPLS Multicast traffic*/#define ETH_P_ATMMPOA0x884c/* MultiProtocol Over ATM*/#define ETH_P_LINK_CTL0x886c/* HPNA, wlan link local tunnel */#define ETH_P_ATMFATE0x8884/* Frame-based ATM Transport * over Ethernet */#define ETH_P_PAE0x888E/* Port Access Entity (IEEE 802.1X) */#define ETH_P_AOE0x88A2/* ATA over Ethernet*/#define ETH_P_TIPC0x88CA/* TIPC */#define ETH_P_15880x88F7/* IEEE 1588 Timesync */#define ETH_P_FCOE0x8906/* Fibre Channel over Ethernet  */#define ETH_P_FIP0x8914/* FCoE Initialization Protocol */#define ETH_P_EDSA0xDADA/* Ethertype DSA [ NOT AN OFFICIALLY REGISTERED ID ] *//* *Non DIX types. Won't clash for 1500 types. */#define ETH_P_802_30x0001/* Dummy type for 802.3 frames  */#define ETH_P_AX250x0002/* Dummy protocol id for AX.25  */#define ETH_P_ALL0x0003/* Every packet (be careful!!!) */#define ETH_P_802_20x0004/* 802.2 frames */#define ETH_P_SNAP0x0005/* Internal only*/#define ETH_P_DDCMP     0x0006          /* DEC DDCMP: Internal only     */#define ETH_P_WAN_PPP   0x0007          /* Dummy type for WAN PPP frames*/#define ETH_P_PPP_MP    0x0008          /* Dummy type for PPP MP frames */#define ETH_P_LOCALTALK 0x0009/* Localtalk pseudo type */#define ETH_P_CAN0x000C/* Controller Area Network      */#define ETH_P_PPPTALK0x0010/* Dummy type for Atalk over PPP*/#define ETH_P_TR_802_20x0011/* 802.2 frames */#define ETH_P_MOBITEX0x0015/* Mobitex (kaz@cafe.net)*/#define ETH_P_CONTROL0x0016/* Card specific control frames */#define ETH_P_IRDA0x0017/* Linux-IrDA*/#define ETH_P_ECONET0x0018/* Acorn Econet*/#define ETH_P_HDLC0x0019/* HDLC frames*/#define ETH_P_ARCNET0x001A/* 1A for ArcNet :-)            */#define ETH_P_DSA0x001B/* Distributed Switch Arch.*/#define ETH_P_TRAILER0x001C/* Trailer switch tagging*/#define ETH_P_PHONET0x00F5/* Nokia Phonet frames          */#define ETH_P_IEEE802154 0x00F6/* IEEE802.15.4 frame*/#define ETH_P_CAIF0x00F7/* ST-Ericsson CAIF protocol*/

2,什么时候赋值skb->protocol

由驱动负责给protocol赋值,且通过eth_type_trans赋值,同时skb->pkt_type也是在这个函数中赋值的。

/* Packet types */#define PACKET_HOST0/* To us*/#define PACKET_BROADCAST1/* To all*/#define PACKET_MULTICAST2/* To group*/#define PACKET_OTHERHOST3/* To someone else */#define PACKET_OUTGOING4/* Outgoing of any type */

到现在我们知道了协议处理过程,也就很自然的进入了具体协议等研究,例如ARP的处理,IP数据包的处理等。

后面将深入讲解IP协议、路由过程(包括策略路由)和邻居系统,整一个是同一有机体。这之前我们还会深入一些TC系统的研究,对TC的研究有助于巩固对数据包发送过程的理解;还有一个重要的是网桥的研究,网桥其实作为单独一章来讲解,并不会非常的深入,只是大体讲解网桥的过程,曾经参与过项目,将网桥和VLAN是合在一起的,具体可以参考LISA(http://lisa.mindbit.ro/)。



原创粉丝点击