c - ip_options_echo 中的 ip 选项时间戳

标签 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)

请告诉我为什么显示这个,谢谢

最佳答案

我发现最新的内核版本已经修复了这个问题,并且我发现问题代码在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;
}

关于c - ip_options_echo 中的 ip 选项时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21085667/

相关文章:

c - 使用 fgets() 读取文件最后一行时出现段错误

c - 可靠地确定数组中元素的数量

c - 指针和指针澄清

c++ - 两台具有相同 IP 地址的计算机 - 使用套接字的聊天应用程序

c# - Unity 5联网色彩同步

c - C中的Blowfish加解密

linux - Bash 执行包含 'read' 的字符串中的命令,读取无法从标准输入读取输入

linux - 使用 $() 将多个命令输出到变量 Bash 脚本中

c - DMA 传输到 Linux 中的从属 PCI 设备

java - 安卓网络