summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2019-07-03 17:15:58 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2019-07-05 11:06:01 +0200
commit40babe1c448bd2bb53d4d9beff8b8ab387bbe00e (patch)
treed1a2119690caf904611ee14f524ff8e1c373a74f
parent1609f508666985c84713a93d987bada59aa646ff (diff)
downloadNetworkManager-40babe1c448bd2bb53d4d9beff8b8ab387bbe00e.tar.gz
dhcp: pass broadcast address to clients
Read the broadcast address from platform and pass it to clients. Currently only the nettool backends uses it.
-rw-r--r--src/devices/nm-device.c12
-rw-r--r--src/dhcp/nm-dhcp-client.c24
-rw-r--r--src/dhcp/nm-dhcp-client.h25
-rw-r--r--src/dhcp/nm-dhcp-manager.c13
-rw-r--r--src/dhcp/nm-dhcp-manager.h2
-rw-r--r--src/dhcp/nm-dhcp-nettools.c8
-rw-r--r--src/nm-iface-helper.c6
7 files changed, 73 insertions, 17 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index f707919478..569ff6289d 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -7966,6 +7966,7 @@ dhcp4_start (NMDevice *self)
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
NMSettingIPConfig *s_ip4;
gs_unref_bytes GBytes *hwaddr = NULL;
+ gs_unref_bytes GBytes *bcast_hwaddr = NULL;
gs_unref_bytes GBytes *client_id = NULL;
NMConnection *connection;
GError *error = NULL;
@@ -7981,8 +7982,10 @@ dhcp4_start (NMDevice *self)
priv->dhcp4.config = nm_dhcp4_config_new ();
pllink = nm_platform_link_get (nm_device_get_platform (self), nm_device_get_ip_ifindex (self));
- if (pllink)
+ if (pllink) {
hwaddr = nmp_link_address_get_as_bytes (&pllink->l_address);
+ bcast_hwaddr = nmp_link_address_get_as_bytes (&pllink->l_broadcast);
+ }
client_id = dhcp4_get_client_id (self, connection, hwaddr);
@@ -7992,6 +7995,7 @@ dhcp4_start (NMDevice *self)
nm_device_get_ip_iface (self),
nm_device_get_ip_ifindex (self),
hwaddr,
+ bcast_hwaddr,
nm_connection_get_uuid (connection),
nm_device_get_route_table (self, AF_INET),
nm_device_get_route_metric (self, AF_INET),
@@ -8769,6 +8773,7 @@ dhcp6_start_with_link_ready (NMDevice *self, NMConnection *connection)
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
NMSettingIPConfig *s_ip6;
gs_unref_bytes GBytes *hwaddr = NULL;
+ gs_unref_bytes GBytes *bcast_hwaddr = NULL;
gs_unref_bytes GBytes *duid = NULL;
gboolean enforce_duid = FALSE;
const NMPlatformLink *pllink;
@@ -8792,8 +8797,10 @@ dhcp6_start_with_link_ready (NMDevice *self, NMConnection *connection)
}
pllink = nm_platform_link_get (nm_device_get_platform (self), nm_device_get_ip_ifindex (self));
- if (pllink)
+ if (pllink) {
hwaddr = nmp_link_address_get_as_bytes (&pllink->l_address);
+ bcast_hwaddr = nmp_link_address_get_as_bytes (&pllink->l_broadcast);
+ }
duid = dhcp6_get_duid (self, connection, hwaddr, &enforce_duid);
priv->dhcp6.client = nm_dhcp_manager_start_ip6 (nm_dhcp_manager_get (),
@@ -8801,6 +8808,7 @@ dhcp6_start_with_link_ready (NMDevice *self, NMConnection *connection)
nm_device_get_ip_iface (self),
nm_device_get_ip_ifindex (self),
hwaddr,
+ bcast_hwaddr,
&ll_addr->address,
nm_connection_get_uuid (connection),
nm_device_get_route_table (self, AF_INET6),
diff --git a/src/dhcp/nm-dhcp-client.c b/src/dhcp/nm-dhcp-client.c
index 4dca4750e7..e6ac217c56 100644
--- a/src/dhcp/nm-dhcp-client.c
+++ b/src/dhcp/nm-dhcp-client.c
@@ -51,6 +51,7 @@ NM_GOBJECT_PROPERTIES_DEFINE (NMDhcpClient,
PROP_ADDR_FAMILY,
PROP_FLAGS,
PROP_HWADDR,
+ PROP_BROADCAST_HWADDR,
PROP_IFACE,
PROP_IFINDEX,
PROP_MULTI_IDX,
@@ -65,6 +66,7 @@ typedef struct _NMDhcpClientPrivate {
NMDedupMultiIndex *multi_idx;
char * iface;
GBytes * hwaddr;
+ GBytes * bcast_hwaddr;
char * uuid;
GBytes * client_id;
char * hostname;
@@ -143,6 +145,14 @@ nm_dhcp_client_get_hw_addr (NMDhcpClient *self)
return NM_DHCP_CLIENT_GET_PRIVATE (self)->hwaddr;
}
+GBytes *
+nm_dhcp_client_get_broadcast_hw_addr (NMDhcpClient *self)
+{
+ g_return_val_if_fail (NM_IS_DHCP_CLIENT (self), NULL);
+
+ return NM_DHCP_CLIENT_GET_PRIVATE (self)->bcast_hwaddr;
+}
+
guint32
nm_dhcp_client_get_route_table (NMDhcpClient *self)
{
@@ -869,6 +879,9 @@ get_property (GObject *object, guint prop_id,
case PROP_HWADDR:
g_value_set_boxed (value, priv->hwaddr);
break;
+ case PROP_BROADCAST_HWADDR:
+ g_value_set_boxed (value, priv->bcast_hwaddr);
+ break;
case PROP_ADDR_FAMILY:
g_value_set_int (value, priv->addr_family);
break;
@@ -930,6 +943,10 @@ set_property (GObject *object, guint prop_id,
/* construct-only */
priv->hwaddr = g_value_dup_boxed (value);
break;
+ case PROP_BROADCAST_HWADDR:
+ /* construct-only */
+ priv->bcast_hwaddr = g_value_dup_boxed (value);
+ break;
case PROP_ADDR_FAMILY:
/* construct-only */
priv->addr_family = g_value_get_int (value);
@@ -996,6 +1013,7 @@ dispose (GObject *object)
g_clear_pointer (&priv->uuid, g_free);
g_clear_pointer (&priv->client_id, g_bytes_unref);
g_clear_pointer (&priv->hwaddr, g_bytes_unref);
+ g_clear_pointer (&priv->bcast_hwaddr, g_bytes_unref);
G_OBJECT_CLASS (nm_dhcp_client_parent_class)->dispose (object);
@@ -1040,6 +1058,12 @@ nm_dhcp_client_class_init (NMDhcpClientClass *client_class)
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
+ obj_properties[PROP_BROADCAST_HWADDR] =
+ g_param_spec_boxed (NM_DHCP_CLIENT_BROADCAST_HWADDR, "", "",
+ G_TYPE_BYTES,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS);
+
obj_properties[PROP_ADDR_FAMILY] =
g_param_spec_int (NM_DHCP_CLIENT_ADDR_FAMILY, "", "",
0, G_MAXINT, AF_UNSPEC,
diff --git a/src/dhcp/nm-dhcp-client.h b/src/dhcp/nm-dhcp-client.h
index dd61cd9959..9eb76f33a8 100644
--- a/src/dhcp/nm-dhcp-client.h
+++ b/src/dhcp/nm-dhcp-client.h
@@ -34,17 +34,18 @@
#define NM_IS_DHCP_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_DHCP_CLIENT))
#define NM_DHCP_CLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_DHCP_CLIENT, NMDhcpClientClass))
-#define NM_DHCP_CLIENT_ADDR_FAMILY "addr-family"
-#define NM_DHCP_CLIENT_FLAGS "flags"
-#define NM_DHCP_CLIENT_HWADDR "hwaddr"
-#define NM_DHCP_CLIENT_IFINDEX "ifindex"
-#define NM_DHCP_CLIENT_INTERFACE "iface"
-#define NM_DHCP_CLIENT_MULTI_IDX "multi-idx"
-#define NM_DHCP_CLIENT_HOSTNAME "hostname"
-#define NM_DHCP_CLIENT_ROUTE_METRIC "route-metric"
-#define NM_DHCP_CLIENT_ROUTE_TABLE "route-table"
-#define NM_DHCP_CLIENT_TIMEOUT "timeout"
-#define NM_DHCP_CLIENT_UUID "uuid"
+#define NM_DHCP_CLIENT_ADDR_FAMILY "addr-family"
+#define NM_DHCP_CLIENT_FLAGS "flags"
+#define NM_DHCP_CLIENT_HWADDR "hwaddr"
+#define NM_DHCP_CLIENT_BROADCAST_HWADDR "broadcast-hwaddr"
+#define NM_DHCP_CLIENT_IFINDEX "ifindex"
+#define NM_DHCP_CLIENT_INTERFACE "iface"
+#define NM_DHCP_CLIENT_MULTI_IDX "multi-idx"
+#define NM_DHCP_CLIENT_HOSTNAME "hostname"
+#define NM_DHCP_CLIENT_ROUTE_METRIC "route-metric"
+#define NM_DHCP_CLIENT_ROUTE_TABLE "route-table"
+#define NM_DHCP_CLIENT_TIMEOUT "timeout"
+#define NM_DHCP_CLIENT_UUID "uuid"
#define NM_DHCP_CLIENT_SIGNAL_STATE_CHANGED "state-changed"
#define NM_DHCP_CLIENT_SIGNAL_PREFIX_DELEGATED "prefix-delegated"
@@ -129,6 +130,8 @@ GBytes *nm_dhcp_client_get_duid (NMDhcpClient *self);
GBytes *nm_dhcp_client_get_hw_addr (NMDhcpClient *self);
+GBytes *nm_dhcp_client_get_broadcast_hw_addr (NMDhcpClient *self);
+
guint32 nm_dhcp_client_get_route_table (NMDhcpClient *self);
void nm_dhcp_client_set_route_table (NMDhcpClient *self, guint32 route_table);
diff --git a/src/dhcp/nm-dhcp-manager.c b/src/dhcp/nm-dhcp-manager.c
index e8ca293304..304a7b9961 100644
--- a/src/dhcp/nm-dhcp-manager.c
+++ b/src/dhcp/nm-dhcp-manager.c
@@ -204,6 +204,7 @@ client_start (NMDhcpManager *self,
const char *iface,
int ifindex,
GBytes *hwaddr,
+ GBytes *bcast_hwaddr,
const char *uuid,
guint32 route_table,
guint32 route_metric,
@@ -233,10 +234,11 @@ client_start (NMDhcpManager *self,
g_return_val_if_fail (!dhcp_client_id || g_bytes_get_size (dhcp_client_id) >= 2, NULL);
g_return_val_if_fail (!error || !*error, NULL);
- if (!hwaddr) {
+ if (!hwaddr || !bcast_hwaddr) {
nm_utils_error_set (error,
NM_UTILS_ERROR_UNKNOWN,
- "missing MAC address");
+ "missing %s address",
+ hwaddr ? "broadcast" : "MAC");
return NULL;
}
@@ -249,6 +251,8 @@ client_start (NMDhcpManager *self,
g_return_val_if_reached (NULL) ;
}
+ nm_assert (g_bytes_get_size (hwaddr) == g_bytes_get_size (bcast_hwaddr));
+
priv = NM_DHCP_MANAGER_GET_PRIVATE (self);
client_factory = _client_factory_get_effective (priv->client_factory, addr_family);
@@ -273,6 +277,7 @@ client_start (NMDhcpManager *self,
NM_DHCP_CLIENT_INTERFACE, iface,
NM_DHCP_CLIENT_IFINDEX, ifindex,
NM_DHCP_CLIENT_HWADDR, hwaddr,
+ NM_DHCP_CLIENT_BROADCAST_HWADDR, bcast_hwaddr,
NM_DHCP_CLIENT_UUID, uuid,
NM_DHCP_CLIENT_HOSTNAME, hostname,
NM_DHCP_CLIENT_ROUTE_TABLE, (guint) route_table,
@@ -345,6 +350,7 @@ nm_dhcp_manager_start_ip4 (NMDhcpManager *self,
const char *iface,
int ifindex,
GBytes *hwaddr,
+ GBytes *bcast_hwaddr,
const char *uuid,
guint32 route_table,
guint32 route_metric,
@@ -395,6 +401,7 @@ nm_dhcp_manager_start_ip4 (NMDhcpManager *self,
iface,
ifindex,
hwaddr,
+ bcast_hwaddr,
uuid,
route_table,
route_metric,
@@ -419,6 +426,7 @@ nm_dhcp_manager_start_ip6 (NMDhcpManager *self,
const char *iface,
int ifindex,
GBytes *hwaddr,
+ GBytes *bcast_hwaddr,
const struct in6_addr *ll_addr,
const char *uuid,
guint32 route_table,
@@ -450,6 +458,7 @@ nm_dhcp_manager_start_ip6 (NMDhcpManager *self,
iface,
ifindex,
hwaddr,
+ bcast_hwaddr,
uuid,
route_table,
route_metric,
diff --git a/src/dhcp/nm-dhcp-manager.h b/src/dhcp/nm-dhcp-manager.h
index 0125813556..ff0d6f5472 100644
--- a/src/dhcp/nm-dhcp-manager.h
+++ b/src/dhcp/nm-dhcp-manager.h
@@ -49,6 +49,7 @@ NMDhcpClient * nm_dhcp_manager_start_ip4 (NMDhcpManager *manager,
const char *iface,
int ifindex,
GBytes *hwaddr,
+ GBytes *bcast_hwaddr,
const char *uuid,
guint32 route_table,
guint32 route_metric,
@@ -66,6 +67,7 @@ NMDhcpClient * nm_dhcp_manager_start_ip6 (NMDhcpManager *manager,
const char *iface,
int ifindex,
GBytes *hwaddr,
+ GBytes *bcast_hwaddr,
const struct in6_addr *ll_addr,
const char *uuid,
guint32 route_table,
diff --git a/src/dhcp/nm-dhcp-nettools.c b/src/dhcp/nm-dhcp-nettools.c
index aca472e05d..d24392e7ed 100644
--- a/src/dhcp/nm-dhcp-nettools.c
+++ b/src/dhcp/nm-dhcp-nettools.c
@@ -1083,8 +1083,11 @@ nettools_create (NMDhcpNettools *self,
nm_auto (n_dhcp4_client_config_freep) NDhcp4ClientConfig *config = NULL;
nm_auto (n_dhcp4_client_unrefp) NDhcp4Client *client = NULL;
GBytes *hwaddr;
+ GBytes *bcast_hwaddr;
const uint8_t *hwaddr_arr;
+ const uint8_t *bcast_hwaddr_arr;
gsize hwaddr_len;
+ gsize bcast_hwaddr_len;
GBytes *client_id;
gs_unref_bytes GBytes *client_id_new = NULL;
const uint8_t *client_id_arr;
@@ -1101,6 +1104,9 @@ nettools_create (NMDhcpNettools *self,
return FALSE;
}
+ bcast_hwaddr = nm_dhcp_client_get_broadcast_hw_addr (NM_DHCP_CLIENT (self));
+ bcast_hwaddr_arr = g_bytes_get_data (bcast_hwaddr, &bcast_hwaddr_len);
+
switch (arp_type) {
case ARPHRD_ETHER:
transport = N_DHCP4_TRANSPORT_ETHERNET;
@@ -1140,7 +1146,7 @@ nettools_create (NMDhcpNettools *self,
n_dhcp4_client_config_set_ifindex (config, nm_dhcp_client_get_ifindex (NM_DHCP_CLIENT (self)));
n_dhcp4_client_config_set_transport (config, transport);
n_dhcp4_client_config_set_mac (config, hwaddr_arr, hwaddr_len);
- n_dhcp4_client_config_set_broadcast_mac (config, (unsigned char[]){ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, }, ETH_ALEN); /* XXX */
+ n_dhcp4_client_config_set_broadcast_mac (config, bcast_hwaddr_arr, bcast_hwaddr_len);
r = n_dhcp4_client_config_set_client_id (config, client_id_arr, client_id_len);
if (r) {
nm_utils_error_set_errno (error, r, "failed to set client-id: %s");
diff --git a/src/nm-iface-helper.c b/src/nm-iface-helper.c
index c8f7d5ccc7..dd5bb327a0 100644
--- a/src/nm-iface-helper.c
+++ b/src/nm-iface-helper.c
@@ -381,6 +381,7 @@ main (int argc, char *argv[])
gs_unref_object NMDhcpClient *dhcp4_client = NULL;
gs_unref_object NMNDisc *ndisc = NULL;
gs_unref_bytes GBytes *hwaddr = NULL;
+ gs_unref_bytes GBytes *bcast_hwaddr = NULL;
gs_unref_bytes GBytes *client_id = NULL;
gs_free NMUtilsIPv6IfaceId *iid = NULL;
const NMPlatformLink *pllink;
@@ -471,8 +472,10 @@ main (int argc, char *argv[])
nm_linux_platform_setup ();
pllink = nm_platform_link_get (NM_PLATFORM_GET, gl.ifindex);
- if (pllink)
+ if (pllink) {
hwaddr = nmp_link_address_get_as_bytes (&pllink->l_address);
+ bcast_hwaddr = nmp_link_address_get_as_bytes (&pllink->l_broadcast);
+ }
if (global_opt.iid_str) {
GBytes *bytes;
@@ -508,6 +511,7 @@ main (int argc, char *argv[])
global_opt.ifname,
gl.ifindex,
hwaddr,
+ bcast_hwaddr,
global_opt.uuid,
RT_TABLE_MAIN,
global_opt.priority_v4,