linux网络协议栈分析笔记11-路由1-路由缓存

来吧,路由 路由是网络的核心,是linux网络协议栈的核心,我们找个入口进去看看


还记得在笔记5-IP层的处理1中ip_rcv_finish走到过一个岔口
->ip_rcv_finish()      -> ip_route_input()  查找路由信息      ->if (iph->ihl > 5 && ip_rcv_options(skb))  如果IP头部大于20字节,则表示IP头部包含IP选项,需要进行选项处理.
          goto drop;      ->dst_input(skb);       dst_input实际上会调用skb->dst->input(skb).input函数会根据路由信息设置为合适的函数指针,                                       如果是则递交到本地的 则为ip_local_deliver,若是转发则为ip_forward 两条路径: 1)  ip_local_deliver 2) ip_forward
是什么导致路径不同呢,我们看一看 ip_route_input()  干了啥
int  ip_route_input(struct sk_buff *skb, __be32 daddr, __be32 saddr,
             u8 tos, struct net_device *dev)      ->net = dev_net(dev);      ->hash =  rt_hash(daddr, saddr, iif, rt_genid(net));         计算hash值,注意hash因子          ->                                                                              既然hash值算出来了,我们就去找吧      rcu_read_lock();      for (rth = rcu_dereference( rt_hash_table[hash].chain ); rth;      
          rth = rcu_dereference(rth-> u.dst.rt_next )) {
          if (((rth->fl.fl4_dst ^ daddr) |                     异或 相同为0                        
               (rth->fl.fl4_src ^ saddr) |
               (rth->fl.iif ^ iif) |
               rth->fl.oif |
               (rth->fl.fl4_tos ^ tos)) == 0 &&
              rth->fl.mark == skb->mark &&
              net_eq(dev_net(rth->u.dst.dev), net) &&            判断路由和报文的struct net指针地址是否相同
              !rt_is_expired(rth)) {                                         路由项是否过期                              找到了
               dst_use(&rth->u.dst, jiffies);                             表示路由的使用时间
               RT_CACHE_STAT_INC(in_hit);
               rcu_read_unlock();
               skb_dst_set(skb, &rth->u.dst);                          设置到skb中去
               return 0;
          }
          RT_CACHE_STAT_INC(in_hlist_search);
     }
     rcu_re


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部