iPXE
Functions
fakedhcp.c File Reference

Fake DHCP packets. More...

#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <ipxe/settings.h>
#include <ipxe/netdevice.h>
#include <ipxe/dhcppkt.h>
#include <ipxe/fakedhcp.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
 FILE_SECBOOT (PERMITTED)
 
static int copy_encap_settings (struct dhcp_packet *dest, struct settings *source, unsigned int encapsulator)
 Copy settings to DHCP packet. More...
 
static int copy_settings (struct dhcp_packet *dest, struct settings *source)
 Copy settings to DHCP packet. More...
 
int create_fakedhcpdiscover (struct net_device *netdev, void *data, size_t max_len)
 Create fake DHCPDISCOVER packet. More...
 
int create_fakedhcpack (struct net_device *netdev, void *data, size_t max_len)
 Create fake DHCPACK packet. More...
 
int create_fakepxebsack (struct net_device *netdev, void *data, size_t max_len)
 Create fake PXE Boot Server ACK packet. More...
 

Detailed Description

Fake DHCP packets.

Definition in file fakedhcp.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED  )

◆ copy_encap_settings()

static int copy_encap_settings ( struct dhcp_packet dest,
struct settings source,
unsigned int  encapsulator 
)
static

Copy settings to DHCP packet.

Parameters
destDestination DHCP packet
sourceSource settings block
encapsulatorEncapsulating setting tag number, or zero
Return values
rcReturn status code

Definition at line 51 of file fakedhcp.c.

