路由 rtable dst_entry 数据结构
/* rt_flags是一组标志位,按目的入口查询的执行顺序:如果路由使用本地环回接口,则rt_flags上加标志RTCF_LOCAL, 如果路由结果类 型是广播,则加标志RTCF_BROADCAST和RTCF_LOCAL,如果结果是组播,则加标志RTCF_MULTICAST和 RTCF_LOCAL, 该标志最终决定了目的入口使用哪一个IP数据报输入函数和输出函数,如果是RTCF_LOCAL,则使用输入函数 ip_local_deliver, 如果是RTCF_BROADCAST或RTCF_MULTICAST,并且带有RTCF_LOCAL标志,并且输出设 备不是环回接口设备,则使用输出函数ip_mc_output, 否则使用输出函数ip_output。 rt_type是路由类型,如果路由是LOOPBACK,则置类型为RTN_LOCAL,单播路由类型为RTN_UNICAST, 如果目的地址为 0xFFFFFFFF,则路由类型为RTN_BROADCAST, 如果目的地址是组播地址,则路由类型为RTN_MULTICAST。 rt_type跟 rt_flags关系比较密切。 */ struct rtable { struct dst_entry dst;//独立于协议的信息 int rt_genid; unsigned int rt_flags;//标识路由表项的特征 __u16 rt_type;//路由的类型 __u8 rt_is_input; __u8 rt_uses_gateway; int rt_iif;//输入设备的标识 /* Info on neighbour */ __be32 rt_gateway;//目的地址或下一跳网关 /* Miscellaneous cached information */ u32 rt_pmtu; u32 rt_table_id; struct list_head rt_uncached; struct uncached_list *rt_uncached_list; };
/* 下一跳缓存的作用就是尽量减少最初和最后的申请释放dst_entry,它将dst_entry缓存在下一跳结构(fib_nh)上。 这和之前的路由缓存有什么区别吗? 很大的区别!之前的路由缓存是以源IP和目的IP为KEY,有千万种可能性, 而现在是和下一跳绑定在一起,一台设备没有那么多下一跳的可能。这就是下一跳缓存的意义! __refcnt是目的入口的引用计数,创建成功后即设为1。__use是一个统计数值,该目的入口被使用一次(发送一个IP数据报),__use就加1。 dev是该路由的输出网络设备接口, flags是标志位,其取值可以是DST_HOST,DST_NOXFRM,DST_NOPOLICY,DST_NOHASH,DST_BALANCED(用在路由有多路径的情况下) input和output分别是该目的入口的输入和输出函数。 */ struct dst_entry { struct rcu_head rcu_head; struct dst_entry *child; struct net_device *dev;//输出网络设备 struct dst_ops *ops; unsigned long _metrics; unsigned long expires;//过期的时间戳 struct dst_entry *path; struct dst_entry *from; #ifdef CONFIG_XFRM struct xfrm_state *xfrm; #else void *__pad1; #endif int (*input)(struct sk_buff *);//ip_output int (*output)(struct net *net, struct sock *sk, struct sk_buff *skb);//ip_local_deliver unsigned short flags; #define DST_HOST 0x0001 #define DST_NOXFRM 0x0002 #define DST_NOPOLICY 0x0004 #define DST_NOHASH 0x0008 #define DST_NOCACHE 0x0010 #define DST_NOCOUNT 0x0020 #define DST_FAKE_RTABLE 0x0040 #define DST_XFRM_TUNNEL 0x0080 #define DST_XFRM_QUEUE 0x0100 #define DST_METADATA 0x0200 short error;//fib_lookup查找失败时的错误码 /* A non-zero value of dst->obsolete forces by-hand validation * of the route entry. Positive values are set by the generic * dst layer to indicate that the entry has been forcefully * destroyed. * * Negative values are used by the implementation layer code to * force invocation of the dst_ops->check() method. */ short obsolete; #define DST_OBSOLETE_NONE 0//该结构有效且可以被使用 #define DST_OBSOLETE_DEAD 2// 该结构被删除而不能使用 #define DST_OBSOLETE_FORCE_CHK -1// 被IPSEC ipv6使用 不能被ipv4 使用 #define DST_OBSOLETE_KILL -2 unsigned short header_len; /* more space at head required */ unsigned short trailer_len; /* space to reserve at tail */ unsigned short __pad3; #ifdef CONFIG_IP_ROUTE_CLASSID __u32 tclassid; #else __u32 __pad2; #endif #ifdef CONFIG_64BIT struct lwtunnel_state *lwtstate; /* * Align __refcnt to a 64 bytes alignment * (L1_CACHE_SIZE would be too much) */ long __pad_to_align_refcnt[1]; #endif /* * __refcnt wants to be on a different cache line from * input/output/ops or performance tanks badly */ atomic_t __refcnt; /* client references引用计数*/ int __use; unsigned long lastuse;//最近一次使用该路由缓存的时间戳 #ifndef CONFIG_64BIT struct lwtunnel_state *lwtstate; #endif union { struct dst_entry *next; struct rtable __rcu *rt_next; struct rt6_info *rt6_next; struct dn_route __rcu *dn_next; }; };
http代理服务器(3-4-7层代理)-网络事件库公共组件、内核kernel驱动 摄像头驱动 tcpip网络协议栈、netfilter、bridge 好像看过!!!!
但行好事 莫问前程
--身高体重180的胖子

浙公网安备 33010602011771号