summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Winship <danw@gnome.org>2014-02-19 16:10:59 -0500
committerDan Winship <danw@gnome.org>2014-03-26 10:39:37 -0400
commitbc43d532ee14ba71867a318561277c1d02c97154 (patch)
tree8574e5d71ecbaeca74ad8cea7cddf4094b914449
parente0832bdb795fadbdc3b18c1321f750626e11e5a0 (diff)
downloadNetworkManager-bc43d532ee14ba71867a318561277c1d02c97154.tar.gz
platform: support address labels for IPv4 addresses
-rw-r--r--src/platform/nm-fake-platform.c5
-rw-r--r--src/platform/nm-linux-platform.c24
-rw-r--r--src/platform/nm-platform.c27
-rw-r--r--src/platform/nm-platform.h7
-rw-r--r--src/platform/tests/platform.c2
-rw-r--r--src/platform/tests/test-address.c6
-rw-r--r--src/platform/tests/test-cleanup.c2
7 files changed, 54 insertions, 19 deletions
diff --git a/src/platform/nm-fake-platform.c b/src/platform/nm-fake-platform.c
index 90d181bb8f..3eec6497f0 100644
--- a/src/platform/nm-fake-platform.c
+++ b/src/platform/nm-fake-platform.c
@@ -738,7 +738,8 @@ ip6_address_get_all (NMPlatform *platform, int ifindex)
static gboolean
ip4_address_add (NMPlatform *platform, int ifindex,
in_addr_t addr, in_addr_t peer_addr,
- int plen, guint32 lifetime, guint32 preferred)
+ int plen, guint32 lifetime, guint32 preferred,
+ const char *label)
{
NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform);
NMPlatformIP4Address address;
@@ -752,6 +753,8 @@ ip4_address_add (NMPlatform *platform, int ifindex,
address.timestamp = nm_utils_get_monotonic_timestamp_s ();
address.lifetime = lifetime;
address.preferred = preferred;
+ if (label)
+ g_strlcpy (address.label, label, sizeof (address.label));
for (i = 0; i < priv->ip4_addresses->len; i++) {
NMPlatformIP4Address *item = &g_array_index (priv->ip4_addresses, NMPlatformIP4Address, i);
diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c
index 6311b3b9b9..252d30d197 100644
--- a/src/platform/nm-linux-platform.c
+++ b/src/platform/nm-linux-platform.c
@@ -868,6 +868,7 @@ init_ip4_address (NMPlatformIP4Address *address, struct rtnl_addr *rtnladdr)
{
struct nl_addr *nladdr = rtnl_addr_get_local (rtnladdr);
struct nl_addr *nlpeer = rtnl_addr_get_peer (rtnladdr);
+ const char *label;
g_return_val_if_fail (nladdr, FALSE);
@@ -890,6 +891,9 @@ init_ip4_address (NMPlatformIP4Address *address, struct rtnl_addr *rtnladdr)
}
memcpy (&address->peer_address, nl_addr_get_binary_addr (nlpeer), sizeof (address->peer_address));
}
+ label = rtnl_addr_get_label (rtnladdr);
+ if (label && *label)
+ g_strlcpy (address->label, label, sizeof (address->label));
return TRUE;
}
@@ -2783,7 +2787,8 @@ build_rtnl_addr (int family,
int plen,
guint32 lifetime,
guint32 preferred,
- guint flags)
+ guint flags,
+ const char *label)
{
struct rtnl_addr *rtnladdr = rtnl_addr_alloc ();
int addrlen = family == AF_INET ? sizeof (in_addr_t) : sizeof (struct in6_addr);
@@ -2824,6 +2829,8 @@ build_rtnl_addr (int family,
}
if (flags)
rtnl_addr_set_flags (rtnladdr, flags);
+ if (label && *label)
+ rtnl_addr_set_label (rtnladdr, label);
return (struct nl_object *) rtnladdr;
}
@@ -2835,11 +2842,13 @@ ip4_address_add (NMPlatform *platform,
in_addr_t peer_addr,
int plen,
guint32 lifetime,
- guint32 preferred)
+ guint32 preferred,
+ const char *label)
{
return add_object (platform, build_rtnl_addr (AF_INET, ifindex, &addr,
peer_addr ? &peer_addr : NULL,
- plen, lifetime, preferred, 0));
+ plen, lifetime, preferred, 0,
+ label));
}
static gboolean
@@ -2854,25 +2863,26 @@ ip6_address_add (NMPlatform *platform,
{
return add_object (platform, build_rtnl_addr (AF_INET6, ifindex, &addr,
IN6_IS_ADDR_UNSPECIFIED (&peer_addr) ? NULL : &peer_addr,
- plen, lifetime, preferred, flags));
+ plen, lifetime, preferred, flags,
+ NULL));
}
static gboolean
ip4_address_delete (NMPlatform *platform, int ifindex, in_addr_t addr, int plen)
{
- return delete_object (platform, build_rtnl_addr (AF_INET, ifindex, &addr, NULL, plen, 0, 0, 0));
+ return delete_object (platform, build_rtnl_addr (AF_INET, ifindex, &addr, NULL, plen, 0, 0, 0, NULL));
}
static gboolean
ip6_address_delete (NMPlatform *platform, int ifindex, struct in6_addr addr, int plen)
{
- return delete_object (platform, build_rtnl_addr (AF_INET6, ifindex, &addr, NULL, plen, 0, 0, 0));
+ return delete_object (platform, build_rtnl_addr (AF_INET6, ifindex, &addr, NULL, plen, 0, 0, 0, NULL));
}
static gboolean
ip_address_exists (NMPlatform *platform, int family, int ifindex, gconstpointer addr, int plen)
{
- auto_nl_object struct nl_object *object = build_rtnl_addr (family, ifindex, addr, NULL, plen, 0, 0, 0);
+ auto_nl_object struct nl_object *object = build_rtnl_addr (family, ifindex, addr, NULL, plen, 0, 0, 0, NULL);
auto_nl_object struct nl_object *cached_object = nl_cache_search (choose_cache (platform, object), object);
return !!cached_object;
diff --git a/src/platform/nm-platform.c b/src/platform/nm-platform.c
index a42910f2c1..ad39084c69 100644
--- a/src/platform/nm-platform.c
+++ b/src/platform/nm-platform.c
@@ -1230,7 +1230,8 @@ nm_platform_ip4_address_add (int ifindex,
in_addr_t peer_address,
int plen,
guint32 lifetime,
- guint32 preferred)
+ guint32 preferred,
+ const char *label)
{
reset_error ();
@@ -1238,6 +1239,7 @@ nm_platform_ip4_address_add (int ifindex,
g_return_val_if_fail (plen > 0, FALSE);
g_return_val_if_fail (lifetime > 0, FALSE);
g_return_val_if_fail (klass->ip4_address_add, FALSE);
+ g_return_val_if_fail (!label || strlen (label) < sizeof (((NMPlatformIP4Address *) NULL)->label), FALSE);
if (nm_logging_enabled (LOGL_DEBUG, LOGD_PLATFORM)) {
NMPlatformIP4Address addr = { 0 };
@@ -1248,10 +1250,12 @@ nm_platform_ip4_address_add (int ifindex,
addr.plen = plen;
addr.lifetime = lifetime;
addr.preferred = preferred;
+ if (label)
+ g_strlcpy (addr.label, label, sizeof (addr.label));
debug ("address: adding or updating IPv4 address: %s", nm_platform_ip4_address_to_string (&addr));
}
- return klass->ip4_address_add (platform, ifindex, address, peer_address, plen, lifetime, preferred);
+ return klass->ip4_address_add (platform, ifindex, address, peer_address, plen, lifetime, preferred, label);
}
gboolean
@@ -1422,7 +1426,7 @@ nm_platform_ip4_address_sync (int ifindex, const GArray *known_addresses)
} else
lifetime = preferred = NM_PLATFORM_LIFETIME_PERMANENT;
- if (!nm_platform_ip4_address_add (ifindex, known_address->address, known_address->peer_address, known_address->plen, lifetime, preferred))
+ if (!nm_platform_ip4_address_add (ifindex, known_address->address, known_address->peer_address, known_address->plen, lifetime, preferred, known_address->label))
return FALSE;
}
@@ -1914,6 +1918,7 @@ nm_platform_ip4_address_to_string (const NMPlatformIP4Address *address)
char s_address[INET_ADDRSTRLEN];
char s_peer[INET_ADDRSTRLEN];
char str_dev[TO_STRING_DEV_BUF_SIZE];
+ char str_label[32];
char *str_peer = NULL;
g_return_val_if_fail (address, "(unknown)");
@@ -1927,11 +1932,17 @@ nm_platform_ip4_address_to_string (const NMPlatformIP4Address *address)
_to_string_dev (address->ifindex, str_dev, sizeof (str_dev));
- g_snprintf (to_string_buffer, sizeof (to_string_buffer), "%s/%d lft %u pref %u time %u%s%s src %s",
+ if (*address->label)
+ g_snprintf (str_label, sizeof (str_label), " label %s", address->label);
+ else
+ str_label[0] = 0;
+
+ g_snprintf (to_string_buffer, sizeof (to_string_buffer), "%s/%d lft %u pref %u time %u%s%s%s src %s",
s_address, address->plen, (guint)address->lifetime, (guint)address->preferred,
(guint)address->timestamp,
str_peer ? str_peer : "",
str_dev,
+ str_label,
source_to_string (address->source));
g_free (str_peer);
return to_string_buffer;
@@ -2092,6 +2103,13 @@ nm_platform_ip6_route_to_string (const NMPlatformIP6Route *route)
return (((a)->field) < ((b)->field)) ? -1 : 1; \
} G_STMT_END
+#define _CMP_FIELD_STR(a, b, field) \
+ G_STMT_START { \
+ int c = strcmp ((a)->field, (b)->field); \
+ if (c != 0) \
+ return c < 0 ? -1 : 1; \
+ } G_STMT_END
+
#define _CMP_FIELD_MEMCMP(a, b, field) \
G_STMT_START { \
int c = memcmp (&((a)->field), &((b)->field), \
@@ -2112,6 +2130,7 @@ nm_platform_ip4_address_cmp (const NMPlatformIP4Address *a, const NMPlatformIP4A
_CMP_FIELD (a, b, timestamp);
_CMP_FIELD (a, b, lifetime);
_CMP_FIELD (a, b, preferred);
+ _CMP_FIELD_STR (a, b, label);
return 0;
}
diff --git a/src/platform/nm-platform.h b/src/platform/nm-platform.h
index cf41ad85fd..356af1f940 100644
--- a/src/platform/nm-platform.h
+++ b/src/platform/nm-platform.h
@@ -156,6 +156,7 @@ typedef struct {
guint32 timestamp;
guint32 lifetime; /* seconds */
guint32 preferred; /* seconds */
+ char label[IFNAMSIZ];
} NMPlatformIP4Address;
/**
@@ -346,7 +347,8 @@ typedef struct {
GArray * (*ip6_address_get_all) (NMPlatform *, int ifindex);
gboolean (*ip4_address_add) (NMPlatform *, int ifindex,
in_addr_t address, in_addr_t peer_address, int plen,
- guint32 lifetime, guint32 preferred_lft);
+ guint32 lifetime, guint32 preferred_lft,
+ const char *label);
gboolean (*ip6_address_add) (NMPlatform *, int ifindex,
struct in6_addr address, struct in6_addr peer_address, int plen,
guint32 lifetime, guint32 preferred_lft, guint flags);
@@ -475,7 +477,8 @@ GArray *nm_platform_ip4_address_get_all (int ifindex);
GArray *nm_platform_ip6_address_get_all (int ifindex);
gboolean nm_platform_ip4_address_add (int ifindex,
in_addr_t address, in_addr_t peer_address, int plen,
- guint32 lifetime, guint32 preferred_lft);
+ guint32 lifetime, guint32 preferred_lft,
+ const char *label);
gboolean nm_platform_ip6_address_add (int ifindex,
struct in6_addr address, struct in6_addr peer_address, int plen,
guint32 lifetime, guint32 preferred_lft, guint flags);
diff --git a/src/platform/tests/platform.c b/src/platform/tests/platform.c
index d599096fea..baa7cd5a69 100644
--- a/src/platform/tests/platform.c
+++ b/src/platform/tests/platform.c
@@ -570,7 +570,7 @@ do_ip4_address_add (char **argv)
guint32 lifetime = strtol (*argv++, NULL, 10);
guint32 preferred = strtol (*argv++, NULL, 10);
- gboolean value = nm_platform_ip4_address_add (ifindex, address, 0, plen, lifetime, preferred);
+ gboolean value = nm_platform_ip4_address_add (ifindex, address, 0, plen, lifetime, preferred, NULL);
return value;
} else
return FALSE;
diff --git a/src/platform/tests/test-address.c b/src/platform/tests/test-address.c
index 20f1bd9ed6..a81b108171 100644
--- a/src/platform/tests/test-address.c
+++ b/src/platform/tests/test-address.c
@@ -60,14 +60,14 @@ test_ip4_address (void)
/* Add address */
g_assert (!nm_platform_ip4_address_exists (ifindex, addr, IP4_PLEN));
no_error ();
- g_assert (nm_platform_ip4_address_add (ifindex, addr, 0, IP4_PLEN, lifetime, preferred));
+ g_assert (nm_platform_ip4_address_add (ifindex, addr, 0, IP4_PLEN, lifetime, preferred, NULL));
no_error ();
g_assert (nm_platform_ip4_address_exists (ifindex, addr, IP4_PLEN));
no_error ();
accept_signal (address_added);
/* Add address again (aka update) */
- g_assert (nm_platform_ip4_address_add (ifindex, addr, 0, IP4_PLEN, lifetime, preferred));
+ g_assert (nm_platform_ip4_address_add (ifindex, addr, 0, IP4_PLEN, lifetime, preferred, NULL));
no_error ();
accept_signal (address_changed);
@@ -183,7 +183,7 @@ test_ip4_address_external (void)
/* Add/delete conflict */
run_command ("ip address add %s/%d dev %s valid_lft %d preferred_lft %d",
IP4_ADDRESS, IP4_PLEN, DEVICE_NAME, lifetime, preferred);
- g_assert (nm_platform_ip4_address_add (ifindex, addr, 0, IP4_PLEN, lifetime, preferred));
+ g_assert (nm_platform_ip4_address_add (ifindex, addr, 0, IP4_PLEN, lifetime, preferred, NULL));
no_error ();
g_assert (nm_platform_ip4_address_exists (ifindex, addr, IP4_PLEN));
accept_signal (address_added);
diff --git a/src/platform/tests/test-cleanup.c b/src/platform/tests/test-cleanup.c
index d94b359559..d8e8a7d513 100644
--- a/src/platform/tests/test-cleanup.c
+++ b/src/platform/tests/test-cleanup.c
@@ -41,7 +41,7 @@ test_cleanup_internal ()
g_assert (ifindex > 0);
/* Add routes and addresses */
- g_assert (nm_platform_ip4_address_add (ifindex, addr4, 0, plen4, lifetime, preferred));
+ g_assert (nm_platform_ip4_address_add (ifindex, addr4, 0, plen4, lifetime, preferred, NULL));
g_assert (nm_platform_ip6_address_add (ifindex, addr6, in6addr_any, plen6, lifetime, preferred, flags));
g_assert (nm_platform_ip4_route_add (ifindex, gateway4, 32, INADDR_ANY, metric, mss));
g_assert (nm_platform_ip4_route_add (ifindex, network4, plen4, gateway4, metric, mss));