gpt4 book ai didi

linux - sendmsg 系统调用是否验证添加到辅助数据中的 IPv6 源地址?

转载 作者:太空狗 更新时间:2023-10-29 11:19:27 25 4
gpt4 key购买 nike

在 IPv4 的情况下,我看到 sendmsg 有以下行为:

假设10.1.2.3是客户端IP。10.1.2.10配置在客户端的其中一个接口(interface)上。

在UDP报文中,在数据包中加入如下控制信息:

它只是服务器在回复客户端时应该使用的源地址或接口(interface)地址:

cmsg->cmsg_len = sizeof(struct cmsghdr) + sizeof(sa->sin_addr);
cmsg->cmsg_level = IPPROTO_IP;
cmsg->cmsg_type = IP_SENDSRCADDR_WITH_ERROR;
* (struct in_addr *)CMSG_DATA(cmsg) = sa->sin_addr;
cmsg = (struct cmsghdr *)((caddr_t) cmsg + ALIGN(cmsg->cmsg_len));

消息发送为:

sendmsg(fd, send_msg, 0);

如果我将 10.1.2.10 配置为源 IP,并且将其添加到 cmsg 后,一切正常。服务器回复 10.1.2.10。

但是,如果我配置了一些无法访问的 IP 地址或未在客户端的任何接口(interface)上配置的 IP,sendmsg 将失败并出现以下错误:

sendmsg to 10.1.2.3(10.1.2.3).1813 failed: Can't assign requested address

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

但是我没有看到 IPv6 有相同的行为:

假设2001::1是客户端IP。而2001::2001配置在客户端的其中一个接口(interface)上。

在控制报文中添加IPv6源地址如下:

    cmsg->cmsg_level = IPPROTO_IPV6;
cmsg->cmsg_type = IPV6_PKTINFO;
cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
memcpy((struct in6_addr *)CMSG_DATA(cmsg), &(sa6->sin6_addr),
sizeof(sa6->sin6_addr));
cmsg = (struct cmsghdr *)((caddr_t) cmsg + ALIGN(cmsg->cmsg_len));

它工作正常,如果我将 2001::2001 配置为源 IP 并且服务器确实回复该地址。

但是如果我配置了一个无法访问的 IPv6 源地址,比如 1001::1001,则 sendmsg 不会出现类似于我们在 IPv4 情况下看到的错误消息。消息仍使用原始 IPv6 发送,即 2001::1。

有人可以建议可能是什么问题吗?

谢谢。

最佳答案

IP_SENDSRCADDR 和 IPV6_PKTINFO 必须是两个不同的实现。也许在第一种情况下它只是控制错误。您是否尝试过在 IPV6_PKTINFO 的辅助数据中设置接口(interface)索引?对于 IPV6_PKTINFO,辅助数据的类型为:in6_pktinfo。

struct in6_pktinfo {
struct in6_addr ipi6_addr; /* src/dst IPv6 address */
unsigned int ipi6_ifindex; /* send/recv if index */
};

希望这能以某种方式帮助

关于linux - sendmsg 系统调用是否验证添加到辅助数据中的 IPv6 源地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19558556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com