summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Gundersen <teg@jklm.no>2014-03-21 18:36:32 +0100
committerTom Gundersen <teg@jklm.no>2014-03-21 18:36:32 +0100
commit4644fee04fb515787bcfbba53b3cabe58c81d317 (patch)
tree281ec9f90238811bf30460db1ae54b734041718f /src
parent9765ce69e15fd294db9553777b621515fa57f2c6 (diff)
sd-dhcp-client/sd-ipv4ll: allow mac address to be updated at any time
If necessary, restart the clients to deal with a changing mac address at runtime. This will solve the problem of starting clients on bridges before they have received their final MAC address.
Diffstat (limited to 'src')
-rw-r--r--src/libsystemd-network/sd-dhcp-client.c24
-rw-r--r--src/libsystemd-network/sd-ipv4ll.c19
2 files changed, 32 insertions, 11 deletions
diff --git a/src/libsystemd-network/sd-dhcp-client.c b/src/libsystemd-network/sd-dhcp-client.c
index 59cd30c606..0728a15550 100644
--- a/src/libsystemd-network/sd-dhcp-client.c
+++ b/src/libsystemd-network/sd-dhcp-client.c
@@ -143,21 +143,27 @@ int sd_dhcp_client_set_index(sd_dhcp_client *client, int interface_index) {
int sd_dhcp_client_set_mac(sd_dhcp_client *client,
const struct ether_addr *addr) {
+ bool need_restart = false;
+
assert_return(client, -EINVAL);
- assert_return(client->state == DHCP_STATE_INIT, -EBUSY);
+ assert_return(addr, -EINVAL);
+
+ if (memcmp(&client->client_id.mac_addr, addr, ETH_ALEN) == 0)
+ return 0;
- log_dhcp_client(client, "set MAC address to "
- "%02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx",
- addr->ether_addr_octet[0],
- addr->ether_addr_octet[1],
- addr->ether_addr_octet[2],
- addr->ether_addr_octet[3],
- addr->ether_addr_octet[4],
- addr->ether_addr_octet[5]);
+ if (client->state != DHCP_STATE_INIT) {
+ log_dhcp_client(client, "Changing MAC address on running DHCP "
+ "client, restarting");
+ sd_dhcp_client_stop(client);
+ need_restart = true;
+ }
memcpy(&client->client_id.mac_addr, addr, ETH_ALEN);
client->client_id.type = 0x01;
+ if (need_restart)
+ sd_dhcp_client_start(client);
+
return 0;
}
diff --git a/src/libsystemd-network/sd-ipv4ll.c b/src/libsystemd-network/sd-ipv4ll.c
index 689dce9adf..ad8b4e3b43 100644
--- a/src/libsystemd-network/sd-ipv4ll.c
+++ b/src/libsystemd-network/sd-ipv4ll.c
@@ -375,10 +375,25 @@ int sd_ipv4ll_set_index(sd_ipv4ll *ll, int interface_index) {
}
int sd_ipv4ll_set_mac(sd_ipv4ll *ll, const struct ether_addr *addr) {
+ bool need_restart = false;
+
assert_return(ll, -EINVAL);
- assert_return(ll->state == IPV4LL_STATE_INIT, -EBUSY);
+ assert_return(addr, -EINVAL);
+
+ if (memcmp(&ll->mac_addr, addr, ETH_ALEN) == 0)
+ return 0;
+
+ if (ll->state != IPV4LL_STATE_INIT) {
+ log_ipv4ll(ll, "Changing MAC address on running IPv4LL "
+ "client, restarting");
+ sd_ipv4ll_stop(ll);
+ need_restart = true;
+ }
+
+ memcpy(&ll->mac_addr, addr, ETH_ALEN);
- memcpy(&ll->mac_addr.ether_addr_octet, addr, ETH_ALEN);
+ if (need_restart)
+ sd_ipv4ll_start(ll);
return 0;
}