Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1509780
  • 博文数量: 228
  • 博客积分: 1698
  • 博客等级: 上尉
  • 技术积分: 3241
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-24 21:49
个人简介

Linux

文章分类

全部博文(228)

文章存档

2017年(1)

2016年(43)

2015年(102)

2014年(44)

2013年(5)

2012年(30)

2011年(3)

分类: LINUX

2012-03-02 16:51:04

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;

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

星期五啦2012-03-03 00:20:42

哇`~预处理好强大了,真没想到在这儿处理链表……