53  {
54  struct setting setting = { .name = "" };
55  unsigned int subtag;
56  unsigned int tag;
57  void *data;
58  int len;
59  int rc;
60 
61  for ( subtag = DHCP_MIN_OPTION; subtag <= DHCP_MAX_OPTION; subtag++ ) {
62  tag = DHCP_ENCAP_OPT ( encapsulator, subtag );
63  switch ( tag ) {
64  case DHCP_EB_ENCAP:
65  case DHCP_VENDOR_ENCAP:
66  /* Process encapsulated settings */
67  if ( ( rc = copy_encap_settings ( dest, source,
68  tag ) ) != 0 )
69  return rc;
70  break;
71  default:
72  /* Copy setting, if present */
73  setting.tag = tag;
74  len = fetch_raw_setting_copy ( source, &setting, &data);
75  if ( len >= 0 ) {
76  rc = dhcppkt_store ( dest, tag, data, len );
77  free ( data );
78  if ( rc != 0 )
79  return rc;
80  }
81  break;
82  }
83  }
84 
85  return 0;
86 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define DHCP_EB_ENCAP
Etherboot-specific encapsulated options.
Definition: dhcp.h:357
int fetch_raw_setting_copy(struct settings *settings, const struct setting *setting, void **data)
Fetch value of setting.
Definition: settings.c:822
#define DHCP_MAX_OPTION
Maximum normal DHCP option.
Definition: dhcp.h:542
#define DHCP_MIN_OPTION
Minimum normal DHCP option.
Definition: dhcp.h:63
const char * name
Name.
Definition: settings.h:29
static int copy_encap_settings(struct dhcp_packet *dest, struct settings *source, unsigned int encapsulator)
Copy settings to DHCP packet.
Definition: fakedhcp.c:51
uint64_t tag
Setting tag, if applicable.
Definition: settings.h:44
ring len
Length.
Definition: dwmac.h:231
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:55
int dhcppkt_store(struct dhcp_packet *dhcppkt, unsigned int tag, const void *data, size_t len)
Store value of DHCP packet setting.
Definition: dhcppkt.c:165
A setting.
Definition: settings.h:24
if(len >=6 *4) __asm__ __volatile__("movsl" if(len >=5 *4) __asm__ __volatile__("movsl" if(len >=4 *4) __asm__ __volatile__("movsl" if(len >=3 *4) __asm__ __volatile__("movsl" if(len >=2 *4) __asm__ __volatile__("movsl" if(len >=1 *4) __asm__ __volatile__("movsl" if((len % 4) >=2) __asm__ __volatile__("movsw" if((len % 2) >=1) __asm__ __volatile__("movsb" return dest
Definition: string.h:151
uint8_t data[48]
Additional event data.
Definition: ena.h:22
#define DHCP_VENDOR_ENCAP
Vendor encapsulated options.
Definition: dhcp.h:93
#define DHCP_ENCAP_OPT(encapsulator, encapsulated)
Construct a tag value for an encapsulated option.
Definition: dhcp.h:41
uint64_t tag
Identity tag.
Definition: edd.h:31

References data, dest, DHCP_EB_ENCAP, DHCP_ENCAP_OPT, DHCP_MAX_OPTION, DHCP_MIN_OPTION, DHCP_VENDOR_ENCAP, dhcppkt_store(), fetch_raw_setting_copy(), free, len, setting::name, rc, tag, and setting::tag.

Referenced by copy_settings().

◆ copy_settings()

static int copy_settings ( struct dhcp_packet dest,
struct settings source 
)
static

Copy settings to DHCP packet.

Parameters
destDestination DHCP packet
sourceSource settings block
Return values
rcReturn status code

Definition at line 95 of file fakedhcp.c.

96  {
97  return copy_encap_settings ( dest, source, 0 );
98 }
static int copy_encap_settings(struct dhcp_packet *dest, struct settings *source, unsigned int encapsulator)
Copy settings to DHCP packet.
Definition: fakedhcp.c:51
if(len >=6 *4) __asm__ __volatile__("movsl" if(len >=5 *4) __asm__ __volatile__("movsl" if(len >=4 *4) __asm__ __volatile__("movsl" if(len >=3 *4) __asm__ __volatile__("movsl" if(len >=2 *4) __asm__ __volatile__("movsl" if(len >=1 *4) __asm__ __volatile__("movsl" if((len % 4) >=2) __asm__ __volatile__("movsw" if((len % 2) >=1) __asm__ __volatile__("movsb" return dest
Definition: string.h:151

References copy_encap_settings(), and dest.

Referenced by create_fakedhcpack(), and create_fakepxebsack().

◆ create_fakedhcpdiscover()

int create_fakedhcpdiscover ( struct net_device netdev,
void *  data,
size_t  max_len 
)

Create fake DHCPDISCOVER packet.

Parameters
netdevNetwork device
dataBuffer for DHCP packet
max_lenSize of DHCP packet buffer
Return values
rcReturn status code

Used by external code.

Definition at line 110 of file fakedhcp.c.

111  {
112  struct dhcp_packet dhcppkt;
113  struct in_addr ciaddr = { 0 };
114  int rc;
115 
116  if ( ( rc = dhcp_create_request ( &dhcppkt, netdev, DHCPDISCOVER,
117  dhcp_last_xid, ciaddr, data,
118  max_len ) ) != 0 ) {
119  DBG ( "Could not create DHCPDISCOVER: %s\n",
120  strerror ( rc ) );
121  return rc;
122  }
123 
124  return 0;
125 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
A DHCP packet.
Definition: dhcppkt.h:21
int dhcp_create_request(struct dhcp_packet *dhcppkt, struct net_device *netdev, unsigned int msgtype, uint32_t xid, struct in_addr ciaddr, void *data, size_t max_len)
Create DHCP request packet.
Definition: dhcp.c:1008
static struct net_device * netdev
Definition: gdbudp.c:52
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
#define DHCPDISCOVER
Definition: dhcp.h:198
IP address structure.
Definition: in.h:42
uint32_t dhcp_last_xid
Most recent DHCP transaction ID.
Definition: dhcp.c:125
uint8_t data[48]
Additional event data.
Definition: ena.h:22
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498

References data, DBG, dhcp_create_request(), dhcp_last_xid, DHCPDISCOVER, netdev, rc, and strerror().

Referenced by efi_pxe_fake_all().

◆ create_fakedhcpack()

int create_fakedhcpack ( struct net_device netdev,
void *  data,
size_t  max_len 
)

Create fake DHCPACK packet.

Parameters
netdevNetwork device
dataBuffer for DHCP packet
max_lenSize of DHCP packet buffer
Return values
rcReturn status code

Used by external code.

Definition at line 137 of file fakedhcp.c.

138  {
139  struct dhcp_packet dhcppkt;
140  int rc;
141 
142  /* Create base DHCPACK packet */
143  if ( ( rc = dhcp_create_packet ( &dhcppkt, netdev, DHCPACK,
144  dhcp_last_xid, NULL, 0,
145  data, max_len ) ) != 0 ) {
146  DBG ( "Could not create DHCPACK: %s\n", strerror ( rc ) );
147  return rc;
148  }
149 
150  /* Merge in globally-scoped settings, then netdev-specific
151  * settings. Do it in this order so that netdev-specific
152  * settings take precedence regardless of stated priorities.
153  */
154  if ( ( rc = copy_settings ( &dhcppkt, NULL ) ) != 0 ) {
155  DBG ( "Could not set DHCPACK global settings: %s\n",
156  strerror ( rc ) );
157  return rc;
158  }
159  if ( ( rc = copy_settings ( &dhcppkt,
160  netdev_settings ( netdev ) ) ) != 0 ) {
161  DBG ( "Could not set DHCPACK netdev settings: %s\n",
162  strerror ( rc ) );
163  return rc;
164  }
165 
166  return 0;
167 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
A DHCP packet.
Definition: dhcppkt.h:21
static int copy_settings(struct dhcp_packet *dest, struct settings *source)
Copy settings to DHCP packet.
Definition: fakedhcp.c:95
static struct settings * netdev_settings(struct net_device *netdev)
Get per-netdevice configuration settings block.
Definition: netdevice.h:587
int dhcp_create_packet(struct dhcp_packet *dhcppkt, struct net_device *netdev, uint8_t msgtype, uint32_t xid, const void *options, size_t options_len, void *data, size_t max_len)
Create a DHCP packet.
Definition: dhcp.c:945
static struct net_device * netdev
Definition: gdbudp.c:52
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
#define DHCPACK
Definition: dhcp.h:202
uint32_t dhcp_last_xid
Most recent DHCP transaction ID.
Definition: dhcp.c:125
uint8_t data[48]
Additional event data.
Definition: ena.h:22
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322

References copy_settings(), data, DBG, dhcp_create_packet(), dhcp_last_xid, DHCPACK, netdev, netdev_settings(), NULL, rc, and strerror().

Referenced by create_fakepxebsack(), efi_pxe_fake_all(), and nbi_prepare_dhcp().

◆ create_fakepxebsack()

int create_fakepxebsack ( struct net_device netdev,
void *  data,
size_t  max_len 
)

Create fake PXE Boot Server ACK packet.

Parameters
netdevNetwork device
dataBuffer for DHCP packet
max_lenSize of DHCP packet buffer
Return values
rcReturn status code

Used by external code.

Definition at line 179 of file fakedhcp.c.

180  {
181  struct dhcp_packet dhcppkt;
182  struct settings *proxy_settings;
183  struct settings *pxebs_settings;
184  int rc;
185 
186  /* Identify available settings */
187  proxy_settings = find_settings ( PROXYDHCP_SETTINGS_NAME );
188  pxebs_settings = find_settings ( PXEBS_SETTINGS_NAME );
189  if ( ( ! proxy_settings ) && ( ! pxebs_settings ) ) {
190  /* No PXE boot server; return the regular DHCPACK */
191  return create_fakedhcpack ( netdev, data, max_len );
192  }
193 
194  /* Create base DHCPACK packet */
195  if ( ( rc = dhcp_create_packet ( &dhcppkt, netdev, DHCPACK,
196  dhcp_last_xid, NULL, 0,
197  data, max_len ) ) != 0 ) {
198  DBG ( "Could not create PXE BS ACK: %s\n",
199  strerror ( rc ) );
200  return rc;
201  }
202 
203  /* Populate ciaddr */
204  fetch_ipv4_setting ( netdev_settings ( netdev ), &ip_setting,
205  &dhcppkt.dhcphdr->ciaddr );
206 
207  /* Merge in ProxyDHCP options */
208  if ( proxy_settings &&
209  ( ( rc = copy_settings ( &dhcppkt, proxy_settings ) ) != 0 ) ) {
210  DBG ( "Could not copy ProxyDHCP settings: %s\n",
211  strerror ( rc ) );
212  return rc;
213  }
214 
215  /* Merge in BootServerDHCP options, if present */
216  if ( pxebs_settings &&
217  ( ( rc = copy_settings ( &dhcppkt, pxebs_settings ) ) != 0 ) ) {
218  DBG ( "Could not copy PXE BS settings: %s\n",
219  strerror ( rc ) );
220  return rc;
221  }
222 
223  return 0;
224 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
A DHCP packet.
Definition: dhcppkt.h:21
int fetch_ipv4_setting(struct settings *settings, const struct setting *setting, struct in_addr *inp)
Fetch value of IPv4 address setting.
Definition: settings.c:913
int create_fakedhcpack(struct net_device *netdev, void *data, size_t max_len)
Create fake DHCPACK packet.
Definition: fakedhcp.c:137
static int copy_settings(struct dhcp_packet *dest, struct settings *source)
Copy settings to DHCP packet.
Definition: fakedhcp.c:95
static struct settings * netdev_settings(struct net_device *netdev)
Get per-netdevice configuration settings block.
Definition: netdevice.h:587
int dhcp_create_packet(struct dhcp_packet *dhcppkt, struct net_device *netdev, uint8_t msgtype, uint32_t xid, const void *options, size_t options_len, void *data, size_t max_len)
Create a DHCP packet.
Definition: dhcp.c:945
#define PROXYDHCP_SETTINGS_NAME
Settings block name used for ProxyDHCP responses.
Definition: dhcp.h:714
static struct net_device * netdev
Definition: gdbudp.c:52
#define PXEBS_SETTINGS_NAME
Setting block name used for BootServerDHCP responses.
Definition: dhcp.h:717
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
A settings block.
Definition: settings.h:133
#define DHCPACK
Definition: dhcp.h:202
uint32_t dhcp_last_xid
Most recent DHCP transaction ID.
Definition: dhcp.c:125
struct settings * find_settings(const char *name)
Find settings block.
Definition: settings.c:407
uint8_t data[48]
Additional event data.
Definition: ena.h:22
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322

References dhcphdr::ciaddr, copy_settings(), create_fakedhcpack(), data, DBG, dhcp_create_packet(), dhcp_last_xid, DHCPACK, dhcp_packet::dhcphdr, fetch_ipv4_setting(), find_settings(), netdev, netdev_settings(), NULL, PROXYDHCP_SETTINGS_NAME, PXEBS_SETTINGS_NAME, rc, and strerror().

Referenced by efi_pxe_fake_all().