dst_entry,neighbour,和hh_cache之间的关系
来源:互联网 发布:java banner合成处理 编辑:程序博客网 时间:2024/04/29 07:03
由ip_finish_output2处理.
/*
*ip_finish_output2:把做为参数传进来的skb传到链路层.此时的skb没有L2 header,但是需要的路由信息已经知道.
* 如果可以找到dst_entry对应的hh_cache.则把路由需要的L2头加到skb中.然后调用相关函数hh->hh_output.
* 如果找不到对应的hh_cache,则需要通过其nerghbour找到下一跳地址,交由相应的处理函数dst->neighbour->output.
*/
static inline int ip_finish_output2(struct sk_buff *skb)
{
/*dst_entry可以理解为路由表的缓冲区,每次主机发送数据时询问路由表后,都会将记录记在一个cache内.*/
/*dst中有能指向其neighbour的指针,通过neighbour可以找到下一跳地址*/
struct dst_entry *dst = skb->dst;
/*hh_cache中存储的是链路头的一些相关信息,可以加快数据包的传输(因为有些情况下不用查看路由表,直接到此缓冲区查看).*/
struct hh_cache *hh = dst->hh;
#ifdef CONFIG_NETFILTER_DEBUG
nf_debug_ip_finish_output2(skb);
#endif /*CONFIG_NETFILTER_DEBUG*/
if (hh) {
read_lock_bh(&hh->hh_lock);
memcpy(skb->data - 16, hh->hh_data, 16);
read_unlock_bh(&hh->hh_lock);
skb_push(skb, hh->hh_len);
return hh->hh_output(skb);
} else if (dst->neighbour)
return dst->neighbour->output(skb);
if (net_ratelimit())
printk(KERN_DEBUG "ip_finish_output2: No header cache and no neighbour!/n");
kfree_skb(skb);
return -EINVAL;
}
要想看明白此函数,需要先知道dst_entry,neighbour,和hh_cache之间的关系.如下图:
500)this.width=500;" width="500" border="0">
det_entry为路由表的cache,也就是说每次发送数据包询问完路由表后,都会将结果保存在这个cache中,以便在以后的发送中相同的操作可以快速执行而不必每次都询问路由表.由于数据包传送到ip_finish_output2后,还没有L2头,所以需要加上相应的链路层头.知道了这三者的关系,再由上面的代码可知,如果dst->hh非空,说明以前传输过相似的数据包,可以直接到相应的hh_cache中去找对应的L2头,然后加到skb中,调用hh->hh_output将数据包发送出去.
如果没有相应的hh指针,则说明去往的目的地以前没有去过,这时候dst_cache中没有相关记录信息,不能根据以往的经验快速发送.这时候就要将数据包传送到Neighbouring Subsystem去查找相关信息.
- dst_entry,neighbour,和hh_cache之间的关系
- dst_entry,neighbour,和hh_cache之间的关系
- 和之间的关系
- Neighbour的状态转移
- jsp和servlet的之间的关系
- 项目经理和程序员之间的关系
- 类和对象之间的关系
- XML和数据库之间的关系
- XML和数据库之间的关系
- equals和hashCode之间的关系
- instance_name,ORACLE_SID和service_name之间的关系
- AF_UNSPEC、AF_INET和AF_INET6之间的关系
- 买和租之间的奥妙关系
- 描述tablespace和datafile之间的关系
- JAVA和JSP之间的关系
- Unicode和UTF-8之间的关系
- 内存带宽和FSB之间的关系
- 信号和系统调用之间的关系
- 替换错误信息里面的KEY 值
- win7格斗记
- 不可这么蹉跎岁月
- 管理钱遵循几个原则
- Warning: session_start() [function.session-start]: open(/tmp/sess_84cb589ea249708b09c3d5e6836fdd0d, O_RDWR) failed: No such file
- dst_entry,neighbour,和hh_cache之间的关系
- 网址
- 转 Android SurfaceFlinger中的SharedClient -- 客户端(Surface)和服务端(Layer)之间的显示缓冲区管
- 快速排序的递归和非递归解法
- easyeclipse for php 搭配xampp教程
- VS2005用VBA写的代码注释宏
- 两个select multiple 多选 全选 取值 增加 删除 问题
- Windows 输入法编辑器 (IME)
- Eclipse的自动编译