Merge "Update UID routing to upstream implementation." am: b072143d78 am: e3d477a8ad am: e6ccd07bf0
am: 1b32ccb031
Change-Id: Id0ab6bdb6ae2bd0ac3fd3fa569280c1de524bf50
diff --git a/include/linux/fib_rules.h b/include/linux/fib_rules.h
index 6dcde64..bbf02a6 100644
--- a/include/linux/fib_rules.h
+++ b/include/linux/fib_rules.h
@@ -29,6 +29,11 @@
__u32 flags;
};
+struct fib_rule_uid_range {
+ __u32 start;
+ __u32 end;
+};
+
enum {
FRA_UNSPEC,
FRA_DST, /* destination address */
@@ -49,8 +54,9 @@
FRA_TABLE, /* Extended table id */
FRA_FWMASK, /* mask for netfilter mark */
FRA_OIFNAME,
- FRA_UID_START,
- FRA_UID_END,
+ FRA_PAD,
+ FRA_L3MDEV, /* iif or oif is l3mdev goto its table */
+ FRA_UID_RANGE, /* UID range */
__FRA_MAX
};
diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h
index dad2e8e..5fc9337 100644
--- a/include/linux/rtnetlink.h
+++ b/include/linux/rtnetlink.h
@@ -305,14 +305,15 @@
RTA_MP_ALGO, /* no longer used */
RTA_TABLE,
RTA_MARK,
- RTA_MFC_STATS, /* not used - backported from the future */
- RTA_UID,
+ RTA_MFC_STATS,
RTA_VIA,
RTA_NEWDST,
RTA_PREF,
RTA_ENCAP_TYPE,
RTA_ENCAP,
RTA_EXPIRES,
+ RTA_PAD,
+ RTA_UID,
__RTA_MAX
};
diff --git a/ip/iproute.c b/ip/iproute.c
index 381c3dd..7f81145 100644
--- a/ip/iproute.c
+++ b/ip/iproute.c
@@ -474,9 +474,6 @@
}
}
- 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 @@
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 @@
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 c363ccc..ac835ab 100644
--- a/ip/iprule.c
+++ b/ip/iprule.c
@@ -149,17 +149,10 @@
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 @@
} 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;