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/)。
- LINUX协议栈详解 协议处理
- Linux 网络协议栈协议的处理
- Linux网络协议栈协议的处理
- Linux 网络协议栈协议的处理
- LINUX协议栈详解 ARP协议
- linux 协议栈分析 ip数据包处理
- Linux协议栈对vlan的处理
- LINUX协议栈详解 数据包接收
- LINUX协议栈详解 数据包发送
- LINUX协议栈详解 流控TC
- LINUX协议栈详解 网桥介绍
- Linux 之 IP协议详解
- Linux 之 TCP 协议详解
- Linux服务器--IP协议详解
- Linux服务器--TCP协议详解
- 蓝牙协议栈详解
- 【网络协议栈】Linux网络协议栈之数据包处理过程
- Linux网络协议栈之数据包处理过程
- 同步原语
- zoj 1093 Monkey and Banana 简单dP 入门
- 二阶无源RC滤波的MATLAB仿真
- malloc kmalloc vmalloc的区别
- unchecked和check控制基元类型操作
- LINUX协议栈详解 协议处理
- 使用 ftrace 调试 Linux 内核
- Inside The C++ Object Model(Note):Member Initialization List
- 关于ORACLE中JOB指定节点运行的方法
- 查看linux的系统和版本
- Vi编辑器的基本使用方法!
- Linux Shell
- 偶数求和
- Installing and Using Ftrace