mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-03-10 00:58:20 +03:00
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:
parent
631bbe7129
commit
ea3b3a75ab
@ -37,6 +37,8 @@ struct sd_dhcp6_lease {
|
|||||||
uint8_t preference;
|
uint8_t preference;
|
||||||
|
|
||||||
DHCP6IA ia;
|
DHCP6IA ia;
|
||||||
|
|
||||||
|
DHCP6Address *addr_iter;
|
||||||
};
|
};
|
||||||
|
|
||||||
int dhcp6_lease_clear_timers(DHCP6IA *ia);
|
int dhcp6_lease_clear_timers(DHCP6IA *ia);
|
||||||
|
@ -129,6 +129,18 @@ int sd_dhcp6_client_set_mac(sd_dhcp6_client *client,
|
|||||||
return 0;
|
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) {
|
static sd_dhcp6_client *client_notify(sd_dhcp6_client *client, int event) {
|
||||||
if (client->cb) {
|
if (client->cb) {
|
||||||
client = sd_dhcp6_client_ref(client);
|
client = sd_dhcp6_client_ref(client);
|
||||||
|
@ -105,6 +105,45 @@ int dhcp6_lease_get_iaid(sd_dhcp6_lease *lease, be32_t *iaid) {
|
|||||||
return 0;
|
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) {
|
sd_dhcp6_lease *sd_dhcp6_lease_ref(sd_dhcp6_lease *lease) {
|
||||||
if (lease)
|
if (lease)
|
||||||
assert_se(REFCNT_INC(lease->n_ref) >= 2);
|
assert_se(REFCNT_INC(lease->n_ref) >= 2);
|
||||||
|
@ -26,6 +26,8 @@
|
|||||||
|
|
||||||
#include "sd-event.h"
|
#include "sd-event.h"
|
||||||
|
|
||||||
|
#include "sd-dhcp6-lease.h"
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
DHCP6_EVENT_STOP = 0,
|
DHCP6_EVENT_STOP = 0,
|
||||||
DHCP6_EVENT_RESEND_EXPIRE = 10,
|
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,
|
int sd_dhcp6_client_set_mac(sd_dhcp6_client *client,
|
||||||
const struct ether_addr *mac_addr);
|
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_stop(sd_dhcp6_client *client);
|
||||||
int sd_dhcp6_client_start(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,
|
int sd_dhcp6_client_attach_event(sd_dhcp6_client *client, sd_event *event,
|
||||||
|
@ -23,8 +23,19 @@
|
|||||||
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
along with systemd; If not, see <http://www.gnu.org/licenses/>.
|
||||||
***/
|
***/
|
||||||
|
|
||||||
|
#include <netinet/in.h>
|
||||||
|
|
||||||
typedef struct sd_dhcp6_lease sd_dhcp6_lease;
|
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_ref(sd_dhcp6_lease *lease);
|
||||||
sd_dhcp6_lease *sd_dhcp6_lease_unref(sd_dhcp6_lease *lease);
|
sd_dhcp6_lease *sd_dhcp6_lease_unref(sd_dhcp6_lease *lease);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user