summaryrefslogtreecommitdiff
path: root/src/libsystemd
diff options
context:
space:
mode:
Diffstat (limited to 'src/libsystemd')
-rw-r--r--src/libsystemd/dhcp-protocol.h1
-rw-r--r--src/libsystemd/sd-dhcp-client.c47
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);