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

View File

@ -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.

View File

@ -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

View File

@ -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