Convert tethering offload IPCs from primitive args to a parcel.

Defining stable AIDL IPCs with primitive args is not future-proof
because AIDL does not support method overloading, so any time a
parameter is added a new method needs to be created.

It's better to use parcelables for parameters instead, because
parcelables can be extended in subsequent version.

Define a TetherOffloadRuleParcel data structure to represent
tethering offload rules, and switch the tethering offload IPCs to
it before we freeze the INetd AIDL.

Bug: 140541991
Test: atest netd_integration_test
Merged-In: I6e84b14872d38a897eb6a10fd37d816ec7e6da64
Change-Id: I6e84b14872d38a897eb6a10fd37d816ec7e6da64
diff --git a/server/NetdNativeService.cpp b/server/NetdNativeService.cpp
index fb7f839..b6c0d4e 100644
--- a/server/NetdNativeService.cpp
+++ b/server/NetdNativeService.cpp
@@ -52,6 +52,7 @@
 
 using android::base::StringPrintf;
 using android::base::WriteStringToFile;
+using android::net::TetherOffloadRuleParcel;
 using android::net::TetherStatsParcel;
 using android::net::UidRangeParcel;
 using android::netdutils::DumpWriter;
@@ -1247,20 +1248,16 @@
     return binder::Status::ok();
 }
 
-binder::Status NetdNativeService::tetherRuleAddDownstreamIpv6(
-        int intIfaceIndex, int extIfaceIndex, const std::vector<uint8_t>& ipAddress,
-        const std::vector<uint8_t>& srcL2Address, const std::vector<uint8_t>& dstL2Address) {
+binder::Status NetdNativeService::tetherOffloadRuleAdd(const TetherOffloadRuleParcel& rule) {
     ENFORCE_NETWORK_STACK_PERMISSIONS();
 
-    return asBinderStatus(gCtls->tetherCtrl.addDownstreamIpv6Rule(
-            intIfaceIndex, extIfaceIndex, ipAddress, srcL2Address, dstL2Address));
+    return asBinderStatus(gCtls->tetherCtrl.addOffloadRule(rule));
 }
 
-binder::Status NetdNativeService::tetherRuleRemoveDownstreamIpv6(
-        int extIfaceIndex, const std::vector<uint8_t>& ipAddress) {
+binder::Status NetdNativeService::tetherOffloadRuleRemove(const TetherOffloadRuleParcel& rule) {
     ENFORCE_NETWORK_STACK_PERMISSIONS();
 
-    return asBinderStatus(gCtls->tetherCtrl.removeDownstreamIpv6Rule(extIfaceIndex, ipAddress));
+    return asBinderStatus(gCtls->tetherCtrl.removeOffloadRule(rule));
 }
 
 }  // namespace net