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.
This commit is contained in:
Patrik Flykt 2014-06-19 15:39:45 +03:00
parent 631bbe7129
commit ea3b3a75ab
5 changed files with 68 additions and 0 deletions

View file

@ -37,6 +37,8 @@ struct sd_dhcp6_lease {
uint8_t preference;
DHCP6IA ia;
DHCP6Address *addr_iter;
};
int dhcp6_lease_clear_timers(DHCP6IA *ia);

View file

@ -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);

View file

@ -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);

View file

@ -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,

View file

@ -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);