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...
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_defrag()进行合并多个数据包的操作,没有分片就调用ip_local_deliver_finish()。 进一步调用ip_protocol_deliver_rcu,该函数根据package 的下一个处理层的 protocal number,调用下一层接口,包括 tcp_v4_rcv (TCP), udp_rcv (UDP)。对于 TCP 来说,函数 tcp_v4_rcv 函数会被调用,...
static int ip_rcv_finish(struct sk_buff *skb) { // 通过查路由表初始化数据包的目的地缓存项 if (skb_dst(skb) == NULL) { int err = ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, skb->dev); ... } // 获取指向路由表的指针 rt = skb_rtable(skb); // 如果路由类型是...
1.tcp_v4_rcv():充当网络层与传输层的接口,传输层报文处理入口函数 2.__inet_lookup_v4_lookup():在ehash或者bhask中查找传输控制块,若无找到则进行退出, 并通过tcp_v4_send_reset(skb)发送RST段给对方,如果报文被损坏则无法发送rst,直接丢包 3.xfrm4_policy_check():进行安全检查 ...
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_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...
TCP/IP五层协议和osi的七层协议对应关系如下: 在每一层实现的协议也各不同,即每一层的服务也不同.下图列出了每层主要的协议。 1.3 Linux内核协议栈 Linux的协议栈其实是源于BSD的协议栈,它向上以及向下的接口以及协议栈本身的软件分层组织的非常好。 Linux的协议栈基于分层的设计思想,总共分为四层,从下往上依次...
内核实现了网络层的IP协议和传输层的TCP、UDP协议,这些协议对应的实现函数分别是ip_rcv()、tcp_v4_rcv()和udp_rcv()。 Linux内核中通过fs_initcall(文件系统初始化,类似subsys_initcall,也是初始化模块的入口)来调用inet_init进行网络协议栈的注册。inet_init将上述的协议实现函数注册到inet_protos(注册udp_rcv函数...
ip层收到包后会继续执行ip_rcv_finish。 代码语言:javascript 代码运行次数:0 复制 Cloud Studio代码运行 staticintip_rcv_finish(struct net*net,struct sock*sk,struct sk_buff*skb){struct net_device*dev=skb->dev;int ret;ret=ip_rcv_finish_core(net,sk,skb,dev,NULL);if(ret!=NET_RX_DROP)ret=...