#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_packet * | dhcppkt_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. | |
Definition in file dhcppkt.h.
| FILE_LICENCE | ( | GPL2_OR_LATER | ) |
| static struct dhcp_packet* dhcppkt_get | ( | struct dhcp_packet * | dhcppkt | ) | [static, read] |
| static void dhcppkt_put | ( | struct dhcp_packet * | dhcppkt | ) | [inline, static] |
Decrement reference count on DHCP packet.
| 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().
| int dhcppkt_store | ( | struct dhcp_packet * | dhcppkt, | |
| unsigned int | tag, | |||
| const void * | data, | |||
| size_t | len | |||
| ) |
Store value of DHCP packet setting.
| dhcppkt | DHCP packet | |
| tag | Setting tag number | |
| data | Setting data, or NULL to clear setting | |
| len | Length of setting data |
| 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.
| dhcppkt | DHCP packet | |
| tag | Setting tag number | |
| data | Buffer to fill with setting data | |
| len | Length of buffer |
| 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.
| dhcppkt | DHCP packet structure to fill in | |
| data | DHCP packet raw data | |
| max_len | Length of raw data buffer |
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 }
1.5.7.1