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;