#ifndef _S_DHCPLEASE_H
#define _S_DHCPLEASE_H
#include <stdbool.h>
#include <stdint.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/udp.h>
#include "dhcplib.h"
#include "timer.h"
#include "interfaces.h"
#include "arp_session.h"
typedef struct {
bool tentative;
bool nak;
struct in_addr our_ip;
absolute_time_t lease_start;
dhcp_lease_time_t lease_length;
struct in_addr router_ip;
uint8_t router_hwaddr[MAX_LINK_ADDR_LEN];
int router_hwaddr_length;
CFStringRef ssid;
int pkt_length;
uint8_t pkt[1];
} DHCPLease, * DHCPLeaseRef;
typedef dynarray_t DHCPLeaseList, * DHCPLeaseListRef;
void
DHCPLeaseSetNAK(DHCPLeaseRef lease_p, int nak);
void
DHCPLeaseListInit(DHCPLeaseListRef list_p);
void
DHCPLeaseListFree(DHCPLeaseListRef list_p);
void
DHCPLeaseListClear(DHCPLeaseListRef list_p,
const char * ifname,
uint8_t cid_type, const void * cid, int cid_length);
void
DHCPLeaseListRemoveLease(DHCPLeaseListRef list_p,
struct in_addr our_ip,
struct in_addr router_ip,
const uint8_t * router_hwaddr,
int router_hwaddr_length);
void
DHCPLeaseListUpdateLease(DHCPLeaseListRef list_p,
struct in_addr our_ip,
struct in_addr router_ip,
const uint8_t * router_hwaddr,
int router_hwaddr_length,
absolute_time_t lease_start,
dhcp_lease_time_t lease_length,
const uint8_t * pkt, int pkt_length,
CFStringRef ssid);
arp_address_info_t *
DHCPLeaseListCopyARPAddressInfo(DHCPLeaseListRef list_p,
CFStringRef ssid,
absolute_time_t * start_threshold_p,
bool tentative_ok,
int * ret_count);
void
DHCPLeaseListWrite(DHCPLeaseListRef list_p,
const char * ifname,
uint8_t cid_type, const void * cid, int cid_length);
void
DHCPLeaseListRead(DHCPLeaseListRef list_p,
const char * ifname, bool is_wifi,
uint8_t cid_type, const void * cid, int cid_length);
int
DHCPLeaseListFindLease(DHCPLeaseListRef list_p, struct in_addr our_ip,
struct in_addr router_ip,
const uint8_t * router_hwaddr, int router_hwaddr_length);
static __inline__ int
DHCPLeaseListCount(DHCPLeaseListRef list_p)
{
return (dynarray_count(list_p));
}
static __inline__ DHCPLeaseRef
DHCPLeaseListElement(DHCPLeaseListRef list_p, int i)
{
return (dynarray_element(list_p, i));
}
void
DHCPLeaseListRemoveAllButLastLease(DHCPLeaseListRef list_p);
#endif