Linux协议栈里用C的预处理器形成的链表

来源:互联网 发布:国密算法适用 编辑:程序博客网 时间:2024/06/10 19:04

利用C的预处理器的顺序Parse特性形成了一个链表。

技巧都在IPPROTO_PREVIOUS 宏,引用#define以及#undefine,形成一个链表赋值给inet_protocol_base 。

#define IPPROTO_PREVIOUS NULL

#ifdef CONFIG_IP_MULTICAST

static struct inet_protocol igmp_protocol =
{
    igmp_rcv,        /* IGMP handler        */
    NULL,            /* IGMP error control    */
    IPPROTO_PREVIOUS,    /* next            */
    IPPROTO_IGMP,        /* protocol ID        */
    0,            /* copy            */
    NULL,            /* data            */
    "IGMP"            /* name            */
};

#undef  IPPROTO_PREVIOUS
#define IPPROTO_PREVIOUS &igmp_protocol

#endif

static struct inet_protocol tcp_protocol =
{
    tcp_v4_rcv,        /* TCP handler        */
    tcp_v4_err,        /* TCP error control    */ 
    IPPROTO_PREVIOUS,
    IPPROTO_TCP,        /* protocol ID        */
    0,            /* copy            */
    NULL,            /* data            */
    "TCP"            /* name            */
};

#undef  IPPROTO_PREVIOUS
#define IPPROTO_PREVIOUS &tcp_protocol

static struct inet_protocol udp_protocol =
{
    udp_rcv,        /* UDP handler        */
    udp_err,        /* UDP error control    */
    IPPROTO_PREVIOUS,    /* next            */
    IPPROTO_UDP,        /* protocol ID        */
    0,            /* copy            */
    NULL,            /* data            */
    "UDP"            /* name            */
};

#undef  IPPROTO_PREVIOUS
#define IPPROTO_PREVIOUS &udp_protocol

static struct inet_protocol icmp_protocol =
{
    icmp_rcv,        /* ICMP handler        */
    NULL,            /* ICMP error control    */
    IPPROTO_PREVIOUS,    /* next            */
    IPPROTO_ICMP,        /* protocol ID        */
    0,            /* copy            */
    NULL,            /* data            */
    "ICMP"            /* name            */
};

#undef  IPPROTO_PREVIOUS
#define IPPROTO_PREVIOUS &icmp_protocol

struct inet_protocol *inet_protocol_base = IPPROTO_PREVIOUS;  

原创粉丝点击