return NF_HOOK(NFPROTO_IPV4, NF_INET_PRE_ROUTING, skb, dev, NULL, ip_rcv_finish); } 这里NF_HOOK是一个钩子函数,当执行完注册的钩子后就会执行到最后一个参数指向的函数ip_rcv_finish。 static int ip_rcv_finish(struct sk_buff *skb){ ... if(!skb_dst(skb)) { int err = ip_route_input...
ip_local_deliver_finish 通过数据包中的协议调用相关的勾子 本篇文章在传输层以UDP协议为例子,上面指的勾子就是 udp_rcv,查找此数据包对应的socket(UDP和TCP通过skb_buff获取socket的过程是不一样的,UDP通过目的端口和目的地址做哈希,在 udp_hslot 结构中查找,而TCP是LHTABLE),关联调用 udp_queue_rcv_skb,中...
int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev){ return NF_HOOK(NFPROTO_IPV4, NF_INET_PRE_ROUTING, skb, dev, NULL, ip_rcv_finish); } 这里NF_HOOK 是一个钩子函数,当执行完注册的钩子后就会执行到最后一个参数指向的函数 ip...
//file: net/ipv4/ip_input.cintip_rcv(structsk_buff *skb,structnet_device *dev,structpacket_type *pt,structnet_device *orig_dev) { ...returnNF_HOOK(NFPROTO_IPV4, NF_INET_PRE_ROUTING, skb, dev, NULL, ip_rcv_finish); } 这里NF_HOOK是一个钩子函数,当执行完注册的钩子后就会执行到最后...
TCP/IP协议栈和OSI参考模型对应关系 可以看到,在图中,linux为了抽象与实现相分离,将内核中的网络部分划分为五层: 系统调用接口:系统调用接口是用户空间的应用程序正常访问内核的唯一途径,系统调用一般以sys开头。 协议无关接口:协议无关接口是由socket来实现的,它提供一组通用函数来支持各种不同的协议。Linux中socket...
ip_rcv_finish); } ip_rcv 中一进来就会先对数据包做一些格式校验,避免非法数据包引起处理异常。接着,数据包会流经 netfilter 框架的一个 hook 点, 及 PRE_ROUTING, 这是数据包从网络进入主机的第一个 hook 点。在这个 hook 的点中,会执行一些钩子函数,如果数据包被放行,最终会调用 ip_rcv_finish 方法:...
2)ip_rcv_finish() 随后将分组发送到ip_rcv_finish()函数处理。根据skb结构的目的或路由信息发送到不同的处理函数。 ip_rcv_finish()函数的具体处理过程如下: 从skb->nh ( IP 头,由 netif_receive_skb 初始化)结构得到 IP 地址 struct net_device *dev = skb->dev; ...
内核实现了网络层的IP协议和传输层的TCP、UDP协议,这些协议对应的实现函数分别是ip_rcv()、tcp_v4_rcv()和udp_rcv()。 Linux内核中通过fs_initcall(文件系统初始化,类似subsys_initcall,也是初始化模块的入口)来调用inet_init进行网络协议栈的注册。inet_init将上述的协议实现函数注册到inet_protos(注册udp_rcv函数...
ip_finish_output2 填充二层头(涉及到ARP查询目的MAC) neigh_resolve_output ARP相关处理1.1 PRE_ROUTING部分函数介绍 1.1.1 ip_rcv() 此函数是接收报文时IP层的入口函数,very very 重要。它的主要功能如下: 是否发给本设备的报文(目的MAC是本设备) IP报文头部格式检查(其中包括校验和) 进入NF_IP_PRE_ROUTING...
ip_rcv_finish ip_local_deliver ip_local_deliver_finish udp_rcv udp_queue_rcv_skb 引言 对于内核网络栈的分析我在大二听了李勇大神来小组的讲座以后就想干了,但像很多主题的文章一样,始终没有勇气,也没有时间动手,我终究还是把这个话题从大二延到大三,从大三延到大四了。冥冥之中某种东西好像早已是安排好...