log_debug_link(link, "offering DHCPv4 leases");
- r = sd_dhcp_server_set_address(link->dhcp_server, &address->in_addr.in);
+ r = sd_dhcp_server_set_address(link->dhcp_server, &address->in_addr.in, address->prefixlen);
if (r < 0)
return r;
return r;
}
- prefixlen = net_netmask_to_prefixlen(&netmask);
+ prefixlen = in_addr_netmask_to_prefixlen(&netmask);
r = address_new_dynamic(&address);
if (r < 0) {
sd_dhcp_lease_get_address(link->dhcp_lease, &addr);
sd_dhcp_lease_get_netmask(link->dhcp_lease, &netmask);
- prefixlen = net_netmask_to_prefixlen(&netmask);
+ prefixlen = in_addr_netmask_to_prefixlen(&netmask);
address->family = AF_INET;
address->in_addr.in = addr;
return r;
}
- prefixlen = net_netmask_to_prefixlen(&netmask);
+ prefixlen = in_addr_netmask_to_prefixlen(&netmask);
r = sd_dhcp_lease_get_router(lease, &gateway);
if (r < 0 && r != -ENOENT) {
if (r < 0)
return r;
+ if (link->mtu) {
+ r = sd_dhcp_client_set_mtu(link->dhcp_client, link->mtu);
+ if (r < 0)
+ return r;
+ }
+
if (link->network->dhcp_mtu) {
r = sd_dhcp_client_set_request_option(link->dhcp_client, DHCP_OPTION_INTERFACE_MTU);
if (r < 0)
int link_update(Link *link, sd_rtnl_message *m) {
struct ether_addr mac;
const char *ifname;
+ uint32_t mtu;
int r;
assert(link);
return -ENOMEM;
}
- if (!link->original_mtu) {
- r = sd_rtnl_message_read_u16(m, IFLA_MTU, &link->original_mtu);
- if (r >= 0)
+ r = sd_rtnl_message_read_u32(m, IFLA_MTU, &mtu);
+ if (r >= 0 && mtu > 0) {
+ link->mtu = mtu;
+ if (!link->original_mtu) {
+ link->original_mtu = mtu;
log_debug_link(link, "saved original MTU: %"
- PRIu16, link->original_mtu);
+ PRIu32, link->original_mtu);
+ }
+
+ if (link->dhcp_client) {
+ r = sd_dhcp_client_set_mtu(link->dhcp_client, link->mtu);
+ if (r < 0) {
+ log_warning_link(link, "Could not update MTU in DHCP client: %s",
+ strerror(-r));
+ return r;
+ }
+ }
}
/* The kernel may broadcast NEWLINK messages without the MAC address
(address + 1 ? " " : ""));
fputs("\n", f);
+
+ fprintf(f, "LLMNR=%s\n", llmnr_support_to_string(link->network->llmnr));
}
if (link->dhcp_lease) {
};
DEFINE_STRING_TABLE_LOOKUP(link_operstate, LinkOperationalState);
-
-static const char* const dhcp_support_table[_DHCP_SUPPORT_MAX] = {
- [DHCP_SUPPORT_NONE] = "none",
- [DHCP_SUPPORT_BOTH] = "both",
- [DHCP_SUPPORT_V4] = "v4",
- [DHCP_SUPPORT_V6] = "v6",
-};
-
-DEFINE_STRING_TABLE_LOOKUP(dhcp_support, DHCPSupport);
-
-int config_parse_dhcp(
- const char* unit,
- const char *filename,
- unsigned line,
- const char *section,
- unsigned section_line,
- const char *lvalue,
- int ltype,
- const char *rvalue,
- void *data,
- void *userdata) {
-
- DHCPSupport *dhcp = data;
- int k;
-
- assert(filename);
- assert(lvalue);
- assert(rvalue);
- assert(data);
-
- /* Our enum shall be a superset of booleans, hence first try
- * to parse as boolean, and then as enum */
-
- k = parse_boolean(rvalue);
- if (k > 0)
- *dhcp = DHCP_SUPPORT_BOTH;
- else if (k == 0)
- *dhcp = DHCP_SUPPORT_NONE;
- else {
- DHCPSupport s;
-
- s = dhcp_support_from_string(rvalue);
- if (s < 0){
- log_syntax(unit, LOG_ERR, filename, line, -s, "Failed to parse DHCP option, ignoring: %s", rvalue);
- return 0;
- }
-
- *dhcp = s;
- }
-
- return 0;
-}