--- iproute2-4.2.0/ip/link_ip6tnl.c	2015-09-01 01:31:15.000000000 +0200
+++ src/ip/link_ip6tnl.c	2015-10-01 17:43:42.592411606 +0200
@@ -37,6 +37,7 @@
 	fprintf(f, "          [ dev PHYS_DEV ] [ encaplimit ELIM ]\n");
 	fprintf(f ,"          [ hoplimit HLIM ] [ tclass TCLASS ] [ flowlabel FLOWLABEL ]\n");
 	fprintf(f, "          [ dscp inherit ] [ fwmark inherit ]\n");
+	fprintf(f, "          [ fmr IP6_PREFIX IP4_PREFIX EA_BITS PSID_OFFSET ]\n");
 	fprintf(f, "\n");
 	fprintf(f, "Where: NAME      := STRING\n");
 	fprintf(f, "       ADDR      := IPV6_ADDRESS\n");
@@ -235,6 +236,49 @@
 			if (strcmp(*argv, "inherit") != 0)
 				invarg("not inherit", *argv);
 			flags |= IP6_TNL_F_USE_ORIG_FWMARK;
+
+		} else if (strcmp(*argv, "fmr") == 0) {
+			inet_prefix addr;
+			struct rtattr *fmrs, *fmr;
+			__u8 ip6_plen, ip4_plen;
+			__u8 ea_len, psid_offset;
+			struct in6_addr ip6;
+			struct in_addr ip4;
+
+			NEXT_ARG();
+
+			get_prefix(&addr, *argv, AF_INET6);
+			if (addr.family != AF_INET6)
+				invarg("\"ip6_prefix\" address family is AF_UNSPEC", *argv);
+			memcpy(&ip6, addr.data, addr.bytelen);
+			ip6_plen = addr.bitlen;
+
+			NEXT_ARG();
+			get_prefix(&addr, *argv, AF_INET);
+			if (addr.family != AF_INET)
+				invarg("\"ip4_prefix\" address family is AF_UNSPEC", *argv);
+			memcpy(&ip4, addr.data, addr.bytelen);
+			ip4_plen = addr.bitlen;
+
+			NEXT_ARG();
+			if (get_u8(&ea_len, *argv, 10))
+				invarg("invalid ea_len", *argv);
+
+			NEXT_ARG();
+			if (get_u8(&psid_offset, *argv, 10))
+				invarg("invalid ea_len", *argv);
+
+			fmrs = addattr_nest(n, 1024, IFLA_IPTUN_FMRS);
+			fmr = addattr_nest(n, 1024, 1);
+			addattr_l(n, 1024, IFLA_IPTUN_FMR_IP6_PREFIX, &ip6, sizeof(ip6));
+			addattr_l(n, 1024, IFLA_IPTUN_FMR_IP4_PREFIX, &ip4, sizeof(ip4));
+			addattr8(n, 1024, IFLA_IPTUN_FMR_IP6_PREFIX_LEN, ip6_plen);
+			addattr8(n, 1024, IFLA_IPTUN_FMR_IP4_PREFIX_LEN, ip4_plen);
+			addattr8(n, 1024, IFLA_IPTUN_FMR_EA_LEN, ea_len);
+			addattr8(n, 1024, IFLA_IPTUN_FMR_OFFSET, psid_offset);
+			addattr_nest_end(n, fmr);
+			addattr_nest_end(n, fmrs);
+
 		} else
 			usage();
 		argc--, argv++;
@@ -340,6 +384,48 @@
 
 	if (flags & IP6_TNL_F_USE_ORIG_FWMARK)
 		fprintf(f, "fwmark inherit ");
+
+	if (tb[IFLA_IPTUN_FMRS]) {
+		struct rtattr *ltb[16];
+		size_t i;
+
+		parse_rtattr_nested(ltb, 16, tb[IFLA_IPTUN_FMRS]);
+		for (i = 1; i < 16; i++) {
+			struct rtattr *lltb[IFLA_IPTUN_FMR_MAX + 1];
+
+			if (!ltb[i])
+				break;
+
+			parse_rtattr_nested(lltb, IFLA_IPTUN_FMR_MAX, ltb[i]);
+			if (!lltb[IFLA_IPTUN_FMR_IP6_PREFIX] ||
+			    !lltb[IFLA_IPTUN_FMR_IP4_PREFIX] ||
+			    !lltb[IFLA_IPTUN_FMR_IP4_PREFIX_LEN] ||
+			    !lltb[IFLA_IPTUN_FMR_IP6_PREFIX_LEN] ||
+			    !lltb[IFLA_IPTUN_FMR_EA_LEN] ||
+			    !lltb[IFLA_IPTUN_FMR_OFFSET])
+				continue;
+
+			fprintf(f, "fmr ");
+			fprintf(f, "%s/%u ",
+				rt_addr_n2a(AF_INET6,
+					    RTA_PAYLOAD(lltb[IFLA_IPTUN_FMR_IP6_PREFIX]),
+					    RTA_DATA(lltb[IFLA_IPTUN_FMR_IP6_PREFIX]),
+					    s1, sizeof(s1)),
+				rta_getattr_u8(lltb[IFLA_IPTUN_FMR_IP6_PREFIX_LEN]));
+
+			fprintf(f, "%s/%u ",
+				rt_addr_n2a(AF_INET,
+					    RTA_PAYLOAD(lltb[IFLA_IPTUN_FMR_IP4_PREFIX]),
+					    RTA_DATA(lltb[IFLA_IPTUN_FMR_IP4_PREFIX]),
+					    s1, sizeof(s1)),
+				rta_getattr_u8(lltb[IFLA_IPTUN_FMR_IP4_PREFIX_LEN]));
+
+			fprintf(f, "eabits %u ",
+				rta_getattr_u8(lltb[IFLA_IPTUN_FMR_EA_LEN]));
+			fprintf(f, "psid_offset %u ",
+				rta_getattr_u8(lltb[IFLA_IPTUN_FMR_OFFSET]));
+		}
+	}
 }
 
 static void ip6tunnel_print_help(struct link_util *lu, int argc, char **argv,
