[systemd-commits] 3 commits - src/libsystemd-network src/network
Tom Gundersen
tomegun at kemper.freedesktop.org
Fri Apr 11 14:57:52 PDT 2014
src/libsystemd-network/sd-dhcp-client.c | 120 ++++++++++++++++++++++----------
src/network/networkd-link.c | 3
2 files changed, 87 insertions(+), 36 deletions(-)
New commits:
commit 702807365ee63f0929858ea26eeea593df4e51da
Author: Tom Gundersen <teg at jklm.no>
Date: Fri Apr 11 23:57:18 2014 +0200
networkd: add an assert
This error should never happen, so replace the check with an assert. The check
was anyway broken due to an uninitialized return value.
Reported by Thomas Hindoe Paaboel Andersen <phomes at gmail.com>.
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
index 684e1e5..31b4bef 100644
--- a/src/network/networkd-link.c
+++ b/src/network/networkd-link.c
@@ -1518,8 +1518,7 @@ int link_save(Link *link) {
assert(link->state_file);
state = link_state_to_string(link->state);
- if (!state)
- goto finish;
+ assert(state);
r = fopen_temporary(link->state_file, &f, &temp_path);
if (r < 0)
commit 50d6810ea8117bbfcf7007ae779d1a98a7300b5f
Author: Tom Gundersen <teg at jklm.no>
Date: Fri Apr 11 21:02:16 2014 +0200
sd-dhcp-client: document message creation a bit more
Also reshuffle some code to make the correspondence with the RFC a bit more
obvious.
Small functional change: fail if we try to send a message from the wrong state.
diff --git a/src/libsystemd-network/sd-dhcp-client.c b/src/libsystemd-network/sd-dhcp-client.c
index e690f67..0adcf13 100644
--- a/src/libsystemd-network/sd-dhcp-client.c
+++ b/src/libsystemd-network/sd-dhcp-client.c
@@ -261,12 +261,12 @@ static int client_message_init(sd_dhcp_client *client, DHCPMessage *message,
refuse to issue an DHCP lease if 'secs' is set to zero */
message->secs = htobe16(client->secs);
+ /* RFC2132 section 4.1.1:
+ The client MUST include its hardware address in the âchaddrâ field, if
+ necessary for delivery of DHCP reply messages.
+ */
memcpy(&message->chaddr, &client->client_id.mac_addr, ETH_ALEN);
- if (client->state == DHCP_STATE_RENEWING ||
- client->state == DHCP_STATE_REBINDING)
- message->ciaddr = client->lease->address;
-
/* Some DHCP servers will refuse to issue an DHCP lease if the Client
Identifier option is not set */
r = dhcp_option_append(opt, optlen, DHCP_OPTION_CLIENT_IDENTIFIER,
@@ -274,6 +274,15 @@ static int client_message_init(sd_dhcp_client *client, DHCPMessage *message,
if (r < 0)
return r;
+
+ /* RFC2131 section 3.5:
+ in its initial DHCPDISCOVER or DHCPREQUEST message, a
+ client may provide the server with a list of specific
+ parameters the client is interested in. If the client
+ includes a list of parameters in a DHCPDISCOVER message,
+ it MUST include that list in any subsequent DHCPREQUEST
+ messages.
+ */
r = dhcp_option_append(opt, optlen,
DHCP_OPTION_PARAMETER_REQUEST_LIST,
client->req_opts_size,
@@ -281,9 +290,14 @@ static int client_message_init(sd_dhcp_client *client, DHCPMessage *message,
if (r < 0)
return r;
- /* Some DHCP servers will send bigger DHCP packets than the
- defined default size unless the Maximum Messge Size option
- is explicitely set */
+ /* RFC2131 section 3.5:
+ The client SHOULD include the âmaximum DHCP message sizeâ option to
+ let the server know how large the server may make its DHCP messages.
+
+ Note (from ConnMan): Some DHCP servers will send bigger DHCP packets
+ than the defined default size unless the Maximum Messge Size option
+ is explicitely set
+ */
max_size = htobe16(DHCP_IP_UDP_SIZE + DHCP_MESSAGE_SIZE +
DHCP_MIN_OPTIONS_SIZE);
r = dhcp_option_append(opt, optlen,
@@ -312,6 +326,10 @@ static int client_send_discover(sd_dhcp_client *client) {
int r;
assert(client);
+ assert(client->state == DHCP_STATE_INIT ||
+ client->state == DHCP_STATE_SELECTING);
+
+ /* See RFC2131 section 4.4.1 */
r = sd_event_now(client->event, CLOCK_MONOTONIC, &time_now);
if (r < 0)
@@ -334,6 +352,12 @@ static int client_send_discover(sd_dhcp_client *client) {
if (r < 0)
return r;
+ /* the client may suggest values for the network address
+ and lease time in the DHCPDISCOVER message. The client may include
+ the ârequested IP addressâ option to suggest that a particular IP
+ address be assigned, and may include the âIP address lease timeâ
+ option to suggest the lease time it would like.
+ */
if (client->last_addr != INADDR_ANY) {
r = dhcp_option_append(&opt, &optlen,
DHCP_OPTION_REQUESTED_IP_ADDRESS,
@@ -346,6 +370,10 @@ static int client_send_discover(sd_dhcp_client *client) {
if (r < 0)
return r;
+ /* We currently ignore:
+ The client SHOULD wait a random time between one and ten seconds to
+ desynchronize the use of DHCP at startup.
+ */
r = dhcp_client_send_raw(client, discover, len - optlen);
if (r < 0)
return r;
@@ -374,38 +402,64 @@ static int client_send_request(sd_dhcp_client *client) {
return r;
switch (client->state) {
+ /* See RFC2131 section 4.3.2 (note that there is a typo in the RFC,
+ SELECTING should be REQUESTING)
+ */
+
+ case DHCP_STATE_REQUESTING:
+ /* Client inserts the address of the selected server in âserver
+ identifierâ, âciaddrâ MUST be zero, ârequested IP addressâ MUST be
+ filled in with the yiaddr value from the chosen DHCPOFFER.
+ */
- case DHCP_STATE_INIT_REBOOT:
r = dhcp_option_append(&opt, &optlen,
- DHCP_OPTION_REQUESTED_IP_ADDRESS,
- 4, &client->last_addr);
+ DHCP_OPTION_SERVER_IDENTIFIER,
+ 4, &client->lease->server_address);
if (r < 0)
return r;
- break;
- case DHCP_STATE_REQUESTING:
r = dhcp_option_append(&opt, &optlen,
DHCP_OPTION_REQUESTED_IP_ADDRESS,
4, &client->lease->address);
if (r < 0)
return r;
+ break;
+
+ case DHCP_STATE_INIT_REBOOT:
+ /* âserver identifierâ MUST NOT be filled in, ârequested IP addressâ
+ option MUST be filled in with clientâs notion of its previously
+ assigned address. âciaddrâ MUST be zero.
+ */
r = dhcp_option_append(&opt, &optlen,
- DHCP_OPTION_SERVER_IDENTIFIER,
- 4, &client->lease->server_address);
+ DHCP_OPTION_REQUESTED_IP_ADDRESS,
+ 4, &client->last_addr);
if (r < 0)
return r;
break;
- case DHCP_STATE_INIT:
- case DHCP_STATE_SELECTING:
- case DHCP_STATE_REBOOTING:
- case DHCP_STATE_BOUND:
case DHCP_STATE_RENEWING:
+ /* âserver identifierâ MUST NOT be filled in, ârequested IP addressâ
+ option MUST NOT be filled in, âciaddrâ MUST be filled in with
+ clientâs IP address.
+ */
+
+ /* fall through */
case DHCP_STATE_REBINDING:
+ /* âserver identifierâ MUST NOT be filled in, ârequested IP addressâ
+ option MUST NOT be filled in, âciaddrâ MUST be filled in with
+ clientâs IP address.
+
+ This message MUST be broadcast to the 0xffffffff IP broadcast address.
+ */
+ request->dhcp.ciaddr = client->lease->address;
break;
+ case DHCP_STATE_INIT:
+ case DHCP_STATE_SELECTING:
+ case DHCP_STATE_REBOOTING:
+ case DHCP_STATE_BOUND:
case DHCP_STATE_STOPPED:
return -EINVAL;
}
commit 8a9e761600d0d44bcc2e665e4fe1fda30e3e4749
Author: Tom Gundersen <teg at jklm.no>
Date: Fri Apr 11 19:54:04 2014 +0200
sd-dhcp-client: assert that we can only create DISCOVER or REQUEST messages
diff --git a/src/libsystemd-network/sd-dhcp-client.c b/src/libsystemd-network/sd-dhcp-client.c
index 4be37a2..e690f67 100644
--- a/src/libsystemd-network/sd-dhcp-client.c
+++ b/src/libsystemd-network/sd-dhcp-client.c
@@ -242,6 +242,7 @@ static sd_dhcp_client *client_stop(sd_dhcp_client *client, int error) {
static int client_message_init(sd_dhcp_client *client, DHCPMessage *message,
uint8_t type, uint8_t **opt, size_t *optlen) {
+ be16_t max_size;
int r;
assert(client);
@@ -249,6 +250,7 @@ static int client_message_init(sd_dhcp_client *client, DHCPMessage *message,
assert(message);
assert(opt);
assert(optlen);
+ assert(type == DHCP_DISCOVER || type == DHCP_REQUEST);
r = dhcp_message_init(message, BOOTREQUEST, client->xid, type, opt,
optlen);
@@ -272,27 +274,23 @@ static int client_message_init(sd_dhcp_client *client, DHCPMessage *message,
if (r < 0)
return r;
- if (type == DHCP_DISCOVER || type == DHCP_REQUEST) {
- be16_t max_size;
-
- r = dhcp_option_append(opt, optlen,
- DHCP_OPTION_PARAMETER_REQUEST_LIST,
- client->req_opts_size,
- client->req_opts);
- if (r < 0)
- return r;
+ r = dhcp_option_append(opt, optlen,
+ DHCP_OPTION_PARAMETER_REQUEST_LIST,
+ client->req_opts_size,
+ client->req_opts);
+ if (r < 0)
+ return r;
- /* Some DHCP servers will send bigger DHCP packets than the
- defined default size unless the Maximum Messge Size option
- is explicitely set */
- max_size = htobe16(DHCP_IP_UDP_SIZE + DHCP_MESSAGE_SIZE +
- DHCP_MIN_OPTIONS_SIZE);
- r = dhcp_option_append(opt, optlen,
- DHCP_OPTION_MAXIMUM_MESSAGE_SIZE,
- 2, &max_size);
- if (r < 0)
- return r;
- }
+ /* Some DHCP servers will send bigger DHCP packets than the
+ defined default size unless the Maximum Messge Size option
+ is explicitely set */
+ max_size = htobe16(DHCP_IP_UDP_SIZE + DHCP_MESSAGE_SIZE +
+ DHCP_MIN_OPTIONS_SIZE);
+ r = dhcp_option_append(opt, optlen,
+ DHCP_OPTION_MAXIMUM_MESSAGE_SIZE,
+ 2, &max_size);
+ if (r < 0)
+ return r;
return 0;
}
More information about the systemd-commits
mailing list