#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <gpxe/settings.h>
#include <gpxe/netdevice.h>
#include <gpxe/dhcppkt.h>
#include <gpxe/fakedhcp.h>
Go to the source code of this file.
Functions | |
| FILE_LICENCE (GPL2_OR_LATER) | |
| static int | copy_encap_settings (struct dhcp_packet *dest, struct settings *source, unsigned int encapsulator) |
| Copy settings to DHCP packet. | |
| static int | copy_settings (struct dhcp_packet *dest, struct settings *source) |
| Copy settings to DHCP packet. | |
| int | create_fakedhcpdiscover (struct net_device *netdev, void *data, size_t max_len) |
| Create fake DHCPDISCOVER packet. | |
| int | create_fakedhcpack (struct net_device *netdev, void *data, size_t max_len) |
| Create fake DHCPACK packet. | |
| int | create_fakepxebsack (struct net_device *netdev, void *data, size_t max_len) |
| Create fake PXE Boot Server ACK packet. | |
Definition in file fakedhcp.c.
| FILE_LICENCE | ( | GPL2_OR_LATER | ) |
| static int copy_encap_settings | ( | struct dhcp_packet * | dest, | |
| struct settings * | source, | |||
| unsigned int | encapsulator | |||
| ) | [static] |
Copy settings to DHCP packet.
| dest | Destination DHCP packet | |
| source | Source settings block | |
| encapsulator | Encapsulating setting tag number, or zero |
| rc | Return status code |
Definition at line 45 of file fakedhcp.c.
References assert, DHCP_EB_ENCAP, DHCP_ENCAP_OPT, DHCP_MAX_OPTION, DHCP_MIN_OPTION, DHCP_VENDOR_ENCAP, dhcppkt_store(), fetch_setting(), fetch_setting_len(), setting::name, and setting::tag.
Referenced by copy_settings().
00047 { 00048 struct setting setting = { .name = "" }; 00049 unsigned int subtag; 00050 unsigned int tag; 00051 int len; 00052 int check_len; 00053 int rc; 00054 00055 for ( subtag = DHCP_MIN_OPTION; subtag <= DHCP_MAX_OPTION; subtag++ ) { 00056 tag = DHCP_ENCAP_OPT ( encapsulator, subtag ); 00057 switch ( tag ) { 00058 case DHCP_EB_ENCAP: 00059 case DHCP_VENDOR_ENCAP: 00060 /* Process encapsulated settings */ 00061 if ( ( rc = copy_encap_settings ( dest, source, 00062 tag ) ) != 0 ) 00063 return rc; 00064 break; 00065 default: 00066 /* Copy setting, if present */ 00067 setting.tag = tag; 00068 len = fetch_setting_len ( source, &setting ); 00069 if ( len < 0 ) 00070 break; 00071 { 00072 char buf[len]; 00073 00074 check_len = fetch_setting ( source, &setting, 00075 buf, sizeof (buf)); 00076 assert ( check_len == len ); 00077 if ( ( rc = dhcppkt_store ( dest, tag, buf, 00078 sizeof(buf) )) !=0) 00079 return rc; 00080 } 00081 break; 00082 } 00083 } 00084 00085 return 0; 00086 }
| static int copy_settings | ( | struct dhcp_packet * | dest, | |
| struct settings * | source | |||
| ) | [static] |
Copy settings to DHCP packet.
| dest | Destination DHCP packet | |
| source | Source settings block |
| rc | Return status code |
Definition at line 95 of file fakedhcp.c.
References copy_encap_settings().
Referenced by create_fakedhcpack(), and create_fakepxebsack().
00096 { 00097 return copy_encap_settings ( dest, source, 0 ); 00098 }
| int create_fakedhcpdiscover | ( | struct net_device * | netdev, | |
| void * | data, | |||
| size_t | max_len | |||
| ) |
Create fake DHCPDISCOVER packet.
| netdev | Network device | |
| data | Buffer for DHCP packet | |
| max_len | Size of DHCP packet buffer |
| rc | Return status code |
Definition at line 110 of file fakedhcp.c.
References DBG, dhcp_create_request(), DHCPDISCOVER, and strerror().
00111 { 00112 struct dhcp_packet dhcppkt; 00113 struct in_addr ciaddr = { 0 }; 00114 int rc; 00115 00116 if ( ( rc = dhcp_create_request ( &dhcppkt, netdev, DHCPDISCOVER, 00117 ciaddr, data, max_len ) ) != 0 ) { 00118 DBG ( "Could not create DHCPDISCOVER: %s\n", 00119 strerror ( rc ) ); 00120 return rc; 00121 } 00122 00123 return 0; 00124 }
| int create_fakedhcpack | ( | struct net_device * | netdev, | |
| void * | data, | |||
| size_t | max_len | |||
| ) |
Create fake DHCPACK packet.
| netdev | Network device | |
| data | Buffer for DHCP packet | |
| max_len | Size of DHCP packet buffer |
| rc | Return status code |
Definition at line 136 of file fakedhcp.c.
References copy_settings(), DBG, dhcp_create_packet(), DHCPACK, netdev_settings(), NULL, and strerror().
Referenced by create_fakepxebsack(), and nbi_prepare_dhcp().
00137 { 00138 struct dhcp_packet dhcppkt; 00139 int rc; 00140 00141 /* Create base DHCPACK packet */ 00142 if ( ( rc = dhcp_create_packet ( &dhcppkt, netdev, DHCPACK, NULL, 0, 00143 data, max_len ) ) != 0 ) { 00144 DBG ( "Could not create DHCPACK: %s\n", strerror ( rc ) ); 00145 return rc; 00146 } 00147 00148 /* Merge in globally-scoped settings, then netdev-specific 00149 * settings. Do it in this order so that netdev-specific 00150 * settings take precedence regardless of stated priorities. 00151 */ 00152 if ( ( rc = copy_settings ( &dhcppkt, NULL ) ) != 0 ) { 00153 DBG ( "Could not set DHCPACK global settings: %s\n", 00154 strerror ( rc ) ); 00155 return rc; 00156 } 00157 if ( ( rc = copy_settings ( &dhcppkt, 00158 netdev_settings ( netdev ) ) ) != 0 ) { 00159 DBG ( "Could not set DHCPACK netdev settings: %s\n", 00160 strerror ( rc ) ); 00161 return rc; 00162 } 00163 00164 return 0; 00165 }
| int create_fakepxebsack | ( | struct net_device * | netdev, | |
| void * | data, | |||
| size_t | max_len | |||
| ) |
Create fake PXE Boot Server ACK packet.
| netdev | Network device | |
| data | Buffer for DHCP packet | |
| max_len | Size of DHCP packet buffer |
| rc | Return status code |
Definition at line 177 of file fakedhcp.c.
References copy_settings(), create_fakedhcpack(), DBG, dhcp_create_packet(), DHCPACK, find_settings(), NULL, PROXYDHCP_SETTINGS_NAME, PXEBS_SETTINGS_NAME, and strerror().
00178 { 00179 struct dhcp_packet dhcppkt; 00180 struct settings *proxy_settings; 00181 struct settings *pxebs_settings; 00182 int rc; 00183 00184 /* Identify available settings */ 00185 proxy_settings = find_settings ( PROXYDHCP_SETTINGS_NAME ); 00186 pxebs_settings = find_settings ( PXEBS_SETTINGS_NAME ); 00187 if ( ( ! proxy_settings ) && ( ! pxebs_settings ) ) { 00188 /* No PXE boot server; return the regular DHCPACK */ 00189 return create_fakedhcpack ( netdev, data, max_len ); 00190 } 00191 00192 /* Create base DHCPACK packet */ 00193 if ( ( rc = dhcp_create_packet ( &dhcppkt, netdev, DHCPACK, NULL, 0, 00194 data, max_len ) ) != 0 ) { 00195 DBG ( "Could not create PXE BS ACK: %s\n", 00196 strerror ( rc ) ); 00197 return rc; 00198 } 00199 00200 /* Merge in ProxyDHCP options */ 00201 if ( proxy_settings && 00202 ( ( rc = copy_settings ( &dhcppkt, proxy_settings ) ) != 0 ) ) { 00203 DBG ( "Could not copy ProxyDHCP settings: %s\n", 00204 strerror ( rc ) ); 00205 return rc; 00206 } 00207 00208 /* Merge in BootServerDHCP options, if present */ 00209 if ( pxebs_settings && 00210 ( ( rc = copy_settings ( &dhcppkt, pxebs_settings ) ) != 0 ) ) { 00211 DBG ( "Could not copy PXE BS settings: %s\n", 00212 strerror ( rc ) ); 00213 return rc; 00214 } 00215 00216 return 0; 00217 }
1.5.7.1