skb->dst = (struct dst_entry*)rth; return 0; } RT_CACHE_STAT_INC(in_hlist_search); } 所以很清晰的看到匹配的所有字段。下面看看我们构造一下在cache中查找的结构图: 首先通过hash找到这个队列首部的chain,然后在chain的队列中进行匹配,如果匹配到那么OK,否则进行完整的查询。
struct dst_entry dst; // 这是目的地址 } u; /* Cache lookup keys */ struct flowi fl; // 注意在cache中的查找主要是通过路由键值和下面的信息 struct in_device *idev; // 设备 int rt_genid; // 路由id unsigned rt_flags; // 标识 __u16 rt_type; // 路由类型 __be32 rt_dst; //...
netfilter(PRE_ROUTING) ip_rcv_finish,其中对路由子系统的dst_entry进行赋值,决定包应该被转发还是到本地协议栈 dst_input 会调用 dst_entry 变量中的input接口,如果包是本地包,则接口是 ip_local_deliver,否则是 ip_forward,其中调用netfilter(FORWARD) ip_local_deliver 中先调用 ip_defrag 使得IP分片重组,然...
进入数据链路层,ARP协议开始工作*/ { struct dst_entry *dst = skb->dst; /*路由信息*/ struct hh_cache *hh = dst->hh; /*二层头MAC信息*/ struct net_device *dev = dst->dev;/*出接口*/ int hh_len = LL_RESERVED_SPACE(dev); /* Be paranoid, rather than too clever. ...
structdst_entrydst//这个结构由路由子系统使用。charcb[40]//“控制缓冲区”,为每一层内部起维护作用。unsignedintcsum//校验和。unsignedcharip_summed//状态标识。unsignedcharcloned//相当于一个boolean标识位,改结构是不是另一个sk_buf拷贝来的。unsignedcharpkt_type//根据帧的L2目的地址进行划分。__u32 ...
1、若查找到,则将dst->neighbour指向该neighbour项 2、若没有查找到,则调用neigh_create创建一个邻居表项并加入到arp_table的邻居表项链表中,并将dst->neighbour指向该neighbour项 int arp_bind_neighbour(struct dst_entry *dst) { struct net_device *dev = dst->dev; ...
如果至时找到了路由,则根据路由信息分配个dst_entry,并调用arp_bind_neighbour为之绑定邻居output指针赋值为ip_output 转到执行ip_output ip_outputà__ip_finish_output() -àip_finish_output2()àdst->neighbour->output() 现在就转至邻居项的出口函数了。关于上述详细流程,将在以后的学习中继续给出 ...
在Linux内核 3.5版本之前,路由子系统存在一个路由cache哈希表,它缓存了最近最经常使用的一些dst_entry(IPv4即rtable)路由项,对数据包 首先以其IP地址元组信息查找路由cache,如果命中便可以直接取出dst_entry,否则再去查找系统路由表。 在3.5内核中,路由 cache不见了,具体缘由不是本文的重点,已有其它文章描述,路由cach...
struct ipv6hdr*ipv6h;unsigned char*raw;}h;/*四层协议首部*/union{struct iphdr*iph;struct ipv6hdr*ipv6h;struct arphdr*arph;unsigned char*raw;}nh;/*三层协议首部*/union{unsigned char*raw;}mac;/*二层协议首部*//*目的路由缓存项*/struct dst_entry*dst;/*IPSec协议用来跟踪传输的信息*/...
dst_entry:包的去向接口,描述了包的去留,下一跳等路由关键信息。 napi_struct:NAPI 调度的结构。NAPI 是 Linux 上采用的一种提高网络处理效率的技术,它的核心概念就是不采用中断的方式读取数据,而代之以首先采用中断唤醒数据接收服务,然后采用 poll 的方法来轮询数据。NAPI 技术适用于高速率的短长度数据包的处理...