首页 > 其他分享 >路由 rtable dst_entry 数据结构

路由 rtable dst_entry 数据结构

时间:2022-12-10 13:06:16浏览次数:36  
标签:__ rt struct dst rtable entry DST define

/*
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的胖子



标签:__,rt,struct,dst,rtable,entry,DST,define
From: https://blog.51cto.com/u_15404950/5927472

相关文章