struct dst_entry *dst

  /usr/src/linux-2.6.19/include/net/dst.h

最终生成的IP数据报的 路由称为目的入口(dst_entry),目的入口反映了相邻的外部主机在本地主机内部的一种“映象”,目的入口在内核中的定义如下

struct dst_entry
{
    struct dst_entry    *next;
    atomic_t            __refcnt;
    int                 __use;
    struct dst_entry    *child;
    struct net_device   *dev;
    short               error;
    short               obsolete;
    int                 flags;
    unsigned long       lastuse;
    unsigned long       expires;
    unsigned short      header_len;
    unsigned short      nfheader_len;
    unsigned short      trailer_len;
    u32                 metrics[RTAX_MAX];
    struct dst_entry    *path;
    unsigned long       rate_last;
    unsigned long       rate_tokens;
    struct neighbour    *neighbour;
    struct hh_cache     *hh;
    struct xfrm_state   *xfrm;
    int                 (*input)(struct sk_buff*);
    int                 (*output)(struct sk_buff*);
#ifdef CONFIG_NET_CLS_ROUTE
    __u32               tclassid;
#endif
    struct dst_ops     *ops;
    struct rcu_head     rcu_head;
    char        info[0];
};



dst_entry->__refcnt
    "目的入口"的引用计数,创建成功后即设为1

dst_entry->__use
    一个统计数值,该"目的入口"被使用一次(发送一个IP数据报),__use就加1

dst_entry->dev
    该路由的输出网络设备接口

dst_entry->flags
    标志位,其取值可以是DST_HOST, DST_NOXFRM, DST_NOPOLICY, DST_NOHASH, DST_BALANCED(用在路由有多路径的情况下)

dst_entry->lastuse
    一个时间值,每次目的入口被用于发送IP数据报,就将该值设置为当前系统时间值。该值被用于几个地方,路由缓存表 rt_hash_table是一个很大的数组(依据系统的内存大小而定),每一项都是一个struct rtable的链表,当要往缓存表的某一个链表中插入一个新的struct rtable时,如果这个链表的长度已经超出ip_rt_gc_elasticity(值为8),则需要删掉一个当前使用价值最低的,已保持链表长度的平衡。函数rt_score()就是用于为每个struct rtable计算价值分数,分数是一个32位值,最高位表示非常有价值,当struct rtable的成员rt_flags上有标志RTCF_REDIRECTED或RTCF_NOTIFY,或者目的入口的超时时间未到时,置该位,次高位价值次之,余下的30位由lastuse决定,该目的入口距上次使用时间越长,价值越低。另外,用于在rt_may_expire函数中判断一个struct rtable是否超时。

dst_entry->expires
    一个超时时间值,定时器rt_periodic_timer定期扫描路由缓存表rt_hash_table,如果发现expires值为0,或者小于当前系统时间值,并符合其它超时条件,则把该路由从缓存表中删除。

dst_entry->neighbour
    为该路由绑定的邻居节点(与ARP相关)

dst_entry->hh
    硬件头缓存,ARP解析得到的邻居的mac地址缓存在这里,再次发送IP数据报的时候,就不需要再到ARP缓存中去取硬件头。

dst_entry->input
dst_entry->output

    input和output分别是该目的入口的输入和输出函数。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`struct dst_entry`是Linux内核网络子系统中的一个数据结构,用于表示网络层和数据链路层之间的转发表项,包含了下面的成员: 1. `struct dst_entry *child`: 指向子路由项的链表。 2. `struct dst_entry *next`: 指向相同哈希桶中的下一个路由项。 3. `struct dst_entry *path`: 指向从源到目的地的路径,用于实现反向路由缓存。 4. `struct net_device *dev`: 指向出接口设备的结构体。 5. `short error`: 表示路由项的状态,比如是否可达、是否需要重新计算等。 6. `short obsolete`: 表示路由项是否过期,如果过期则需要重新计算。 7. `unsigned long last_use`: 表示路由项最近一次被使用的时间。 8. `unsigned long expires`: 表示路由项的过期时间。 9. `unsigned long __pad`: 用于补齐字节对齐。 10. `unsigned long metrics[RTAX_MAX]`: 表示路由项的度量值,比如距离、带宽等。 11. `unsigned int flags`: 表示路由项的属性,比如是否是多路径路由、是否需要源路由等。 12. `int (*output)(struct sk_buff *)`: 指向路由项的输出函数,用于将数据包发送到对应的设备。 13. `int (*input)(struct sk_buff *)`: 指向路由项的输入函数,用于接收数据包并进行处理。 14. `struct flowi fl`: 表示路由项的具体信息,包括源IP地址、目的IP地址、协议类型等。 15. `struct xfrm_state *xfrm`: 指向传输层安全性协议(IPSec)的状态。 总之,`struct dst_entry`包含了许多重要的信息,用于实现路由选择和数据包的转发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值