)]}'
{
  "log": [
    {
      "commit": "060d855a00cb94e8903fd1551c9bf040f42b57d1",
      "tree": "fbc4f9dea7c4432490627b77974be889ad2ea94e",
      "parents": [
        "507e7c5bbfcd1d68f67477866497adb1748c5fd5",
        "de5d5df753dd35d852ac47a6174b06eacd0d5523"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Mon Jul 28 18:53:50 2014 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Sun Jul 27 22:35:46 2014 +0000"
      },
      "message": "Merge \"Prohibit address families by default unless a VPN explicitly allows them.\" into lmp-dev"
    },
    {
      "commit": "de5d5df753dd35d852ac47a6174b06eacd0d5523",
      "tree": "64e9861df4c6a7ca0e32478fc7ec347a66b04d42",
      "parents": [
        "95684ba176a9fe5ea59207d7202e47fa12bbfdbe"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Sat Jul 26 18:43:25 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Mon Jul 28 11:28:47 2014 -0700"
      },
      "message": "Prohibit address families by default unless a VPN explicitly allows them.\n\nBug: 15972465\nChange-Id: I3278d94536fefacc86390c1ba4231680f7be8589\n"
    },
    {
      "commit": "95684ba176a9fe5ea59207d7202e47fa12bbfdbe",
      "tree": "0e26a0409c05a8c8ae8daabc0fb004d1fc5f0087",
      "parents": [
        "111bec203e82bdc9fb2c27df7c232465dffeee5f"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Wed Jul 23 13:27:31 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Fri Jul 25 14:58:08 2014 -0700"
      },
      "message": "Implement support for bypassable VPNs.\n\nBypassable VPNs grab all traffic by default (just like secure VPNs), but:\n+ They allow all apps to choose other networks using the multinetwork APIs.\n  If these other networks are insecure (\"untrusted\"), they will enforce that the\n  app holds the necessary permissions, such as CHANGE_NETWORK_STATE.\n+ They support consistent routing. If an app has an existing connection over\n  some other network when the bypassable VPN comes up, it\u0027s not interrupted.\n\nBug: 15347374\nChange-Id: Iaee9c6f6fa8103215738570d2b65d3fcf10343f3\n"
    },
    {
      "commit": "48e19b037e7e20674048ef76bf31ce65c741347c",
      "tree": "f449b95624750c10d406bb65b6d8574d027e973c",
      "parents": [
        "95684ba176a9fe5ea59207d7202e47fa12bbfdbe"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue Jul 22 22:23:20 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Fri Jul 25 16:27:04 2014 -0700"
      },
      "message": "Implement the fallthrough rule to support split tunnel VPNs.\n\nChange-Id: Ibc48caedb5954c6b12bfa553d978bab56c4b09aa\n"
    },
    {
      "commit": "111bec203e82bdc9fb2c27df7c232465dffeee5f",
      "tree": "3a6e8fd139f314d27cad0f50610f742d4f57eb6c",
      "parents": [
        "fa9f4dcd79dcfd24af276263159c5315abb06df6"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue Jul 22 18:51:06 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Wed Jul 23 11:20:43 2014 -0700"
      },
      "message": "Implement the rule to forward traffic to local networks via VPNs.\n\nChange-Id: I4bffb2ce854a6fa7d4c0d35b97f123d91c6a84d6\n"
    },
    {
      "commit": "fa9f4dcd79dcfd24af276263159c5315abb06df6",
      "tree": "7456c470d8c609e800c7fd05eb3b9183c0593523",
      "parents": [
        "182a26ff95515179b1a7e62a806f90279cdcd9b3"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue Jul 22 18:16:44 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue Jul 22 18:16:44 2014 -0700"
      },
      "message": "Cosmetic: Move some functions around to match rule priority order.\n\nChange-Id: I81af639b66ac66272e0fae2d53119de1bfa12e69\n"
    },
    {
      "commit": "182a26ff95515179b1a7e62a806f90279cdcd9b3",
      "tree": "2c0cbec59a147624f9a91f3710a4178fbc008c48",
      "parents": [
        "1604e18615f824adb2d54c36320069ba6fcb4796"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue Jul 22 16:44:37 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue Jul 22 16:50:39 2014 -0700"
      },
      "message": "Remove the oif\u003diface clause when tethering.\n\nThe rule is meant to be \"iif\u003dinputIface \u003d\u003e lookup \u003ctable_for_outputIface\u003e\", not\n\"iif\u003dfoo oif\u003dbar \u003d\u003e lookup \u003ctable_for_bar\u003e\" (the latter would never match\nbecause packets coming in on the input interface will not have any output\ninterface binding).\n\nBug: 16242255\nChange-Id: I98a2a8ab90765aee833134297b58d4f7a212036f\n"
    },
    {
      "commit": "b717e74df3571951890cf36ee8bd559501d7fdc4",
      "tree": "2947c70ebf0a1dba738461475ccff87b45c8801d",
      "parents": [
        "87475a1471373b72ffc9f81f17dfd7884723fa86"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Sat Jul 19 00:22:15 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue Jul 22 11:26:01 2014 -0700"
      },
      "message": "Flush routing rules and add an \"unreachable\" rule on Init().\n\nWithout the flush, rules accumulate duplicates when netd is restarted due to a\nruntime restart. Nothing functionally wrong with having duplicates; it just\nmakes the output of \"ip rule\" look as though something went wrong in the system.\n\nTime to add the unreachable rule, to suss out issues with corner cases. With the\nflush, there\u0027s no more a naked \"from main\" rule that we need to protect by\nadding the unreachable rule. But it\u0027s a good idea to add the unreachable rule\nanyway, in case somebody comes along and adds a rule below it later.\n\nChange-Id: I975b2221868b7f5366bd7cf60937a82fb4b75913\n"
    },
    {
      "commit": "87475a1471373b72ffc9f81f17dfd7884723fa86",
      "tree": "eeafaad1905e7c55db35720ed79bc86e7ba62630",
      "parents": [
        "070b2d296de30e3dbc68c21f542acb1f2914d870"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue Jul 15 16:20:28 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue Jul 22 11:20:55 2014 -0700"
      },
      "message": "Fix WiFi-Direct and Tethering.\n\nA LocalNetwork object now always exists in the NetworkController, with a fixed\nNetId that\u0027s guaranteed not to collide with NetIds created by the framework.\n\nWhen routes are added on an interface tracked by the LocalNetwork, they are\nadded to a fixed \"local_network\" table.\n\nWhen NAT is enabled, we add a special \"iif -\u003e oif\" tethering rule.\n\nBug: 15413694\nBug: 15413741\n\nChange-Id: I36effc438d5ac193a77174493bf196cb68a5b97a\n"
    },
    {
      "commit": "b31e085466c95e5e89de6e06ebc3547c85e98242",
      "tree": "5f5cac66e1ae02595f5f58781be8a79b770ab9fb",
      "parents": [
        "6a773534e7f8541f221f27fb8063af079b1a5936",
        "bb40d5198943df0e2a88514cbcd82a23a5b0cd97"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Fri Jul 11 22:29:49 2014 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Thu Jul 10 21:02:07 2014 +0000"
      },
      "message": "Merge \"Add default routing tables to rt_tables.\""
    },
    {
      "commit": "bb40d5198943df0e2a88514cbcd82a23a5b0cd97",
      "tree": "9e97f40ad2a050e2ad64168bae7c2dd0c5b97e85",
      "parents": [
        "c7d804c1d22db40ac79fde46a032cd359e975f5b"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Fri Jul 11 11:45:14 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Fri Jul 11 13:05:56 2014 -0700"
      },
      "message": "Add default routing tables to rt_tables.\n\nThis is so that these tables also get dumped by bugreport / dumpstate.\n\nChange-Id: Ia5ed8a23911d7b34ba964934dec42849f4a73824\n"
    },
    {
      "commit": "6a773534e7f8541f221f27fb8063af079b1a5936",
      "tree": "03b44593f5021c5fd8526d257d716c45c65d146d",
      "parents": [
        "c7d804c1d22db40ac79fde46a032cd359e975f5b"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Fri Jul 11 09:10:20 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Fri Jul 11 11:07:58 2014 -0700"
      },
      "message": "Fix tethering in the case of a regular upstream connection.\n\nFixes tethering via Ethernet, Bluetooth and WiFi (hotspot).\n\nTethering when the upstream has a DUN-specific APN is likely still broken\n(untested).\n\nFor now, assign a fixed NetId (a hack) until we can change the framework to\ncreate a valid NetworkAgent and all that jazz.\n\nBug: 15968336\nBug: 14988803\nChange-Id: Idcf4d492d9329a9c87913e27be6dd835a792bea2\n"
    },
    {
      "commit": "c7d804c1d22db40ac79fde46a032cd359e975f5b",
      "tree": "23f36403ff36e19bc8bf3ea8425ea2a5cfdad6da",
      "parents": [
        "4acd34a8e95b1191318216ebad409ec5e1b3d5f0"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Wed Jul 09 07:39:30 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Wed Jul 09 07:39:30 2014 -0700"
      },
      "message": "Cosmetic: Move constants into file scope.\n\nChange-Id: Ic1398a5867693bb8f1e588e727869ec6a4574432\n"
    },
    {
      "commit": "4acd34a8e95b1191318216ebad409ec5e1b3d5f0",
      "tree": "08c0f474df922aed4878575a89dc5757737a263d",
      "parents": [
        "e09b20aee85f1dfd8c18c3d8581ac875d939ba70"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Mon Jul 07 22:11:37 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue Jul 08 16:18:25 2014 -0700"
      },
      "message": "Add symbolic table names for routing table numbers.\n\nThis makes the output from \"ip rule\" much more readable.\n\nCompanion changes are in AOSP.\n\nChange-Id: I69deb1a64d5d6647470823405bf0cc55b24b22de\n"
    },
    {
      "commit": "e09b20aee85f1dfd8c18c3d8581ac875d939ba70",
      "tree": "bdfbd786a1cc3069ffa8b5d7513ccb6a115b72e1",
      "parents": [
        "5009d5ef3fbcdc69d772b528fd22184b7d605afa"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Sat Jul 05 17:15:14 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Mon Jul 07 16:20:18 2014 -0700"
      },
      "message": "Add full support for UIDs in VPNs.\n\nMajor:\n+ Implement the functions mentioned in http://go/android-multinetwork-routing\n  correctly, including handling accept(), connect(), setNetworkForSocket()\n  and protect() and supporting functions like canUserSelectNetwork().\n+ Eliminate the old code path of getting/setting UID ranges through\n  SecondaryTableController (which is currently unused) and mUidMap.\n\nMinor:\n+ Rename some methods/variables for clarity and consistency.\n+ Moved some methods in .cpp files to match declaration order in the .h files.\n\nBug: 15409918\nChange-Id: Ic6ce3646c58cf645db0d9a53cbeefdd7ffafff93\n"
    },
    {
      "commit": "5009d5ef3fbcdc69d772b528fd22184b7d605afa",
      "tree": "c4375c84299cd6aca384ce100549456e7d91a09e",
      "parents": [
        "ed4bd1f7d219f9f5f56763ea02cf4947e78397f6"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Thu Jul 03 12:20:48 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Mon Jul 07 16:19:33 2014 -0700"
      },
      "message": "Update routing rules.\n\nAs per the latest changes to: http://go/android-multinetwork-routing\n\nFunctional changes:\n+ Add explicit\u003dNO to the implicit network rules, though it\u0027s a no-op.\n+ Remove most of the UID\u003d0 (kernel access) rules since they are no longer\n  needed, except in one case to allow access to a VPN.\n+ Add the explicit, protect and permissions bits to the incoming packet mark.\n+ VPNs now don\u0027t need an implicit network rule.\n+ Modifying network permissions now modifies the incoming packet mark as well.\n\nCosmetic changes:\n+ Renamed the legacy tables to match their permissions (SYSTEM and NETWORK).\n+ Renamed most functions and methods for clarity and consistency.\n+ Renamed and adjusted some ule priorities.\n+ Move most rule modifications into their own functions, to prevent brittle\n  reliance on the previous state of the fwmark/mask variables.\n\nChange-Id: I958a7e158ee918d5254de606fcfa55fe23327438\n"
    },
    {
      "commit": "ed4bd1f7d219f9f5f56763ea02cf4947e78397f6",
      "tree": "f1ec6176a56c340fd4207058c1b4558ed4b15354",
      "parents": [
        "a675b00423e5a370e72a7f10f6b632b4d15a1ff4"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Sat Jul 05 12:31:05 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Mon Jul 07 13:16:02 2014 -0700"
      },
      "message": "Fix permissions handling.\n\n+ Rename the permissions as per: http://go/android-multinetwork-routing\n+ Make the SYSTEM permission explicitly include NETWORK.\n+ Grant the SYSTEM permission to system UIDs by default, but allow the framework\n  to override them if necessary.\n+ Move the \"string to permission\" parsing to CommandListener.cpp, thus allowing\n  us to get rid of Permission.cpp.\n+ There\u0027s no need to support multiple permissions string arguments, so tighten\n  that up.\n\nChange-Id: I73d51b5e2f44a97e6d5ab5943ff198cebfbcc0c4\n"
    },
    {
      "commit": "72999d6cfc1df23cd911b85730f1f532fb62bed4",
      "tree": "38da5d461b954356b3b028082934004fc931d958",
      "parents": [
        "d36c49c1d66585769d33d95f0eb2c9c524b337a4"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Wed Jul 02 18:06:34 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Wed Jul 02 18:06:34 2014 -0700"
      },
      "message": "Fix regressions in flushRoutes().\n\nhttp://ag/486276 left out a comma, causing the command to be \"routeflush\" (which\nis invalid), instead of the correct \"route flush\".\n\nhttp://ag/495068 changed the order, causing the interface to be removed from the\ninterfaceToIndex map before we are done using it in modifyPerNetworkRules().\n\nChange-Id: I65af0b5763b13e47b48e7e2b81d243dc19e1a03b\n"
    },
    {
      "commit": "eb27b7ec10faf47a93fbc2863092cc667b05e252",
      "tree": "addbd7ae92ee634ac8768ab8dc1ae8187e8a61e4",
      "parents": [
        "cf891383224e420d99996f7e63728a7cc902415e"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue Jul 01 14:30:30 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue Jul 01 16:16:24 2014 -0700"
      },
      "message": "Fix routing rules.\n\nFix the rules in RouteController as per the latest iteration of the routing\ndesign: http://go/android-multinetwork-routing. Changes include:\n\n+ The legacy tables have to be global. So remove the UID being passed in to\n  modifyRoute() and remove the associated TODOs.\n\n+ Add UID\u003d0 rules to let the kernel access routes on privileged networks.\n\n+ Add a UID\u003d0 clause to the directly-connected hack, thus fixing the TODO.\n\n+ Add the privileged_legacy table just above the legacy table, when overriding\n  the default network. (The same table remains added at the top of the rule\n  chain, to override VPNs, but only for CONNECTIVITY_INTERNAL-privileged apps).\n\nOther cosmetic changes:\n+ Update the names and values of the rule priorities.\n+ Move the legacy table IDs to the .h file in anticipation of using them from\n  bugreport / dump commands.\n+ Make \u0027action\u0027 the first parameter consistently.\n\nChange-Id: I6634a19ddc8062b2ef55d926c7892fff8c586106\n"
    },
    {
      "commit": "cf891383224e420d99996f7e63728a7cc902415e",
      "tree": "116e033fa160c96c2bf1d350a0d1088408c335fc",
      "parents": [
        "1201e84ebda52d8d82e5385644e9de0923e61aa3"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue Jul 01 15:49:20 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue Jul 01 15:53:24 2014 -0700"
      },
      "message": "Don\u0027t use %zu for uid_t. It\u0027s always unsigned int, so %u is correct.\n\nChange-Id: I5be1d479b524495037c2aedc8336c794d2698914\n"
    },
    {
      "commit": "1201e84ebda52d8d82e5385644e9de0923e61aa3",
      "tree": "2a43407d734cc2d1a959ca0c9f3b96adcd74252f",
      "parents": [
        "b1425cc09f8a29350520db0d4f489331df5a689b"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue Jul 01 15:06:05 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue Jul 01 15:09:14 2014 -0700"
      },
      "message": "Use %zu to printf size_t correctly on both 32-bit and 64-bit platforms.\n\nChange-Id: I5223e574084fca47606b844d74a99a642c7d66be\n"
    },
    {
      "commit": "b1425cc09f8a29350520db0d4f489331df5a689b",
      "tree": "cdc54a47c69e1ba78faf6e759ee2d5dc5692addf",
      "parents": [
        "4043f01f8e25f24246efadc710ad7440aab75529"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Mon Jun 23 18:54:27 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue Jul 01 11:26:54 2014 -0700"
      },
      "message": "Add UID range support to VPNs.\n\nThis adds the necessary routing rules.\n\nFuture CLs will add the ability to select the right netId for connect(),\nsetNetworkForSocket(), DNS resolutions, etc.\n\nBug: 15409918\nChange-Id: I88a67660d49cecda834dd72ab947fbfed250f09d\n"
    },
    {
      "commit": "4043f01f8e25f24246efadc710ad7440aab75529",
      "tree": "05690f59e4158475a99fe9220191c3282c9f0981",
      "parents": [
        "f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Mon Jun 23 12:41:37 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue Jul 01 10:59:47 2014 -0700"
      },
      "message": "Introduce VPN support.\n\nThis change sets up the basic routing rules for VPNs. It doesn\u0027t yet handle UID\nranges (that are meant to apply to the VPN) correctly. That\u0027s forthcoming in\nother CLs.\n\nBug: 15409918\nChange-Id: I284de04f176dcf6ba702361de6a614266256d04e\n"
    },
    {
      "commit": "f4f6c8de3f091be4b91a5a9d7f14e8882ec6d502",
      "tree": "096f5672a478e9eb9a5a374cba625a949fb645c8",
      "parents": [
        "1077d298655efa7755925e788d49a73e9db10afc"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Mon Jun 23 09:54:06 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue Jul 01 10:54:43 2014 -0700"
      },
      "message": "Refactor: Encapsulate permissions and interfaces into a Network class.\n\nCurrently, there\u0027s a lot of logic in NetworkController surrounding events such\nas interface addition/removal, network creation/destruction and default network\nchange, because these events are interwined. For example, adding an interface\nmeans also adding a corresponding default network rule if the interface is being\nadded to the current default network.\n\nWhen we introduce VPNs into this mix, things will get hairy real quick for all\nthis logic in NetworkController.\n\nIn this refactor, we introduce an abstract base class Network which supports\nadding and removing interfaces. The main concrete implementation of this is\nPhysicalNetwork, which allows setting permissions and \"default network\" state.\n\nSince we\u0027ve moved network permissions into the above class, and user permissions\ninto NetworkController, PermissionsController is unused and has been removed.\n\nAlso fix a few bugs in RouteController:\n+ Use uidEnd correctly.\n+ Check for all error cases in inet_pton.\n+ Check the return value of android_fork_execvp() correctly.\n+ The \"return cmd1() \u0026\u0026 cmd2()\" pattern is wrong. Rewrite that code.\n\nAlso (non-functional changes):\n+ Remove instantiations of RouteController. It has static methods only.\n+ Reorder some blocks in CommandListener so that the most frequent commands are\n  checked first.\n+ Remove unused paramError() and clearNetworkPreference().\n+ Change all return codes to int (negative errno) wherever applicable.\n+ Add WARN_UNUSED_RESULT everywhere.\n+ Cleanup some style in RouteController and NetworkController.\n+ Use uid_t instead of unsigned for user IDs.\n+ Add clearer log messages at the source of failures.\n+ Add a check for when fwmark bits are set without corresponding mask bits.\n\nBug: 15409918\n\nChange-Id: Ibba78b0850160f9f3d17d476f16331a6db0025d1\n"
    },
    {
      "commit": "1077d298655efa7755925e788d49a73e9db10afc",
      "tree": "c746a1c40cb3516eac4c8903e904f0ff6c58b3fb",
      "parents": [
        "72723683be57b6d562dc96cde30cc33cc96b3e82"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Fri Jun 27 06:42:11 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Fri Jun 27 06:43:40 2014 -0700"
      },
      "message": "Don\u0027t fail when adding a duplicate legacy route.\n\nThis only affects calls to requestRouteToHost() by apps. We still fail if the\nframework itself tries to add a non-legacy duplicate route, since the framework\nshould know better (we can consider relaxing that too in the future).\n\nBug: 15925532\nChange-Id: I9ee434277e462d570f88e6fe63a096e5ae41eee9\n"
    },
    {
      "commit": "72723683be57b6d562dc96cde30cc33cc96b3e82",
      "tree": "9ab2fd72f0e734ab45e545d6549ea9aeb9c46f14",
      "parents": [
        "5965651602fb8373b75b6ae2d59c6a4d753f2f49"
      ],
      "author": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Thu Jun 26 13:51:10 2014 +0900"
      },
      "committer": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Thu Jun 26 14:16:51 2014 +0900"
      },
      "message": "Convert rta_* and fra_* variable names to camelCase.\n\nChange-Id: I0ca539ac4c54bb71b033f288fb4229afd71b7989\n"
    },
    {
      "commit": "5965651602fb8373b75b6ae2d59c6a4d753f2f49",
      "tree": "6fe0439f1edb267854a4019e7ed58a4491e3abb3",
      "parents": [
        "96f261e8b28048b8cb48f5a4e81822c73bb813f4"
      ],
      "author": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Wed Jun 25 03:20:29 2014 +0900"
      },
      "committer": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Thu Jun 26 14:07:11 2014 +0900"
      },
      "message": "Support adding and removing UID rules via netlink.\n\nChange-Id: Idae13bceda869261689260759084b8d6ef1ff639\n"
    },
    {
      "commit": "96f261e8b28048b8cb48f5a4e81822c73bb813f4",
      "tree": "b5c22de820353af1d4c17007b026e80f2f2b7cc5",
      "parents": [
        "4753afd79e130d5f1c888f549c36b4da92dbe680"
      ],
      "author": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Mon Jun 23 15:09:54 2014 +0900"
      },
      "committer": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Thu Jun 26 14:07:10 2014 +0900"
      },
      "message": "Pass rule modification errors back to CommandListener.\n\nChange-Id: If01334dccad8b6230648713a57fd58be180ac66b\n"
    },
    {
      "commit": "4753afd79e130d5f1c888f549c36b4da92dbe680",
      "tree": "bcfcefc18377057d59ec47aa2df9c4889e96ae54",
      "parents": [
        "7f972fb1cd3c26af76779a7a3220b9cf5fb63a0a"
      ],
      "author": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Fri Jun 20 23:03:29 2014 +0900"
      },
      "committer": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Thu Jun 26 14:07:10 2014 +0900"
      },
      "message": "Use netlink to add/delete rules as well as routes.\n\nAlso change the indentation of the rtattrs used in modifyIpRoute\nto make it easier to see what attributes are being used and in\nwhat sequence.\n\nThis change does not yet pass the errors back to CommandListener;\nthat is done in the next change in the series.\n\nChange-Id: Ib2e174386c63cb0647d838d9c7d731cd6df39c4f\n"
    },
    {
      "commit": "7f972fb1cd3c26af76779a7a3220b9cf5fb63a0a",
      "tree": "8dce9aefe6096bca426d693135c9bf21065e6df3",
      "parents": [
        "ab359feb1a4d3a1898e32a7da47dcde3da4c1ed6"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue Jun 24 16:09:21 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue Jun 24 16:09:21 2014 -0700"
      },
      "message": "Unrevert the \u0027revert the \"talk to netlink directly\" change.\u0027\n\nhttp://ag/486277 was reverted in http://ag/491263 and is being unreverted in\nthis change. The bug in the original CL was a typo (\"interface\" instead of the\ndesired \"ifindex\"), which is now fixed.\n\nBug: 15840054\nChange-Id: If66987c74cc86e9ba4f7a35d36f0a39afe939a68\n"
    },
    {
      "commit": "ab359feb1a4d3a1898e32a7da47dcde3da4c1ed6",
      "tree": "9348b4f9f811f8073b2d8cfdffc21e99afdc8141",
      "parents": [
        "7b64cdee0f468a5b66ae2439f84364815ae9a795"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue Jun 24 15:03:52 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue Jun 24 15:03:52 2014 -0700"
      },
      "message": "Temporarily revert the \"talk to netlink directly\" change.\n\nThe change being reverted is http://ag/486277. Instead, use /sbin/ip again. The\ncode to talk to netlink fails on volantis. I.e., instead of this:\n    $ ip route show table 1006\n    default via 100.110.191.254 dev wlan0\n    100.110.128.0/18 dev wlan0  scope link\nwe end up with this:\n    $ ip route show table 1006\n    default dev wlan0  proto static\n    100.110.128.0/18 dev wlan0  proto static\nNotice the lack of the nexthop and the addition of \"proto static\". I think the\nnetlink message is somehow not properly aligned on volantis, causing the kernel\nto misinterpret it.\n\nBug: 15840054\nChange-Id: Ief60473e337410f7cb35890de0a5a74a21723a41\n"
    },
    {
      "commit": "f7fc8eccb0a6a4fbca4cafdf53f5c167c8f1d755",
      "tree": "7217049a19d215354077f4ab6726da5787779fa4",
      "parents": [
        "ba25df989b48f36b784ad39307a49a4fd9c3fd66"
      ],
      "author": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Wed Jun 18 00:41:58 2014 +0900"
      },
      "committer": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Tue Jun 24 00:46:59 2014 +0900"
      },
      "message": "Pass route add/delete errors back to CommandListener.\n\nChange-Id: Id1d6d578963080e141f71bc1303801fc53bce40a\n"
    },
    {
      "commit": "ba25df989b48f36b784ad39307a49a4fd9c3fd66",
      "tree": "96995bf97188c9d8e884cecd59e7478ca2d2e17f",
      "parents": [
        "bd0f224f077264f21fa858b7a93062e3b8564006"
      ],
      "author": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Wed Jun 18 00:22:17 2014 +0900"
      },
      "committer": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Mon Jun 23 16:00:08 2014 +0900"
      },
      "message": "Use native netlink code instead of /sbin/ip to manipulate routes\n\nShelling out to /sbin/ip is slow, and more importantly it does\nnot preserve the error messages returned by the kernel when\nadding or deleting a route fails.  Instead, use netlink directly.\n\nThis change does not yet pass the errors back to CommandListener;\nthat is done in the next change in the series.\n\nChange-Id: I5ad3c8583580857be6386a620ff5c4f3872d685b\n"
    },
    {
      "commit": "357e5629bb4c745296ab40340ec8679372337155",
      "tree": "0d2fcb6c98606d04a80b19de2125f6aea6c345fa",
      "parents": [
        "d2f23fb6285000831f14cacc16881d96f6046c33"
      ],
      "author": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Tue Jun 17 16:14:17 2014 +0900"
      },
      "committer": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Fri Jun 20 14:51:15 2014 +0900"
      },
      "message": "Flush both IPv4 and IPv6 routes.\n\nThe current code unintentionally flushes only IPv4 routes\nbecause it reuses a function that is normally used to add and\nremove routes (where the IP version is implicitly specified by\nthe route to add or remove).\n\nInstead of fixing the runIpRouteCommand function, add a new\nflushIpRoutes function because runIpRouteCommand will be\nreplaced by a netlink implementation in an upcoming CL.\n\nChange-Id: Ie96ae4124baca3edb8e0d0841e7abadb6b3ee9ab\n"
    },
    {
      "commit": "a561e121c724e9163b2e256e15eef660e3a326da",
      "tree": "8490eb9cf8c9f54de243dc1d7787f192bb282f2b",
      "parents": [
        "5ad1c281da21ebe1863fbad50f7c20dce4f08512"
      ],
      "author": {
        "name": "Paul Jensen",
        "email": "pauljensen@google.com",
        "time": "Thu Jun 12 16:46:37 2014 -0400"
      },
      "committer": {
        "name": "Paul Jensen",
        "email": "pauljensen@google.com",
        "time": "Tue Jun 17 16:30:30 2014 +0000"
      },
      "message": "Cache interface indices in case interfaces go away.\n\nWithout caching them netd will fail to remove rules and routes,\nfor example, when the Bluetooth reverse-tether interface (\"bt-pan\")\ngoes away.\n\nbug:15407087\n\nChange-Id: I99fcf00f9645a0b029455516a705b70110f62ff6"
    },
    {
      "commit": "ac19883dd50d5310d1fddf996ee227075a103ecb",
      "tree": "ab375a40c6bb83baf4e1c78c03395de21d3d764c",
      "parents": [
        "9a4c1128b274ee2a6ffab3d50d08aaf0bc2fb2ff"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Fri May 30 15:11:54 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Fri May 30 15:11:54 2014 -0700"
      },
      "message": "Fix build.\n\nChange-Id: If170e46ff92c6a972bc1c2d838b1ac0eea6e23de\n"
    },
    {
      "commit": "9a4c1128b274ee2a6ffab3d50d08aaf0bc2fb2ff",
      "tree": "180043c6c40100c6168e6e4a32e80fd2c244078a",
      "parents": [
        "bfe8e77344c713844dbb40b14999f50a1e2a2142",
        "82eab785bd5cb2eff0a263f5b0dcde13e9139588"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Fri May 30 21:33:07 2014 +0000"
      },
      "committer": {
        "name": "Android Git Automerger",
        "email": "android-git-automerger@android.com",
        "time": "Fri May 30 21:33:07 2014 +0000"
      },
      "message": "am 82eab785: Support legacy routes added by apps via ensureRouteToHost().\n\n* commit \u002782eab785bd5cb2eff0a263f5b0dcde13e9139588\u0027:\n  Support legacy routes added by apps via ensureRouteToHost().\n"
    },
    {
      "commit": "82eab785bd5cb2eff0a263f5b0dcde13e9139588",
      "tree": "76c295e087df8391bee5d452728c5efe99e2f17e",
      "parents": [
        "ce8f583ff6620a19602d3c4604557e1b1501cafa"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Thu May 22 14:21:49 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Fri May 30 18:27:40 2014 +0000"
      },
      "message": "Support legacy routes added by apps via ensureRouteToHost().\n\nThis adds the routes to two fixed tables:\n+ LEGACY, which has higher priority than other non-explicit lookup tables\n  (per-network and default network).\n+ PRIVILEGED_LEGACY, available only to system apps and has higher priority than\n  VPNs (system apps are those with the CONNECTIVITY_INTERNAL permission).\n\nThis will be changed to per-UID tables once the kernel supports UID-based\nrouting, so that these legacy routes are scoped to each app and not global.\n\nAlso, fix a TODO: The framework (as of http://ag/471599) will not set the\ngateway argument if it\u0027s actually a direct-connected route.\n\nChange-Id: I0ee1ca89fdc859d75a89021ca8c1902811b1e4a9\n(cherry picked from commit 38b7af1f2cb9579895465fabc37865f5dadcac25)\n"
    },
    {
      "commit": "56afacf838d24cf8e54d2cf0d8ab9182ab704125",
      "tree": "905e375d2eae15018f3e05c45c30e0d299928452",
      "parents": [
        "38b7af1f2cb9579895465fabc37865f5dadcac25"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Wed May 28 15:07:00 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Thu May 29 20:33:18 2014 -0700"
      },
      "message": "Turn on C++11 and make all warnings into errors.\n\nAs a consequence:\n+ Comment out the names of all unused parameters.\n+ Remove all unused variables and functions.\n\nIn server/Android.mk, there are a couple of non-trivial changes:\n+ Use libcxx instead of stlport. This is needed to fix a bunch of errors due to\n  specifying -std\u003dc++11.\n+ LOCAL_SHARED_LIBRARIES is sorted. Technically, the order in which libraries\n  are listed has an effect on linking, but nobody should be doing such brittle\n  things anyway.\n\nChange-Id: I0aff5b745e04609da23144d0e8be4c5694321b8b\n"
    },
    {
      "commit": "38b7af1f2cb9579895465fabc37865f5dadcac25",
      "tree": "9a01d8dcdbdd91d1813476aa5b2cbc756e17f932",
      "parents": [
        "ec00884cac216d1cb79556ca23b21ce55e35af3e"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Thu May 22 14:21:49 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Thu May 29 18:34:06 2014 -0700"
      },
      "message": "Support legacy routes added by apps via ensureRouteToHost().\n\nThis adds the routes to two fixed tables:\n+ LEGACY, which has higher priority than other non-explicit lookup tables\n  (per-network and default network).\n+ PRIVILEGED_LEGACY, available only to system apps and has higher priority than\n  VPNs (system apps are those with the CONNECTIVITY_INTERNAL permission).\n\nThis will be changed to per-UID tables once the kernel supports UID-based\nrouting, so that these legacy routes are scoped to each app and not global.\n\nAlso, fix a TODO: The framework (as of http://ag/471599) will not set the\ngateway argument if it\u0027s actually a direct-connected route.\n\nChange-Id: I0ee1ca89fdc859d75a89021ca8c1902811b1e4a9\n"
    },
    {
      "commit": "72604075e74af459fb4637404fbf030422c6b6b6",
      "tree": "6a5a7fdb52919bd8e049a1ac7d29532578407e17",
      "parents": [
        "5fc275794ab41d110abbdb7683ed9db45918985f"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Wed May 21 13:19:43 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Wed May 21 19:28:36 2014 -0700"
      },
      "message": "Rework the determination of a \"valid network\".\n\n+ isNetIdValid() doesn\u0027t make much sense. What we want is whether the netId has\n  actually been created (via createNetwork()).\n+ It isn\u0027t an error to call deleteNetwork() or setDefaultNetwork() even when\n  there are no interfaces assigned to the network.\n+ Secure all accesses to the maps in PermissionsController with locks; they are\n  called from many threads (CommandListener, DnsProxyListener and FwmarkServer).\n+ Remove the redundant mIfaceNetidMap.\n+ Minor cosmetic changes to things such as #includes and log messages.\n\nChange-Id: Ieb154589b24f00ba8067eaaec4def3534aec4923\n"
    },
    {
      "commit": "f4cfad361175a7f9ccf4d41e76a9b289c3c3da22",
      "tree": "adef9c2f736b8a566b0edd9ff83f92493c367f34",
      "parents": [
        "5ff58d494a5ddf7e544adc77590300f04daf8e31"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Wed May 21 08:54:07 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Wed May 21 09:03:35 2014 -0700"
      },
      "message": "Move netd_client into netd.\n\nChange-Id: Ie4b6b303225c93f2448a503d6ea9cebb552cbad5\n"
    },
    {
      "commit": "122f581eb16e06c70cbbc40bd40995775075151f",
      "tree": "1accb5703f76d761132bdefd799feda7d0109a03",
      "parents": [
        "ae37e8a4f42b658d5aaf43f312f063944b4aeecb"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Sun May 11 20:29:49 2014 -0700"
      },
      "committer": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Wed May 14 02:46:23 2014 -0700"
      },
      "message": "Refactor the fwmark stuff to use an explicit union of bit-fields.\n\nThis is a pure refactor. There\u0027s no effect on any functionality.\n\nChange-Id: I99d1f3fb76781cf84f67c2dff44eaf3a2cf50a9f\n"
    },
    {
      "commit": "ae37e8a4f42b658d5aaf43f312f063944b4aeecb",
      "tree": "37b5a4bc8de51b288569e78fc39ad07013d90975",
      "parents": [
        "fd6424fdf2cd0516a6c95288610e323dbdfe84ff"
      ],
      "author": {
        "name": "Paul Jensen",
        "email": "pauljensen@google.com",
        "time": "Mon Apr 28 10:35:51 2014 -0400"
      },
      "committer": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Wed May 14 02:46:17 2014 -0700"
      },
      "message": "Separate network and interface addition/removal netd APIs.\nThis should facilitate stacked interfaces (i.e. clatd).\n\nChange-Id: Ib3e7a4d3847ef6ec4449451f6da42e75959baa4f\n"
    },
    {
      "commit": "fd6424fdf2cd0516a6c95288610e323dbdfe84ff",
      "tree": "4031d9554d80f789d7aa82a0eb7f9acac81c5170",
      "parents": [
        "a79f6182a338621a32f350d7c2985c6872cccf84"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Thu Apr 24 16:23:35 2014 -0700"
      },
      "committer": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Wed May 14 02:45:49 2014 -0700"
      },
      "message": "Ignore failure when adding directly-connected routes to the main table.\n\nChange-Id: I12f65cdfbe2285820bd24b047f794ec9b9b5110f\n"
    },
    {
      "commit": "a79f6182a338621a32f350d7c2985c6872cccf84",
      "tree": "542ffb0f387f96bdb1614c0f646d9f7cab4f0555",
      "parents": [
        "c92133732378aae815120c39edd62a7b4eb773b3"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Thu Apr 24 15:55:26 2014 -0700"
      },
      "committer": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Wed May 14 02:45:06 2014 -0700"
      },
      "message": "Fixes for stupid mistakes (by me).\n\n+ Only remove netId/permission after doing everything that references them.\n+ Return success/failure correctly based on return value of fork/exec.\n\nConflicts:\n\tNetworkController.cpp\n\nChange-Id: Iddb8ccdffc104ffed1058ecc2421006beebd568d\n"
    },
    {
      "commit": "c92133732378aae815120c39edd62a7b4eb773b3",
      "tree": "f9b650215acb5a3d24e198927c8e551673ee1631",
      "parents": [
        "7dd69a1b0b95e67c8b939884476f2cf888026eb7"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Wed Apr 16 12:32:18 2014 -0700"
      },
      "committer": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Wed May 14 02:43:10 2014 -0700"
      },
      "message": "Add directly-connected routes to the main table.\n\nChange-Id: I545555d273ea9d321eab08fef12a32ca17e33dff\n"
    },
    {
      "commit": "8fe9c8e0a2b1c5cd2a34720efaccc641d9ab8fb6",
      "tree": "50ecb527f3a5584d263037e4ad25443bc6b91e33",
      "parents": [
        "92b66c4990b4a0ab608aa9c31da946f36085203b"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Wed Apr 16 12:08:05 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Wed May 14 00:24:34 2014 -0700"
      },
      "message": "Update the \"lookup main\" rule to include a fwmark clause.\n\nIf a packet is marked with a non-zero NetId, and doesn\u0027t find a route in its\nper-network table, it will now not match the main table rule, and so will\nfallthrough to the \"unreachable\" rule, resulting in ENETUNREACH, as desired.\n\nIf a packet has a zero NetId (e.g.: sent on an unconnected UDP socket), it will\nfind the \"default network\" rule first, which should have a default route, so it\nwill never need to fall through any further to the main table.\n\nThis makes the main table effectively unused for all normal routing lookups.\n\nOnly the kernel will still use this table, when trying to find a directly\nconnected route to validate the nexthop when a route is added anywhere.\n\n(cherry picked from commit 4594dbba433dadba953c1c7b43fdd99e77fb1f2b)\n\nChange-Id: Ib0784ff0848854be0575c64a59bbd0a4d3bf93e0\n"
    },
    {
      "commit": "92b66c4990b4a0ab608aa9c31da946f36085203b",
      "tree": "5e74a7d81670d1fe1ec7d9e166d38e197ad51f7a",
      "parents": [
        "7619e1bbebdfe643c35ee6be4ac054f5255f0706"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue Apr 15 14:28:55 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Wed May 14 03:01:09 2014 +0000"
      },
      "message": "Flush (delete) routing tables when destroying a network.\n\n(cherry picked from commit 7ee2c3fe24f9a643584ddf5f759a7acb73e35e8d)\n\nChange-Id: I1b222b474b1ae7a551250f8f02d7900c493b5b16\n"
    },
    {
      "commit": "7619e1bbebdfe643c35ee6be4ac054f5255f0706",
      "tree": "ecddf6cd1a1b3496b9e663c1e16df1742482fc32",
      "parents": [
        "9c0d313de6a3157fadd3b52a9927c77216ca435e"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue Apr 15 14:23:08 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Wed May 14 02:58:22 2014 +0000"
      },
      "message": "Implement the \"network route add/remove\" API.\n\n(cherry picked from commit 909c52248a4ad832548c5feb5e9a58323e30ab7b)\n\nChange-Id: Idb09b0c22a3a519dda232995ced406e470ab9768\n"
    },
    {
      "commit": "9c0d313de6a3157fadd3b52a9927c77216ca435e",
      "tree": "9307c6816270a9d8a5e75b9c1c212d10eee5c7cc",
      "parents": [
        "379bd33f7640e2c4bef902be0ed6cb96378c8c2e"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Thu Apr 10 20:35:04 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue May 13 16:18:19 2014 -0700"
      },
      "message": "Implement network default set/clear.\n\n(cherry picked from commit 4cc7df247a7ec67da3b5edfb9356077fbbf0150c)\n\nChange-Id: Ib35d54816884c6a6ba28231c9b1f54e362d1d16a\n"
    },
    {
      "commit": "379bd33f7640e2c4bef902be0ed6cb96378c8c2e",
      "tree": "3e3a8c53f28af59abf9c27db164400721e22218b",
      "parents": [
        "a10ac3214f6a582b7fdb66acc43c702731e53d81"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Thu Apr 10 19:58:06 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue May 13 23:09:53 2014 +0000"
      },
      "message": "Implement permissions set/clear for both networks and users.\n\n(cherry picked from commit 47a0fa0ad402704b639fbc2868c55adc432bb6ea)\n\nChange-Id: Ibb71025e1e2c72bd300fb7379d5ab54da4a6982e\n"
    },
    {
      "commit": "a10ac3214f6a582b7fdb66acc43c702731e53d81",
      "tree": "c689ff8ac4442d6b71fefd624c8b4ca921afef6f",
      "parents": [
        "a01d6eff4316c6c10e81bd8d48ae85aa82b933e3"
      ],
      "author": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Fri Apr 11 18:26:17 2014 +0900"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue May 13 22:52:05 2014 +0000"
      },
      "message": "Move sprintf statements to getRouteTableForInterface.\n\n(cherry picked from commit b45648ad5902e53f433615ab1a0268927b6a328e)\n\nChange-Id: Ie0b2c3e3688285068b70e96d1153c0b105548a00\n"
    },
    {
      "commit": "a01d6eff4316c6c10e81bd8d48ae85aa82b933e3",
      "tree": "663575ad32f0417549571d7b390b4d9c090f3f84",
      "parents": [
        "a48118062412f16ae712bfc8c8a539d3b6a85e47"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Thu Apr 10 19:37:59 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue May 13 22:50:46 2014 +0000"
      },
      "message": "Cleanup: Minor style fixes.\n\n(cherry picked from commit 49d905456fd6cf730abdddb49df84d6032b0a419)\n\nChange-Id: I199447f03ce33d79007e62e23ccf683ed4249f97\n"
    },
    {
      "commit": "a48118062412f16ae712bfc8c8a539d3b6a85e47",
      "tree": "314273de5ce2dbefcb1ffdeaec612c8e7964078b",
      "parents": [
        "5c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082f"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Thu Apr 10 12:10:24 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue May 13 12:59:08 2014 -0700"
      },
      "message": "Set kernel proc files for fwmark reflection and table numbers for RAs.\n\n(cherry picked from commit 75992274574e91c9a17aad5b60f0c2b710cd31b9)\n\nChange-Id: I5f0d759cb9b8590555af7f5503f00d3e455ece54\n"
    },
    {
      "commit": "5c181bf8ca0c89bd9e3e6d8e40bac53d0ee7082f",
      "tree": "e6d285b596ec32fdd36d422f4981313ad149109a",
      "parents": [
        "d736d4b327bf35afc59b5cec110491fcdb9e2cbb"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Mon Apr 07 14:10:04 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Tue May 13 11:52:23 2014 -0700"
      },
      "message": "Implement network create/destroy.\n\n(cherry picked from commit 382fc20107aa38cca062f10b4bc05c47b6c7f191)\n\nChange-Id: Id5f8df447d812c8e8cf03addbb5e70abdcdfceb9\n"
    }
  ]
}
