On Fri, Jun 13, 2014 at 04:45:02PM +0300, Patrik Flykt wrote: > Implement the initial functionality used for creating a DHCPv6 Solicit > message containing the needed options and send it to the DHCPv6 > broadcast address. Increase the sent message count and ensure that > the Solicit Initial Retransmission Time is strictly greater than > the Solicitation IRT as described in RFC 3315, section 17.1.2. > --- > src/libsystemd-network/dhcp6-internal.h | 4 ++ > src/libsystemd-network/sd-dhcp6-client.c | 111 > +++++++++++++++++++++++++++++++ > 2 files changed, 115 insertions(+) > > diff --git a/src/libsystemd-network/dhcp6-internal.h > b/src/libsystemd-network/dhcp6-internal.h > index 7a491fb..31f5bd2 100644 > --- a/src/libsystemd-network/dhcp6-internal.h > +++ b/src/libsystemd-network/dhcp6-internal.h > @@ -27,6 +27,7 @@ > #include "sparse-endian.h" > #include "sd-event.h" > #include "list.h" > +#include "macro.h" > > typedef struct DHCP6Address DHCP6Address; > > @@ -69,3 +70,6 @@ int dhcp6_option_parse(uint8_t **buf, size_t *buflen, > uint16_t *optcode, > int dhcp6_network_bind_udp_socket(int index, struct in6_addr *address); > int dhcp6_network_send_udp_socket(int s, struct in6_addr *address, > const void *packet, size_t len); > + > +const char *dhcp6_message_type_to_string(int s) _const_; > +int dhcp6_message_type_from_string(const char *s) _pure_; > diff --git a/src/libsystemd-network/sd-dhcp6-client.c > b/src/libsystemd-network/sd-dhcp6-client.c > index 048b4ea..bdd9177 100644 > --- a/src/libsystemd-network/sd-dhcp6-client.c > +++ b/src/libsystemd-network/sd-dhcp6-client.c > @@ -48,6 +48,9 @@ struct sd_dhcp6_client { > struct ether_addr mac_addr; > icmp6_nd *ra; > DHCP6IA ia_na; > + be32_t transaction_id; > + int fd; > + sd_event_source *receive_message; > usec_t retransmit_time; > uint8_t retransmit_count; > sd_event_source *timeout_resend; > @@ -62,6 +65,24 @@ struct sd_dhcp6_client { > } _packed_ duid; > }; > > +const char * dhcp6_message_type_table[_DHCP6_MESSAGE_MAX] = { > + [DHCP6_SOLICIT] = "SOLICIT", > + [DHCP6_ADVERTISE] = "ADVERTISE", > + [DHCP6_REQUEST] = "REQUEST", > + [DHCP6_CONFIRM] = "CONFIRM", > + [DHCP6_RENEW] = "RENEW", > + [DHCP6_REBIND] = "REBIND", > + [DHCP6_REPLY] = "REPLY", > + [DHCP6_RELEASE] = "RELEASE", > + [DHCP6_DECLINE] = "DECLINE", > + [DHCP6_RECONFIGURE] = "RECONFIGURE", > + [DHCP6_INFORMATION_REQUEST] = "INFORMATION-REQUEST", > + [DHCP6_RELAY_FORW] = "RELAY-FORW", > + [DHCP6_RELAY_REPL] = "RELAY-REPL", > +}; > + > +DEFINE_STRING_TABLE_LOOKUP(dhcp6_message_type, int); > + > int sd_dhcp6_client_set_callback(sd_dhcp6_client *client, > sd_dhcp6_client_cb_t cb, void *userdata) > { > @@ -110,6 +131,15 @@ static int client_initialize(sd_dhcp6_client *client) > { > assert_return(client, -EINVAL); > > + client->receive_message = > + sd_event_source_unref(client->receive_message); > +
> + if (client->fd > 0) > + safe_close(client->fd); > + client->fd = -1; client->fd = safe_close(client->fd); That's what safe_close is for :) Zbyszek _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel