--- libnl-3.2.25/lib/route/link/sit.c	2014-06-16 16:45:51.000000000 +0200
+++ src/lib/route/link/sit.c	2015-07-17 16:37:29.450025551 +0200
@@ -39,29 +39,38 @@
 #define SIT_ATTR_PMTUDISC      (1 << 5)
 #define SIT_ATTR_FLAGS         (1 << 6)
 #define SIT_ATTR_PROTO         (1 << 7)
+#define SIT_ATTR_6RD           (1 << 8)
 
 struct sit_info
 {
-	uint8_t    ttl;
-	uint8_t    tos;
-	uint8_t    pmtudisc;
-	uint8_t    proto;
-	uint16_t   flags;
-	uint32_t   link;
-	uint32_t   local;
-	uint32_t   remote;
-	uint32_t   sit_mask;
+	uint8_t                 ttl;
+	uint8_t                 tos;
+	uint8_t                 pmtudisc;
+	uint8_t                 proto;
+	uint16_t                flags;
+	uint32_t                link;
+	uint32_t                local;
+	uint32_t                remote;
+	uint32_t                sit_mask;
+	struct in6_addr         ip6rd_prefix;
+	uint16_t                ip6rd_prefix_len;
+	uint32_t                ip6rd_relay_prefix;
+	uint16_t                ip6rd_relay_prefix_len;
 };
 
 static struct nla_policy sit_policy[IFLA_IPTUN_MAX + 1] = {
-	[IFLA_IPTUN_LINK]       = { .type = NLA_U32 },
-	[IFLA_IPTUN_LOCAL]      = { .type = NLA_U32 },
-	[IFLA_IPTUN_REMOTE]     = { .type = NLA_U32 },
-	[IFLA_IPTUN_TTL]        = { .type = NLA_U8 },
-	[IFLA_IPTUN_TOS]        = { .type = NLA_U8 },
-	[IFLA_IPTUN_PMTUDISC]   = { .type = NLA_U8 },
-	[IFLA_IPTUN_FLAGS]      = { .type = NLA_U16 },
-	[IFLA_IPTUN_PROTO]      = { .type = NLA_U8 },
+	[IFLA_IPTUN_LINK]               = { .type = NLA_U32 },
+	[IFLA_IPTUN_LOCAL]              = { .type = NLA_U32 },
+	[IFLA_IPTUN_REMOTE]             = { .type = NLA_U32 },
+	[IFLA_IPTUN_TTL]                = { .type = NLA_U8 },
+	[IFLA_IPTUN_TOS]                = { .type = NLA_U8 },
+	[IFLA_IPTUN_PMTUDISC]           = { .type = NLA_U8 },
+	[IFLA_IPTUN_FLAGS]              = { .type = NLA_U16 },
+	[IFLA_IPTUN_PROTO]              = { .type = NLA_U8 },
+	[IFLA_IPTUN_6RD_PREFIX]         = { .minlen = sizeof(struct in6_addr) },
+	[IFLA_IPTUN_6RD_PREFIXLEN]      = { .type = NLA_U16 },
+	[IFLA_IPTUN_6RD_RELAY_PREFIX]    = { .type = NLA_U32 },
+	[IFLA_IPTUN_6RD_RELAY_PREFIXLEN] = { .type = NLA_U16 },
 };
 
 static int sit_alloc(struct rtnl_link *link)
@@ -136,6 +145,14 @@
 		sit->sit_mask |= SIT_ATTR_PROTO;
 	}
 
+	if (tb[IFLA_IPTUN_6RD_PREFIXLEN]) {
+		nla_memcpy(&sit->ip6rd_prefix, tb[IFLA_IPTUN_6RD_PREFIX], sizeof(struct in6_addr));
+		sit->ip6rd_prefix_len = nla_get_u16(tb[IFLA_IPTUN_6RD_PREFIXLEN]);
+		sit->ip6rd_relay_prefix = nla_get_u32(tb[IFLA_IPTUN_6RD_RELAY_PREFIX]);
+		sit->ip6rd_relay_prefix_len = nla_get_u16(tb[IFLA_IPTUN_6RD_RELAY_PREFIXLEN]);
+		sit->sit_mask |= SIT_ATTR_6RD;
+	}
+
 	err = 0;
 
  errout:
@@ -175,6 +192,17 @@
 	if (sit->sit_mask & SIT_ATTR_PROTO)
 		NLA_PUT_U8(msg, IFLA_IPTUN_PROTO, sit->proto);
 
+	if (sit->sit_mask & SIT_ATTR_6RD) {
+		NLA_PUT(msg, IFLA_IPTUN_6RD_PREFIX,
+			sizeof(struct in6_addr), &sit->ip6rd_prefix);
+		NLA_PUT_U16(msg, IFLA_IPTUN_6RD_PREFIXLEN,
+			    sit->ip6rd_prefix_len);
+		NLA_PUT_U32(msg, IFLA_IPTUN_6RD_RELAY_PREFIX,
+			    sit->ip6rd_relay_prefix);
+		NLA_PUT_U16(msg, IFLA_IPTUN_6RD_RELAY_PREFIXLEN,
+			    sit->ip6rd_relay_prefix_len);
+	}
+
 	nla_nest_end(msg, data);
 
 nla_put_failure:
