Chinaunix首页 | 论坛 | 博客
  • 博客访问: 185161
  • 博文数量: 49
  • 博客积分: 635
  • 博客等级: 中士
  • 技术积分: 410
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-25 12:58
文章分类

全部博文(49)

文章存档

2012年(9)

2011年(40)

分类:

2012-03-04 12:46:23

Linux2.4协议栈相关的一个文件:net\ipv4\protocol.c。

利用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;

阅读(1443) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~