From 8eb4888e0ed98f81c3157dec8de2faf5339e2d16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20=C5=BBenczykowski?= Date: Tue, 14 Mar 2023 03:55:22 +0000 Subject: clatd: skip over virtio_net_hdr MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Test: TreeHugger, ping 1.1.1.1 on ipv6-only wifi works Bug: 265591307 Signed-off-by: Maciej Żenczykowski Change-Id: I88ab5381bd144633ae3d3117c3b340cc2cb0b5fe --- clatd.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/clatd.c b/clatd.c index 284a676..e10bda1 100644 --- a/clatd.c +++ b/clatd.c @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -83,6 +84,7 @@ void process_packet_6_to_4(struct tun_data *tunnel) { // we don't really support vlans (or especially Q-in-Q)... // but a few bytes of extra buffer space doesn't hurt... struct { + struct virtio_net_hdr vnet; uint8_t payload[22 + MAXMTU]; char pad; // +1 to make packet truncation obvious } buf; @@ -125,7 +127,7 @@ void process_packet_6_to_4(struct tun_data *tunnel) { } } - if (readlen < tp_net) { + if (readlen < sizeof(struct virtio_net_hdr) + tp_net) { logmsg(ANDROID_LOG_WARN, "%s: ignoring %zd byte pkt shorter than %u L2 header", __func__, readlen, tp_net); return; @@ -140,7 +142,7 @@ void process_packet_6_to_4(struct tun_data *tunnel) { } } - translate_packet(tunnel->fd4, 0 /* to_ipv6 */, buf.payload + tp_net, readlen - tp_net); + translate_packet(tunnel->fd4, 0 /* to_ipv6 */, buf.payload + tp_net, readlen - sizeof(struct virtio_net_hdr) - tp_net); } // reads TUN_PI + L3 IPv4 packet from tun, translates to IPv6, writes to AF_INET6/RAW socket -- cgit v1.2.3