[libnl3/f21] Add support for IPv6 link local address generation

thaller thaller at fedoraproject.org
Tue Dec 9 17:48:52 UTC 2014


commit 4aa273fe19e154209fa6cc6aadbca88fc1285dea
Author: Thomas Haller <thaller at redhat.com>
Date:   Tue Dec 9 18:33:58 2014 +0100

    Add support for IPv6 link local address generation

 0002-i6-addr-gen-mode.patch |  586 +++++++++++++++++++++++++++++++++++++++++++
 libnl3.spec                 |    7 +-
 2 files changed, 592 insertions(+), 1 deletions(-)
---
diff --git a/0002-i6-addr-gen-mode.patch b/0002-i6-addr-gen-mode.patch
new file mode 100644
index 0000000..67e5fb7
--- /dev/null
+++ b/0002-i6-addr-gen-mode.patch
@@ -0,0 +1,586 @@
+From 5d3e671169b7588ca0718ca372f9ddf3296269f5 Mon Sep 17 00:00:00 2001
+From: Dan Williams <dcbw at redhat.com>
+Date: Fri, 25 Jul 2014 14:27:09 -0500
+Subject: [PATCH 1/4] veth: add kernel header linux/veth.h for VETH defines
+
+Similar to what's done with <linux/if_link.h>, make sure used defines
+actually exist.  Otherwise building on even slightly older kernels
+fails.
+
+Taken from upstream kernel commit 1860e379875dfe7271c649058aeddffe5afd9d0d
+(tag: v3.15), file 'include/uapi/linux/veth.h'.
+
+Signed-off-by: Dan Williams <dcbw at redhat.com>
+Signed-off-by: Thomas Haller <thaller at redhat.com>
+(cherry picked from commit 9dc6e6da90016a33929f262bea0187396e1a061b)
+---
+ include/linux/if_link.h |  8 --------
+ include/linux/veth.h    | 12 ++++++++++++
+ lib/route/link/veth.c   |  1 +
+ 3 files changed, 13 insertions(+), 8 deletions(-)
+ create mode 100644 include/linux/veth.h
+
+diff --git a/include/linux/if_link.h b/include/linux/if_link.h
+index bbe6991..86a7945 100644
+--- a/include/linux/if_link.h
++++ b/include/linux/if_link.h
+@@ -314,14 +314,6 @@ struct ifla_vxlan_port_range {
+ 	__be16	high;
+ };
+ 
+-enum {
+-	VETH_INFO_UNSPEC,
+-	VETH_INFO_PEER,
+-
+-	__VETH_INFO_MAX
+-#define VETH_INFO_MAX   (__VETH_INFO_MAX - 1)
+-};
+-
+ /* SR-IOV virtual function management section */
+ 
+ enum {
+diff --git a/include/linux/veth.h b/include/linux/veth.h
+new file mode 100644
+index 0000000..3354c1e
+--- /dev/null
++++ b/include/linux/veth.h
+@@ -0,0 +1,12 @@
++#ifndef __NET_VETH_H_
++#define __NET_VETH_H_
++
++enum {
++	VETH_INFO_UNSPEC,
++	VETH_INFO_PEER,
++
++	__VETH_INFO_MAX
++#define VETH_INFO_MAX	(__VETH_INFO_MAX - 1)
++};
++
++#endif
+diff --git a/lib/route/link/veth.c b/lib/route/link/veth.c
+index e7e4a26..1c5b125 100644
+--- a/lib/route/link/veth.c
++++ b/lib/route/link/veth.c
+@@ -32,6 +32,7 @@
+ #include <netlink/route/link/veth.h>
+ 
+ #include <linux/if_link.h>
++#include <linux/veth.h>
+ 
+ static struct nla_policy veth_policy[VETH_INFO_MAX+1] = {
+ 	[VETH_INFO_PEER]	= { .minlen = sizeof(struct ifinfomsg) },
+-- 
+1.9.3
+
+
+From 8dbc6df4f386fca7b09ce894f19a0c2be4a64962 Mon Sep 17 00:00:00 2001
+From: Thomas Haller <thaller at redhat.com>
+Date: Tue, 9 Dec 2014 17:47:51 +0100
+Subject: [PATCH 2/4] build: mark header linux-private/linux/veth.h as
+ noinst_HEADERS
+
+Fixes: 9dc6e6da90016a33929f262bea0187396e1a061b
+(cherry picked from commit b56f88c9b3c22466fabeb1d751666bc4f79d347c)
+
+Conflicts:
+	include/Makefile.am
+---
+ include/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/include/Makefile.am b/include/Makefile.am
+index 40ed84f..41f700f 100644
+--- a/include/Makefile.am
++++ b/include/Makefile.am
+@@ -142,6 +142,7 @@ noinst_HEADERS = \
+ 	linux/pkt_sched.h \
+ 	linux/rtnetlink.h \
+ 	linux/snmp.h \
++	linux/veth.h \
+ 	linux/tc_ematch/tc_em_meta.h \
+ 	netlink-private/genl.h \
+ 	netlink-private/netlink.h \
+-- 
+1.9.3
+
+
+From 609715e276167aaaaa64e0aa6c845f8bcf5eaa4f Mon Sep 17 00:00:00 2001
+From: Dan Williams <dcbw at redhat.com>
+Date: Fri, 25 Jul 2014 14:33:38 -0500
+Subject: [PATCH 3/4] link: update copy of kernel header
+ include/linux/if_link.h
+
+The next patch will use some of these defines, so update.
+
+Taken from upstream kernel commit bc91b0f07ada5535427373a4e2050877bcc12218,
+file 'include/uapi/linux/if_link.h'.
+
+Signed-off-by: Dan Williams <dcbw at redhat.com>
+Signed-off-by: Thomas Haller <thaller at redhat.com>
+(cherry picked from commit b51815a9dbd8e45fd2558bbe337fb360ca2fd861)
+
+Conflicts:
+	include/linux/if_link.h
+---
+ include/linux/if_link.h | 121 ++++++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 118 insertions(+), 3 deletions(-)
+
+diff --git a/include/linux/if_link.h b/include/linux/if_link.h
+index 86a7945..ff95760 100644
+--- a/include/linux/if_link.h
++++ b/include/linux/if_link.h
+@@ -144,12 +144,19 @@ enum {
+ 	IFLA_NUM_RX_QUEUES,
+ 	IFLA_CARRIER,
+ 	IFLA_PHYS_PORT_ID,
++	IFLA_CARRIER_CHANGES,
+ 	__IFLA_MAX
+ };
+ 
+ 
+ #define IFLA_MAX (__IFLA_MAX - 1)
+ 
++/* backwards compatibility for userspace */
++#ifndef __KERNEL__
++#define IFLA_RTA(r)  ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg))))
++#define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg))
++#endif
++
+ enum {
+ 	IFLA_INET_UNSPEC,
+ 	IFLA_INET_CONF,
+@@ -197,11 +204,17 @@ enum {
+ 	IFLA_INET6_CACHEINFO,	/* time values and max reasm size */
+ 	IFLA_INET6_ICMP6STATS,	/* statistics (icmpv6)		*/
+ 	IFLA_INET6_TOKEN,	/* device token			*/
++	IFLA_INET6_ADDR_GEN_MODE, /* implicit address generator mode */
+ 	__IFLA_INET6_MAX
+ };
+ 
+ #define IFLA_INET6_MAX	(__IFLA_INET6_MAX - 1)
+ 
++enum in6_addr_gen_mode {
++	IN6_ADDR_GEN_MODE_EUI64,
++	IN6_ADDR_GEN_MODE_NONE,
++};
++
+ enum {
+ 	BRIDGE_MODE_UNSPEC,
+ 	BRIDGE_MODE_HAIRPIN,
+@@ -216,6 +229,8 @@ enum {
+ 	IFLA_BRPORT_GUARD,	/* bpdu guard              */
+ 	IFLA_BRPORT_PROTECT,	/* root port protection    */
+ 	IFLA_BRPORT_FAST_LEAVE,	/* multicast fast leave    */
++	IFLA_BRPORT_LEARNING,	/* mac learning */
++	IFLA_BRPORT_UNICAST_FLOOD, /* flood unicast traffic */
+ 	__IFLA_BRPORT_MAX
+ };
+ #define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1)
+@@ -232,6 +247,8 @@ enum {
+ 	IFLA_INFO_KIND,
+ 	IFLA_INFO_DATA,
+ 	IFLA_INFO_XSTATS,
++	IFLA_INFO_SLAVE_KIND,
++	IFLA_INFO_SLAVE_DATA,
+ 	__IFLA_INFO_MAX,
+ };
+ 
+@@ -292,7 +309,7 @@ enum macvlan_mode {
+ enum {
+ 	IFLA_VXLAN_UNSPEC,
+ 	IFLA_VXLAN_ID,
+-	IFLA_VXLAN_GROUP,
++	IFLA_VXLAN_GROUP,	/* group or remote address */
+ 	IFLA_VXLAN_LINK,
+ 	IFLA_VXLAN_LOCAL,
+ 	IFLA_VXLAN_TTL,
+@@ -300,11 +317,17 @@ enum {
+ 	IFLA_VXLAN_LEARNING,
+ 	IFLA_VXLAN_AGEING,
+ 	IFLA_VXLAN_LIMIT,
+-	IFLA_VXLAN_PORT_RANGE,
++	IFLA_VXLAN_PORT_RANGE,	/* source port */
+ 	IFLA_VXLAN_PROXY,
+ 	IFLA_VXLAN_RSC,
+ 	IFLA_VXLAN_L2MISS,
+ 	IFLA_VXLAN_L3MISS,
++	IFLA_VXLAN_PORT,	/* destination port */
++	IFLA_VXLAN_GROUP6,
++	IFLA_VXLAN_LOCAL6,
++	IFLA_VXLAN_UDP_CSUM,
++	IFLA_VXLAN_UDP_ZERO_CSUM6_TX,
++	IFLA_VXLAN_UDP_ZERO_CSUM6_RX,
+ 	__IFLA_VXLAN_MAX
+ };
+ #define IFLA_VXLAN_MAX	(__IFLA_VXLAN_MAX - 1)
+@@ -314,6 +337,63 @@ struct ifla_vxlan_port_range {
+ 	__be16	high;
+ };
+ 
++/* Bonding section */
++
++enum {
++	IFLA_BOND_UNSPEC,
++	IFLA_BOND_MODE,
++	IFLA_BOND_ACTIVE_SLAVE,
++	IFLA_BOND_MIIMON,
++	IFLA_BOND_UPDELAY,
++	IFLA_BOND_DOWNDELAY,
++	IFLA_BOND_USE_CARRIER,
++	IFLA_BOND_ARP_INTERVAL,
++	IFLA_BOND_ARP_IP_TARGET,
++	IFLA_BOND_ARP_VALIDATE,
++	IFLA_BOND_ARP_ALL_TARGETS,
++	IFLA_BOND_PRIMARY,
++	IFLA_BOND_PRIMARY_RESELECT,
++	IFLA_BOND_FAIL_OVER_MAC,
++	IFLA_BOND_XMIT_HASH_POLICY,
++	IFLA_BOND_RESEND_IGMP,
++	IFLA_BOND_NUM_PEER_NOTIF,
++	IFLA_BOND_ALL_SLAVES_ACTIVE,
++	IFLA_BOND_MIN_LINKS,
++	IFLA_BOND_LP_INTERVAL,
++	IFLA_BOND_PACKETS_PER_SLAVE,
++	IFLA_BOND_AD_LACP_RATE,
++	IFLA_BOND_AD_SELECT,
++	IFLA_BOND_AD_INFO,
++	__IFLA_BOND_MAX,
++};
++
++#define IFLA_BOND_MAX	(__IFLA_BOND_MAX - 1)
++
++enum {
++	IFLA_BOND_AD_INFO_UNSPEC,
++	IFLA_BOND_AD_INFO_AGGREGATOR,
++	IFLA_BOND_AD_INFO_NUM_PORTS,
++	IFLA_BOND_AD_INFO_ACTOR_KEY,
++	IFLA_BOND_AD_INFO_PARTNER_KEY,
++	IFLA_BOND_AD_INFO_PARTNER_MAC,
++	__IFLA_BOND_AD_INFO_MAX,
++};
++
++#define IFLA_BOND_AD_INFO_MAX	(__IFLA_BOND_AD_INFO_MAX - 1)
++
++enum {
++	IFLA_BOND_SLAVE_UNSPEC,
++	IFLA_BOND_SLAVE_STATE,
++	IFLA_BOND_SLAVE_MII_STATUS,
++	IFLA_BOND_SLAVE_LINK_FAILURE_COUNT,
++	IFLA_BOND_SLAVE_PERM_HWADDR,
++	IFLA_BOND_SLAVE_QUEUE_ID,
++	IFLA_BOND_SLAVE_AD_AGGREGATOR_ID,
++	__IFLA_BOND_SLAVE_MAX,
++};
++
++#define IFLA_BOND_SLAVE_MAX	(__IFLA_BOND_SLAVE_MAX - 1)
++
+ /* SR-IOV virtual function management section */
+ 
+ enum {
+@@ -328,8 +408,10 @@ enum {
+ 	IFLA_VF_UNSPEC,
+ 	IFLA_VF_MAC,		/* Hardware queue specific attributes */
+ 	IFLA_VF_VLAN,
+-	IFLA_VF_TX_RATE,	/* TX Bandwidth Allocation */
++	IFLA_VF_TX_RATE,	/* Max TX Bandwidth Allocation */
+ 	IFLA_VF_SPOOFCHK,	/* Spoof Checking on/off switch */
++	IFLA_VF_LINK_STATE,	/* link state enable/disable/auto switch */
++	IFLA_VF_RATE,		/* Min and Max TX Bandwidth Allocation */
+ 	__IFLA_VF_MAX,
+ };
+ 
+@@ -351,11 +433,29 @@ struct ifla_vf_tx_rate {
+ 	__u32 rate; /* Max TX bandwidth in Mbps, 0 disables throttling */
+ };
+ 
++struct ifla_vf_rate {
++	__u32 vf;
++	__u32 min_tx_rate; /* Min Bandwidth in Mbps */
++	__u32 max_tx_rate; /* Max Bandwidth in Mbps */
++};
++
+ struct ifla_vf_spoofchk {
+ 	__u32 vf;
+ 	__u32 setting;
+ };
+ 
++enum {
++	IFLA_VF_LINK_STATE_AUTO,	/* link state of the uplink */
++	IFLA_VF_LINK_STATE_ENABLE,	/* link always up */
++	IFLA_VF_LINK_STATE_DISABLE,	/* link always down */
++	__IFLA_VF_LINK_STATE_MAX,
++};
++
++struct ifla_vf_link_state {
++	__u32 vf;
++	__u32 link_state;
++};
++
+ /* VF ports management section
+  *
+  *	Nested layout of set/get msg is:
+@@ -446,4 +546,19 @@ enum {
+ 
+ #define IFLA_IPOIB_MAX (__IFLA_IPOIB_MAX - 1)
+ 
++
++/* HSR section */
++
++enum {
++	IFLA_HSR_UNSPEC,
++	IFLA_HSR_SLAVE1,
++	IFLA_HSR_SLAVE2,
++	IFLA_HSR_MULTICAST_SPEC,	/* Last byte of supervision addr */
++	IFLA_HSR_SUPERVISION_ADDR,	/* Supervision frame multicast addr */
++	IFLA_HSR_SEQ_NR,
++	__IFLA_HSR_MAX,
++};
++
++#define IFLA_HSR_MAX (__IFLA_HSR_MAX - 1)
++
+ #endif /* _UAPI_LINUX_IF_LINK_H */
+-- 
+1.9.3
+
+
+From 1f2ba593c91d9c58652c4eb6e31694267b896261 Mon Sep 17 00:00:00 2001
+From: Dan Williams <dcbw at redhat.com>
+Date: Fri, 25 Jul 2014 14:36:29 -0500
+Subject: [PATCH 4/4] link/inet6: add link IPv6 address generation mode support
+
+Signed-off-by: Dan Williams <dcbw at redhat.com>
+Signed-off-by: Thomas Haller <thaller at redhat.com>
+(cherry picked from commit 558f966782539f6d975da705fd73cea561c9dc83)
+
+Conflicts:
+	include/netlink/route/link/inet6.h
+	lib/route/link/inet6.c
+---
+ include/netlink/route/link/inet6.h |  12 ++++
+ lib/route/link/inet6.c             | 115 +++++++++++++++++++++++++++++++++----
+ 2 files changed, 117 insertions(+), 10 deletions(-)
+
+diff --git a/include/netlink/route/link/inet6.h b/include/netlink/route/link/inet6.h
+index 71886d7..7e81967 100644
+--- a/include/netlink/route/link/inet6.h
++++ b/include/netlink/route/link/inet6.h
+@@ -18,12 +18,24 @@
+ extern "C" {
+ #endif
+ 
++const char *		rtnl_link_inet6_addrgenmode2str  (uint8_t mode,
++							  char *buf,
++							  size_t len);
++
++uint8_t			rtnl_link_inet6_str2addrgenmode  (const char *mode);
++
+ extern int		rtnl_link_inet6_get_token(struct rtnl_link *,
+ 						  struct nl_addr **);
+ 
+ extern int		rtnl_link_inet6_set_token(struct rtnl_link *,
+ 						  struct nl_addr *);
+ 
++extern int		rtnl_link_inet6_get_addr_gen_mode(struct rtnl_link *,
++							  uint8_t *);
++
++extern int		rtnl_link_inet6_set_addr_gen_mode(struct rtnl_link *,
++							  uint8_t);
++
+ #ifdef __cplusplus
+ }
+ #endif
+diff --git a/lib/route/link/inet6.c b/lib/route/link/inet6.c
+index eb4fa3f..e3cf73a 100644
+--- a/lib/route/link/inet6.c
++++ b/lib/route/link/inet6.c
+@@ -15,17 +15,26 @@
+ #include <netlink/route/rtnl.h>
+ #include <netlink-private/route/link/api.h>
+ 
++#define I6_ADDR_GEN_MODE_UNKNOWN	UINT8_MAX
++
+ struct inet6_data
+ {
+ 	uint32_t		i6_flags;
+ 	struct ifla_cacheinfo	i6_cacheinfo;
+ 	uint32_t		i6_conf[DEVCONF_MAX];
+ 	struct in6_addr		i6_token;
++	uint8_t			i6_addr_gen_mode;
+ };
+ 
+ static void *inet6_alloc(struct rtnl_link *link)
+ {
+-	return calloc(1, sizeof(struct inet6_data));
++	struct inet6_data *i6;
++
++	i6 = calloc(1, sizeof(struct inet6_data));
++	if (i6)
++		i6->i6_addr_gen_mode = I6_ADDR_GEN_MODE_UNKNOWN;
++
++	return i6;
+ }
+ 
+ static void *inet6_clone(struct rtnl_link *link, void *data)
+@@ -44,12 +53,13 @@ static void inet6_free(struct rtnl_link *link, void *data)
+ }
+ 
+ static struct nla_policy inet6_policy[IFLA_INET6_MAX+1] = {
+-	[IFLA_INET6_FLAGS]	= { .type = NLA_U32 },
+-	[IFLA_INET6_CACHEINFO]	= { .minlen = sizeof(struct ifla_cacheinfo) },
+-	[IFLA_INET6_CONF]	= { .minlen = 4 },
+-	[IFLA_INET6_STATS]	= { .minlen = 8 },
+-	[IFLA_INET6_ICMP6STATS]	= { .minlen = 8 },
+-	[IFLA_INET6_TOKEN]	= { .minlen = sizeof(struct in6_addr) },
++	[IFLA_INET6_FLAGS]		= { .type = NLA_U32 },
++	[IFLA_INET6_CACHEINFO]		= { .minlen = sizeof(struct ifla_cacheinfo) },
++	[IFLA_INET6_CONF]		= { .minlen = 4 },
++	[IFLA_INET6_STATS]		= { .minlen = 8 },
++	[IFLA_INET6_ICMP6STATS]		= { .minlen = 8 },
++	[IFLA_INET6_TOKEN]		= { .minlen = sizeof(struct in6_addr) },
++	[IFLA_INET6_ADDR_GEN_MODE]	= { .type = NLA_U8 },
+ };
+ 
+ static const uint8_t map_stat_id_from_IPSTATS_MIB_v1[__IPSTATS_MIB_MAX] = {
+@@ -160,8 +170,11 @@ static int inet6_parse_protinfo(struct rtnl_link *link, struct nlattr *attr,
+ 
+ 	if (tb[IFLA_INET6_TOKEN])
+ 		nla_memcpy(&i6->i6_token, tb[IFLA_INET6_TOKEN],
+-			   sizeof(struct in6_addr));
+- 
++		           sizeof(struct in6_addr));
++
++	if (tb[IFLA_INET6_ADDR_GEN_MODE])
++		i6->i6_addr_gen_mode = nla_get_u8 (tb[IFLA_INET6_ADDR_GEN_MODE]);
++
+ 	/*
+ 	 * Due to 32bit data alignment, these addresses must be copied to an
+ 	 * aligned location prior to access.
+@@ -206,6 +219,19 @@ static int inet6_parse_protinfo(struct rtnl_link *link, struct nlattr *attr,
+ 	return 0;
+ }
+ 
++static int inet6_fill_af(struct rtnl_link *link, struct nl_msg *msg, void *data)
++{
++	struct inet6_data *id = data;
++
++	if (id->i6_addr_gen_mode != I6_ADDR_GEN_MODE_UNKNOWN)
++		NLA_PUT_U8(msg, IFLA_INET6_ADDR_GEN_MODE, id->i6_addr_gen_mode);
++
++	return 0;
++
++nla_put_failure:
++	return -NLE_MSGSIZE;
++}
++
+ /* These live in include/net/if_inet6.h and should be moved to include/linux */
+ #define IF_RA_OTHERCONF	0x80
+ #define IF_RA_MANAGED	0x40
+@@ -265,6 +291,22 @@ static char *inet6_devconf2str(int type, char *buf, size_t len)
+ 			  ARRAY_SIZE(inet6_devconf));
+ }
+ 
++static const struct trans_tbl inet6_addr_gen_mode[] = {
++	__ADD(IN6_ADDR_GEN_MODE_EUI64, eui64)
++	__ADD(IN6_ADDR_GEN_MODE_NONE, none)
++};
++
++const char *rtnl_link_inet6_addrgenmode2str(uint8_t mode, char *buf, size_t len)
++{
++	return __type2str(mode, buf, len, inet6_addr_gen_mode,
++			  ARRAY_SIZE(inet6_addr_gen_mode));
++}
++
++uint8_t rtnl_link_inet6_str2addrgenmode(const char *mode)
++{
++	return (uint8_t) __str2type(mode, inet6_addr_gen_mode,
++			            ARRAY_SIZE(inet6_addr_gen_mode));
++}
+ 
+ static void inet6_dump_details(struct rtnl_link *link,
+ 				struct nl_dump_params *p, void *data)
+@@ -293,6 +335,10 @@ static void inet6_dump_details(struct rtnl_link *link,
+ 		nl_addr2str(addr, buf, sizeof(buf)));
+ 	nl_addr_put(addr);
+ 
++	nl_dump(p, " link-local address mode %s\n",
++		rtnl_link_inet6_addrgenmode2str(i6->i6_addr_gen_mode,
++						buf, sizeof(buf)));
++
+ 	nl_dump_line(p, "      devconf:\n");
+ 	nl_dump_line(p, "      ");
+ 
+@@ -480,6 +526,7 @@ static struct rtnl_link_af_ops inet6_ops = {
+ 	.ao_free			= &inet6_free,
+ 	.ao_parse_protinfo		= &inet6_parse_protinfo,
+ 	.ao_parse_af			= &inet6_parse_protinfo,
++	.ao_fill_af			= &inet6_fill_af,
+ 	.ao_dump[NL_DUMP_DETAILS]	= &inet6_dump_details,
+ 	.ao_dump[NL_DUMP_STATS]		= &inet6_dump_stats,
+ 	.ao_protinfo_policy		= &protinfo_policy,
+@@ -493,7 +540,7 @@ static struct rtnl_link_af_ops inet6_ops = {
+  * Returns the link's IPv6 tokenized interface identifier.
+  *
+  * @return 0 on success
+- * @return -NLE_NOMEM	failure to allocate struct nl_addr result
++ * @return -NLE_NOMEM  failure to allocate struct nl_addr result
+  * @return -NLE_NOATTR configuration setting not available
+  * @return -NLE_NOADDR tokenized interface identifier is not set
+  */
+@@ -543,6 +590,54 @@ int rtnl_link_inet6_set_token(struct rtnl_link *link, struct nl_addr *addr)
+ 	return 0;
+ }
+ 
++/**
++ * Get IPv6 link-local address generation mode
++ * @arg link		Link object
++ * @arg mode		Generation mode on success
++ *
++ * Returns the link's IPv6 link-local address generation mode.
++ *
++ * @return 0 on success
++ * @return -NLE_NOATTR configuration setting not available
++ * @return -NLE_INVAL generation mode unknown. If the link was received via
++ *                    netlink, it means that address generation mode is not
++ *                    supported by the kernel.
++ */
++int rtnl_link_inet6_get_addr_gen_mode(struct rtnl_link *link, uint8_t *mode)
++{
++	struct inet6_data *id;
++
++	if (!(id = rtnl_link_af_data(link, &inet6_ops)))
++		return -NLE_NOATTR;
++
++	if (id->i6_addr_gen_mode == I6_ADDR_GEN_MODE_UNKNOWN)
++		return -NLE_INVAL;
++
++	*mode = id->i6_addr_gen_mode;
++	return 0;
++}
++
++/**
++ * Set IPv6 link-local address generation mode
++ * @arg link		Link object
++ * @arg mode		Generation mode
++ *
++ * Sets the link's IPv6 link-local address generation mode.
++ *
++ * @return 0 on success
++ * @return -NLE_NOMEM could not allocate inet6 data
++ */
++int rtnl_link_inet6_set_addr_gen_mode(struct rtnl_link *link, uint8_t mode)
++{
++	struct inet6_data *id;
++
++	if (!(id = rtnl_link_af_alloc(link, &inet6_ops)))
++		return -NLE_NOMEM;
++
++	id->i6_addr_gen_mode = mode;
++	return 0;
++}
++
+ static void __init inet6_init(void)
+ {
+ 	rtnl_link_af_register(&inet6_ops);
+-- 
+1.9.3
+
diff --git a/libnl3.spec b/libnl3.spec
index bafc6f8..9a9148e 100644
--- a/libnl3.spec
+++ b/libnl3.spec
@@ -1,6 +1,6 @@
 Name: libnl3
 Version: 3.2.25
-Release: 4%{?dist}
+Release: 5%{?dist}
 Summary: Convenience library for kernel netlink sockets
 Group: Development/Libraries
 License: LGPLv2
@@ -11,6 +11,7 @@ URL: http://www.infradead.org/~tgr/libnl/
 Source: http://www.infradead.org/~tgr/libnl/files/libnl-%{fullversion}.tar.gz
 Source1: http://www.infradead.org/~tgr/libnl/files/libnl-doc-%{fullversion}.tar.gz
 Patch1: 0001-link-inet6-add-support-for-tokenized-interface-ident.patch
+Patch2: 0002-i6-addr-gen-mode.patch
 
 BuildRequires: flex bison
 BuildRequires: python
@@ -51,6 +52,7 @@ This package contains libnl3 API documentation
 %prep
 %setup -q -n libnl-%{fullversion}
 %patch1 -p1 -b .0001-link-inet6-add-support-for-tokenized-interface-ident.orig
+%patch2 -p1 -b .0002-i6-addr-gen-mode.orig
 
 tar -xzf %SOURCE1
 
@@ -100,6 +102,9 @@ find $RPM_BUILD_ROOT -name \*.la -delete
 %doc libnl-doc-%{fullversion}/api/*
 
 %changelog
+* Tue Dec  9 2014 Thomas Haller <thaller at redhat.com> - 3.2.25-5
+- Add support for IPv6 link local address generation
+
 * Fri Oct 10 2014 Lubomir Rintel <lkundrak at v3.sk> - 3.2.25-4
 - Add support for IPv6 tokenized interface identifiers
 


More information about the scm-commits mailing list