Commit Graph

159 Commits

Author SHA1 Message Date
Maciej Żenczykowski
66da6a9b44 possibly fix clat ingress nat64 drop
Due to try_make_writable's implementation:

  // try to make the 1st 'len' header bytes r/w via DPA
  void try_make_writable(struct __sk_buff* skb, int len) {
    if (len > skb->len) len = skb->len;
    if (skb->data_end - skb->data < len) bpf_skb_pull_data(skb, len);
  }

This *should* normally result in nothing actually being done.

This is because the 'len' we request should trivially be <= skb->len
(by virtue of how we construct the packet / get here),
and because skb->data_end - skb->data < len was previously
(to this patch) already checked below in line 251
(and thus the packet would have been dropped if it was false).

However, there's a tentative theory that we could somehow end up
with the entire payload in the non-linear portion of the packet,
and thus need to move it into the linear header portion where
we actually have direct packet access to it.

Note also that we already called this in line 71, so it should
be safe to add another call without causing bpf verifier unhappiness...

Test: TreeHugger
Bug: 298879031
Signed-off-by: Maciej Żenczykowski <maze@google.com
Change-Id: If3531c3cf6932ac3f1d384a43d28326d17544aa3
2023-09-08 18:20:21 +00:00
Maciej Żenczykowski
6109d94ec5 netd bpf - implement ingress discard based on {dstip,ifindex}
Test: TreeHugger
Bug: 295800201
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I82771644045e0e37f73725730bd0bd2265ac5b77
2023-08-29 19:35:12 +00:00
Maciej Żenczykowski
fca4ee4f08 netd.c - only check clat uid on egress
On ingress:
(a) the socket is not a normal socket (it's AF_PACKET)
    and thus (likely) doesn't hit this code path
    [if it did... we'd have double or more accounting
    of any traffic captured by AF_PACKET sockets,
    I haven't checked - but I assume that doesn't happen]
(b) is created by the system server (so not AID_CLAT)
(c) is not tagged by the system server (so not AID_CLAT)

So this is a no-op, but it simplifies the bpf program,
since 'egress' is a compile time evaluated constant.

Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: Iec693548789eb2752f9f30038e72e35c876f986c
2023-08-29 15:03:29 +00:00
Maciej Żenczykowski
a693bac180 StatsValue - define operator+=
while this is a little bit more code,
it seems much better for the accumulation operation
to be next to the struct definition itself
(in case we ever add more fields)

Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I26022db4566e69c964298d7b3f2cc4fa4a9a5152
2023-08-13 09:16:23 +00:00
Maciej Żenczykowski
4bcac5dadf eliminate 'struct Stats' in favour of StatsValue
Bug: 294604315
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: Ib45a130e7fa36ad90334c00de637d523455e000e
2023-08-12 16:24:49 +00:00
Maciej Żenczykowski
15b63b308e eliminate unused tcp{Rx,Tx}Packets
(next step is to replace use of Stats struct with
 identical (except field order) StatsValue struct)

Test: TreeHugger
Bug: 294604315
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I9be3c411f9592bf4edc75386b1c5b386ebeb5905
2023-08-12 08:20:39 +00:00
KH Shi
c8fb1a2530 bpf tethering offload - add src subnet to upstream ipv6 direction
This patch is based on aosp/2535559 from maze@.

Add source prefix into the upstream key such that only packets which
source IPv6 address matches it will be forwarded to the upstream
interface.

In this patch, the source prefix is set to zero so there is no
behavior changes. Next CL in patch series will use the real source
prefixes retrieved from upstream interface.

Test: atest TetheringTests
Bug: 261923493
Change-Id: I43d068a29b937c7dfeb6fab632a8effb47ee2263
2023-08-10 16:01:21 +08:00
Maciej Żenczykowski
43d31bbaf6 clatd.c - add support for UDPLITE
This is trivial - as the UDPLITE pseudoheader is identical
to the UDP pseudoheader (except that the UDPLITE pseudo length
is derived from the IPv4 total length / IPv6 payload length
field, instead of being copied from the UDPLITE header 'coverage
length' field - but this doesn't matter, as it [ie. the udplite
payload length] doesn't change during 464xlat translation).

Additionally UDPLITE never sends a checksum value of 0,
as at least 8 bytes (the UDPLITE header) *must* be included
in the checksum field, and a 0 must be sent as 0xFFFF.

See: https://datatracker.ietf.org/doc/html/rfc3828

Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I00a110b793fcf3cf705a9a706811da7866c3e810
2023-07-25 16:17:48 +00:00
Maciej Żenczykowski
de1342a033 bpf_progs: disable BTF on <=U && user builds
This is to cut down bpfloader boot time.
Potential savings might be on the order of 30+% (300ms).

Loading BTF requires fork-execing the btfloader,
and currently BTF is only used to facilitate debugging.

Bug: 286369326
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: Ifa5f0052135b9dc826b18ca4622784615ed9c3c8
2023-06-09 05:58:57 +00:00
Maciej Żenczykowski
9fb415a7c0 Merge "netd.c: simplify impossible code path" 2023-05-22 17:44:16 +00:00
Maciej Żenczykowski
83dde6b40a netd.c - cleanup AID_CLAT handling
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: Ie2fab051f3d923b3dd2be09d82c3cf47e91f6224
2023-05-20 17:25:49 +00:00
Maciej Żenczykowski
399c9f296e netd.c: simplify impossible code path
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I04f3f1b6ba1093f6543f6e80f62d978ebfee707d
2023-05-20 17:16:06 +00:00
Maciej Żenczykowski
7a03c187f5 remove inprocess tethering
It is just a constant source of bugs, with no real tests,
let's stop pretending this is a supported configuration.

The only tested configuration is out-of-process tethering
updatable apex.

Test: TreeHugger
Bug: 279942846
Change-Id: I4b659a3cd32b89a65549b56006b926a5ac755f7b
2023-04-28 20:11:14 +00:00
Maciej Żenczykowski
c5af9f2084 Drop support for beta versions of Android T.
Android T beta3/4 haven't been tested in ages,
and were really only tested for the transition to final T
nearly a year ago.

Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I520e60026179c078859572231b86184796182142
2023-04-25 15:08:28 -07:00
Maciej Żenczykowski
58c6337906 sed -i -r 's@/[*] updatetime [*]/ false@NO_UPDATETIME@g' offload.c
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I69947ef2bfc330d38c56b64e9d43dbea1b78cf69
2023-04-20 04:05:06 +00:00
Maciej Żenczykowski
653bb006b7 sed -i -r 's@/[*] updatetime [*]/ true@UPDATETIME@g' offload.c
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: Ie62454bee2c7c0a23cc6827ee626640281527f19
2023-04-20 04:04:58 +00:00
Maciej Żenczykowski
b27132f716 sed -i -r 's@/[*]ignore_on_user[*]/true@IGNORE_ON_USER@g' netd.c
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I756e4451d252ab43b4fbe57f185c950cd519b359
2023-04-20 04:04:51 +00:00
Maciej Żenczykowski
b6232eb6f0 sed -i -r 's@/[*]ignore_on_user[*]/false@LOAD_ON_USER@g' netd.c
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I437fe4cca4bd59b12531ac722a6d464bdce512a6
2023-04-20 04:04:27 +00:00
Maciej Żenczykowski
e94f47674b sed -i -r 's@/[*]ignore_on_userdebug[*]/false@LOAD_ON_USERDEBUG@g' netd.c
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I850678bd050026d5d4da3cff74a44a4df274b48a
2023-04-20 04:04:19 +00:00
Maciej Żenczykowski
95e074380f sed -i -r 's@/[*]ignore_on_eng[*]/false@LOAD_ON_ENG@g' netd.c
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: Ife0c4bc8fe468456172b9a8e7567d3633c1b7404
2023-04-20 04:04:11 +00:00
Maciej Żenczykowski
66f52f4ea7 sed -i -r 's@/[*] is_ethernet [*]/ false@RAWIP@g' offload.c
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: Id488301a50e28e2636936340c78bf8ac5ed2f34e
2023-04-20 04:04:04 +00:00
Maciej Żenczykowski
63fadd1c67 sed -i -r 's@/[*] is_ethernet [*]/ true@ETHER@g' offload.c
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: Ib3967f1768820e92011eee78f589cc54ee3677fc
2023-04-20 04:03:55 +00:00
Maciej Żenczykowski
cad569fef5 sed -i -r 's@/[*] downstream [*]/ true@DOWNSTREAM@g' offload.c
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: Ia1eeca7e8cda672562f3da5b28b52cc25cae2f2a
2023-04-20 04:03:48 +00:00
Maciej Żenczykowski
941ea039db sed -i -r 's@/[*] downstream [*]/ false@UPSTREAM@g' offload.c
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: Ieaf2cb8d93b4b62fba1be9893ed7e2510b5ed4b7
2023-04-20 04:03:41 +00:00
Maciej Żenczykowski
4c33f5c958 bpf_net_helpers: define some boolean constants
This will make the code more legibble once we switch to using these.

Also moving them out of the .c files so we can share the same
constants across multiple files.

Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I5cc9058cee8d1ea10d2f9e62a38313d0728f07d3
2023-04-20 04:03:26 +00:00
Maciej Żenczykowski
2541a1924e offload.c - feed kver in to bpf progs
Bug: 263884894
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I1ad6df9e4cf4e39b4fe785ca9d8ff0eaa31d33c5
2023-04-19 20:51:18 +00:00
Maciej Żenczykowski
99a1a26a2f netd.c - feed kver deeper into bpf programs
Bug: 263884894
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I4a1ca71d529602a1651b711439ccd0a60fe3c550
2023-04-19 19:34:57 +00:00
Maciej Żenczykowski
bdccc50824 allow ingress TCP FINs in doze mode
I don't know if this will truly help:

We'll still drop the expected egress TCP ACK (or FIN-ACK) reply
to the newly allowed ingress TCP FIN...

However: I don't think this will make things worse.

The presence of an ingress packet is proof the hardware already woke up to receive it.  This behaviour doesn't change when allowing ingress *anything*.

ie. the main reason we don't allow ingress packets is
that it would be illogical to be asymmetrical.

So even if we do immediately send back a reply (I think a RST is the only real possibility at the moment, since ACK would still be dropped).  Worst case we're waking the hardware up from RX processing to full blown TX processing.

Furthermore if an inbound FIN causes an outbound RST, then that
RST will most likely prevent receiving future FIN retransmits.

So we're trading an RX->TX hardware wake up now,
for less RX wakeups in the (near) future.

This *might* just be an overall win.

I think a true solution likely needs to be smarter still
and allow skb->sk state != BPF_TCP_ESTABLISHED (or something)

Bug: 259199087
Bug: 264903985
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I143f12342f72d89f9450560c8d60dad4c79ffe64
2023-04-18 07:05:00 +00:00
Maciej Żenczykowski
ce7431f1fc bpf network stats - move double accounting tag!=0 out of bpf
Instead of also accounting tag!=0 traffic against tag==0 slot,
while the bpf code writes into the map, move this logic into
the userspace jni code which reads from the map.

Simplifies the bpf program making things easier on the
kernel's bpf verifier, and is better for performance,
since a per-packet fixup operation becomes a per-poll fixup.

Test: TreeHugger, atest libnetworkstats_test FrameworksNetTests
Bug: 276296921
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: Ic220a201781a1170bcffe327fe5664fc12b65dd9
2023-04-14 07:18:01 +00:00
Maciej Żenczykowski
bab0c1ad95 offload.c - adjust bytes for l2 header
Bug: 263884894
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I5c7bca4e005302a91368d22b9683db5b16d73b3a
2023-04-04 06:18:28 +00:00
Maciej Żenczykowski
bdcb8968b8 clatd: update a comment about ipv6 frag handling
Test: N/A, comment only
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: Id41148e01f5ea8e924bd7bdd09216178081a44c5
2023-03-17 18:29:04 +00:00
Maciej Żenczykowski
896ef4e01b Merge "bpf netd - minor perf improvement - move uid check first" 2023-03-03 08:04:49 +00:00
Maciej Żenczykowski
e4c0473bd9 bpf netd - minor perf improvement - move uid check first
effectively no-op, but since it's a trivial check (uid < APP_START),
better do it first, rather than the complex packet parsing in
skip_owner_match().

Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I35a9188e108987d48f03a18cdf70ec4cdd715376
2023-03-02 00:19:23 +00:00
Maciej Żenczykowski
8e4a794519 netd bpf - no-op code hygiene fix for DROP_UNLESS_DNS
We only ever return DROP_UNLESS_DNS on ingress,
so the ordering doesn't actually matter.

Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I742b85748433f5319d518bebc05d976d630b72e7
2023-03-02 00:12:08 +00:00
Ryan Zuklie
9419d25fe2 Add packet tracing bpf implementation
This adds the core BPF implementation of Android network packet tracing.
The new code looks into the skb to pull out various bits of information.
Both the program and the ring buffer are restricted to 5.8+ kernels and
userdebug or eng builds.

With the packet_info_config map defaulting to zero, userdebug and eng
builds won't run any of the tracing today. The only effect will be 32k
memory increase for the ringbuf and the check on the config array.

Bug: 246985031
Test: build & flash both userdebug and user
Change-Id: I144da2971c0738b565ad58abc17e456209f13bde
2023-01-23 09:51:31 -08:00
Ryan Zuklie
1db34f3b91 Add BPF helpers for ipv4/ipv6 and tcp/udp offsets.
Test: build & install connectivity module
Change-Id: I869810d05ad8266b6a4107a5276864fdbcdbd9b0
2023-01-23 09:50:31 -08:00
Ryan Zuklie
0c57d8567c Update BPF EXT maps with new ignore_on fields.
These all default to false, never ignoring the maps.

Bug: 246985031
Test: build connectivity module
Change-Id: I404d56dcb311b34587d56dd6edc292029c4ad83f
2023-01-19 16:16:02 -08:00
Ryan Zuklie
cc72fa8f9d Update bpf helpers to support new ignore_on fields
This change updates callers to include the new ignore_on and bpfloader
arguments as per the change in aosp/2374598.

Bug: 246985031
Test: tethering build & install, full platform build & install
Change-Id: Id940a6003ae4cb0bbfc65db8ff96590c4f3c847b
2023-01-05 13:26:30 -08:00
Maciej Żenczykowski
9b239528e3 clatd - ipv6 fragment to ipv4 translation support (try 2)
This is a repeat of:
  https://android-review.git.corp.google.com/c/platform/packages/modules/Connectivity/+/2266447

which was reverted in:
  https://android-review.git.corp.google.com/c/platform/packages/modules/Connectivity/+/2372509

This time with kver >= 4.14 protections of the bpf_skb_adjust_room()
bpf helper which isn't present on 4.9 T devices.

Original change comments:

Tested manually on a flame device connected to an ipv6-only wifi
network (GoogleGuest).

On server:
  nc -4 -l -u -p 443

On client (phone):
  adb shell nc -4 -u my.server 443

On client (phone):
  adb shell tcpdump -l -ee -vv -s 1600 -i v4-wlan0

On client send something to server "Hi."
On server send something to client "Hey!"

You should see normal unfragmented IP packets.

Then on server send something really long (I used 57 copies of the 26 letter English alphabet).  This should be long enough that fragmentation is required.

You should see tcpdump show 2 ipv4 fragments, and netcat
show the packet being delivered correctly.

(and previous versions of the code were buggy and were
resulting in corrupt packets and things not working)

Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I6758e63d8133215edd26b4cd2d73a5b5f261ffd1
2023-01-04 11:35:50 +00:00
Maciej Żenczykowski
2aaa7b6c67 Revert "clatd - ipv6 fragment to ipv4 translation support"
This reverts commit be9685c35c.

Reason for revert:
  fails on 4.9 due to bpf_skb_adjust_room requiring a later kernel,
  will need an alternative approach

Bug: 261818177
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I26535a96de80febc2fd54dcb564cde4f9ed7b3c9
2023-01-03 11:30:54 +00:00
Maciej Żenczykowski
0966bbee1a netd.c - switch from is_4_19 to simply passing KVER(4, 19, 0) around
will make it easier to extend this for 5.4+ behaviour as well
without having to introduce another is_5_4 boolean

Bug: 263884894
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: Id4f6512d813dd460cb2b9a7ccb6a5f7b7e937575
2022-12-30 18:59:49 +00:00
Maciej Żenczykowski
28b9a29e04 netd.c - simplify, if not map A then by definition map B
easier on bpf verifier with no third case

Bug: 263884894
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I5076de6f83ba522ed4783bca0a9d7fca4024986a
2022-12-29 12:06:49 +00:00
Maciej Żenczykowski
2de5957a88 bpf_connectivity_headers - remove visibility from //system/netd/tests
depends on at least:
  https://android-review.git.corp.google.com/c/platform/system/netd/+/2363881
  'cleanup a bunch of bpf related things (header files mostly)'

Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: Ifaf20267f791af09f8c76dda5dfbc38ebc75c4ba
2022-12-20 00:35:05 +00:00
Maciej Żenczykowski
513474c1a7 rename bpf_shared.h to netd.h
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I2e1569c8d70e98f9a3fdbab41fd2ba7f7b84dd37
2022-12-18 20:02:52 +00:00
Maciej Żenczykowski
7b452a1186 bpf_shared.h - split clatd portion out into clatd.h
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: Ib068ffc927d031dfb979d86957fcf5818474831d
2022-12-08 15:39:01 +00:00
Maciej Żenczykowski
4e3321ed3b bpf_tethering.h -> offload.h
match header file with bpf program

Locations to change found via:
  https://source.corp.google.com/search?q=p:aosp-master%20(%5E%7C%5B%5E_%5D)bpf_tethering.h

Core reasoning for this will be to match the .h naming
that we'll have for netd.c and clatd.c once we get rid of bpf_shared.h

Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I4154659c7fb23a37f5316a5c804fb2606d842e9c
2022-12-08 13:04:45 +00:00
Maciej Żenczykowski
f932a8df0e offload.c - fix a mistake in a comment
The comment added by:
  https://android-review.git.corp.google.com/c/platform/packages/modules/Connectivity/+/2261966
  'offload.c - make tether_error_map read only.'

mentions offload.o loading on T when it should talk about S+.

Tethering offload bpf code was mainlined in S.
(T mainlined all the other bpf code)

Bug: 254543135
Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I10b89691082e451115e61dedbdc0dac7a58e499c
2022-12-03 10:31:23 +00:00
Maciej Żenczykowski
5cee8817af Merge "bpf clatd.c - refix RFC6145 - really use low 16 bits of IPv6 frag id" 2022-11-24 15:25:59 +00:00
Maciej Żenczykowski
f7d2393ded bpf clatd.c - refix RFC6145 - really use low 16 bits of IPv6 frag id
To quote: https://www.rfc-editor.org/rfc/rfc6145

4.1 Identification:
The low-order 16 bits copied from the Identification field in
the IPv4 header.  The high-order 16 bits set to zero.

5.1.1 Identification:
Copied from the low-order 16 bits in the Identification field in
the Fragment Header.

The RFC does not mention endianness.  But I'm assuming it thinks
of things as network, ie. big, endian.

This matches userspace external/android-clat/translate.c:214

  ip_targ->id       = htons(ntohl(frag_hdr->ip6f_ident) & 0xffff);

This takes the 3rd and 4th byte of the 32-bit ipv6 frag ident field:

see also line 195:

  frag_hdr->ip6f_ident = htonl(ntohs(old_header->id));

and

packages/modules/Connectivity/bpf_progs/bpf_net_helpers.h

// Android only supports little endian architectures
#define htons(x) (__builtin_constant_p(x) ? ___constant_swab16(x) : __builtin_bswap16(x))
#define htonl(x) (__builtin_constant_p(x) ? ___constant_swab32(x) : __builtin_bswap32(x))
#define ntohs(x) htons(x)
#define ntohl(x) htonl(x)


Test: TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: Ie4eed30cfd0e3e3e4dfa6c1a54751dcae1f9972b
2022-11-24 09:15:57 +00:00
Maciej Żenczykowski
d0c03cf20f Merge "bpf netd.c - switch from 'int direction' to 'bool egress'" 2022-11-21 20:29:40 +00:00