1
0
mirror of https://github.com/systemd/systemd.git synced 2025-02-18 21:57:48 +03:00

network/dhcp4: add support for ARPHRD_RAWIP and ARPHRD_NONE network interface types

This should fix QMI wwan modems, as noted in
https://github.com/systemd/systemd/issues/27219
This commit is contained in:
Darsey Litzenberger 2024-10-09 13:55:42 -06:00 committed by Yu Watanabe
parent 67226c3cb1
commit 4bc7a54d75
2 changed files with 33 additions and 2 deletions

View File

@ -273,6 +273,35 @@ int sd_dhcp_client_set_mac(
assert_return(client, -EINVAL);
assert_return(!sd_dhcp_client_is_running(client), -EBUSY);
assert_return(IN_SET(arp_type, ARPHRD_ETHER, ARPHRD_INFINIBAND, ARPHRD_RAWIP, ARPHRD_NONE), -EINVAL);
static const uint8_t default_eth_bcast[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff },
default_eth_hwaddr[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
switch (arp_type) {
case ARPHRD_RAWIP:
case ARPHRD_NONE:
/* Linux cellular modem drivers (e.g. qmi_wwan) present a
* network interface of type ARPHRD_RAWIP(519) or
* ARPHRD_NONE(65534) when in point-to-point mode, but these
* are not valid DHCP hardware-type values.
*
* Apparently, it's best to just pretend that these are ethernet
* devices. Other approaches have been tried, but resulted in
* incompatibilities with some server software. See
* https://lore.kernel.org/netdev/cover.1228948072.git.inaky@linux.intel.com/
*/
arp_type = ARPHRD_ETHER;
if (addr_len == 0) {
assert_cc(sizeof(default_eth_hwaddr) == ETH_ALEN);
assert_cc(sizeof(default_eth_bcast) == ETH_ALEN);
hw_addr = default_eth_hwaddr;
bcast_addr = default_eth_bcast;
addr_len = ETH_ALEN;
}
break;
}
assert_return(IN_SET(arp_type, ARPHRD_ETHER, ARPHRD_INFINIBAND), -EINVAL);
assert_return(hw_addr, -EINVAL);
assert_return(addr_len == (arp_type == ARPHRD_ETHER ? ETH_ALEN : INFINIBAND_ALEN), -EINVAL);

View File

@ -53,8 +53,10 @@ bool link_dhcp_enabled(Link *link, int family) {
assert(link);
assert(IN_SET(family, AF_INET, AF_INET6));
/* Currently, sd-dhcp-client supports only ethernet and infiniband. */
if (family == AF_INET && !IN_SET(link->iftype, ARPHRD_ETHER, ARPHRD_INFINIBAND))
/* Currently, sd-dhcp-client supports only ethernet and infiniband.
* (ARMHRD_RAWIP and ARMHRD_NONE are typically wwan modems and will be
* treated as ethernet devices.) */
if (family == AF_INET && !IN_SET(link->iftype, ARPHRD_ETHER, ARPHRD_INFINIBAND, ARPHRD_RAWIP, ARPHRD_NONE))
return false;
if (family == AF_INET6 && !socket_ipv6_is_supported())