ClatdController - populate mClatEgressMap
On egress we translate in the opposite direction
(from IPv4 to IPv6 instead of from IPv6 to IPv4), and thus key/value
must be reversed.
For now this map is the precise reverse of the mClatIngressMap,
but there will be further differentiation in the future.
Test: compiles, atest, flashed to phone on wifi/cellular ipv6 only
network and observed dumpsys netd printout
Bug: 139396664
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I65a8e85764aa24f2652f09b89273e4821ebc36fb
diff --git a/server/ClatdController.cpp b/server/ClatdController.cpp
index 67e16c2..cf51eca 100644
--- a/server/ClatdController.cpp
+++ b/server/ClatdController.cpp
@@ -299,31 +299,51 @@
}
unique_fd rxProgFd(rv);
- ClatIngressKey key = {
+ ClatEgressKey txKey = {
+ .iif = tracker.v4ifIndex,
+ .local4 = tracker.v4,
+ };
+ ClatEgressValue txValue = {
+ .oif = tracker.ifIndex,
+ .local6 = tracker.v6,
+ .pfx96 = tracker.pfx96,
+ };
+
+ auto ret = mClatEgressMap.writeValue(txKey, txValue, BPF_ANY);
+ if (!isOk(ret)) {
+ ALOGE("mClatEgress.Map.writeValue failure: %s", strerror(ret.code()));
+ return;
+ }
+
+ ClatIngressKey rxKey = {
.iif = tracker.ifIndex,
.pfx96 = tracker.pfx96,
.local6 = tracker.v6,
};
- ClatIngressValue value = {
+ ClatIngressValue rxValue = {
// TODO: move all the clat code to eBPF and remove the tun interface entirely.
.oif = tracker.v4ifIndex,
.local4 = tracker.v4,
};
- auto ret = mClatIngressMap.writeValue(key, value, BPF_ANY);
+ ret = mClatIngressMap.writeValue(rxKey, rxValue, BPF_ANY);
if (!isOk(ret)) {
ALOGE("mClatIngress.Map.writeValue failure: %s", strerror(ret.code()));
+ ret = mClatEgressMap.deleteValue(txKey);
+ if (!isOk(ret)) ALOGE("mClatEgressMap.deleteValue failure: %s", strerror(ret.code()));
return;
}
- // We do tc setup *after* populating map, so scanning through map
+ // We do tc setup *after* populating the maps, so scanning through them
// can always be used to tell us what needs cleanup.
rv = tcQdiscAddDevClsact(mNetlinkFd, tracker.ifIndex);
if (rv) {
ALOGE("tcQdiscAddDevClsact(%d[%s]) failure: %s", tracker.ifIndex, tracker.iface,
strerror(-rv));
- ret = mClatIngressMap.deleteValue(key);
+ ret = mClatEgressMap.deleteValue(txKey);
+ if (!isOk(ret)) ALOGE("mClatEgressMap.deleteValue failure: %s", strerror(ret.code()));
+ ret = mClatIngressMap.deleteValue(rxKey);
if (!isOk(ret)) ALOGE("mClatIngressMap.deleteValue failure: %s", strerror(ret.code()));
return;
}
@@ -338,10 +358,13 @@
tracker.iface, isEthernet, strerror(-rv));
}
rv = tcQdiscDelDevClsact(mNetlinkFd, tracker.ifIndex);
- if (rv)
+ if (rv) {
ALOGE("tcQdiscDelDevClsact(%d[%s]) failure: %s", tracker.ifIndex, tracker.iface,
strerror(-rv));
- ret = mClatIngressMap.deleteValue(key);
+ }
+ ret = mClatEgressMap.deleteValue(txKey);
+ if (!isOk(ret)) ALOGE("mClatEgressMap.deleteValue failure: %s", strerror(ret.code()));
+ ret = mClatIngressMap.deleteValue(rxKey);
if (!isOk(ret)) ALOGE("mClatIngressMap.deleteValue failure: %s", strerror(ret.code()));
return;
}
@@ -371,16 +394,24 @@
ALOGE("tcQdiscDelDevClsact(%d[%s]) failure: %s", tracker.ifIndex, tracker.iface,
strerror(-rv));
- // We cleanup map last, so scanning through map can be used to
+ // We cleanup the maps last, so scanning through them can be used to
// determine what still needs cleanup.
- ClatIngressKey key = {
+ ClatEgressKey txKey = {
+ .iif = tracker.v4ifIndex,
+ .local4 = tracker.v4,
+ };
+
+ auto ret = mClatEgressMap.deleteValue(txKey);
+ if (!isOk(ret)) ALOGE("mClatEgressMap.deleteValue failure: %s", strerror(ret.code()));
+
+ ClatIngressKey rxKey = {
.iif = tracker.ifIndex,
.pfx96 = tracker.pfx96,
.local6 = tracker.v6,
};
- auto ret = mClatIngressMap.deleteValue(key);
+ ret = mClatIngressMap.deleteValue(rxKey);
if (!isOk(ret)) ALOGE("mClatIngressMap.deleteValue failure: %s", strerror(ret.code()));
}