netd: Route MTU

- Route may include optional MTU parameter
- Change route is added so routes don't need to be deleted then re-added
- Add/Del/Change functions to pass route info as parcel

Bug: 142892223
Test: new unit tests
Change-Id: Idc32ecb0520b1f4136b3fe0e3f7b6800fb3005a6
diff --git a/server/NetworkController.cpp b/server/NetworkController.cpp
index 3e428ff..6a11f92 100644
--- a/server/NetworkController.cpp
+++ b/server/NetworkController.cpp
@@ -585,13 +585,18 @@
 }
 
 int NetworkController::addRoute(unsigned netId, const char* interface, const char* destination,
-                                const char* nexthop, bool legacy, uid_t uid) {
-    return modifyRoute(netId, interface, destination, nexthop, true, legacy, uid);
+                                const char* nexthop, bool legacy, uid_t uid, int mtu) {
+    return modifyRoute(netId, interface, destination, nexthop, ROUTE_ADD, legacy, uid, mtu);
+}
+
+int NetworkController::updateRoute(unsigned netId, const char* interface, const char* destination,
+                                   const char* nexthop, bool legacy, uid_t uid, int mtu) {
+    return modifyRoute(netId, interface, destination, nexthop, ROUTE_UPDATE, legacy, uid, mtu);
 }
 
 int NetworkController::removeRoute(unsigned netId, const char* interface, const char* destination,
                                    const char* nexthop, bool legacy, uid_t uid) {
-    return modifyRoute(netId, interface, destination, nexthop, false, legacy, uid);
+    return modifyRoute(netId, interface, destination, nexthop, ROUTE_REMOVE, legacy, uid, 0);
 }
 
 void NetworkController::addInterfaceAddress(unsigned ifIndex, const char* address) {
@@ -768,7 +773,8 @@
 }
 
 int NetworkController::modifyRoute(unsigned netId, const char* interface, const char* destination,
-                                   const char* nexthop, bool add, bool legacy, uid_t uid) {
+                                   const char* nexthop, enum RouteOperation op, bool legacy,
+                                   uid_t uid, int mtu) {
     ScopedRLock lock(mRWLock);
 
     if (!isValidNetworkLocked(netId)) {
@@ -798,8 +804,15 @@
         tableType = RouteController::INTERFACE;
     }
 
-    return add ? RouteController::addRoute(interface, destination, nexthop, tableType) :
-                 RouteController::removeRoute(interface, destination, nexthop, tableType);
+    switch (op) {
+        case ROUTE_ADD:
+            return RouteController::addRoute(interface, destination, nexthop, tableType, mtu);
+        case ROUTE_UPDATE:
+            return RouteController::updateRoute(interface, destination, nexthop, tableType, mtu);
+        case ROUTE_REMOVE:
+            return RouteController::removeRoute(interface, destination, nexthop, tableType);
+    }
+    return -EINVAL;
 }
 
 int NetworkController::modifyFallthroughLocked(unsigned vpnNetId, bool add) {