diff --git a/pkg/abi/linux/socket.go b/pkg/abi/linux/socket.go index 5555994bc..1c74ea2b8 100644 --- a/pkg/abi/linux/socket.go +++ b/pkg/abi/linux/socket.go @@ -239,6 +239,9 @@ const SockAddrMax = 128 // +marshal type InetAddr [4]byte +// SizeOfInetAddr is the size of InetAddr. +var SizeOfInetAddr = uint32((*InetAddr)(nil).SizeBytes()) + // SockAddrInet is struct sockaddr_in, from uapi/linux/in.h. // // +marshal diff --git a/pkg/sentry/socket/hostinet/socket.go b/pkg/sentry/socket/hostinet/socket.go index dd3e58b84..b8dce12f5 100644 --- a/pkg/sentry/socket/hostinet/socket.go +++ b/pkg/sentry/socket/hostinet/socket.go @@ -193,6 +193,8 @@ func (p *socketProvider) Socket(t *kernel.Task, stypeflags linux.SockType, proto // IPPROTO_IP with SOCK_DGRAM causes proto to actually // be IPPROTO_UDP. protocol = unix.IPPROTO_UDP + case unix.IPPROTO_ICMP: + // ok case unix.IPPROTO_UDP: // ok default: diff --git a/pkg/sentry/socket/hostinet/sockopt.go b/pkg/sentry/socket/hostinet/sockopt.go index 808539424..b9b0d747d 100644 --- a/pkg/sentry/socket/hostinet/sockopt.go +++ b/pkg/sentry/socket/hostinet/sockopt.go @@ -59,6 +59,7 @@ type SockOpt struct { var SockOpts = []SockOpt{ {linux.SOL_IP, linux.IP_ADD_MEMBERSHIP, 0, false, true}, {linux.SOL_IP, linux.IP_DROP_MEMBERSHIP, 0, false, true}, + {linux.SOL_IP, linux.IP_MULTICAST_IF, uint64(linux.SizeOfInetAddr), true, true}, {linux.SOL_IP, linux.IP_MULTICAST_LOOP, 0 /* can be 32-bit int or 8-bit uint */, true, true}, {linux.SOL_IP, linux.IP_MULTICAST_TTL, 0 /* can be 32-bit int or 8-bit uint */, true, true}, {linux.SOL_IP, linux.IP_PKTINFO, sizeofInt32, true, true}, diff --git a/test/syscalls/BUILD b/test/syscalls/BUILD index 732402976..d24482467 100644 --- a/test/syscalls/BUILD +++ b/test/syscalls/BUILD @@ -730,6 +730,7 @@ syscall_test( ) syscall_test( + add_hostinet = True, test = "//test/syscalls/linux:socket_ipv4_udp_unbound_external_networking_test", ) @@ -775,6 +776,7 @@ syscall_test( syscall_test( size = "medium", + add_hostinet = True, test = "//test/syscalls/linux:socket_ipv4_datagram_based_socket_unbound_loopback_test", ) diff --git a/test/syscalls/linux/socket_ipv4_datagram_based_socket_unbound.cc b/test/syscalls/linux/socket_ipv4_datagram_based_socket_unbound.cc index 0e3e7057b..a61d509a1 100644 --- a/test/syscalls/linux/socket_ipv4_datagram_based_socket_unbound.cc +++ b/test/syscalls/linux/socket_ipv4_datagram_based_socket_unbound.cc @@ -24,6 +24,9 @@ namespace testing { void IPv4DatagramBasedUnboundSocketTest::SetUp() { if (GetParam().type & SOCK_RAW) { SKIP_IF(!ASSERT_NO_ERRNO_AND_VALUE(HaveRawIPSocketCapability())); + + // TODO(b/267210840): Support raw sockets on hostinet. + SKIP_IF(IsRunningWithHostinet()); } }