@@ -198,7 +226,7 @@
 static void sit_dump_details(struct rtnl_link *link, struct nl_dump_params *p)
 {
 	struct sit_info *sit = link->l_info;
-	char *name, addr[INET_ADDRSTRLEN];
+	char *name, addr[INET6_ADDRSTRLEN];
 
 	if (sit->sit_mask & SIT_ATTR_LINK) {
 		nl_dump(p, "      link ");
@@ -244,6 +272,27 @@
 		nl_dump(p, "    proto   ");
 		nl_dump_line(p, " (%x)\n", sit->proto);
 	}
+
+	if (sit->sit_mask & SIT_ATTR_6RD) {
+		nl_dump(p, "    6rd-prefix ");
+
+		if(inet_ntop(AF_INET6, &sit->ip6rd_prefix, addr, sizeof(addr)))
+			snprintf(addr, sizeof (addr), "%#x",
+				 &sit->ip6rd_prefix);
+
+		nl_dump_line(p, " %s/%u\n", addr, sit->ip6rd_prefix_len);
+
+		if (sit->ip6rd_relay_prefix) {
+			nl_dump(p, "    6rd-relay-prefix ");
+
+			if(inet_ntop(AF_INET, &sit->ip6rd_relay_prefix,
+				     addr, sizeof(addr)))
+				snprintf(addr, sizeof (addr), "%#x",
+					 &sit->ip6rd_relay_prefix);
+			nl_dump_line(p, " %s/%u\n",
+				     addr, sit->ip6rd_relay_prefix_len);
+		}
+	}
 }
 
 static int sit_clone(struct rtnl_link *dst, struct rtnl_link *src)
@@ -613,6 +662,60 @@
 	return sit->proto;
 }
 
+/**
+ * set SIT 6rd parameters
+ * @arg link               Link object
+ * @arg prefix             6rd prefix
+ * @arg prefix_len         6rd prefix len
+ * @arg relay_prefix       6rd relay prefix (0 if ununused)
+ * @arg relay_prefix_len   6rd relay prefix len
+ *
+ * @return 0 on success or a negative error code
+ */
+int rtnl_link_sit_set_6rd(struct rtnl_link *link,
+			  const struct in6_addr *prefix,
+			  uint16_t prefix_len,
+			  uint32_t relay_prefix,
+			  uint16_t relay_prefix_len)
+{
+	struct sit_info *sit = link->l_info;
+
+	IS_SIT_LINK_ASSERT(link);
+
+	memcpy(&sit->ip6rd_prefix, prefix, sizeof (sit->ip6rd_prefix));
+	sit->ip6rd_prefix_len = prefix_len;
+	sit->ip6rd_relay_prefix_len = relay_prefix;
+	sit->ip6rd_relay_prefix_len = relay_prefix_len;
+
+	sit->sit_mask |= SIT_ATTR_6RD;
+
+	return 0;
+}
+
+/**
+ * Get SIT proto
+ * @arg link            Link object
+ * @arg prefix             returned 6rd prefix
+ * @arg prefix_len         returned 6rd prefix len
+ * @arg relay_prefix       returned 6rd relay prefix (0 if ununused)
+ * @arg relay_prefix_len   returned 6rd relay prefix len
+ */
+void rtnl_link_sit_get_6rd(struct rtnl_link *link,
+			   struct in6_addr *prefix,
+			   uint16_t *prefix_len,
+			   uint32_t *relay_prefix,
+			   uint16_t *relay_prefix_len)
+{
+	struct sit_info *sit = link->l_info;
+
+	IS_SIT_LINK_ASSERT(link);
+
+	memcpy(prefix, &sit->ip6rd_prefix, sizeof (*prefix));
+	prefix_len = sit->ip6rd_prefix_len;
+	relay_prefix = sit->ip6rd_relay_prefix_len;
+	relay_prefix_len = sit->ip6rd_relay_prefix_len;
+}
+
 static void __init sit_init(void)
 {
 	rtnl_link_register_info(&sit_info_ops);
--- libnl-3.2.25/include/netlink/route/link/sit.h	2014-06-16 16:45:51.000000000 +0200
+++ src/include/netlink/route/link/sit.h	2015-07-17 16:33:51.996361096 +0200
@@ -42,7 +42,16 @@
 
 	extern int rtnl_link_sit_set_flags(struct rtnl_link *link, uint16_t flags);
 	extern uint16_t rtnl_link_sit_get_flags(struct rtnl_link *link);
-
+	extern int rtnl_link_sit_set_6rd(struct rtnl_link *link,
+					 const struct in6_addr *prefix,
+					 uint16_t prefix_len,
+					 uint32_t relay_prefix,
+					 uint16_t relay_prefix_len);
+	extern void rtnl_link_sit_get_6rd(struct rtnl_link *link,
+					  struct in6_addr *prefix,
+					  uint16_t *prefix_len,
+					  uint32_t *relay_prefix,
+					  uint16_t *relay_prefix_len);
 	int rtnl_link_sit_set_proto(struct rtnl_link *link, uint8_t proto);
 	uint8_t rtnl_link_get_proto(struct rtnl_link *link);
 
