clat: use AF_PACKET/SOCK_RAW not SOCK_DGRAM sockets

This switches incoming packets from L3 to L2,
ie. they now include the ethernet header for non-rawip cases
(like wifi)

Note: depends on userspace clatd change to offset packet
processing index by tpacket_auxdata->tp_net L3 header offset,
an increase in the read buffer size,  and on change to use
IPv6 header relative cBPF for ingress packet filtering!

Test: TreeHugger, atest libclat_test, ping 1.1.1.1 on v6-only wifi
Bug: 265591307
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: Ie5893d18b0dd796751f95150680a0d4cd5f64c3c
This commit is contained in:
Maciej Żenczykowski 2023-03-08 03:24:41 +00:00
commit 2460294974
2 changed files with 2 additions and 2 deletions

View file

@ -177,7 +177,7 @@ static jint com_android_server_connectivity_ClatCoordinator_openPacketSocket(JNI
jobject clazz) {
// Will eventually be bound to htons(ETH_P_IPV6) protocol,
// but only after appropriate bpf filter is attached.
int sock = socket(AF_PACKET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
const int sock = socket(AF_PACKET, SOCK_RAW | SOCK_CLOEXEC, 0);
if (sock < 0) {
throwIOException(env, "packet socket failed", errno);
return -1;

View file

@ -165,7 +165,7 @@ TEST_F(ClatUtils, ConfigurePacketSocket) {
TunInterface v6Iface;
ASSERT_EQ(0, v6Iface.init());
int s = socket(AF_PACKET, SOCK_DGRAM | SOCK_CLOEXEC, htons(ETH_P_IPV6));
const int s = socket(AF_PACKET, SOCK_RAW | SOCK_CLOEXEC, htons(ETH_P_IPV6));
EXPECT_LE(0, s);
struct in6_addr addr6;
EXPECT_EQ(1, inet_pton(AF_INET6, "2001:db8::f00", &addr6));