blob: 6007ccabe6615e6d9a3dd33281f682b02c2b8b74 [file] [log] [blame]
#ifndef _GPXE_DHCPPKT_H
#define _GPXE_DHCPPKT_H
/** @file
*
* DHCP packets
*
*/
FILE_LICENCE ( GPL2_OR_LATER );
#include <gpxe/dhcp.h>
#include <gpxe/dhcpopts.h>
#include <gpxe/refcnt.h>
/**
* A DHCP packet
*
*/
struct dhcp_packet {
/** Reference counter */
struct refcnt refcnt;
/** The DHCP packet contents */
struct dhcphdr *dhcphdr;
/** Maximum length of the DHCP packet buffer */
size_t max_len;
/** Used length of the DHCP packet buffer */
size_t len;
/** DHCP options */
struct dhcp_options options;
/** Settings interface */
struct settings settings;
};
/**
* Increment reference count on DHCP packet
*
* @v dhcppkt DHCP packet
* @ret dhcppkt DHCP packet
*/
static inline __attribute__ (( always_inline )) struct dhcp_packet *
dhcppkt_get ( struct dhcp_packet *dhcppkt ) {
ref_get ( &dhcppkt->refcnt );
return dhcppkt;
}
/**
* Decrement reference count on DHCP packet
*
* @v dhcppkt DHCP packet
*/
static inline __attribute__ (( always_inline )) void
dhcppkt_put ( struct dhcp_packet *dhcppkt ) {
ref_put ( &dhcppkt->refcnt );
}
extern int dhcppkt_store ( struct dhcp_packet *dhcppkt, unsigned int tag,
const void *data, size_t len );
extern int dhcppkt_fetch ( struct dhcp_packet *dhcppkt, unsigned int tag,
void *data, size_t len );
extern void dhcppkt_init ( struct dhcp_packet *dhcppkt,
struct dhcphdr *data, size_t len );
#endif /* _GPXE_DHCPPKT_H */