Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8104168
  • 博文数量: 159
  • 博客积分: 10424
  • 博客等级: 少将
  • 技术积分: 14615
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-14 12:45
个人简介

啦啦啦~~~

文章分类
文章存档

2015年(5)

2014年(1)

2013年(5)

2012年(10)

2011年(116)

2010年(22)

分类: LINUX

2010-12-21 00:08:40

struct sk_buff与socket
作者:gfree.wind@gmail.com

在Linux2.6中,struct sk_buf承担了socket的输入输出的传输缓存的任务。

首先,还是先看struct socket的定义

/**
 * struct socket - general BSD socket
 * @state: socket state (%SS_CONNECTED, etc)
 * @type: socket type (%SOCK_STREAM, etc)
 * @flags: socket flags (%SOCK_ASYNC_NOSPACE, etc)
 * @ops: protocol specific socket operations
 * @file: File back pointer for gc
 * @sk: internal networking protocol agnostic socket representation
 * @wq: wait queue for several uses
 */

struct socket {
    socket_state        state;

    kmemcheck_bitfield_begin(type);
    short            type;
    kmemcheck_bitfield_end(type);

    unsigned long        flags;

    struct socket_wq    *wq;

    struct file        *file;
    struct sock        *sk;
    const struct proto_ops    *ops;
};

代码中的注释对于每一个变量说的都很清楚——看到这里,我先感叹一下,linux2.6的结构体的注释比老版本要清楚的多。到目前为止,我所看到的关键的结构体,都有清晰的注释。我们可以看出struct socket中的sock变量,是socket变量的工作核心。

那么现在跳转到struct sock的定义处。由于struct sock的定义过长,所以只展示一部分。

struct sock {
    /*
     * Now struct inet_timewait_sock also uses sock_common, so please just
     * don't add nothing before this first member (__sk_common) --acme
     */

    struct sock_common    __sk_common;
    /* skip some codes */
    int sk_rcvbuf;
    /* skip some codes */
    int sk_sndbuf;
    struct sk_buff_head    sk_receive_queue;
    struct sk_buff_head    sk_write_queue;

}

其中,sk_rcvbuf和sk_sendbuf分别是接收和发送缓存的字节数。
而struct sk_buff_head的定义如下:

struct sk_buff_head {
    /* These two members must be first. */
    struct sk_buff    *next;
    struct sk_buff    *prev;

    __u32        qlen;
    spinlock_t    lock;
};

可以看出socket的接收和发送缓存是使用一个双链表将sk_buff组织起来的。
阅读(9974) | 评论(4) | 转发(11) |
给主人留下些什么吧!~~

GFree_Wind2011-05-12 13:29:47

lijianweiabcde: 呵呵,不客气。我最近也在看linux 内核网络部分,大家一起进步。不知道你什么时候会研究下netfilter?.....
netfilter。。。估计一两个月内吧。。。

lijianweiabcde2011-05-12 12:54:06

GFree_Wind: 我的错误,谢谢指点.....
呵呵,不客气。我最近也在看linux 内核网络部分,大家一起进步。不知道你什么时候会研究下netfilter?

GFree_Wind2011-05-12 10:14:53

lijianweiabcde: 我怎么记得: linux 2.4 /2.6 都是使用的skb结构来管理数据缓冲,FreeBSD使用的是m_buf.....
我的错误,谢谢指点

lijianweiabcde2011-05-12 00:41:25

我怎么记得: linux 2.4 /2.6 都是使用的skb结构来管理数据缓冲,FreeBSD使用的是m_buf