X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Flibsystemd%2Fsd-dhcp-client.c;h=76abcbd2ac9d08d9a4da3cd7597973b91f15415c;hp=edfcb54a4c7b4762d219c63934eae8b661c631d5;hb=4f882b2a5007e51032459e29d15a86df6b5ea9f4;hpb=c813ca40c859ff8abc8bc6aabc3f1e896623eb67 diff --git a/src/libsystemd/sd-dhcp-client.c b/src/libsystemd/sd-dhcp-client.c index edfcb54a4..76abcbd2a 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) @@ -783,7 +811,20 @@ static int client_parse_offer(uint8_t code, uint8_t len, const uint8_t *option, memcpy(&lease->dns[i]->s_addr, option + 4 * i, 4); } - lease->dns[i + 1] = NULL; + lease->dns[len / 4] = NULL; + } + + 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;