ip选项时间戳在ip_options_echo中

时间:2014-01-13 07:07:47

标签: c linux networking ip

ip_options_echo

if (sopt->ts) {
    optlen = sptr[sopt->ts+1];
    soffset = sptr[sopt->ts+2];
    dopt->ts = dopt->optlen + sizeof(struct iphdr);
    memcpy(dptr, sptr+sopt->ts, optlen);
    if (soffset <= optlen) {
        if (sopt->ts_needaddr) {
            if (soffset + 3 > optlen)
                return -EINVAL;
            dopt->ts_needaddr = 1;
            soffset += 4;
        }
        if (sopt->ts_needtime) {
            if (soffset + 3 > optlen)
                return -EINVAL;
            if ((dptr[3]&0xF) != IPOPT_TS_PRESPEC) {
                dopt->ts_needtime = 1;
                soffset += 4;
            } else {
                dopt->ts_needtime = 0;

                if (soffset + 8 <= optlen) {
                    __be32 addr;

                    memcpy(&addr, sptr+soffset-1, 4);
                    if (inet_addr_type(dev_net(skb_dst(skb)->dev), addr) != RTN_LOCAL) {
                        dopt->ts_needtime = 1;
                        soffset += 8;
                    }
                }
            }
        }
        dptr[2] = soffset;
    }
    dptr += optlen;
    dopt->optlen += optlen;
}

为什么这个判断if (inet_addr_type(dev_net(skb_dst(skb)->dev), addr) != RTN_LOCAL)是!= RTN_LOCAL,是否为RTN_LOCAL然后填写时间,
我认为这将是if (inet_addr_type(dev_net(skb_dst(skb)->dev), addr) == RTN_LOCAL)

请告诉我为什么会这样,谢谢

1 个答案:

答案 0 :(得分:0)

我发现最新的内核版本修复了这个问题,我发现问题代码是在2.6.3。

最新代码是:

if (sopt->ts) {
    optlen = sptr[sopt->ts+1];
    soffset = sptr[sopt->ts+2];
    dopt->ts = dopt->optlen + sizeof(struct iphdr);
    memcpy(dptr, sptr+sopt->ts, optlen);
    if (soffset <= optlen) {
        if (sopt->ts_needaddr) {
            if (soffset + 3 > optlen)
                return -EINVAL;
            dopt->ts_needaddr = 1;
            soffset += 4;
        }
        if (sopt->ts_needtime) {
            if (soffset + 3 > optlen)
                return -EINVAL;
            if ((dptr[3]&0xF) != IPOPT_TS_PRESPEC) {
                dopt->ts_needtime = 1;
                soffset += 4;
            } else {
                dopt->ts_needtime = 0;

                if (soffset + 7 <= optlen) {
                    __be32 addr;

                    memcpy(&addr, dptr+soffset-1, 4);
                    if (inet_addr_type(dev_net(skb_dst(skb)->dev), addr) != RTN_UNICAST) {
                        dopt->ts_needtime = 1;
                        soffset += 8;
                    }
                }
            }
        }
        dptr[2] = soffset;
    }
    dptr += optlen;
    dopt->optlen += optlen;
}