diff options
Diffstat (limited to 'src/libsystemd')
-rw-r--r-- | src/libsystemd/dhcp-protocol.h | 1 | ||||
-rw-r--r-- | src/libsystemd/sd-dhcp-client.c | 47 |
2 files changed, 45 insertions, 3 deletions
diff --git a/src/libsystemd/dhcp-protocol.h b/src/libsystemd/dhcp-protocol.h index 76621f541b..abdfe8d54b 100644 --- a/src/libsystemd/dhcp-protocol.h +++ b/src/libsystemd/dhcp-protocol.h @@ -104,6 +104,7 @@ enum { DHCP_OPTION_DOMAIN_NAME_SERVER = 6, DHCP_OPTION_HOST_NAME = 12, DHCP_OPTION_DOMAIN_NAME = 15, + DHCP_OPTION_INTERFACE_MTU = 26, DHCP_OPTION_NTP_SERVER = 42, DHCP_OPTION_REQUESTED_IP_ADDRESS = 50, DHCP_OPTION_IP_ADDRESS_LEASE_TIME = 51, diff --git a/src/libsystemd/sd-dhcp-client.c b/src/libsystemd/sd-dhcp-client.c index 1df89dc651..76abcbd2ac 100644 --- a/src/libsystemd/sd-dhcp-client.c +++ b/src/libsystemd/sd-dhcp-client.c @@ -42,6 +42,7 @@ struct DHCPLease { be32_t subnet_mask; be32_t router; struct in_addr **dns; + uint16_t mtu; }; typedef struct DHCPLease DHCPLease; @@ -186,10 +187,10 @@ int sd_dhcp_client_get_address(sd_dhcp_client *client, struct in_addr *addr) return 0; } -int sd_dhcp_client_get_netmask(sd_dhcp_client *client, struct in_addr *addr) +int sd_dhcp_client_get_mtu(sd_dhcp_client *client, uint16_t *mtu) { assert_return(client, -EINVAL); - assert_return(addr, -EINVAL); + assert_return(mtu, -EINVAL); switch (client->state) { case DHCP_STATE_INIT: @@ -202,7 +203,10 @@ int sd_dhcp_client_get_netmask(sd_dhcp_client *client, struct in_addr *addr) case DHCP_STATE_BOUND: case DHCP_STATE_RENEWING: case DHCP_STATE_REBINDING: - addr->s_addr = client->lease->subnet_mask; + if (client->lease->mtu) + *mtu = client->lease->mtu; + else + return -ENOENT; break; } @@ -277,6 +281,30 @@ int sd_dhcp_client_get_router(sd_dhcp_client *client, struct in_addr *addr) return 0; } +int sd_dhcp_client_get_netmask(sd_dhcp_client *client, struct in_addr *addr) +{ + assert_return(client, -EINVAL); + assert_return(addr, -EINVAL); + + switch (client->state) { + case DHCP_STATE_INIT: + case DHCP_STATE_SELECTING: + case DHCP_STATE_INIT_REBOOT: + case DHCP_STATE_REBOOTING: + case DHCP_STATE_REQUESTING: + return -EADDRNOTAVAIL; + + case DHCP_STATE_BOUND: + case DHCP_STATE_RENEWING: + case DHCP_STATE_REBINDING: + addr->s_addr = client->lease->subnet_mask; + + break; + } + + return 0; +} + static int client_notify(sd_dhcp_client *client, int event) { if (client->cb) @@ -788,6 +816,19 @@ static int client_parse_offer(uint8_t code, uint8_t len, const uint8_t *option, break; + case DHCP_OPTION_INTERFACE_MTU: + if (len >= 2) { + be16_t mtu; + + memcpy(&mtu, option, 2); + lease->mtu = be16toh(mtu); + + if (lease->mtu < 68) + lease->mtu = 0; + } + + break; + case DHCP_OPTION_RENEWAL_T1_TIME: if (len == 4) { memcpy(&val, option, 4); |