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:
Ian Gudger 2019-02-08 18:22:31 -08:00 committed by Shentubot
parent f17692d807
commit 85d53d81d9
4 changed files with 234 additions and 240 deletions

View File

@ -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 {
TestAddress listener;
TestAddress connector;

View File

@ -29,6 +29,17 @@
namespace gvisor {
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
// interface configured by bind.
TEST_P(IPv4UDPUnboundSocketPairTest, IpMulticastLoopbackNoGroup) {
@ -36,40 +47,36 @@ TEST_P(IPv4UDPUnboundSocketPairTest, IpMulticastLoopbackNoGroup) {
// Bind the first FD to the loopback. This is an alternative to
// IP_MULTICAST_IF for setting the default send interface.
sockaddr_in senderAddr = {};
senderAddr.sin_family = AF_INET;
senderAddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
auto sender_addr = V4Loopback();
EXPECT_THAT(
bind(sockets->first_fd(), reinterpret_cast<sockaddr*>(&senderAddr),
sizeof(senderAddr)),
bind(sockets->first_fd(), reinterpret_cast<sockaddr*>(&sender_addr.addr),
sender_addr.addr_len),
SyscallSucceeds());
// Bind the second FD to the v4 any address. If multicast worked like unicast,
// this would ensure that we get the packet.
sockaddr_in receiverAddr = {};
receiverAddr.sin_family = AF_INET;
receiverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
EXPECT_THAT(
bind(sockets->second_fd(), reinterpret_cast<sockaddr*>(&receiverAddr),
sizeof(receiverAddr)),
auto receiver_addr = V4Any();
EXPECT_THAT(bind(sockets->second_fd(),
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
receiver_addr.addr_len),
SyscallSucceeds());
socklen_t receiverAddrLen = sizeof(receiverAddr);
EXPECT_THAT(
getsockname(sockets->second_fd(),
reinterpret_cast<sockaddr*>(&receiverAddr), &receiverAddrLen),
socklen_t receiver_addr_len = receiver_addr.addr_len;
EXPECT_THAT(getsockname(sockets->second_fd(),
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
&receiver_addr_len),
SyscallSucceeds());
EXPECT_EQ(receiverAddrLen, sizeof(receiverAddr));
EXPECT_EQ(receiver_addr_len, receiver_addr.addr_len);
// Send the multicast packet.
sockaddr_in sendAddr = {};
sendAddr.sin_family = AF_INET;
sendAddr.sin_port = receiverAddr.sin_port;
sendAddr.sin_addr.s_addr = inet_addr("224.0.2.1");
auto send_addr = V4Multicast();
reinterpret_cast<sockaddr_in*>(&send_addr.addr)->sin_port =
reinterpret_cast<sockaddr_in*>(&receiver_addr.addr)->sin_port;
char send_buf[200];
RandomizeBuffer(send_buf, sizeof(send_buf));
EXPECT_THAT(RetryEINTR(sendto)(
sockets->first_fd(), send_buf, sizeof(send_buf), 0,
reinterpret_cast<sockaddr*>(&sendAddr), sizeof(sendAddr)),
EXPECT_THAT(
RetryEINTR(sendto)(sockets->first_fd(), send_buf, sizeof(send_buf), 0,
reinterpret_cast<sockaddr*>(&send_addr.addr),
send_addr.addr_len),
SyscallSucceedsWithValue(sizeof(send_buf)));
// 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
// unicast packet.
sockaddr_in receiverAddr = {};
receiverAddr.sin_family = AF_INET;
receiverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
EXPECT_THAT(
bind(sockets->second_fd(), reinterpret_cast<sockaddr*>(&receiverAddr),
sizeof(receiverAddr)),
auto receiver_addr = V4Any();
EXPECT_THAT(bind(sockets->second_fd(),
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
receiver_addr.addr_len),
SyscallSucceeds());
socklen_t receiverAddrLen = sizeof(receiverAddr);
EXPECT_THAT(
getsockname(sockets->second_fd(),
reinterpret_cast<sockaddr*>(&receiverAddr), &receiverAddrLen),
socklen_t receiver_addr_len = receiver_addr.addr_len;
EXPECT_THAT(getsockname(sockets->second_fd(),
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
&receiver_addr_len),
SyscallSucceeds());
EXPECT_EQ(receiverAddrLen, sizeof(receiverAddr));
EXPECT_EQ(receiver_addr_len, receiver_addr.addr_len);
// Register to receive multicast packets.
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);
EXPECT_THAT(setsockopt(sockets->second_fd(), IPPROTO_IP, IP_ADD_MEMBERSHIP,
&group, sizeof(group)),
SyscallSucceeds());
// Send a multicast packet.
sockaddr_in sendAddr = {};
sendAddr.sin_family = AF_INET;
sendAddr.sin_port = receiverAddr.sin_port;
sendAddr.sin_addr.s_addr = inet_addr("224.0.2.1");
auto send_addr = V4Multicast();
reinterpret_cast<sockaddr_in*>(&send_addr.addr)->sin_port =
reinterpret_cast<sockaddr_in*>(&receiver_addr.addr)->sin_port;
char send_buf[200];
RandomizeBuffer(send_buf, sizeof(send_buf));
EXPECT_THAT(RetryEINTR(sendto)(
sockets->first_fd(), send_buf, sizeof(send_buf), 0,
reinterpret_cast<sockaddr*>(&sendAddr), sizeof(sendAddr)),
EXPECT_THAT(
RetryEINTR(sendto)(sockets->first_fd(), send_buf, sizeof(send_buf), 0,
reinterpret_cast<sockaddr*>(&send_addr.addr),
send_addr.addr_len),
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
// unicast packet.
sockaddr_in receiverAddr = {};
receiverAddr.sin_family = AF_INET;
receiverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
EXPECT_THAT(
bind(sockets->second_fd(), reinterpret_cast<sockaddr*>(&receiverAddr),
sizeof(receiverAddr)),
auto receiver_addr = V4Any();
EXPECT_THAT(bind(sockets->second_fd(),
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
receiver_addr.addr_len),
SyscallSucceeds());
socklen_t receiverAddrLen = sizeof(receiverAddr);
EXPECT_THAT(
getsockname(sockets->second_fd(),
reinterpret_cast<sockaddr*>(&receiverAddr), &receiverAddrLen),
socklen_t receiver_addr_len = receiver_addr.addr_len;
EXPECT_THAT(getsockname(sockets->second_fd(),
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
&receiver_addr_len),
SyscallSucceeds());
EXPECT_EQ(receiverAddrLen, sizeof(receiverAddr));
EXPECT_EQ(receiver_addr_len, receiver_addr.addr_len);
// Register to receive multicast packets.
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"));
EXPECT_THAT(setsockopt(sockets->second_fd(), IPPROTO_IP, IP_ADD_MEMBERSHIP,
&group, sizeof(group)),
SyscallSucceeds());
// Send a multicast packet.
sockaddr_in sendAddr = {};
sendAddr.sin_family = AF_INET;
sendAddr.sin_port = receiverAddr.sin_port;
sendAddr.sin_addr.s_addr = inet_addr("224.0.2.1");
auto send_addr = V4Multicast();
reinterpret_cast<sockaddr_in*>(&send_addr.addr)->sin_port =
reinterpret_cast<sockaddr_in*>(&receiver_addr.addr)->sin_port;
char send_buf[200];
RandomizeBuffer(send_buf, sizeof(send_buf));
EXPECT_THAT(RetryEINTR(sendto)(
sockets->first_fd(), send_buf, sizeof(send_buf), 0,
reinterpret_cast<sockaddr*>(&sendAddr), sizeof(sendAddr)),
EXPECT_THAT(
RetryEINTR(sendto)(sockets->first_fd(), send_buf, sizeof(send_buf), 0,
reinterpret_cast<sockaddr*>(&send_addr.addr),
send_addr.addr_len),
SyscallFailsWithErrno(ENETUNREACH));
}
@ -170,48 +173,44 @@ TEST_P(IPv4UDPUnboundSocketPairTest, IpMulticastLoopbackAddr) {
// Bind the first FD to the loopback. This is an alternative to
// IP_MULTICAST_IF for setting the default send interface.
sockaddr_in senderAddr = {};
senderAddr.sin_family = AF_INET;
senderAddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
auto sender_addr = V4Loopback();
EXPECT_THAT(
bind(sockets->first_fd(), reinterpret_cast<sockaddr*>(&senderAddr),
sizeof(senderAddr)),
bind(sockets->first_fd(), reinterpret_cast<sockaddr*>(&sender_addr.addr),
sender_addr.addr_len),
SyscallSucceeds());
// Bind the second FD to the v4 any address to ensure that we can receive the
// multicast packet.
sockaddr_in receiverAddr = {};
receiverAddr.sin_family = AF_INET;
receiverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
EXPECT_THAT(
bind(sockets->second_fd(), reinterpret_cast<sockaddr*>(&receiverAddr),
sizeof(receiverAddr)),
auto receiver_addr = V4Any();
EXPECT_THAT(bind(sockets->second_fd(),
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
receiver_addr.addr_len),
SyscallSucceeds());
socklen_t receiverAddrLen = sizeof(receiverAddr);
EXPECT_THAT(
getsockname(sockets->second_fd(),
reinterpret_cast<sockaddr*>(&receiverAddr), &receiverAddrLen),
socklen_t receiver_addr_len = receiver_addr.addr_len;
EXPECT_THAT(getsockname(sockets->second_fd(),
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
&receiver_addr_len),
SyscallSucceeds());
EXPECT_EQ(receiverAddrLen, sizeof(receiverAddr));
EXPECT_EQ(receiver_addr_len, receiver_addr.addr_len);
// Register to receive multicast packets.
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);
EXPECT_THAT(setsockopt(sockets->second_fd(), IPPROTO_IP, IP_ADD_MEMBERSHIP,
&group, sizeof(group)),
SyscallSucceeds());
// Send a multicast packet.
sockaddr_in sendAddr = {};
sendAddr.sin_family = AF_INET;
sendAddr.sin_port = receiverAddr.sin_port;
sendAddr.sin_addr.s_addr = inet_addr("224.0.2.1");
auto send_addr = V4Multicast();
reinterpret_cast<sockaddr_in*>(&send_addr.addr)->sin_port =
reinterpret_cast<sockaddr_in*>(&receiver_addr.addr)->sin_port;
char send_buf[200];
RandomizeBuffer(send_buf, sizeof(send_buf));
EXPECT_THAT(RetryEINTR(sendto)(
sockets->first_fd(), send_buf, sizeof(send_buf), 0,
reinterpret_cast<sockaddr*>(&sendAddr), sizeof(sendAddr)),
EXPECT_THAT(
RetryEINTR(sendto)(sockets->first_fd(), send_buf, sizeof(send_buf), 0,
reinterpret_cast<sockaddr*>(&send_addr.addr),
send_addr.addr_len),
SyscallSucceedsWithValue(sizeof(send_buf)));
// 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
// IP_MULTICAST_IF for setting the default send interface.
sockaddr_in senderAddr = {};
senderAddr.sin_family = AF_INET;
senderAddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
auto sender_addr = V4Loopback();
EXPECT_THAT(
bind(sockets->first_fd(), reinterpret_cast<sockaddr*>(&senderAddr),
sizeof(senderAddr)),
bind(sockets->first_fd(), reinterpret_cast<sockaddr*>(&sender_addr.addr),
sender_addr.addr_len),
SyscallSucceeds());
// Bind the second FD to the v4 any address to ensure that we can receive the
// multicast packet.
sockaddr_in receiverAddr = {};
receiverAddr.sin_family = AF_INET;
receiverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
EXPECT_THAT(
bind(sockets->second_fd(), reinterpret_cast<sockaddr*>(&receiverAddr),
sizeof(receiverAddr)),
auto receiver_addr = V4Any();
EXPECT_THAT(bind(sockets->second_fd(),
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
receiver_addr.addr_len),
SyscallSucceeds());
socklen_t receiverAddrLen = sizeof(receiverAddr);
EXPECT_THAT(
getsockname(sockets->second_fd(),
reinterpret_cast<sockaddr*>(&receiverAddr), &receiverAddrLen),
socklen_t receiver_addr_len = receiver_addr.addr_len;
EXPECT_THAT(getsockname(sockets->second_fd(),
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
&receiver_addr_len),
SyscallSucceeds());
EXPECT_EQ(receiverAddrLen, sizeof(receiverAddr));
EXPECT_EQ(receiver_addr_len, receiver_addr.addr_len);
// Register to receive multicast packets.
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"));
EXPECT_THAT(setsockopt(sockets->second_fd(), IPPROTO_IP, IP_ADD_MEMBERSHIP,
&group, sizeof(group)),
SyscallSucceeds());
// Send a multicast packet.
sockaddr_in sendAddr = {};
sendAddr.sin_family = AF_INET;
sendAddr.sin_port = receiverAddr.sin_port;
sendAddr.sin_addr.s_addr = inet_addr("224.0.2.1");
auto send_addr = V4Multicast();
reinterpret_cast<sockaddr_in*>(&send_addr.addr)->sin_port =
reinterpret_cast<sockaddr_in*>(&receiver_addr.addr)->sin_port;
char send_buf[200];
RandomizeBuffer(send_buf, sizeof(send_buf));
EXPECT_THAT(RetryEINTR(sendto)(
sockets->first_fd(), send_buf, sizeof(send_buf), 0,
reinterpret_cast<sockaddr*>(&sendAddr), sizeof(sendAddr)),
EXPECT_THAT(
RetryEINTR(sendto)(sockets->first_fd(), send_buf, sizeof(send_buf), 0,
reinterpret_cast<sockaddr*>(&send_addr.addr),
send_addr.addr_len),
SyscallSucceedsWithValue(sizeof(send_buf)));
// Check that we received the multicast packet.
@ -289,7 +284,7 @@ TEST_P(IPv4UDPUnboundSocketPairTest, IpMulticastInvalidDrop) {
// Unregister from a membership that we didn't have.
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);
EXPECT_THAT(setsockopt(sockets->first_fd(), IPPROTO_IP, IP_DROP_MEMBERSHIP,
&group, sizeof(group)),
@ -304,33 +299,29 @@ TEST_P(IPv4UDPUnboundSocketPairTest, IpMulticastDropAddr) {
// Bind the first FD to the loopback. This is an alternative to
// IP_MULTICAST_IF for setting the default send interface.
sockaddr_in senderAddr = {};
senderAddr.sin_family = AF_INET;
senderAddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
auto sender_addr = V4Loopback();
EXPECT_THAT(
bind(sockets->first_fd(), reinterpret_cast<sockaddr*>(&senderAddr),
sizeof(senderAddr)),
bind(sockets->first_fd(), reinterpret_cast<sockaddr*>(&sender_addr.addr),
sender_addr.addr_len),
SyscallSucceeds());
// Bind the second FD to the v4 any address to ensure that we can receive the
// multicast packet.
sockaddr_in receiverAddr = {};
receiverAddr.sin_family = AF_INET;
receiverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
EXPECT_THAT(
bind(sockets->second_fd(), reinterpret_cast<sockaddr*>(&receiverAddr),
sizeof(receiverAddr)),
auto receiver_addr = V4Any();
EXPECT_THAT(bind(sockets->second_fd(),
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
receiver_addr.addr_len),
SyscallSucceeds());
socklen_t receiverAddrLen = sizeof(receiverAddr);
EXPECT_THAT(
getsockname(sockets->second_fd(),
reinterpret_cast<sockaddr*>(&receiverAddr), &receiverAddrLen),
socklen_t receiver_addr_len = receiver_addr.addr_len;
EXPECT_THAT(getsockname(sockets->second_fd(),
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
&receiver_addr_len),
SyscallSucceeds());
EXPECT_EQ(receiverAddrLen, sizeof(receiverAddr));
EXPECT_EQ(receiver_addr_len, receiver_addr.addr_len);
// Register and unregister to receive multicast packets.
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);
EXPECT_THAT(setsockopt(sockets->second_fd(), IPPROTO_IP, IP_ADD_MEMBERSHIP,
&group, sizeof(group)),
@ -340,15 +331,15 @@ TEST_P(IPv4UDPUnboundSocketPairTest, IpMulticastDropAddr) {
SyscallSucceeds());
// Send a multicast packet.
sockaddr_in sendAddr = {};
sendAddr.sin_family = AF_INET;
sendAddr.sin_port = receiverAddr.sin_port;
sendAddr.sin_addr.s_addr = inet_addr("224.0.2.1");
auto send_addr = V4Multicast();
reinterpret_cast<sockaddr_in*>(&send_addr.addr)->sin_port =
reinterpret_cast<sockaddr_in*>(&receiver_addr.addr)->sin_port;
char send_buf[200];
RandomizeBuffer(send_buf, sizeof(send_buf));
EXPECT_THAT(RetryEINTR(sendto)(
sockets->first_fd(), send_buf, sizeof(send_buf), 0,
reinterpret_cast<sockaddr*>(&sendAddr), sizeof(sendAddr)),
EXPECT_THAT(
RetryEINTR(sendto)(sockets->first_fd(), send_buf, sizeof(send_buf), 0,
reinterpret_cast<sockaddr*>(&send_addr.addr),
send_addr.addr_len),
SyscallSucceedsWithValue(sizeof(send_buf)));
// 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
// IP_MULTICAST_IF for setting the default send interface.
sockaddr_in senderAddr = {};
senderAddr.sin_family = AF_INET;
senderAddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
auto sender_addr = V4Loopback();
EXPECT_THAT(
bind(sockets->first_fd(), reinterpret_cast<sockaddr*>(&senderAddr),
sizeof(senderAddr)),
bind(sockets->first_fd(), reinterpret_cast<sockaddr*>(&sender_addr.addr),
sender_addr.addr_len),
SyscallSucceeds());
// Bind the second FD to the v4 any address to ensure that we can receive the
// multicast packet.
sockaddr_in receiverAddr = {};
receiverAddr.sin_family = AF_INET;
receiverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
EXPECT_THAT(
bind(sockets->second_fd(), reinterpret_cast<sockaddr*>(&receiverAddr),
sizeof(receiverAddr)),
auto receiver_addr = V4Any();
EXPECT_THAT(bind(sockets->second_fd(),
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
receiver_addr.addr_len),
SyscallSucceeds());
socklen_t receiverAddrLen = sizeof(receiverAddr);
EXPECT_THAT(
getsockname(sockets->second_fd(),
reinterpret_cast<sockaddr*>(&receiverAddr), &receiverAddrLen),
socklen_t receiver_addr_len = receiver_addr.addr_len;
EXPECT_THAT(getsockname(sockets->second_fd(),
reinterpret_cast<sockaddr*>(&receiver_addr.addr),
&receiver_addr_len),
SyscallSucceeds());
EXPECT_EQ(receiverAddrLen, sizeof(receiverAddr));
EXPECT_EQ(receiver_addr_len, receiver_addr.addr_len);
// Register and unregister to receive multicast packets.
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"));
EXPECT_THAT(setsockopt(sockets->second_fd(), IPPROTO_IP, IP_ADD_MEMBERSHIP,
&group, sizeof(group)),
@ -402,15 +389,15 @@ TEST_P(IPv4UDPUnboundSocketPairTest, IpMulticastDropNic) {
SyscallSucceeds());
// Send a multicast packet.
sockaddr_in sendAddr = {};
sendAddr.sin_family = AF_INET;
sendAddr.sin_port = receiverAddr.sin_port;
sendAddr.sin_addr.s_addr = inet_addr("224.0.2.1");
auto send_addr = V4Multicast();
reinterpret_cast<sockaddr_in*>(&send_addr.addr)->sin_port =
reinterpret_cast<sockaddr_in*>(&receiver_addr.addr)->sin_port;
char send_buf[200];
RandomizeBuffer(send_buf, sizeof(send_buf));
EXPECT_THAT(RetryEINTR(sendto)(
sockets->first_fd(), send_buf, sizeof(send_buf), 0,
reinterpret_cast<sockaddr*>(&sendAddr), sizeof(sendAddr)),
EXPECT_THAT(
RetryEINTR(sendto)(sockets->first_fd(), send_buf, sizeof(send_buf), 0,
reinterpret_cast<sockaddr*>(&send_addr.addr),
send_addr.addr_len),
SyscallSucceedsWithValue(sizeof(send_buf)));
// Check that we did not receive the multicast packet.

View File

@ -680,5 +680,56 @@ void RecvNoData(int sock) {
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 gvisor

View File

@ -449,6 +449,23 @@ void RecvNoData(int sock);
// sockets.
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 gvisor