diff options
author | Patrik Flykt <patrik.flykt@linux.intel.com> | 2014-06-19 14:39:45 +0200 |
---|---|---|
committer | Patrik Flykt <patrik.flykt@linux.intel.com> | 2014-06-19 14:44:44 +0200 |
commit | ea3b3a75abb3f8b853f7da454b9b8e258a120eea (patch) | |
tree | 82d44fc73fc8c36cced35de7e70d152a629fb8d0 /src | |
parent | sd-dhcp6-client: Receive and parse Advertise messages (diff) | |
download | systemd-ea3b3a75abb3f8b853f7da454b9b8e258a120eea.tar.xz systemd-ea3b3a75abb3f8b853f7da454b9b8e258a120eea.zip |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/libsystemd-network/dhcp6-lease-internal.h | 2 | ||||
-rw-r--r-- | src/libsystemd-network/sd-dhcp6-client.c | 12 | ||||
-rw-r--r-- | src/libsystemd-network/sd-dhcp6-lease.c | 39 | ||||
-rw-r--r-- | src/systemd/sd-dhcp6-client.h | 4 | ||||
-rw-r--r-- | src/systemd/sd-dhcp6-lease.h | 11 |
5 files changed, 68 insertions, 0 deletions
diff --git a/src/libsystemd-network/dhcp6-lease-internal.h b/src/libsystemd-network/dhcp6-lease-internal.h index f4f1488f4d..295c223207 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 431801d6f0..65679b7301 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 41d6a5aa1a..cbda7d8c84 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 72267f908c..92ea8b8832 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 0b2765cbe5..1126f1ac2e 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 <http://www.gnu.org/licenses/>. ***/ +#include <netinet/in.h> + 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); |