From: Patrik Flykt Date: Thu, 19 Jun 2014 12:39:45 +0000 (+0300) Subject: sd-dhcp6-lease: Add functions for accessing lease and addresses X-Git-Tag: v215~310 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=ea3b3a75abb3f8b853f7da454b9b8e258a120eea;ds=sidebyside sd-dhcp6-lease: Add functions for accessing lease and addresses Add support functions for accessing the current client lease as well as iterating over the addresses and get their preferred and valid lifetimes. --- diff --git a/src/libsystemd-network/dhcp6-lease-internal.h b/src/libsystemd-network/dhcp6-lease-internal.h index f4f1488f4..295c22320 100644 --- a/src/libsystemd-network/dhcp6-lease-internal.h +++ b/src/libsystemd-network/dhcp6-lease-internal.h @@ -37,6 +37,8 @@ struct sd_dhcp6_lease { uint8_t preference; DHCP6IA ia; + + DHCP6Address *addr_iter; }; int dhcp6_lease_clear_timers(DHCP6IA *ia); diff --git a/src/libsystemd-network/sd-dhcp6-client.c b/src/libsystemd-network/sd-dhcp6-client.c index 431801d6f..65679b730 100644 --- a/src/libsystemd-network/sd-dhcp6-client.c +++ b/src/libsystemd-network/sd-dhcp6-client.c @@ -129,6 +129,18 @@ int sd_dhcp6_client_set_mac(sd_dhcp6_client *client, return 0; } +int sd_dhcp6_client_get_lease(sd_dhcp6_client *client, sd_dhcp6_lease **ret) { + assert_return(client, -EINVAL); + assert_return(ret, -EINVAL); + + if (!client->lease) + return -ENOMSG; + + *ret = sd_dhcp6_lease_ref(client->lease); + + return 0; +} + static sd_dhcp6_client *client_notify(sd_dhcp6_client *client, int event) { if (client->cb) { client = sd_dhcp6_client_ref(client); diff --git a/src/libsystemd-network/sd-dhcp6-lease.c b/src/libsystemd-network/sd-dhcp6-lease.c index 41d6a5aa1..cbda7d8c8 100644 --- a/src/libsystemd-network/sd-dhcp6-lease.c +++ b/src/libsystemd-network/sd-dhcp6-lease.c @@ -105,6 +105,45 @@ int dhcp6_lease_get_iaid(sd_dhcp6_lease *lease, be32_t *iaid) { return 0; } +int sd_dhcp6_lease_get_next_address(sd_dhcp6_lease *lease, + struct in6_addr *addr, + uint32_t *lifetime_preferred, + uint32_t *lifetime_valid) { + assert_return(lease, -EINVAL); + assert_return(addr, -EINVAL); + assert_return(lifetime_preferred, -EINVAL); + assert_return(lifetime_valid, -EINVAL); + + if (!lease->addr_iter) + return -ENOMSG; + + memcpy(addr, &lease->addr_iter->address, sizeof(struct in6_addr)); + *lifetime_preferred = be32toh(lease->addr_iter->lifetime_preferred); + *lifetime_valid = be32toh(lease->addr_iter->lifetime_valid); + + lease->addr_iter = lease->addr_iter->addresses_next; + + return 0; +} + +int sd_dhcp6_lease_get_first_address(sd_dhcp6_lease *lease, + struct in6_addr *addr, + uint32_t *lifetime_preferred, + uint32_t *lifetime_valid) { + assert_return(lease, -EINVAL); + assert_return(addr, -EINVAL); + assert_return(lifetime_preferred, -EINVAL); + assert_return(lifetime_valid, -EINVAL); + + if (!lease->ia.addresses) + return -ENOMSG; + + lease->addr_iter = lease->ia.addresses; + + return sd_dhcp6_lease_get_next_address(lease, addr, lifetime_preferred, + lifetime_valid); +} + sd_dhcp6_lease *sd_dhcp6_lease_ref(sd_dhcp6_lease *lease) { if (lease) assert_se(REFCNT_INC(lease->n_ref) >= 2); diff --git a/src/systemd/sd-dhcp6-client.h b/src/systemd/sd-dhcp6-client.h index 72267f908..92ea8b883 100644 --- a/src/systemd/sd-dhcp6-client.h +++ b/src/systemd/sd-dhcp6-client.h @@ -26,6 +26,8 @@ #include "sd-event.h" +#include "sd-dhcp6-lease.h" + enum { DHCP6_EVENT_STOP = 0, DHCP6_EVENT_RESEND_EXPIRE = 10, @@ -43,6 +45,8 @@ int sd_dhcp6_client_set_index(sd_dhcp6_client *client, int interface_index); int sd_dhcp6_client_set_mac(sd_dhcp6_client *client, const struct ether_addr *mac_addr); +int sd_dhcp6_client_get_lease(sd_dhcp6_client *client, sd_dhcp6_lease **ret); + int sd_dhcp6_client_stop(sd_dhcp6_client *client); int sd_dhcp6_client_start(sd_dhcp6_client *client); int sd_dhcp6_client_attach_event(sd_dhcp6_client *client, sd_event *event, diff --git a/src/systemd/sd-dhcp6-lease.h b/src/systemd/sd-dhcp6-lease.h index 0b2765cbe..1126f1ac2 100644 --- a/src/systemd/sd-dhcp6-lease.h +++ b/src/systemd/sd-dhcp6-lease.h @@ -23,8 +23,19 @@ along with systemd; If not, see . ***/ +#include + typedef struct sd_dhcp6_lease sd_dhcp6_lease; +int sd_dhcp6_lease_get_first_address(sd_dhcp6_lease *lease, + struct in6_addr *addr, + uint32_t *lifetime_preferred, + uint32_t *lifetime_valid); +int sd_dhcp6_lease_get_next_address(sd_dhcp6_lease *lease, + struct in6_addr *addr, + uint32_t *lifetime_preferred, + uint32_t *lifetime_valid); + sd_dhcp6_lease *sd_dhcp6_lease_ref(sd_dhcp6_lease *lease); sd_dhcp6_lease *sd_dhcp6_lease_unref(sd_dhcp6_lease *lease);