zhaoyanghong
驱动小牛
驱动小牛
  • 注册日期2004-11-13
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分341分
  • 威望92点
  • 贡献值0点
  • 好评度91点
  • 原创分0分
  • 专家分0分
阅读:3338回复:5

tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC))函数的讨论

楼主#
更多 发布于:2007-03-22 17:33
在此函数中const struct inet_connection_sock *icsk = inet_csk(sk);  
定义为const 是否意味着所有sk的*icsk是相同的?
在SMP下在此函数中可以如此使用,作者仅为了节省一些资源吗?其它地方如此使用会有问题.
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
沙发#
发布于:2007-03-22 20:07
struct inet_connection_sock {
    /* inet_sock has to be the first member! */
    struct inet_sock      icsk_inet;
    struct request_sock_queue icsk_accept_queue;
    struct inet_bind_bucket      *icsk_bind_hash;
    unsigned long          icsk_timeout;
     struct timer_list      icsk_retransmit_timer;
     struct timer_list      icsk_delack_timer;
    __u32              icsk_rto;
    __u32              icsk_pmtu_cookie;
    const struct tcp_congestion_ops *icsk_ca_ops;
    const struct inet_connection_sock_af_ops *icsk_af_ops;
    unsigned int          (*icsk_sync_mss)(struct sock *sk, u32 pmtu);
    __u8              icsk_ca_state;
    __u8              icsk_retransmits;
    __u8              icsk_pending;
    __u8              icsk_backoff;
    __u8              icsk_syn_retries;
    __u8              icsk_probes_out;
    __u16              icsk_ext_hdr_len;
    struct {
        __u8          pending;     /* ACK is pending               */
        __u8          quick;     /* Scheduled number of quick acks       */
        __u8          pingpong;     /* The session is interactive           */
        __u8          blocked;     /* Delayed ACK was blocked by socket lock */
        __u32          ato;         /* Predicted tick of soft clock       */
        unsigned long      timeout;     /* Currently scheduled timeout           */
        __u32          lrcvtime;     /* timestamp of last received data packet */
        __u16          last_seg_size; /* Size of last incoming segment       */
        __u16          rcv_mss;     /* MSS used for delayed ACK decisions       */
    } icsk_ack;
    struct {
        int          enabled;

        /* Range of MTUs to search */
        int          search_high;
        int          search_low;

        /* Information on the current probe. */
        int          probe_size;
    } icsk_mtup;
    u32              icsk_ca_priv[16];
#define ICSK_CA_PRIV_SIZE    (16 * sizeof(u32))
};

该结构中第一个数据是inet_sock。

struct inet_sock {
    /* sk and pinet6 has to be the first two members of inet_sock */
    struct sock        sk;
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
    struct ipv6_pinfo    *pinet6;
#endif
    /* Socket demultiplex comparisons on incoming packets. */
    __u32            daddr;
    __u32            rcv_saddr;
    __u16            dport;
    __u16            num;
    __u32            saddr;
    __s16            uc_ttl;
    __u16            cmsg_flags;
    struct ip_options    *opt;
    __u16            sport;
    __u16            id;
    __u8            tos;
    __u8            mc_ttl;
    __u8            pmtudisc;
    __u8            recverr:1,
                is_icsk:1,
                freebind:1,
                hdrincl:1,
                mc_loop:1;
    int            mc_index;
    __u32            mc_addr;
    struct ip_mc_socklist    *mc_list;
    struct {
        unsigned int        flags;
        unsigned int        fragsize;
        struct ip_options    *opt;
        struct rtable        *rt;
        int            length; /* Total length of all frames */
        u32            addr;
        struct flowi        fl;
    } cork;
};

inet_sock第一个结构是sock。

那么此环境中sock起始地址也就是inet_connection_sock起始地址。

所以可以把sock转化为inet_connection_sock,而不是共享数据的原因。他们本来就是一个地址。
走走看看开源好 Solaris vs Linux
zhaoyanghong
驱动小牛
驱动小牛
  • 注册日期2004-11-13
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分341分
  • 威望92点
  • 贡献值0点
  • 好评度91点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-03-23 08:23
引用第1楼cyliu2007-03-22 20:07发表的“”:
struct inet_connection_sock {
    /* inet_sock has to be the first member! */
    struct inet_sock      icsk_inet;
    struct request_sock_queue icsk_accept_queue;
    struct inet_bind_bucket      *icsk_bind_hash;
.......

对不起,我想你没有看清楚我的问题.
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
地板#
发布于:2007-03-23 09:41
引用第0楼zhaoyanghong2007-03-22 17:33发表的“tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC))函数的问题”:
  在此函数中const struct inet_connection_sock *icsk = inet_csk(sk);  
定义为const 是否意味着所有sk的*icsk是相同的?
在SMP下在此函数中可以如此使用,作者仅为了节省一些资源吗?其它地方如此使用会有问题.


1 定义为const 是否意味着所有sk的*icsk是相同的?

没有明白你说的意思,参考我上面的解释,本来就是一个地址的引用问题,他们是相同,所以谈不上是否相同。不同的sk当然icsk是不同。

2 在SMP下在此函数中可以如此使用,作者仅为了节省一些资源吗?

为什么在smp下可以如此使用,而在单核下不可以使用,不明白这个和多核有什么关系。本来就是一个存储空间,谈不上为了节省一些资源的问题。不过是c语言的类型转换引起的误会.

3 其它地方如此使用会有问题。

会有什么问题,能否详细说明。
走走看看开源好 Solaris vs Linux
zhaoyanghong
驱动小牛
驱动小牛
  • 注册日期2004-11-13
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分341分
  • 威望92点
  • 贡献值0点
  • 好评度91点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-03-23 10:38
引用第3楼cyliu2007-03-23 09:41发表的“”:


1 定义为const 是否意味着所有sk的*icsk是相同的?

没有明白你说的意思,参考我上面的解释,本来就是一个地址的引用问题,他们是相同,所以谈不上是否相同。不同的sk当然icsk是不同。
.......

1,2的观点我同意
3 在SMP下 2个CPU均运行到此函数,若CPU1更改了*icsk的一个成员,设置为自己上下文的值,CPU2也更改了*icsk的相同成员的值, 发生使用冲突----当然可能内核中没有这样使用,*icsk其它成员均市是公用的.
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
5楼#
发布于:2007-03-23 13:29
在smp下,有些数据时需要考虑同步问题。但是对于sock在该接口中并不需要,因为所用到的数据是一些调用接口,而这些接口伴随sock生命周期
走走看看开源好 Solaris vs Linux
游客

返回顶部