diff options
author | Lorenzo Colitti <lorenzo@google.com> | 2016-12-17 22:19:40 +0900 |
---|---|---|
committer | Lorenzo Colitti <lorenzo@google.com> | 2016-12-19 11:08:26 +0900 |
commit | 04cd308001d732a1c8e5d244daba37c56a4641b0 (patch) | |
tree | 9f9e399f955bc51d523a875451114dc15c279978 /ip | |
parent | fbcd09cfc15f89c138e0ddb54b0f3340e9b29992 (diff) | |
download | platform_external_iproute2-04cd308001d732a1c8e5d244daba37c56a4641b0.tar.gz platform_external_iproute2-04cd308001d732a1c8e5d244daba37c56a4641b0.tar.bz2 platform_external_iproute2-04cd308001d732a1c8e5d244daba37c56a4641b0.zip |
Update UID routing to upstream implementation.
This is essentially a revert of our out-of-tree changes plus
upstream 82252cdc50 ("ip: support UID range routing.").
Test: netd_integration_test passes on a device with updated kernel
Test: added, deleted, listed, and looked up rules manually on a device with updated kernel
Bug: 16355602
Change-Id: I1767580daf51913886a43dd45bafbee97550091e
Signed-off-by: Lorenzo Colitti <lorenzo@google.com>
Diffstat (limited to 'ip')
-rw-r--r-- | ip/iproute.c | 19 | ||||
-rw-r--r-- | ip/iprule.c | 28 |
2 files changed, 22 insertions, 25 deletions
diff --git a/ip/iproute.c b/ip/iproute.c index 381c3ddc..7f81145e 100644 --- a/ip/iproute.c +++ b/ip/iproute.c @@ -474,9 +474,6 @@ int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) } } - if (tb[RTA_UID]) - fprintf(fp, " uid %u ", rta_getattr_u32(tb[RTA_UID])); - if (tb[RTA_FLOW] && filter.realmmask != ~0U) { __u32 to = rta_getattr_u32(tb[RTA_FLOW]); __u32 from = to>>16; @@ -489,6 +486,10 @@ int print_route(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) fprintf(fp, "%s ", rtnl_rtrealm_n2a(to, b1, sizeof(b1))); } + + if (tb[RTA_UID]) + fprintf(fp, "uid %u ", rta_getattr_u32(tb[RTA_UID])); + if ((r->rtm_flags&RTM_F_CLONED) && r->rtm_family == AF_INET) { __u32 flags = r->rtm_flags&~0xFFFF; int first = 1; @@ -1633,15 +1634,17 @@ static int iproute_get(int argc, char **argv) strcmp(*argv, "dev") == 0) { NEXT_ARG(); odev = *argv; - } else if (matches(*argv, "uid") == 0) { - uid_t uid; - NEXT_ARG(); - get_unsigned(&uid, *argv, 0); - addattr32(&req.n, sizeof(req), RTA_UID, uid); } else if (matches(*argv, "notify") == 0) { req.r.rtm_flags |= RTM_F_NOTIFY; } else if (matches(*argv, "connected") == 0) { connected = 1; + } else if (matches(*argv, "uid") == 0) { + uid_t uid; + + NEXT_ARG(); + if (get_unsigned(&uid, *argv, 0)) + invarg("invalid UID\n", *argv); + addattr32(&req.n, sizeof(req), RTA_UID, uid); } else { inet_prefix addr; if (strcmp(*argv, "to") == 0) { diff --git a/ip/iprule.c b/ip/iprule.c index c363cccf..ac835ab8 100644 --- a/ip/iprule.c +++ b/ip/iprule.c @@ -149,17 +149,10 @@ int print_rule(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) fprintf(fp, "[detached] "); } - if (tb[FRA_UID_START] || tb[FRA_UID_END]) { - fprintf(fp, "uidrange "); - if (tb[FRA_UID_START]) - fprintf(fp, "%u", rta_getattr_u32(tb[FRA_UID_START])); - else - fprintf(fp, "???"); + if (tb[FRA_UID_RANGE]) { + struct fib_rule_uid_range *r = RTA_DATA(tb[FRA_UID_RANGE]); - if (tb[FRA_UID_END]) - fprintf(fp, "-%u ", rta_getattr_u32(tb[FRA_UID_END])); - else - fprintf(fp, "-??? "); + fprintf(fp, "uidrange %u-%u ", r->start, r->end); } table = rtm_get_table(r, tb); @@ -441,19 +434,20 @@ static int iprule_modify(int cmd, int argc, char **argv) } else if (strcmp(*argv, "oif") == 0) { NEXT_ARG(); addattr_l(&req.n, sizeof(req), FRA_OIFNAME, *argv, strlen(*argv)+1); + } else if (strcmp(*argv, "uidrange") == 0) { + struct fib_rule_uid_range r; + + NEXT_ARG(); + if (sscanf(*argv, "%u-%u", &r.start, &r.end) != 2) + invarg("invalid UID range\n", *argv); + addattr_l(&req.n, sizeof(req), FRA_UID_RANGE, &r, + sizeof(r)); } else if (strcmp(*argv, "nat") == 0 || matches(*argv, "map-to") == 0) { NEXT_ARG(); fprintf(stderr, "Warning: route NAT is deprecated\n"); addattr32(&req.n, sizeof(req), RTA_GATEWAY, get_addr32(*argv)); req.r.rtm_type = RTN_NAT; - } else if (strcmp(*argv, "uidrange") == 0) { - __u32 uid_start, uid_end; - NEXT_ARG(); - if (sscanf(*argv, "%u-%u", &uid_start, &uid_end) != 2) - invarg("UID range is invalid\n", *argv); - addattr32(&req.n, sizeof(req), FRA_UID_START, uid_start); - addattr32(&req.n, sizeof(req), FRA_UID_END, uid_end); } else { int type; |