路由 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;
    };
};

 

posted @ 2022-08-03 16:58  codestacklinuxer  阅读(101)  评论(0)    收藏  举报