r_table: RT_TABLE_MAIN, // 指向主路由表 r_action: RTN_UNICAST, // 动作是返回路由 }; // 默认规则default rule static struct fib_rule default_rule = { r_clntref: ATOMIC_INIT(2), r_preference: 0x7FFF, // 默认规则的优先级32767 r_table: RT_TABLE_DEFAULT, // 指默认路由表 r_action...
r_table: RT_TABLE_MAIN, // 指向主路由表 r_action: RTN_UNICAST, // 动作是返回路由 }; // 默认规则default rule static struct fib_rule default_rule = { r_clntref: ATOMIC_INIT(2), r_preference: 0x7FFF, // 默认规则的优先级32767 r_table: RT_TABLE_DEFAULT, // 指默认路由表 r_action...
首先会进行一些检查,报文的目的MAC必须是本主机,这里检查skb->pkt_type==PACKET_HOST;如果报文的目的IP不是本机(而是在本机的邻居),则本主只是源路径的一个中转站,此时不用再次查找路由表,直接返回,这里检查rt->rt_type==RTN_UNICAST,这种情况在LSRR中是允许的,SSRR是不允许的;如果报文的目的IP对本机来说不...
return0;if(skb->pkt_type != PACKET_HOST)//如果数据包是发给本机的就返回return -EINVAL;if(rt->rt_type == RTN_UNICAST) {//如果路由表是单播,即点对点if(!opt->is_strictroute)//并且不是严格路由就返回return0; icmp_send(skb, ICMP_PARAMETERPROB,0, htonl(16<<24));//发回ICMP信息return -...
r_action: RTN_UNICAST,/*动作是返回路由*/ }; 规则链的链头指向本地规则。 RPDB的中心函数fib_lookup 现在到了讨论RPDB的实现的的中心函数fib_lookup了。RPDB通过提供接口函数fib_lookup,作为寻找路由的入口点,在这里有必要详细讨论这个函数,下面是源代码:, ...
unsigned char type;//对象类型,决定数据包处理方式,如RTN_UNICAST、RTN_LOCAL、RTN_BROADCAST、RTN_MULTICAST、RTN_UNREACHABLE. unsigned char scope; u32 tclassid; struct fib_info *fi;//指向fib_info对象,存储了下一跳的引用fib_nh struct fib_table *table;//指向用于查找的FIB表 ...
if (addr_type == RTN_UNICAST && (arp_fwd_proxy(in_dev, dev, rt) || arp_fwd_pvlan(in_dev, dev, rt, sip, tip) || pneigh_lookup(&arp_tbl, net, &tip, dev, 0))) { n = neigh_event_ns(&arp_tbl, sha, &sip, dev); ...
main表中存放的是路由类型为RTN_UNICAST的所有路由项,即网关或直接连接的路由。在myfib_add_ifaddr函数中是这样添加main表项的:对于某个网络设备接口的一个IP地址,如果目的地址的网络号不是零网络(网络号与子网号全为零),并且它是primary地址,同时,它不是D类地址(网络号与子网号占32位)。最后一个条件是:它不...
如果ARP数据包不是发送给当前主机但需要进行转发的(路由选择条目的rt_type为RTN_UNICAST),也需要检查一些条件(也将在稍后介绍)。如果这些条件都满足,就调用方法pneigh_lookup()在代理ARP表中进行查找。 比如arp_process() 首先验证ARP报文头和设备是否使能ARP功能。 arp_process函数只处理ARPOP_REPLY和ARPOP_REQUEST...
{…… if (rt->rt_type == RTN_UNICAST || rt->fl.iif == 0) { int err = arp_bind_neighbour(&rt->u.dst); if (err) { if (net_ratelimit()) printk(KERN_WARNING "Neighbour table overflow.n"); rt_drop(rt); return -ENOBUFS; } } ……} ...