)]}'
{
  "log": [
    {
      "commit": "dc0d578a69cc5a57167a508207e2198590142d51",
      "tree": "90ee148de47e433799c494e60b0d4e2eeb51adf1",
      "parents": [
        "ff1587fc4ee0434129f6c2431eabeb291fdb0936"
      ],
      "author": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Wed Jul 20 14:17:11 2016 +0100"
      },
      "committer": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Tue Dec 06 09:31:39 2016 +0000"
      },
      "message": "UidRanges: use class instead of pair\u003cuid_t, uid_t\u003e\n\nReuse the UidRange that was introduced in 7.0 (NYC) to ease transition\nfrom CommandListener to binder which supports this as a parcelable type.\n\nThere is a small difference in behaviour: UidRange uses signed int32_t\nvs. uid_t being unsigned and potentially a different size. This should\nnot be a problem as all of the java-side code is converting from int.\n\nUpdating to use int64_t in future would be a large effort and involve\nchanging the java-side UidRange class to use longs, and not fixing the\nnative side would cause unit tests to fail, so it shouldn\u0027t be possible\nto overlook if that happens.\n\nCommitting this early with an appropriately loud warning so that it can\nget soak time over the next year.\n\nTest: runtest -x netd_integration_test.cpp\nChange-Id: I6c217b347724ba5bfe2df28d6142a4343cb06353\n"
    },
    {
      "commit": "5bbe13bdc4470d0af2786fc62ad40a8ba8ff5830",
      "tree": "5f15c2d0cec942ae77bdaa83abf2ec57abe0df06",
      "parents": [
        "7ad3c888e2781321cf44cb101cdf180a9671ca1e",
        "6c84ef62d953eae93c36ffa831e9b451560afba0"
      ],
      "author": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Tue May 17 16:19:40 2016 +0000"
      },
      "committer": {
        "name": "Android (Google) Code Review",
        "email": "android-gerrit@google.com",
        "time": "Tue May 17 16:19:40 2016 +0000"
      },
      "message": "Merge \"Drop PROHIBIT_NON_VPN priority 11500 -\u003e 12500\" into nyc-dev"
    },
    {
      "commit": "6c84ef62d953eae93c36ffa831e9b451560afba0",
      "tree": "db9a805035d895efe9306082e468f5b17fb73474",
      "parents": [
        "3a272070fc318ef1a7a5a04e500483f1a7c629a8"
      ],
      "author": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Tue May 03 13:17:58 2016 +0100"
      },
      "committer": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Tue May 03 13:17:58 2016 +0100"
      },
      "message": "Drop PROHIBIT_NON_VPN priority 11500 -\u003e 12500\n\nSo that the rule can be kept up 100% of the time instead of dropping\nit when VPN comes on.\n\nBug: 26694104\nChange-Id: I1df6b8f588e54d72e34dbcbd15492513e07fac3d\n"
    },
    {
      "commit": "c125fe43c194128167db7a2a82b736b1357945d8",
      "tree": "79507dd5a63ab758e74ffe74407fa0f0b79e7434",
      "parents": [
        "3a272070fc318ef1a7a5a04e500483f1a7c629a8"
      ],
      "author": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Mon May 02 08:53:34 2016 +0100"
      },
      "committer": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Mon May 02 09:34:11 2016 +0100"
      },
      "message": "Restore ACT_UNREACHABLE\n\nThis got lost in between\n  I7d9752e86fa1a4564c622152a5be6ce2c1eda150 and\n  If23df0760c6eb0ad137fc26c5124e48edf23b722.\n\nWhich broke creating the UNREACHABLE network, also breaking the dummy\nnetwork which should be created after it.\n\nFix: 28304838\nChange-Id: I31c4ca9c3f53d6162b50e5bc46e27cfcd1b6a314\n"
    },
    {
      "commit": "b8087363143050d214d48e5620a330776ca95a69",
      "tree": "72dd7eb2cc094cc7b92796ef37e1682ab108da37",
      "parents": [
        "4ef94642636182e68495f606a65c00f8a830aad4"
      ],
      "author": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Wed Mar 30 18:43:08 2016 +0100"
      },
      "committer": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Tue Apr 19 10:09:31 2016 +0100"
      },
      "message": "Server API to only allow networking by VPN apps\n\nSecure virtual networks already create rules to route all traffic into\ntheirselves. This depends on the secure network already existing.\n\nAPI creates an ip rule at a priority level below SECURE_VPN which\ncan catch traffic before VPN comes up, if it is a requirement that no\ntraffic ever leaves without first going through VPN.\n\nBug: 26694104\nBug: 26354134\nChange-Id: If23df0760c6eb0ad137fc26c5124e48edf23b722\n"
    },
    {
      "commit": "4ef94642636182e68495f606a65c00f8a830aad4",
      "tree": "e4ac151f92b025dd113b06d9b908535aa0ef9f23",
      "parents": [
        "9f9aae9102f62f5f96ccec670170ee1fb262ef09"
      ],
      "author": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Fri Apr 01 11:50:49 2016 +0100"
      },
      "committer": {
        "name": "Robin Lee",
        "email": "rgl@google.com",
        "time": "Tue Apr 19 10:09:31 2016 +0100"
      },
      "message": "Have modifyIpRule take an explicit action\n\nInstead of inferring from the priority what the action should be.\n\nBug: 26694104\nChange-Id: I7d9752e86fa1a4564c622152a5be6ce2c1eda150\n"
    },
    {
      "commit": "f65122c81c824940ba93666d961c8d3fd76f3a9c",
      "tree": "3dec11a93d8fe827897610996766d07b93afaeb5",
      "parents": [
        "31701a903560b165f8241d34b9d98c18b8aaad6a"
      ],
      "author": {
        "name": "Evgenii Stepanov",
        "email": "eugenis@google.com",
        "time": "Thu Feb 11 16:55:56 2016 -0800"
      },
      "committer": {
        "name": "Jon Larimer",
        "email": "jlarimer@google.com",
        "time": "Wed Apr 06 20:18:01 2016 -0400"
      },
      "message": "Workaround ASan false positive in RouteController.\n\nBug: 27037723\n\nChange-Id: I40e7f0d07652aeb6484de5f963a7698b6805d582\n(cherry picked from commit dfde1d6c6c397e437adf937a1718784d9cb2c0cf)\n"
    },
    {
      "commit": "bbd5626b3d0994ff0ecbfceac75f6dc4abfb55c6",
      "tree": "c2233425eaacb6bca8a3d5e7744bfae41203b913",
      "parents": [
        "b407c9b318b07c0f659444d0295380e7fd48ed77"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Dec 04 15:45:10 2015 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Fri Dec 04 15:45:10 2015 -0800"
      },
      "message": "Track rename from base/ to android-base/.\n\nChange-Id: Ice6d43c0f9b16b8fb441158a0f7344dfbf969dea\n"
    },
    {
      "commit": "5407e14fd3d81bb76f94221b4a359faa2806de65",
      "tree": "6ca19120267ce67ed67265dab49feac7e81825bc",
      "parents": [
        "afd4037d7d7802d2ecc0494901ac17134a27aa1f"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Mon Mar 16 10:05:59 2015 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Mon Mar 16 13:50:59 2015 -0700"
      },
      "message": "Revert \"Revert \"Update for libbase.\"\"\n\nThis reverts commit 4a0ab5ff4a87cfc4a987da99546b01e44875a2e5.\n\n(cherry picked from commit 3e87c785434fdfed2fb00496cb391c411a426bdd)\n\nChange-Id: I042f485f3cc84206766298853491ddd26dbba13f\n"
    },
    {
      "commit": "e298ded6ade9744f2a79cae045b5c324886262f4",
      "tree": "0b16bb0fe3430dd224dabf4b3c87176ba1b0f91c",
      "parents": [
        "a4614fe5bfaafd0ff6be60ddb6fd135f99f5a5a5",
        "6066d41889ada93c5312e081d5bdff94fc1fd2af"
      ],
      "author": {
        "name": "Nicolas Geoffray",
        "email": "ngeoffray@google.com",
        "time": "Mon Mar 16 11:54:19 2015 +0000"
      },
      "committer": {
        "name": "Nicolas Geoffray",
        "email": "ngeoffray@google.com",
        "time": "Mon Mar 16 11:54:19 2015 +0000"
      },
      "message": "resolved conflicts for merge of 6066d418 to master\n\nChange-Id: I2aa9721365e96c363648dd8e9e15718ed50e3c12\n"
    },
    {
      "commit": "4a0ab5ff4a87cfc4a987da99546b01e44875a2e5",
      "tree": "2e6faf54c6782b6355feca6b43faab1633c91b43",
      "parents": [
        "b67219a71d1d896bcb34c4a7a797824b88515b2c"
      ],
      "author": {
        "name": "Nicolas Geoffray",
        "email": "ngeoffray@google.com",
        "time": "Mon Mar 16 10:28:37 2015 +0000"
      },
      "committer": {
        "name": "Nicolas Geoffray",
        "email": "ngeoffray@google.com",
        "time": "Mon Mar 16 10:28:37 2015 +0000"
      },
      "message": "Revert \"Update for libbase.\"\n\nBreaks internal master.\n\nThis reverts commit b67219a71d1d896bcb34c4a7a797824b88515b2c.\n\nChange-Id: I43145f0724ad2d669b65d20b6fd6ccc44b8f0a4f\n"
    },
    {
      "commit": "a4614fe5bfaafd0ff6be60ddb6fd135f99f5a5a5",
      "tree": "e493bc44925cd955c5bd6947666c0004be5507b8",
      "parents": [
        "6d631575749406ad4d69ce14f59910bf5f186deb",
        "8656c84dcab2800fd7c1d64bba307527619d7bdb"
      ],
      "author": {
        "name": "Vinit Deshpande",
        "email": "vinitd@google.com",
        "time": "Mon Mar 16 01:28:03 2015 -0700"
      },
      "committer": {
        "name": "Vinit Deshpande",
        "email": "vinitd@google.com",
        "time": "Mon Mar 16 01:28:03 2015 -0700"
      },
      "message": "Merge remote-tracking branch \u0027goog/mirror-m-wireless-internal-release\u0027\n\nChange-Id: I51337014e2851f47dd5e183c4bfdf39bafa59942\n"
    },
    {
      "commit": "b67219a71d1d896bcb34c4a7a797824b88515b2c",
      "tree": "afb5171b6e804b87a0a0aedd0742f36283b3bd64",
      "parents": [
        "909757cfc276546652d8f6d433c56d644325af8c"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Fri Mar 13 22:35:27 2015 -0700"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Sat Mar 14 16:53:36 2015 -0700"
      },
      "message": "Update for libbase.\n\nStringPrintf and the string based file I/O are being moved to libbase.\n\nChange-Id: I765d9e53f65a76d318d9d0d9503403fc092254d5\n"
    },
    {
      "commit": "6b6f25fa4c135d477bcaf0bb50305a5d9aee92e3",
      "tree": "72e99c16b92789cf2c7935cfc540c35bf4c5e390",
      "parents": [
        "57947f02c00bb03651e3f9427c880211c689db7f"
      ],
      "author": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Tue Mar 03 17:22:57 2015 +0900"
      },
      "committer": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Thu Mar 05 13:37:21 2015 +0900"
      },
      "message": "Flush tethering rules on interface remove.\n\nBug: 19500693\nChange-Id: I25b7942784ec026d30c60273c9e13e34d082d25a\n"
    },
    {
      "commit": "57947f02c00bb03651e3f9427c880211c689db7f",
      "tree": "33b45eabd9dc617f8d3aa0bd3f0aa2f4116d536f",
      "parents": [
        "32d768792bcd5860512998543f6904d91da1a9b7"
      ],
      "author": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Fri Feb 27 16:45:55 2015 +0900"
      },
      "committer": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Fri Feb 27 16:45:55 2015 +0900"
      },
      "message": "Add oif rules that allow UID 0 to bypass the VPN.\n\nThis is needed for wifi calling so that the kernel (which does\nnot set marks) can tee packets towards the modem. It also fixes\nthings like not being able to reply to DHCP requests from\ntethered clients when a VPN is up.\n\nSystem apps can already bypass the VPN using explicit marks, so\nallowing UID 0 to do so does not create additional bypass VPN\nissues.\n\nBug: 19500693\nChange-Id: Ie324026893637e9bd8e7aa65a37579569390e7b7\n"
    },
    {
      "commit": "5ad4e98f7b566ffde39491ee4e80d4a15507f053",
      "tree": "f85bf1d8642cb805ca3e5232c68323b47a6eff8d",
      "parents": [
        "3667936aadcabddc708797ac38ce1ffb2f992cb3"
      ],
      "author": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Thu Feb 26 17:34:32 2015 +0900"
      },
      "committer": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Fri Feb 27 09:51:15 2015 +0900"
      },
      "message": "Make the VPN rule only to originated, not forwarded, traffic.\n\nCurrently the VPN rule for the primary user will match every\nforwarded packet on the system, because it specifies a UID range\nthat includes 0, and forwarded packets have UID 0.\n\nUse \"iif lo\" to limit the rule match to locally-originated\ntraffic. This requires a kernel that sets the loopback ifindex.\nwhen originating packets. Anything based on 3.10 is fine, but\ndevices using 3.4 will need a one-line change for IPv6.\n\nBug: 19500693\nChange-Id: Iaab88bed62716dc1cea33b45c4e258f6b3bfc9d0\n"
    },
    {
      "commit": "3667936aadcabddc708797ac38ce1ffb2f992cb3",
      "tree": "5b2945957c1f42dc3dbcfb68555dc524b49b4161",
      "parents": [
        "799625cd5b0a2191632f5b042bf9ff559c18a848"
      ],
      "author": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Wed Feb 25 10:26:19 2015 +0900"
      },
      "committer": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Wed Feb 25 13:50:49 2015 +0900"
      },
      "message": "Add a dummy network that discards all packets.\n\nBug: 19500693\nChange-Id: Ic25f2d8c481f1528e887e43ca3fa868189582110\n"
    },
    {
      "commit": "bd37832f1843ed78f64604e5627cf952ac9614ba",
      "tree": "4822622da30658fb1a67e592ef9c40720f884a6e",
      "parents": [
        "50c6639a55b3208b64adc691b181a90e1e6de223"
      ],
      "author": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Feb 04 13:25:14 2015 -0800"
      },
      "committer": {
        "name": "Elliott Hughes",
        "email": "enh@google.com",
        "time": "Wed Feb 04 13:25:14 2015 -0800"
      },
      "message": "Switch writing to \u003cutils/file.h\u003e.\n\nChange-Id: Idb2de24414f4dd8e926e625b62e4d12152dc4527\n"
    },
    {
      "commit": "53ea9cadf6cc5f8be1c16b5b6b660cd7366fd3f0",
      "tree": "f9cbb3ae0ce8872d4982e145ac6abd646b3fa8fd",
      "parents": [
        "aea68fddd979bf6852b8aef9bc718567f9da935a"
      ],
      "author": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Sat Jan 31 13:54:00 2015 -0800"
      },
      "committer": {
        "name": "Nick Kralevich",
        "email": "nnk@google.com",
        "time": "Sat Jan 31 13:54:00 2015 -0800"
      },
      "message": "Avoid leaking file descriptors\n\nAdd O_CLOEXEC on open() calls, and SOCK_CLOEXEC on socket calls.\nThis avoids leaking file descriptors across execs.\n\nAddresses the following SELinux denial:\n\n  audit(1422740213.283:8): avc: denied { read write } for pid\u003d2597 comm\u003d\"clatd\" path\u003d\"socket:[6709]\" dev\u003d\"sockfs\" ino\u003d6709 scontext\u003du:r:clatd:s0 tcontext\u003du:r:netd:s0 tclass\u003dnetlink_socket\n\nand allows the removal of some other SELinux rules which were\ninappropriately added because of leaking file descriptors.\n\nChange-Id: I9c180488ea1969d610e488f967a7276a672bb477\n"
    },
    {
      "commit": "0321315d4e94dacd5ef2e0de217059cbc72d803d",
      "tree": "4d89277b199a7eaf09652b82c271cd777524926f",
      "parents": [
        "6ef96c4862428e02a0c4aebbfa1ed0ccbf58b46e"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Thu Oct 30 10:01:07 2014 -0700"
      },
      "committer": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Thu Jan 29 17:40:04 2015 +0900"
      },
      "message": "Don\u0027t fail when trying to add routes that already exist.\n\nPreviously, we suppressed failures for the special case of\nrequestRouteToHost() being called multiple times. Turns out that other\nparts of the system also try to add duplicate routes, so just suppress\nEEXIST errors in general (as far as adding routes is concerned). For\nexample, this happens when the WiFi P2P DHCP client renews its lease\nand blindly requests to add a route that it had already added before.\n\n(cherry picked from commit 64166e7666e3cc7f4b9c715f2b4e19d28ae44c5a)\n\nBug: 17205769\nChange-Id: I11d50052f616cb48a912d647b8024ccef01b736d\n"
    },
    {
      "commit": "aa1be2b3d24d99f3ccb98ff4fbb2a81b63587eff",
      "tree": "46b13422c90088fde9da814b392a555b563c0bf9",
      "parents": [
        "8a8b0c6af6ba45b549228ca4339277f18894f909"
      ],
      "author": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Tue Jan 06 09:36:17 2015 -0800"
      },
      "committer": {
        "name": "Dan Albert",
        "email": "danalbert@google.com",
        "time": "Tue Jan 06 09:36:17 2015 -0800"
      },
      "message": "Fix missing errno.h includes after libc cleanup.\n\nThese issues hadn\u0027t been found yet because a libc++ header was\nunconditionally pulling in errno.h. I\u0027ve fixed the libc++ header now.\n\nChange-Id: Ib096634cdd231fc75bf7548e4b99babc7442dc53\n"
    },
    {
      "commit": "64166e7666e3cc7f4b9c715f2b4e19d28ae44c5a",
      "tree": "fe9c0bcdcc7839fac97cff453a8cbacc66fa0d93",
      "parents": [
        "2b8d1ead4ea2ff8cb5af1ce88033a8ea0d691402"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Thu Oct 30 10:01:07 2014 -0700"
      },
      "committer": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Thu Oct 30 17:42:46 2014 +0000"
      },
      "message": "Don\u0027t fail when trying to add routes that already exist.\n\nPreviously, we suppressed failures for the special case of\nrequestRouteToHost() being called multiple times. Turns out that other\nparts of the system also try to add duplicate routes, so just suppress\nEEXIST errors in general (as far as adding routes is concerned). For\nexample, this happens when the WiFi P2P DHCP client renews its lease\nand blindly requests to add a route that it had already added before.\n\nBug: 17205769\nChange-Id: I3de557ddb82c95899623aa31b4b3ec7c955f5609"
    },
    {
      "commit": "4c95a125e0930c112555437589f7620575482095",
      "tree": "d7ea3681e0bb8d9036536279352ced736d80140c",
      "parents": [
        "6a834abb5acca22e47b70ee88e55f394f909559b"
      ],
      "author": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Thu Sep 18 16:01:50 2014 +0900"
      },
      "committer": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Fri Sep 19 10:56:29 2014 +0900"
      },
      "message": "Support manipulating throw routes.\n\nWe already supported unreachable routes. Throw routes are\nnecessary so we can exempt the VPN endpoint from being routed\nthrough the VPN in legacy VPN modes that do not pass traffic\nthrough a tun or ppp interface but just directly appply IPsec\ntransformations to outgoing packets.\n\nBug: 17462989\nChange-Id: I8635472ca3e96ec2866af2de48e6260ab2da13fb\n"
    },
    {
      "commit": "99286fe1ef6fc325c28dd10b651b5adedd549495",
      "tree": "490f67430aad333ef39a55a68a83bf5b11f75d5b",
      "parents": [
        "6a46f3384b3f48e6ef77a83a5e058a47a2939a0d"
      ],
      "author": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Tue Aug 12 15:08:00 2014 +0900"
      },
      "committer": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Thu Aug 14 14:00:23 2014 +0900"
      },
      "message": "Make destroying networks more robust.\n\n1. Retry route flushes if they fail.\n2. Make destroyNetwork ignore (but return) errors.\n\nBug: 16944962\nChange-Id: I26301613437d7cc373ff64955fd44d716e9982b9\n"
    },
    {
      "commit": "db74dba7ccfe9e9504e0acd440a23fed96682842",
      "tree": "ad6e4d180478c94419b51dc83e95dc0a628e004d",
      "parents": [
        "a2c230520be5fdafce8bbc0b6ee52262f981f75a"
      ],
      "author": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Tue Jul 29 18:26:21 2014 +0900"
      },
      "committer": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Tue Jul 29 18:46:31 2014 +0900"
      },
      "message": "Stop copying directly-connected routes to the main table, #2.\n\nFor a long time we have thought that copying directly-connected\nroutes to the main table was necessary to add gatewayed routes\nto other routing tables. However, this is not necessary when the\ndirectly-connected routes are properly created with \"scope link\"\nas we do in http://ag/513100 .\n\nDelete the copying code, but don\u0027t delete the rule that looks up\nthe main table or the code that dumps it. The main table is used\nfor things like cell networking, because the RIL emulates cell\nnetworks, which are actually point-to-point, as directly\nconnected broadcast subnets (e.g., a /30 or a /27) with a fake\ndefault gateway.  The directly-connected route that covers the\nfake default gateway is implicitly created by adding the IP\naddress, but it\u0027s in the main table, so we can\u0027t add the default\nroute without looking up the main table.\n\nChange-Id: I93bd4764ac75fdcc98fa4206c601524100d53fc3\n"
    },
    {
      "commit": "a2c230520be5fdafce8bbc0b6ee52262f981f75a",
      "tree": "4a9b6ee2eec871b1b9edb3de92921516b27a0251",
      "parents": [
        "2f5ea0e99e9a436cd43901b1772b77a410a62f8d"
      ],
      "author": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Tue Jul 29 09:25:44 2014 +0000"
      },
      "committer": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Tue Jul 29 09:25:44 2014 +0000"
      },
      "message": "Revert \"Stop copying directly-connected routes to the main table.\"\n\nThis reverts commit 2f5ea0e99e9a436cd43901b1772b77a410a62f8d.\n\nChange-Id: I1fe1df0249714cb650a34fae56476236ac0108e3\n"
    },
    {
      "commit": "2f5ea0e99e9a436cd43901b1772b77a410a62f8d",
      "tree": "f471d786f4bee0723218df8be9c496a4ee9be5cd",
      "parents": [
        "2bff72e0cf091f4d71af0c81cfc74e8ebd8c6644"
      ],
      "author": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Tue Jul 29 15:46:56 2014 +0900"
      },
      "committer": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Tue Jul 29 16:11:58 2014 +0900"
      },
      "message": "Stop copying directly-connected routes to the main table.\n\nFor a long time we have thought that copying directly-connected\nroutes to the main table was necessary to add gatewayed routes\nto other routing tables. However, this is not necessary when the\ndirectly-connected routes are properly created with \"scope link\"\nas we do in http://ag/513100 .\n\nDelete the copying code, but keep dumping the main table in\nbugreports, so we can see if third-party code such as RIL\ndaemons is putting anything in it.\n\nChange-Id: Iddd531daaf9881ffd82f0a4b4f6cc857ce8788fd\n"
    },
    {
      "commit": "2bff72e0cf091f4d71af0c81cfc74e8ebd8c6644",
      "tree": "4a9b6ee2eec871b1b9edb3de92921516b27a0251",
      "parents": [
        "060d855a00cb94e8903fd1551c9bf040f42b57d1"
      ],
      "author": {
        "name": "Sreeram Ramachandran",
        "email": "sreeram@google.com",
        "time": "Fri Jul 18 13:03:47 2014 -0700"
      },
      "committer": {
        "name": "Lorenzo Colitti",
        "email": "lorenzo@google.com",
        "time": "Tue Jul 29 15:09:46 2014 +0900"
      },
      "message": "Add \"scope link\" when adding routes without a nexthop.\n\nThis is consistent with what /sbin/ip does, and it makes\nrecursive lookups on secondary tables work even when the main\ntable is empty.\n\nThis was originally proposed by Sreeram as http://ag/506456 to\nfix a VPN issue, but then abandoned because it did not fix that\nparticular problem.\n\nBug: 16628572\nChange-Id: I85753389c683ae2127b21af722463a35a33b60eb\n"
    },
    {
      "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"
    }
  ]
}
