d4c1522a3e
This commit is mostly similar to c9b963bc22
as
we revert to the previous release.
87 lines
2.4 KiB
Diff
87 lines
2.4 KiB
Diff
From 7eb12a5b21f87d7592ec2c5235d1ed90c4fac132 Mon Sep 17 00:00:00 2001
|
|
From: Dan Williams <dcbw@redhat.com>
|
|
Date: Tue, 3 Dec 2013 11:42:28 -0600
|
|
Subject: [PATCH] platform: set IPv4 broadcast address too (rh #1032819)
|
|
|
|
When moving over the platform, setting of the IPv4 broadcast address
|
|
got lost. Bring it back.
|
|
|
|
https://bugzilla.redhat.com/show_bug.cgi?id=1032819
|
|
---
|
|
src/platform/nm-linux-platform.c | 32 ++++++++++++++++++++++++++++++++
|
|
1 file changed, 32 insertions(+)
|
|
|
|
diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c
|
|
index 8f0e077..3f57925 100644
|
|
--- a/src/platform/nm-linux-platform.c
|
|
+++ b/src/platform/nm-linux-platform.c
|
|
@@ -2213,14 +2213,33 @@ ip6_address_get_all (NMPlatform *platform, int ifindex)
|
|
nl_object_unmark (object);
|
|
}
|
|
}
|
|
|
|
return addresses;
|
|
}
|
|
|
|
+static void
|
|
+addr4_to_broadcast (struct in_addr *dst, const struct in_addr *src, guint8 plen)
|
|
+{
|
|
+ guint nbytes = plen / 8;
|
|
+ guint nbits = plen % 8;
|
|
+
|
|
+ g_return_if_fail (plen <= 32);
|
|
+ g_assert (src);
|
|
+ g_assert (dst);
|
|
+
|
|
+ if (plen >= 32)
|
|
+ *dst = *src;
|
|
+ else {
|
|
+ dst->s_addr = 0xFFFFFFFF;
|
|
+ memcpy (dst, src, nbytes);
|
|
+ ((guint8 *) dst)[nbytes] = (((const guint8 *) src)[nbytes] | (0xFF >> nbits));
|
|
+ }
|
|
+}
|
|
+
|
|
static struct nl_object *
|
|
build_rtnl_addr (int family,
|
|
int ifindex,
|
|
gconstpointer addr,
|
|
gconstpointer peer_addr,
|
|
int plen,
|
|
guint32 lifetime,
|
|
@@ -2230,18 +2249,31 @@ build_rtnl_addr (int family,
|
|
struct rtnl_addr *rtnladdr = rtnl_addr_alloc ();
|
|
int addrlen = family == AF_INET ? sizeof (in_addr_t) : sizeof (struct in6_addr);
|
|
auto_nl_addr struct nl_addr *nladdr = nl_addr_build (family, addr, addrlen);
|
|
int nle;
|
|
|
|
g_assert (rtnladdr && nladdr);
|
|
|
|
+ /* IP address */
|
|
rtnl_addr_set_ifindex (rtnladdr, ifindex);
|
|
nle = rtnl_addr_set_local (rtnladdr, nladdr);
|
|
g_assert (!nle);
|
|
|
|
+ /* IPv4 Broadcast address */
|
|
+ if (family == AF_INET) {
|
|
+ struct in_addr bcast;
|
|
+ auto_nl_addr struct nl_addr *bcaddr = NULL;
|
|
+
|
|
+ addr4_to_broadcast (&bcast, addr, plen);
|
|
+ bcaddr = nl_addr_build (family, &bcast, addrlen);
|
|
+ g_assert (bcaddr);
|
|
+ rtnl_addr_set_broadcast (rtnladdr, bcaddr);
|
|
+ }
|
|
+
|
|
+ /* Peer/point-to-point address */
|
|
if (peer_addr) {
|
|
auto_nl_addr struct nl_addr *nlpeer = nl_addr_build (family, peer_addr, addrlen);
|
|
|
|
nle = rtnl_addr_set_peer (rtnladdr, nlpeer);
|
|
g_assert (!nle);
|
|
}
|
|
|
|
--
|
|
1.8.3.1
|
|
|