aboutsummaryrefslogtreecommitdiffstats
path: root/ip
diff options
context:
space:
mode:
authorLorenzo Colitti <lorenzo@google.com>2016-12-17 22:19:40 +0900
committerLorenzo Colitti <lorenzo@google.com>2016-12-19 11:08:26 +0900
commit04cd308001d732a1c8e5d244daba37c56a4641b0 (patch)
tree9f9e399f955bc51d523a875451114dc15c279978 /ip
parentfbcd09cfc15f89c138e0ddb54b0f3340e9b29992 (diff)
downloadplatform_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.c19
-rw-r--r--ip/iprule.c28
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;