platform: add @peer_address argument to nm_platform_ip4_address_delete()

Deleting an IPv4 address using libnl requires the proper peer address.
Pass the address of the peer on to nm_platform_ip4_address_delete().

Signed-off-by: Thomas Haller <thaller@redhat.com>
This commit is contained in:
Thomas Haller
2014-08-12 01:31:00 +02:00
parent 64851f9559
commit 388d4d9030
6 changed files with 23 additions and 17 deletions

View File

@@ -901,7 +901,7 @@ ip6_address_add (NMPlatform *platform, int ifindex,
} }
static gboolean static gboolean
ip4_address_delete (NMPlatform *platform, int ifindex, in_addr_t addr, int plen) ip4_address_delete (NMPlatform *platform, int ifindex, in_addr_t addr, int plen, in_addr_t peer_address)
{ {
NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform); NMFakePlatformPrivate *priv = NM_FAKE_PLATFORM_GET_PRIVATE (platform);
int i; int i;
@@ -909,7 +909,8 @@ ip4_address_delete (NMPlatform *platform, int ifindex, in_addr_t addr, int plen)
for (i = 0; i < priv->ip4_addresses->len; i++) { for (i = 0; i < priv->ip4_addresses->len; i++) {
NMPlatformIP4Address *address = &g_array_index (priv->ip4_addresses, NMPlatformIP4Address, i); NMPlatformIP4Address *address = &g_array_index (priv->ip4_addresses, NMPlatformIP4Address, i);
if (address->ifindex == ifindex && address->plen == plen && address->address == addr) { if (address->ifindex == ifindex && address->plen == plen && address->address == addr &&
(!peer_address || address->peer_address == peer_address)) {
NMPlatformIP4Address deleted_address; NMPlatformIP4Address deleted_address;
memcpy (&deleted_address, address, sizeof (deleted_address)); memcpy (&deleted_address, address, sizeof (deleted_address));

View File

@@ -3567,9 +3567,9 @@ ip6_address_add (NMPlatform *platform,
} }
static gboolean static gboolean
ip4_address_delete (NMPlatform *platform, int ifindex, in_addr_t addr, int plen) ip4_address_delete (NMPlatform *platform, int ifindex, in_addr_t addr, int plen, in_addr_t peer_address)
{ {
return delete_object (platform, build_rtnl_addr (AF_INET, ifindex, &addr, NULL, plen, 0, 0, 0, NULL), TRUE); return delete_object (platform, build_rtnl_addr (AF_INET, ifindex, &addr, peer_address ? &peer_address : NULL, plen, 0, 0, 0, NULL), TRUE);
} }
static gboolean static gboolean

View File

@@ -1567,9 +1567,10 @@ nm_platform_ip6_address_add (int ifindex,
} }
gboolean gboolean
nm_platform_ip4_address_delete (int ifindex, in_addr_t address, int plen) nm_platform_ip4_address_delete (int ifindex, in_addr_t address, int plen, in_addr_t peer_address)
{ {
char str_dev[TO_STRING_DEV_BUF_SIZE]; char str_dev[TO_STRING_DEV_BUF_SIZE];
char str_peer[NM_UTILS_INET_ADDRSTRLEN];
reset_error (); reset_error ();
@@ -1577,10 +1578,14 @@ nm_platform_ip4_address_delete (int ifindex, in_addr_t address, int plen)
g_return_val_if_fail (plen > 0, FALSE); g_return_val_if_fail (plen > 0, FALSE);
g_return_val_if_fail (klass->ip4_address_delete, FALSE); g_return_val_if_fail (klass->ip4_address_delete, FALSE);
debug ("address: deleting IPv4 address %s/%d, ifindex %d%s", debug ("address: deleting IPv4 address %s/%d, %s%s%sifindex %d%s",
nm_utils_inet4_ntop (address, NULL), plen, ifindex, nm_utils_inet4_ntop (address, NULL), plen,
peer_address ? "peer " : "",
peer_address ? nm_utils_inet4_ntop (peer_address, str_peer) : "",
peer_address ? ", " : "",
ifindex,
_to_string_dev (ifindex, str_dev, sizeof (str_dev))); _to_string_dev (ifindex, str_dev, sizeof (str_dev)));
return klass->ip4_address_delete (platform, ifindex, address, plen); return klass->ip4_address_delete (platform, ifindex, address, plen, peer_address);
} }
gboolean gboolean
@@ -1744,7 +1749,7 @@ nm_platform_ip4_address_sync (int ifindex, const GArray *known_addresses)
address = &g_array_index (addresses, NMPlatformIP4Address, i); address = &g_array_index (addresses, NMPlatformIP4Address, i);
if (!array_contains_ip4_address (known_addresses, address)) if (!array_contains_ip4_address (known_addresses, address))
nm_platform_ip4_address_delete (ifindex, address->address, address->plen); nm_platform_ip4_address_delete (ifindex, address->address, address->plen, address->peer_address);
} }
g_array_free (addresses, TRUE); g_array_free (addresses, TRUE);

View File

@@ -447,7 +447,7 @@ typedef struct {
gboolean (*ip6_address_add) (NMPlatform *, int ifindex, gboolean (*ip6_address_add) (NMPlatform *, int ifindex,
struct in6_addr address, struct in6_addr peer_address, int plen, struct in6_addr address, struct in6_addr peer_address, int plen,
guint32 lifetime, guint32 preferred_lft, guint flags); guint32 lifetime, guint32 preferred_lft, guint flags);
gboolean (*ip4_address_delete) (NMPlatform *, int ifindex, in_addr_t address, int plen); gboolean (*ip4_address_delete) (NMPlatform *, int ifindex, in_addr_t address, int plen, in_addr_t peer_address);
gboolean (*ip6_address_delete) (NMPlatform *, int ifindex, struct in6_addr address, int plen); gboolean (*ip6_address_delete) (NMPlatform *, int ifindex, struct in6_addr address, int plen);
gboolean (*ip4_address_exists) (NMPlatform *, int ifindex, in_addr_t address, int plen); gboolean (*ip4_address_exists) (NMPlatform *, int ifindex, in_addr_t address, int plen);
gboolean (*ip6_address_exists) (NMPlatform *, int ifindex, struct in6_addr address, int plen); gboolean (*ip6_address_exists) (NMPlatform *, int ifindex, struct in6_addr address, int plen);
@@ -591,7 +591,7 @@ gboolean nm_platform_ip4_address_add (int ifindex,
gboolean nm_platform_ip6_address_add (int ifindex, gboolean nm_platform_ip6_address_add (int ifindex,
struct in6_addr address, struct in6_addr peer_address, int plen, struct in6_addr address, struct in6_addr peer_address, int plen,
guint32 lifetime, guint32 preferred_lft, guint flags); guint32 lifetime, guint32 preferred_lft, guint flags);
gboolean nm_platform_ip4_address_delete (int ifindex, in_addr_t address, int plen); gboolean nm_platform_ip4_address_delete (int ifindex, in_addr_t address, int plen, in_addr_t peer_address);
gboolean nm_platform_ip6_address_delete (int ifindex, struct in6_addr address, int plen); gboolean nm_platform_ip6_address_delete (int ifindex, struct in6_addr address, int plen);
gboolean nm_platform_ip4_address_exists (int ifindex, in_addr_t address, int plen); gboolean nm_platform_ip4_address_exists (int ifindex, in_addr_t address, int plen);
gboolean nm_platform_ip6_address_exists (int ifindex, struct in6_addr address, int plen); gboolean nm_platform_ip6_address_exists (int ifindex, struct in6_addr address, int plen);

View File

@@ -597,7 +597,7 @@ do_ip6_address_add (char **argv)
return FALSE; return FALSE;
} }
#define ADDR_CMD_FULL(v, cmdname, print) \ #define ADDR_CMD_FULL(v, cmdname, print, ...) \
static gboolean \ static gboolean \
do_##v##_address_##cmdname (char **argv) \ do_##v##_address_##cmdname (char **argv) \
{ \ { \
@@ -605,7 +605,7 @@ do_ip6_address_add (char **argv)
v##_t address; \ v##_t address; \
int plen; \ int plen; \
if (ifindex && parse_##v##_address (*argv++, &address, &plen)) { \ if (ifindex && parse_##v##_address (*argv++, &address, &plen)) { \
gboolean value = nm_platform_##v##_address_##cmdname (ifindex, address, plen); \ gboolean value = nm_platform_##v##_address_##cmdname (ifindex, address, plen, ##__VA_ARGS__); \
if (print) { \ if (print) { \
print_boolean (value); \ print_boolean (value); \
return TRUE; \ return TRUE; \
@@ -614,7 +614,7 @@ do_ip6_address_add (char **argv)
} else \ } else \
return FALSE; \ return FALSE; \
} }
#define ADDR_CMD(cmdname) ADDR_CMD_FULL (ip4, cmdname, FALSE) ADDR_CMD_FULL (ip6, cmdname, FALSE) #define ADDR_CMD(cmdname) ADDR_CMD_FULL (ip4, cmdname, FALSE, 0) ADDR_CMD_FULL (ip6, cmdname, FALSE)
#define ADDR_CMD_PRINT(cmdname) ADDR_CMD_FULL (ip4, cmdname, TRUE) ADDR_CMD_FULL (ip6, cmdname, TRUE) #define ADDR_CMD_PRINT(cmdname) ADDR_CMD_FULL (ip4, cmdname, TRUE) ADDR_CMD_FULL (ip6, cmdname, TRUE)
ADDR_CMD (delete) ADDR_CMD (delete)

View File

@@ -91,13 +91,13 @@ test_ip4_address (void)
g_array_unref (addresses); g_array_unref (addresses);
/* Remove address */ /* Remove address */
g_assert (nm_platform_ip4_address_delete (ifindex, addr, IP4_PLEN)); g_assert (nm_platform_ip4_address_delete (ifindex, addr, IP4_PLEN, 0));
no_error (); no_error ();
g_assert (!nm_platform_ip4_address_exists (ifindex, addr, IP4_PLEN)); g_assert (!nm_platform_ip4_address_exists (ifindex, addr, IP4_PLEN));
accept_signal (address_removed); accept_signal (address_removed);
/* Remove address again */ /* Remove address again */
g_assert (nm_platform_ip4_address_delete (ifindex, addr, IP4_PLEN)); g_assert (nm_platform_ip4_address_delete (ifindex, addr, IP4_PLEN, 0));
no_error (); no_error ();
free_signal (address_added); free_signal (address_added);
@@ -196,7 +196,7 @@ test_ip4_address_external (void)
g_assert (nm_platform_ip4_address_exists (ifindex, addr, IP4_PLEN)); g_assert (nm_platform_ip4_address_exists (ifindex, addr, IP4_PLEN));
accept_signal (address_added); accept_signal (address_added);
/*run_command ("ip address delete %s/%d dev %s", IP4_ADDRESS, IP4_PLEN, DEVICE_NAME); /*run_command ("ip address delete %s/%d dev %s", IP4_ADDRESS, IP4_PLEN, DEVICE_NAME);
g_assert (nm_platform_ip4_address_delete (ifindex, addr, IP4_PLEN)); g_assert (nm_platform_ip4_address_delete (ifindex, addr, IP4_PLEN, 0));
no_error (); no_error ();
g_assert (!nm_platform_ip4_address_exists (ifindex, addr, IP4_PLEN)); g_assert (!nm_platform_ip4_address_exists (ifindex, addr, IP4_PLEN));
accept_signal (address_removed);*/ accept_signal (address_removed);*/