dhcppkt.h File Reference

DHCP packets. More...

#include <gpxe/dhcp.h>
#include <gpxe/dhcpopts.h>
#include <gpxe/refcnt.h>

Go to the source code of this file.

Data Structures

struct  dhcp_packet
 A DHCP packet. More...

Functions

 FILE_LICENCE (GPL2_OR_LATER)
static struct dhcp_packetdhcppkt_get (struct dhcp_packet *dhcppkt)
 Increment reference count on DHCP packet.
static void dhcppkt_put (struct dhcp_packet *dhcppkt)
 Decrement reference count on DHCP packet.
int dhcppkt_store (struct dhcp_packet *dhcppkt, unsigned int tag, const void *data, size_t len)
 Store value of DHCP packet setting.
int dhcppkt_fetch (struct dhcp_packet *dhcppkt, unsigned int tag, void *data, size_t len)
 Fetch value of DHCP packet setting.
void dhcppkt_init (struct dhcp_packet *dhcppkt, struct dhcphdr *data, size_t len)
 Initialise DHCP packet.


Detailed Description

DHCP packets.

Definition in file dhcppkt.h.


Function Documentation

FILE_LICENCE ( GPL2_OR_LATER   ) 

static struct dhcp_packet* dhcppkt_get ( struct dhcp_packet dhcppkt  )  [static, read]

Increment reference count on DHCP packet.

Parameters:
dhcppkt DHCP packet
Return values:
dhcppkt DHCP packet

Definition at line 42 of file dhcppkt.h.

References ref_get().

Referenced by dhcp_rx_offer().

00042                                             {
00043         ref_get ( &dhcppkt->refcnt );
00044         return dhcppkt;
00045 }

static void dhcppkt_put ( struct dhcp_packet dhcppkt  )  [inline, static]

Decrement reference count on DHCP packet.

Parameters:
dhcppkt DHCP packet

Definition at line 53 of file dhcppkt.h.

References ref_put().

Referenced by dhcp_deliver_iob(), dhcp_free(), dhcp_rx_offer(), and store_cached_dhcpack().

00053                                             {
00054         ref_put ( &dhcppkt->refcnt );
00055 }

int dhcppkt_store ( struct dhcp_packet dhcppkt,
unsigned int  tag,
const void *  data,
size_t  len 
)

Store value of DHCP packet setting.

Parameters:
dhcppkt DHCP packet
tag Setting tag number
data Setting data, or NULL to clear setting
len Length of setting data
Return values:
rc Return status code

Definition at line 146 of file dhcppkt.c.

References dhcp_packet_field(), dhcp_packet::dhcphdr, dhcpopt_store(), ENOSPC, find_dhcp_packet_field(), dhcp_options::len, dhcp_packet::len, dhcp_packet_field::len, memcpy, memset(), NULL, offsetof, options, and dhcp_packet::options.

Referenced by copy_encap_settings(), dhcp_create_packet(), dhcp_create_request(), dhcp_proxy_tx(), dhcp_pxebs_tx(), dhcp_request_tx(), and dhcppkt_settings_store().

00147                                                    {
00148         struct dhcp_packet_field *field;
00149         void *field_data;
00150         int rc;
00151 
00152         /* If this is a special field, fill it in */
00153         if ( ( field = find_dhcp_packet_field ( tag ) ) != NULL ) {
00154                 if ( len > field->len )
00155                         return -ENOSPC;
00156                 field_data = dhcp_packet_field ( dhcppkt->dhcphdr, field );
00157                 memset ( field_data, 0, field->len );
00158                 memcpy ( dhcp_packet_field ( dhcppkt->dhcphdr, field ),
00159                          data, len );
00160                 /* Erase any equivalent option from the options block */
00161                 dhcpopt_store ( &dhcppkt->options, tag, NULL, 0 );
00162                 return 0;
00163         }
00164 
00165         /* Otherwise, use the generic options block */
00166         rc = dhcpopt_store ( &dhcppkt->options, tag, data, len );
00167 
00168         /* Update our used-length field */
00169         dhcppkt->len = ( offsetof ( struct dhcphdr, options ) +
00170                          dhcppkt->options.len );
00171 
00172         return rc;
00173 }

int dhcppkt_fetch ( struct dhcp_packet dhcppkt,
unsigned int  tag,
void *  data,
size_t  len 
)

Fetch value of DHCP packet setting.

Parameters:
dhcppkt DHCP packet
tag Setting tag number
data Buffer to fill with setting data
len Length of buffer
Return values:
len Length of setting data, or negative error

Definition at line 184 of file dhcppkt.c.

References dhcp_packet_field(), dhcp_packet::dhcphdr, dhcpopt_fetch(), find_dhcp_packet_field(), dhcp_packet_field::len, memcpy, NULL, dhcp_packet::options, and dhcp_packet_field::used_len.

Referenced by dhcp_deliver_iob(), dhcp_pxebs_rx(), dhcp_rx_offer(), and dhcppkt_settings_fetch().

00185                                              {
00186         struct dhcp_packet_field *field;
00187         void *field_data;
00188         size_t field_len = 0;
00189         
00190         /* Identify special field, if any */
00191         if ( ( field = find_dhcp_packet_field ( tag ) ) != NULL ) {
00192                 field_data = dhcp_packet_field ( dhcppkt->dhcphdr, field );
00193                 field_len = field->used_len ( field_data, field->len );
00194         }
00195 
00196         /* Return special field, if it exists and is populated */
00197         if ( field_len ) {
00198                 if ( len > field_len )
00199                         len = field_len;
00200                 memcpy ( data, field_data, len );
00201                 return field_len;
00202         }
00203 
00204         /* Otherwise, use the generic options block */
00205         return dhcpopt_fetch ( &dhcppkt->options, tag, data, len );
00206 }

void dhcppkt_init ( struct dhcp_packet dhcppkt,
struct dhcphdr data,
size_t  len 
)

Initialise DHCP packet.

Parameters:
dhcppkt DHCP packet structure to fill in
data DHCP packet raw data
max_len Length of raw data buffer
Initialise a DHCP packet structure from a data buffer containing a DHCP packet.

Definition at line 272 of file dhcppkt.c.

References DHCP_SETTINGS_NAME, dhcp_packet::dhcphdr, dhcpopt_init(), dhcp_options::len, dhcp_packet::len, dhcp_packet::max_len, offsetof, options, dhcphdr::options, dhcp_packet::options, dhcp_packet::refcnt, dhcp_packet::settings, and settings_init().

Referenced by dhcp_create_packet(), dhcp_deliver_iob(), and store_cached_dhcpack().

00273                                  {
00274         dhcppkt->dhcphdr = data;
00275         dhcppkt->max_len = len;
00276         dhcpopt_init ( &dhcppkt->options, &dhcppkt->dhcphdr->options,
00277                        ( len - offsetof ( struct dhcphdr, options ) ) );
00278         dhcppkt->len = ( offsetof ( struct dhcphdr, options ) +
00279                          dhcppkt->options.len );
00280         settings_init ( &dhcppkt->settings,
00281                         &dhcppkt_settings_operations, &dhcppkt->refcnt,
00282                         DHCP_SETTINGS_NAME, 0 );
00283 }


Generated on Tue Apr 6 20:01:48 2010 for gPXE by  doxygen 1.5.7.1