Use socket address functions in unbound IPv4 UDP tests.
Also switch to the correct casing style for local address variables. PiperOrigin-RevId: 233161128 Change-Id: Ibc4a10a5d3ab04c40907aa885e8237b255c65a79
This commit is contained in:
parent
f17692d807
commit
85d53d81d9
|
@ -69,67 +69,6 @@ PosixError SetAddrPort(int family, sockaddr_storage* addr, uint16_t port) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct TestAddress {
|
|
||||||
std::string description;
|
|
||||||
sockaddr_storage addr;
|
|
||||||
socklen_t addr_len;
|
|
||||||
|
|
||||||
int family() const { return addr.ss_family; }
|
|
||||||
explicit TestAddress(std::string description = "")
|
|
||||||
: description(std::move(description)), addr(), addr_len() {}
|
|
||||||
};
|
|
||||||
|
|
||||||
TestAddress V4Any() {
|
|
||||||
TestAddress t("V4Any");
|
|
||||||
t.addr.ss_family = AF_INET;
|
|
||||||
t.addr_len = sizeof(sockaddr_in);
|
|
||||||
reinterpret_cast<sockaddr_in*>(&t.addr)->sin_addr.s_addr = htonl(INADDR_ANY);
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
TestAddress V4Loopback() {
|
|
||||||
TestAddress t("V4Loopback");
|
|
||||||
t.addr.ss_family = AF_INET;
|
|
||||||
t.addr_len = sizeof(sockaddr_in);
|
|
||||||
reinterpret_cast<sockaddr_in*>(&t.addr)->sin_addr.s_addr =
|
|
||||||
htonl(INADDR_LOOPBACK);
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
TestAddress V4MappedAny() {
|
|
||||||
TestAddress t("V4MappedAny");
|
|
||||||
t.addr.ss_family = AF_INET6;
|
|
||||||
t.addr_len = sizeof(sockaddr_in6);
|
|
||||||
inet_pton(AF_INET6, "::ffff:0.0.0.0",
|
|
||||||
reinterpret_cast<sockaddr_in6*>(&t.addr)->sin6_addr.s6_addr);
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
TestAddress V4MappedLoopback() {
|
|
||||||
TestAddress t("V4MappedLoopback");
|
|
||||||
t.addr.ss_family = AF_INET6;
|
|
||||||
t.addr_len = sizeof(sockaddr_in6);
|
|
||||||
inet_pton(AF_INET6, "::ffff:127.0.0.1",
|
|
||||||
reinterpret_cast<sockaddr_in6*>(&t.addr)->sin6_addr.s6_addr);
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
TestAddress V6Any() {
|
|
||||||
TestAddress t("V6Any");
|
|
||||||
t.addr.ss_family = AF_INET6;
|
|
||||||
t.addr_len = sizeof(sockaddr_in6);
|
|
||||||
reinterpret_cast<sockaddr_in6*>(&t.addr)->sin6_addr = in6addr_any;
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
TestAddress V6Loopback() {
|
|
||||||
TestAddress t("V6Loopback");
|
|
||||||
t.addr.ss_family = AF_INET6;
|
|
||||||
t.addr_len = sizeof(sockaddr_in6);
|
|
||||||
reinterpret_cast<sockaddr_in6*>(&t.addr)->sin6_addr = in6addr_loopback;
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct TestParam {
|
struct TestParam {
|
||||||
TestAddress listener;
|
TestAddress listener;
|
||||||
TestAddress connector;
|
TestAddress connector;
|
||||||
|
|
|
@ -29,6 +29,17 @@
|
||||||
namespace gvisor {
|
namespace gvisor {
|
||||||
namespace testing {
|
namespace testing {
|
||||||
|
|
||||||
|
constexpr char kMulticastAddress[] = "224.0.2.1";
|
||||||
|
|
||||||
|
TestAddress V4Multicast() {
|
||||||
|
TestAddress t("V4Multicast");
|
||||||
|
t.addr.ss_family = AF_INET;
|
||||||
|
t.addr_len = sizeof(sockaddr_in);
|
||||||
|
reinterpret_cast<sockaddr_in*>(&t.addr)->sin_addr.s_addr =
|
||||||
|
inet_addr(kMulticastAddress);
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
// Check that packets are not received without a group memebership. Default send
|
// Check that packets are not received without a group memebership. Default send
|
||||||
// interface configured by bind.
|
// interface configured by bind.
|
||||||
TEST_P(IPv4UDPUnboundSocketPairTest, IpMulticastLoopbackNoGroup) {
|
TEST_P(IPv4UDPUnboundSocketPairTest, IpMulticastLoopbackNoGroup) {
|
||||||
|
@ -36,40 +47,36 @@ TEST_P(IPv4UDPUnboundSocketPairTest, IpMulticastLoopbackNoGroup) {
|
||||||
|
|
||||||
// Bind the first FD to the loopback. This is an alternative to
|
// Bind the first FD to the loopback. This is an alternative to
|
||||||
// IP_MULTICAST_IF for setting the default send interface.
|
// IP_MULTICAST_IF for setting the default send interface.
|
||||||
sockaddr_in senderAddr = {};
|
auto sender_addr = V4Loopback();
|
||||||
senderAddr.sin_family = AF_INET;
|
|
||||||
senderAddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
|
|
||||||
EXPECT_THAT(
|
EXPECT_THAT(
|
||||||
bind(sockets->first_fd(), reinterpret_cast<sockaddr*>(&senderAddr),
|
bind(sockets->first_fd(), reinterpret_cast<sockaddr*>(&sender_addr.addr),
|
||||||
sizeof(senderAddr)),
|
sender_addr.addr_len),
|
||||||
SyscallSucceeds());
|
SyscallSucceeds());
|
||||||
|
|
||||||
// Bind the second FD to the v4 any address. If multicast worked like unicast,
|
// Bind the second FD to the v4 any address. If multicast worked like unicast,
|
||||||
// this would ensure that we get the packet.
|
// this would ensure that we get the packet.
|
||||||
sockaddr_in receiverAddr = {};
|
auto receiver_addr = V4Any();
|
||||||
receiverAddr.sin_family = AF_INET;
|
EXPECT_THAT(bind(sockets->second_fd(),
|
||||||
receiverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
|
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
|
||||||
EXPECT_THAT(
|
receiver_addr.addr_len),
|
||||||
bind(sockets->second_fd(), reinterpret_cast<sockaddr*>(&receiverAddr),
|
|
||||||
sizeof(receiverAddr)),
|
|
||||||
SyscallSucceeds());
|
SyscallSucceeds());
|
||||||
socklen_t receiverAddrLen = sizeof(receiverAddr);
|
socklen_t receiver_addr_len = receiver_addr.addr_len;
|
||||||
EXPECT_THAT(
|
EXPECT_THAT(getsockname(sockets->second_fd(),
|
||||||
getsockname(sockets->second_fd(),
|
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
|
||||||
reinterpret_cast<sockaddr*>(&receiverAddr), &receiverAddrLen),
|
&receiver_addr_len),
|
||||||
SyscallSucceeds());
|
SyscallSucceeds());
|
||||||
EXPECT_EQ(receiverAddrLen, sizeof(receiverAddr));
|
EXPECT_EQ(receiver_addr_len, receiver_addr.addr_len);
|
||||||
|
|
||||||
// Send the multicast packet.
|
// Send the multicast packet.
|
||||||
sockaddr_in sendAddr = {};
|
auto send_addr = V4Multicast();
|
||||||
sendAddr.sin_family = AF_INET;
|
reinterpret_cast<sockaddr_in*>(&send_addr.addr)->sin_port =
|
||||||
sendAddr.sin_port = receiverAddr.sin_port;
|
reinterpret_cast<sockaddr_in*>(&receiver_addr.addr)->sin_port;
|
||||||
sendAddr.sin_addr.s_addr = inet_addr("224.0.2.1");
|
|
||||||
char send_buf[200];
|
char send_buf[200];
|
||||||
RandomizeBuffer(send_buf, sizeof(send_buf));
|
RandomizeBuffer(send_buf, sizeof(send_buf));
|
||||||
EXPECT_THAT(RetryEINTR(sendto)(
|
EXPECT_THAT(
|
||||||
sockets->first_fd(), send_buf, sizeof(send_buf), 0,
|
RetryEINTR(sendto)(sockets->first_fd(), send_buf, sizeof(send_buf), 0,
|
||||||
reinterpret_cast<sockaddr*>(&sendAddr), sizeof(sendAddr)),
|
reinterpret_cast<sockaddr*>(&send_addr.addr),
|
||||||
|
send_addr.addr_len),
|
||||||
SyscallSucceedsWithValue(sizeof(send_buf)));
|
SyscallSucceedsWithValue(sizeof(send_buf)));
|
||||||
|
|
||||||
// Check that we did not receive the multicast packet.
|
// Check that we did not receive the multicast packet.
|
||||||
|
@ -86,38 +93,36 @@ TEST_P(IPv4UDPUnboundSocketPairTest, IpMulticastLoopbackAddrNoDefaultSendIf) {
|
||||||
|
|
||||||
// Bind the second FD to the v4 any address to ensure that we can receive any
|
// Bind the second FD to the v4 any address to ensure that we can receive any
|
||||||
// unicast packet.
|
// unicast packet.
|
||||||
sockaddr_in receiverAddr = {};
|
auto receiver_addr = V4Any();
|
||||||
receiverAddr.sin_family = AF_INET;
|
EXPECT_THAT(bind(sockets->second_fd(),
|
||||||
receiverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
|
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
|
||||||
EXPECT_THAT(
|
receiver_addr.addr_len),
|
||||||
bind(sockets->second_fd(), reinterpret_cast<sockaddr*>(&receiverAddr),
|
|
||||||
sizeof(receiverAddr)),
|
|
||||||
SyscallSucceeds());
|
SyscallSucceeds());
|
||||||
socklen_t receiverAddrLen = sizeof(receiverAddr);
|
socklen_t receiver_addr_len = receiver_addr.addr_len;
|
||||||
EXPECT_THAT(
|
EXPECT_THAT(getsockname(sockets->second_fd(),
|
||||||
getsockname(sockets->second_fd(),
|
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
|
||||||
reinterpret_cast<sockaddr*>(&receiverAddr), &receiverAddrLen),
|
&receiver_addr_len),
|
||||||
SyscallSucceeds());
|
SyscallSucceeds());
|
||||||
EXPECT_EQ(receiverAddrLen, sizeof(receiverAddr));
|
EXPECT_EQ(receiver_addr_len, receiver_addr.addr_len);
|
||||||
|
|
||||||
// Register to receive multicast packets.
|
// Register to receive multicast packets.
|
||||||
ip_mreq group = {};
|
ip_mreq group = {};
|
||||||
group.imr_multiaddr.s_addr = inet_addr("224.0.2.1");
|
group.imr_multiaddr.s_addr = inet_addr(kMulticastAddress);
|
||||||
group.imr_interface.s_addr = htonl(INADDR_LOOPBACK);
|
group.imr_interface.s_addr = htonl(INADDR_LOOPBACK);
|
||||||
EXPECT_THAT(setsockopt(sockets->second_fd(), IPPROTO_IP, IP_ADD_MEMBERSHIP,
|
EXPECT_THAT(setsockopt(sockets->second_fd(), IPPROTO_IP, IP_ADD_MEMBERSHIP,
|
||||||
&group, sizeof(group)),
|
&group, sizeof(group)),
|
||||||
SyscallSucceeds());
|
SyscallSucceeds());
|
||||||
|
|
||||||
// Send a multicast packet.
|
// Send a multicast packet.
|
||||||
sockaddr_in sendAddr = {};
|
auto send_addr = V4Multicast();
|
||||||
sendAddr.sin_family = AF_INET;
|
reinterpret_cast<sockaddr_in*>(&send_addr.addr)->sin_port =
|
||||||
sendAddr.sin_port = receiverAddr.sin_port;
|
reinterpret_cast<sockaddr_in*>(&receiver_addr.addr)->sin_port;
|
||||||
sendAddr.sin_addr.s_addr = inet_addr("224.0.2.1");
|
|
||||||
char send_buf[200];
|
char send_buf[200];
|
||||||
RandomizeBuffer(send_buf, sizeof(send_buf));
|
RandomizeBuffer(send_buf, sizeof(send_buf));
|
||||||
EXPECT_THAT(RetryEINTR(sendto)(
|
EXPECT_THAT(
|
||||||
sockets->first_fd(), send_buf, sizeof(send_buf), 0,
|
RetryEINTR(sendto)(sockets->first_fd(), send_buf, sizeof(send_buf), 0,
|
||||||
reinterpret_cast<sockaddr*>(&sendAddr), sizeof(sendAddr)),
|
reinterpret_cast<sockaddr*>(&send_addr.addr),
|
||||||
|
send_addr.addr_len),
|
||||||
SyscallFailsWithErrno(ENETUNREACH));
|
SyscallFailsWithErrno(ENETUNREACH));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,38 +133,36 @@ TEST_P(IPv4UDPUnboundSocketPairTest, IpMulticastLoopbackNicNoDefaultSendIf) {
|
||||||
|
|
||||||
// Bind the second FD to the v4 any address to ensure that we can receive any
|
// Bind the second FD to the v4 any address to ensure that we can receive any
|
||||||
// unicast packet.
|
// unicast packet.
|
||||||
sockaddr_in receiverAddr = {};
|
auto receiver_addr = V4Any();
|
||||||
receiverAddr.sin_family = AF_INET;
|
EXPECT_THAT(bind(sockets->second_fd(),
|
||||||
receiverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
|
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
|
||||||
EXPECT_THAT(
|
receiver_addr.addr_len),
|
||||||
bind(sockets->second_fd(), reinterpret_cast<sockaddr*>(&receiverAddr),
|
|
||||||
sizeof(receiverAddr)),
|
|
||||||
SyscallSucceeds());
|
SyscallSucceeds());
|
||||||
socklen_t receiverAddrLen = sizeof(receiverAddr);
|
socklen_t receiver_addr_len = receiver_addr.addr_len;
|
||||||
EXPECT_THAT(
|
EXPECT_THAT(getsockname(sockets->second_fd(),
|
||||||
getsockname(sockets->second_fd(),
|
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
|
||||||
reinterpret_cast<sockaddr*>(&receiverAddr), &receiverAddrLen),
|
&receiver_addr_len),
|
||||||
SyscallSucceeds());
|
SyscallSucceeds());
|
||||||
EXPECT_EQ(receiverAddrLen, sizeof(receiverAddr));
|
EXPECT_EQ(receiver_addr_len, receiver_addr.addr_len);
|
||||||
|
|
||||||
// Register to receive multicast packets.
|
// Register to receive multicast packets.
|
||||||
ip_mreqn group = {};
|
ip_mreqn group = {};
|
||||||
group.imr_multiaddr.s_addr = inet_addr("224.0.2.1");
|
group.imr_multiaddr.s_addr = inet_addr(kMulticastAddress);
|
||||||
group.imr_ifindex = ASSERT_NO_ERRNO_AND_VALUE(InterfaceIndex("lo"));
|
group.imr_ifindex = ASSERT_NO_ERRNO_AND_VALUE(InterfaceIndex("lo"));
|
||||||
EXPECT_THAT(setsockopt(sockets->second_fd(), IPPROTO_IP, IP_ADD_MEMBERSHIP,
|
EXPECT_THAT(setsockopt(sockets->second_fd(), IPPROTO_IP, IP_ADD_MEMBERSHIP,
|
||||||
&group, sizeof(group)),
|
&group, sizeof(group)),
|
||||||
SyscallSucceeds());
|
SyscallSucceeds());
|
||||||
|
|
||||||
// Send a multicast packet.
|
// Send a multicast packet.
|
||||||
sockaddr_in sendAddr = {};
|
auto send_addr = V4Multicast();
|
||||||
sendAddr.sin_family = AF_INET;
|
reinterpret_cast<sockaddr_in*>(&send_addr.addr)->sin_port =
|
||||||
sendAddr.sin_port = receiverAddr.sin_port;
|
reinterpret_cast<sockaddr_in*>(&receiver_addr.addr)->sin_port;
|
||||||
sendAddr.sin_addr.s_addr = inet_addr("224.0.2.1");
|
|
||||||
char send_buf[200];
|
char send_buf[200];
|
||||||
RandomizeBuffer(send_buf, sizeof(send_buf));
|
RandomizeBuffer(send_buf, sizeof(send_buf));
|
||||||
EXPECT_THAT(RetryEINTR(sendto)(
|
EXPECT_THAT(
|
||||||
sockets->first_fd(), send_buf, sizeof(send_buf), 0,
|
RetryEINTR(sendto)(sockets->first_fd(), send_buf, sizeof(send_buf), 0,
|
||||||
reinterpret_cast<sockaddr*>(&sendAddr), sizeof(sendAddr)),
|
reinterpret_cast<sockaddr*>(&send_addr.addr),
|
||||||
|
send_addr.addr_len),
|
||||||
SyscallFailsWithErrno(ENETUNREACH));
|
SyscallFailsWithErrno(ENETUNREACH));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,48 +173,44 @@ TEST_P(IPv4UDPUnboundSocketPairTest, IpMulticastLoopbackAddr) {
|
||||||
|
|
||||||
// Bind the first FD to the loopback. This is an alternative to
|
// Bind the first FD to the loopback. This is an alternative to
|
||||||
// IP_MULTICAST_IF for setting the default send interface.
|
// IP_MULTICAST_IF for setting the default send interface.
|
||||||
sockaddr_in senderAddr = {};
|
auto sender_addr = V4Loopback();
|
||||||
senderAddr.sin_family = AF_INET;
|
|
||||||
senderAddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
|
|
||||||
EXPECT_THAT(
|
EXPECT_THAT(
|
||||||
bind(sockets->first_fd(), reinterpret_cast<sockaddr*>(&senderAddr),
|
bind(sockets->first_fd(), reinterpret_cast<sockaddr*>(&sender_addr.addr),
|
||||||
sizeof(senderAddr)),
|
sender_addr.addr_len),
|
||||||
SyscallSucceeds());
|
SyscallSucceeds());
|
||||||
|
|
||||||
// Bind the second FD to the v4 any address to ensure that we can receive the
|
// Bind the second FD to the v4 any address to ensure that we can receive the
|
||||||
// multicast packet.
|
// multicast packet.
|
||||||
sockaddr_in receiverAddr = {};
|
auto receiver_addr = V4Any();
|
||||||
receiverAddr.sin_family = AF_INET;
|
EXPECT_THAT(bind(sockets->second_fd(),
|
||||||
receiverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
|
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
|
||||||
EXPECT_THAT(
|
receiver_addr.addr_len),
|
||||||
bind(sockets->second_fd(), reinterpret_cast<sockaddr*>(&receiverAddr),
|
|
||||||
sizeof(receiverAddr)),
|
|
||||||
SyscallSucceeds());
|
SyscallSucceeds());
|
||||||
socklen_t receiverAddrLen = sizeof(receiverAddr);
|
socklen_t receiver_addr_len = receiver_addr.addr_len;
|
||||||
EXPECT_THAT(
|
EXPECT_THAT(getsockname(sockets->second_fd(),
|
||||||
getsockname(sockets->second_fd(),
|
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
|
||||||
reinterpret_cast<sockaddr*>(&receiverAddr), &receiverAddrLen),
|
&receiver_addr_len),
|
||||||
SyscallSucceeds());
|
SyscallSucceeds());
|
||||||
EXPECT_EQ(receiverAddrLen, sizeof(receiverAddr));
|
EXPECT_EQ(receiver_addr_len, receiver_addr.addr_len);
|
||||||
|
|
||||||
// Register to receive multicast packets.
|
// Register to receive multicast packets.
|
||||||
ip_mreq group = {};
|
ip_mreq group = {};
|
||||||
group.imr_multiaddr.s_addr = inet_addr("224.0.2.1");
|
group.imr_multiaddr.s_addr = inet_addr(kMulticastAddress);
|
||||||
group.imr_interface.s_addr = htonl(INADDR_LOOPBACK);
|
group.imr_interface.s_addr = htonl(INADDR_LOOPBACK);
|
||||||
EXPECT_THAT(setsockopt(sockets->second_fd(), IPPROTO_IP, IP_ADD_MEMBERSHIP,
|
EXPECT_THAT(setsockopt(sockets->second_fd(), IPPROTO_IP, IP_ADD_MEMBERSHIP,
|
||||||
&group, sizeof(group)),
|
&group, sizeof(group)),
|
||||||
SyscallSucceeds());
|
SyscallSucceeds());
|
||||||
|
|
||||||
// Send a multicast packet.
|
// Send a multicast packet.
|
||||||
sockaddr_in sendAddr = {};
|
auto send_addr = V4Multicast();
|
||||||
sendAddr.sin_family = AF_INET;
|
reinterpret_cast<sockaddr_in*>(&send_addr.addr)->sin_port =
|
||||||
sendAddr.sin_port = receiverAddr.sin_port;
|
reinterpret_cast<sockaddr_in*>(&receiver_addr.addr)->sin_port;
|
||||||
sendAddr.sin_addr.s_addr = inet_addr("224.0.2.1");
|
|
||||||
char send_buf[200];
|
char send_buf[200];
|
||||||
RandomizeBuffer(send_buf, sizeof(send_buf));
|
RandomizeBuffer(send_buf, sizeof(send_buf));
|
||||||
EXPECT_THAT(RetryEINTR(sendto)(
|
EXPECT_THAT(
|
||||||
sockets->first_fd(), send_buf, sizeof(send_buf), 0,
|
RetryEINTR(sendto)(sockets->first_fd(), send_buf, sizeof(send_buf), 0,
|
||||||
reinterpret_cast<sockaddr*>(&sendAddr), sizeof(sendAddr)),
|
reinterpret_cast<sockaddr*>(&send_addr.addr),
|
||||||
|
send_addr.addr_len),
|
||||||
SyscallSucceedsWithValue(sizeof(send_buf)));
|
SyscallSucceedsWithValue(sizeof(send_buf)));
|
||||||
|
|
||||||
// Check that we received the multicast packet.
|
// Check that we received the multicast packet.
|
||||||
|
@ -230,48 +229,44 @@ TEST_P(IPv4UDPUnboundSocketPairTest, IpMulticastLoopbackNic) {
|
||||||
|
|
||||||
// Bind the first FD to the loopback. This is an alternative to
|
// Bind the first FD to the loopback. This is an alternative to
|
||||||
// IP_MULTICAST_IF for setting the default send interface.
|
// IP_MULTICAST_IF for setting the default send interface.
|
||||||
sockaddr_in senderAddr = {};
|
auto sender_addr = V4Loopback();
|
||||||
senderAddr.sin_family = AF_INET;
|
|
||||||
senderAddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
|
|
||||||
EXPECT_THAT(
|
EXPECT_THAT(
|
||||||
bind(sockets->first_fd(), reinterpret_cast<sockaddr*>(&senderAddr),
|
bind(sockets->first_fd(), reinterpret_cast<sockaddr*>(&sender_addr.addr),
|
||||||
sizeof(senderAddr)),
|
sender_addr.addr_len),
|
||||||
SyscallSucceeds());
|
SyscallSucceeds());
|
||||||
|
|
||||||
// Bind the second FD to the v4 any address to ensure that we can receive the
|
// Bind the second FD to the v4 any address to ensure that we can receive the
|
||||||
// multicast packet.
|
// multicast packet.
|
||||||
sockaddr_in receiverAddr = {};
|
auto receiver_addr = V4Any();
|
||||||
receiverAddr.sin_family = AF_INET;
|
EXPECT_THAT(bind(sockets->second_fd(),
|
||||||
receiverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
|
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
|
||||||
EXPECT_THAT(
|
receiver_addr.addr_len),
|
||||||
bind(sockets->second_fd(), reinterpret_cast<sockaddr*>(&receiverAddr),
|
|
||||||
sizeof(receiverAddr)),
|
|
||||||
SyscallSucceeds());
|
SyscallSucceeds());
|
||||||
socklen_t receiverAddrLen = sizeof(receiverAddr);
|
socklen_t receiver_addr_len = receiver_addr.addr_len;
|
||||||
EXPECT_THAT(
|
EXPECT_THAT(getsockname(sockets->second_fd(),
|
||||||
getsockname(sockets->second_fd(),
|
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
|
||||||
reinterpret_cast<sockaddr*>(&receiverAddr), &receiverAddrLen),
|
&receiver_addr_len),
|
||||||
SyscallSucceeds());
|
SyscallSucceeds());
|
||||||
EXPECT_EQ(receiverAddrLen, sizeof(receiverAddr));
|
EXPECT_EQ(receiver_addr_len, receiver_addr.addr_len);
|
||||||
|
|
||||||
// Register to receive multicast packets.
|
// Register to receive multicast packets.
|
||||||
ip_mreqn group = {};
|
ip_mreqn group = {};
|
||||||
group.imr_multiaddr.s_addr = inet_addr("224.0.2.1");
|
group.imr_multiaddr.s_addr = inet_addr(kMulticastAddress);
|
||||||
group.imr_ifindex = ASSERT_NO_ERRNO_AND_VALUE(InterfaceIndex("lo"));
|
group.imr_ifindex = ASSERT_NO_ERRNO_AND_VALUE(InterfaceIndex("lo"));
|
||||||
EXPECT_THAT(setsockopt(sockets->second_fd(), IPPROTO_IP, IP_ADD_MEMBERSHIP,
|
EXPECT_THAT(setsockopt(sockets->second_fd(), IPPROTO_IP, IP_ADD_MEMBERSHIP,
|
||||||
&group, sizeof(group)),
|
&group, sizeof(group)),
|
||||||
SyscallSucceeds());
|
SyscallSucceeds());
|
||||||
|
|
||||||
// Send a multicast packet.
|
// Send a multicast packet.
|
||||||
sockaddr_in sendAddr = {};
|
auto send_addr = V4Multicast();
|
||||||
sendAddr.sin_family = AF_INET;
|
reinterpret_cast<sockaddr_in*>(&send_addr.addr)->sin_port =
|
||||||
sendAddr.sin_port = receiverAddr.sin_port;
|
reinterpret_cast<sockaddr_in*>(&receiver_addr.addr)->sin_port;
|
||||||
sendAddr.sin_addr.s_addr = inet_addr("224.0.2.1");
|
|
||||||
char send_buf[200];
|
char send_buf[200];
|
||||||
RandomizeBuffer(send_buf, sizeof(send_buf));
|
RandomizeBuffer(send_buf, sizeof(send_buf));
|
||||||
EXPECT_THAT(RetryEINTR(sendto)(
|
EXPECT_THAT(
|
||||||
sockets->first_fd(), send_buf, sizeof(send_buf), 0,
|
RetryEINTR(sendto)(sockets->first_fd(), send_buf, sizeof(send_buf), 0,
|
||||||
reinterpret_cast<sockaddr*>(&sendAddr), sizeof(sendAddr)),
|
reinterpret_cast<sockaddr*>(&send_addr.addr),
|
||||||
|
send_addr.addr_len),
|
||||||
SyscallSucceedsWithValue(sizeof(send_buf)));
|
SyscallSucceedsWithValue(sizeof(send_buf)));
|
||||||
|
|
||||||
// Check that we received the multicast packet.
|
// Check that we received the multicast packet.
|
||||||
|
@ -289,7 +284,7 @@ TEST_P(IPv4UDPUnboundSocketPairTest, IpMulticastInvalidDrop) {
|
||||||
|
|
||||||
// Unregister from a membership that we didn't have.
|
// Unregister from a membership that we didn't have.
|
||||||
ip_mreq group = {};
|
ip_mreq group = {};
|
||||||
group.imr_multiaddr.s_addr = inet_addr("224.0.2.1");
|
group.imr_multiaddr.s_addr = inet_addr(kMulticastAddress);
|
||||||
group.imr_interface.s_addr = htonl(INADDR_LOOPBACK);
|
group.imr_interface.s_addr = htonl(INADDR_LOOPBACK);
|
||||||
EXPECT_THAT(setsockopt(sockets->first_fd(), IPPROTO_IP, IP_DROP_MEMBERSHIP,
|
EXPECT_THAT(setsockopt(sockets->first_fd(), IPPROTO_IP, IP_DROP_MEMBERSHIP,
|
||||||
&group, sizeof(group)),
|
&group, sizeof(group)),
|
||||||
|
@ -304,33 +299,29 @@ TEST_P(IPv4UDPUnboundSocketPairTest, IpMulticastDropAddr) {
|
||||||
|
|
||||||
// Bind the first FD to the loopback. This is an alternative to
|
// Bind the first FD to the loopback. This is an alternative to
|
||||||
// IP_MULTICAST_IF for setting the default send interface.
|
// IP_MULTICAST_IF for setting the default send interface.
|
||||||
sockaddr_in senderAddr = {};
|
auto sender_addr = V4Loopback();
|
||||||
senderAddr.sin_family = AF_INET;
|
|
||||||
senderAddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
|
|
||||||
EXPECT_THAT(
|
EXPECT_THAT(
|
||||||
bind(sockets->first_fd(), reinterpret_cast<sockaddr*>(&senderAddr),
|
bind(sockets->first_fd(), reinterpret_cast<sockaddr*>(&sender_addr.addr),
|
||||||
sizeof(senderAddr)),
|
sender_addr.addr_len),
|
||||||
SyscallSucceeds());
|
SyscallSucceeds());
|
||||||
|
|
||||||
// Bind the second FD to the v4 any address to ensure that we can receive the
|
// Bind the second FD to the v4 any address to ensure that we can receive the
|
||||||
// multicast packet.
|
// multicast packet.
|
||||||
sockaddr_in receiverAddr = {};
|
auto receiver_addr = V4Any();
|
||||||
receiverAddr.sin_family = AF_INET;
|
EXPECT_THAT(bind(sockets->second_fd(),
|
||||||
receiverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
|
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
|
||||||
EXPECT_THAT(
|
receiver_addr.addr_len),
|
||||||
bind(sockets->second_fd(), reinterpret_cast<sockaddr*>(&receiverAddr),
|
|
||||||
sizeof(receiverAddr)),
|
|
||||||
SyscallSucceeds());
|
SyscallSucceeds());
|
||||||
socklen_t receiverAddrLen = sizeof(receiverAddr);
|
socklen_t receiver_addr_len = receiver_addr.addr_len;
|
||||||
EXPECT_THAT(
|
EXPECT_THAT(getsockname(sockets->second_fd(),
|
||||||
getsockname(sockets->second_fd(),
|
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
|
||||||
reinterpret_cast<sockaddr*>(&receiverAddr), &receiverAddrLen),
|
&receiver_addr_len),
|
||||||
SyscallSucceeds());
|
SyscallSucceeds());
|
||||||
EXPECT_EQ(receiverAddrLen, sizeof(receiverAddr));
|
EXPECT_EQ(receiver_addr_len, receiver_addr.addr_len);
|
||||||
|
|
||||||
// Register and unregister to receive multicast packets.
|
// Register and unregister to receive multicast packets.
|
||||||
ip_mreq group = {};
|
ip_mreq group = {};
|
||||||
group.imr_multiaddr.s_addr = inet_addr("224.0.2.1");
|
group.imr_multiaddr.s_addr = inet_addr(kMulticastAddress);
|
||||||
group.imr_interface.s_addr = htonl(INADDR_LOOPBACK);
|
group.imr_interface.s_addr = htonl(INADDR_LOOPBACK);
|
||||||
EXPECT_THAT(setsockopt(sockets->second_fd(), IPPROTO_IP, IP_ADD_MEMBERSHIP,
|
EXPECT_THAT(setsockopt(sockets->second_fd(), IPPROTO_IP, IP_ADD_MEMBERSHIP,
|
||||||
&group, sizeof(group)),
|
&group, sizeof(group)),
|
||||||
|
@ -340,15 +331,15 @@ TEST_P(IPv4UDPUnboundSocketPairTest, IpMulticastDropAddr) {
|
||||||
SyscallSucceeds());
|
SyscallSucceeds());
|
||||||
|
|
||||||
// Send a multicast packet.
|
// Send a multicast packet.
|
||||||
sockaddr_in sendAddr = {};
|
auto send_addr = V4Multicast();
|
||||||
sendAddr.sin_family = AF_INET;
|
reinterpret_cast<sockaddr_in*>(&send_addr.addr)->sin_port =
|
||||||
sendAddr.sin_port = receiverAddr.sin_port;
|
reinterpret_cast<sockaddr_in*>(&receiver_addr.addr)->sin_port;
|
||||||
sendAddr.sin_addr.s_addr = inet_addr("224.0.2.1");
|
|
||||||
char send_buf[200];
|
char send_buf[200];
|
||||||
RandomizeBuffer(send_buf, sizeof(send_buf));
|
RandomizeBuffer(send_buf, sizeof(send_buf));
|
||||||
EXPECT_THAT(RetryEINTR(sendto)(
|
EXPECT_THAT(
|
||||||
sockets->first_fd(), send_buf, sizeof(send_buf), 0,
|
RetryEINTR(sendto)(sockets->first_fd(), send_buf, sizeof(send_buf), 0,
|
||||||
reinterpret_cast<sockaddr*>(&sendAddr), sizeof(sendAddr)),
|
reinterpret_cast<sockaddr*>(&send_addr.addr),
|
||||||
|
send_addr.addr_len),
|
||||||
SyscallSucceedsWithValue(sizeof(send_buf)));
|
SyscallSucceedsWithValue(sizeof(send_buf)));
|
||||||
|
|
||||||
// Check that we did not receive the multicast packet.
|
// Check that we did not receive the multicast packet.
|
||||||
|
@ -366,33 +357,29 @@ TEST_P(IPv4UDPUnboundSocketPairTest, IpMulticastDropNic) {
|
||||||
|
|
||||||
// Bind the first FD to the loopback. This is an alternative to
|
// Bind the first FD to the loopback. This is an alternative to
|
||||||
// IP_MULTICAST_IF for setting the default send interface.
|
// IP_MULTICAST_IF for setting the default send interface.
|
||||||
sockaddr_in senderAddr = {};
|
auto sender_addr = V4Loopback();
|
||||||
senderAddr.sin_family = AF_INET;
|
|
||||||
senderAddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
|
|
||||||
EXPECT_THAT(
|
EXPECT_THAT(
|
||||||
bind(sockets->first_fd(), reinterpret_cast<sockaddr*>(&senderAddr),
|
bind(sockets->first_fd(), reinterpret_cast<sockaddr*>(&sender_addr.addr),
|
||||||
sizeof(senderAddr)),
|
sender_addr.addr_len),
|
||||||
SyscallSucceeds());
|
SyscallSucceeds());
|
||||||
|
|
||||||
// Bind the second FD to the v4 any address to ensure that we can receive the
|
// Bind the second FD to the v4 any address to ensure that we can receive the
|
||||||
// multicast packet.
|
// multicast packet.
|
||||||
sockaddr_in receiverAddr = {};
|
auto receiver_addr = V4Any();
|
||||||
receiverAddr.sin_family = AF_INET;
|
EXPECT_THAT(bind(sockets->second_fd(),
|
||||||
receiverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
|
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
|
||||||
EXPECT_THAT(
|
receiver_addr.addr_len),
|
||||||
bind(sockets->second_fd(), reinterpret_cast<sockaddr*>(&receiverAddr),
|
|
||||||
sizeof(receiverAddr)),
|
|
||||||
SyscallSucceeds());
|
SyscallSucceeds());
|
||||||
socklen_t receiverAddrLen = sizeof(receiverAddr);
|
socklen_t receiver_addr_len = receiver_addr.addr_len;
|
||||||
EXPECT_THAT(
|
EXPECT_THAT(getsockname(sockets->second_fd(),
|
||||||
getsockname(sockets->second_fd(),
|
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
|
||||||
reinterpret_cast<sockaddr*>(&receiverAddr), &receiverAddrLen),
|
&receiver_addr_len),
|
||||||
SyscallSucceeds());
|
SyscallSucceeds());
|
||||||
EXPECT_EQ(receiverAddrLen, sizeof(receiverAddr));
|
EXPECT_EQ(receiver_addr_len, receiver_addr.addr_len);
|
||||||
|
|
||||||
// Register and unregister to receive multicast packets.
|
// Register and unregister to receive multicast packets.
|
||||||
ip_mreqn group = {};
|
ip_mreqn group = {};
|
||||||
group.imr_multiaddr.s_addr = inet_addr("224.0.2.1");
|
group.imr_multiaddr.s_addr = inet_addr(kMulticastAddress);
|
||||||
group.imr_ifindex = ASSERT_NO_ERRNO_AND_VALUE(InterfaceIndex("lo"));
|
group.imr_ifindex = ASSERT_NO_ERRNO_AND_VALUE(InterfaceIndex("lo"));
|
||||||
EXPECT_THAT(setsockopt(sockets->second_fd(), IPPROTO_IP, IP_ADD_MEMBERSHIP,
|
EXPECT_THAT(setsockopt(sockets->second_fd(), IPPROTO_IP, IP_ADD_MEMBERSHIP,
|
||||||
&group, sizeof(group)),
|
&group, sizeof(group)),
|
||||||
|
@ -402,15 +389,15 @@ TEST_P(IPv4UDPUnboundSocketPairTest, IpMulticastDropNic) {
|
||||||
SyscallSucceeds());
|
SyscallSucceeds());
|
||||||
|
|
||||||
// Send a multicast packet.
|
// Send a multicast packet.
|
||||||
sockaddr_in sendAddr = {};
|
auto send_addr = V4Multicast();
|
||||||
sendAddr.sin_family = AF_INET;
|
reinterpret_cast<sockaddr_in*>(&send_addr.addr)->sin_port =
|
||||||
sendAddr.sin_port = receiverAddr.sin_port;
|
reinterpret_cast<sockaddr_in*>(&receiver_addr.addr)->sin_port;
|
||||||
sendAddr.sin_addr.s_addr = inet_addr("224.0.2.1");
|
|
||||||
char send_buf[200];
|
char send_buf[200];
|
||||||
RandomizeBuffer(send_buf, sizeof(send_buf));
|
RandomizeBuffer(send_buf, sizeof(send_buf));
|
||||||
EXPECT_THAT(RetryEINTR(sendto)(
|
EXPECT_THAT(
|
||||||
sockets->first_fd(), send_buf, sizeof(send_buf), 0,
|
RetryEINTR(sendto)(sockets->first_fd(), send_buf, sizeof(send_buf), 0,
|
||||||
reinterpret_cast<sockaddr*>(&sendAddr), sizeof(sendAddr)),
|
reinterpret_cast<sockaddr*>(&send_addr.addr),
|
||||||
|
send_addr.addr_len),
|
||||||
SyscallSucceedsWithValue(sizeof(send_buf)));
|
SyscallSucceedsWithValue(sizeof(send_buf)));
|
||||||
|
|
||||||
// Check that we did not receive the multicast packet.
|
// Check that we did not receive the multicast packet.
|
||||||
|
|
|
@ -680,5 +680,56 @@ void RecvNoData(int sock) {
|
||||||
SyscallFailsWithErrno(EAGAIN));
|
SyscallFailsWithErrno(EAGAIN));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TestAddress V4Any() {
|
||||||
|
TestAddress t("V4Any");
|
||||||
|
t.addr.ss_family = AF_INET;
|
||||||
|
t.addr_len = sizeof(sockaddr_in);
|
||||||
|
reinterpret_cast<sockaddr_in*>(&t.addr)->sin_addr.s_addr = htonl(INADDR_ANY);
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
TestAddress V4Loopback() {
|
||||||
|
TestAddress t("V4Loopback");
|
||||||
|
t.addr.ss_family = AF_INET;
|
||||||
|
t.addr_len = sizeof(sockaddr_in);
|
||||||
|
reinterpret_cast<sockaddr_in*>(&t.addr)->sin_addr.s_addr =
|
||||||
|
htonl(INADDR_LOOPBACK);
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
TestAddress V4MappedAny() {
|
||||||
|
TestAddress t("V4MappedAny");
|
||||||
|
t.addr.ss_family = AF_INET6;
|
||||||
|
t.addr_len = sizeof(sockaddr_in6);
|
||||||
|
inet_pton(AF_INET6, "::ffff:0.0.0.0",
|
||||||
|
reinterpret_cast<sockaddr_in6*>(&t.addr)->sin6_addr.s6_addr);
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
TestAddress V4MappedLoopback() {
|
||||||
|
TestAddress t("V4MappedLoopback");
|
||||||
|
t.addr.ss_family = AF_INET6;
|
||||||
|
t.addr_len = sizeof(sockaddr_in6);
|
||||||
|
inet_pton(AF_INET6, "::ffff:127.0.0.1",
|
||||||
|
reinterpret_cast<sockaddr_in6*>(&t.addr)->sin6_addr.s6_addr);
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
TestAddress V6Any() {
|
||||||
|
TestAddress t("V6Any");
|
||||||
|
t.addr.ss_family = AF_INET6;
|
||||||
|
t.addr_len = sizeof(sockaddr_in6);
|
||||||
|
reinterpret_cast<sockaddr_in6*>(&t.addr)->sin6_addr = in6addr_any;
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
TestAddress V6Loopback() {
|
||||||
|
TestAddress t("V6Loopback");
|
||||||
|
t.addr.ss_family = AF_INET6;
|
||||||
|
t.addr_len = sizeof(sockaddr_in6);
|
||||||
|
reinterpret_cast<sockaddr_in6*>(&t.addr)->sin6_addr = in6addr_loopback;
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace testing
|
} // namespace testing
|
||||||
} // namespace gvisor
|
} // namespace gvisor
|
||||||
|
|
|
@ -449,6 +449,23 @@ void RecvNoData(int sock);
|
||||||
// sockets.
|
// sockets.
|
||||||
using AllSocketPairTest = SocketPairTest;
|
using AllSocketPairTest = SocketPairTest;
|
||||||
|
|
||||||
|
struct TestAddress {
|
||||||
|
std::string description;
|
||||||
|
sockaddr_storage addr;
|
||||||
|
socklen_t addr_len;
|
||||||
|
|
||||||
|
int family() const { return addr.ss_family; }
|
||||||
|
explicit TestAddress(std::string description = "")
|
||||||
|
: description(std::move(description)), addr(), addr_len() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
TestAddress V4Any();
|
||||||
|
TestAddress V4Loopback();
|
||||||
|
TestAddress V4MappedAny();
|
||||||
|
TestAddress V4MappedLoopback();
|
||||||
|
TestAddress V6Any();
|
||||||
|
TestAddress V6Loopback();
|
||||||
|
|
||||||
} // namespace testing
|
} // namespace testing
|
||||||
} // namespace gvisor
|
} // namespace gvisor
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue