Changeset 16214 in vbox
- Timestamp:
- Jan 24, 2009 8:23:29 AM (16 years ago)
- Location:
- trunk/src/VBox/Devices/Network/slirp
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/slirp/bootp.c
r16213 r16214 139 139 int send_nak = 0; 140 140 141 #define FILL_BOOTP_EXT(q, tag, len, pvalue) \ 142 do { \ 143 struct bootp_ext *be = (struct bootp_ext *)(q); \ 144 be->bpe_tag = (tag); \ 145 be->bpe_len = (len); \ 146 memcpy(&be[1], (pvalue), (len)); \ 147 (q) = (uint8_t *)(&be[1]) + (len); \ 148 }while(0) 149 141 150 /* extract exact DHCP msg type */ 142 151 requested_ip.s_addr = 0xffffffff; … … 251 260 LogRel(("NAT: DHCP offered IP address %R[IP4]\n", 252 261 &daddr.sin_addr)); 253 254 262 if ( dhcp_msg_type == DHCPDISCOVER 255 263 || dhcp_msg_type == DHCPREQUEST) 256 264 { 257 *q++ = RFC2132_SRV_ID; 258 *q++ = 4; 259 memcpy(q, &saddr.sin_addr, 4); 260 q += 4; 265 FILL_BOOTP_EXT(q, RFC2132_SRV_ID, 4, &saddr.sin_addr); 261 266 } 262 267 … … 265 270 || dhcp_msg_type == DHCPREQUEST)) 266 271 { 267 *q++ = RFC1533_NETMASK; 268 *q++ = 4; 269 *q++ = (pData->netmask & 0xff000000) >> 24; 270 *q++ = (pData->netmask & 0x00ff0000) >> 16; 271 *q++ = (pData->netmask & 0x0000ff00) >> 8; 272 *q++ = (pData->netmask & 0x000000ff); 273 274 *q++ = RFC1533_GATEWAY; 275 *q++ = 4; 276 memcpy(q, &saddr.sin_addr, 4); 277 q += 4; 278 279 *q++ = RFC1533_DNS; 280 *q++ = 4; 272 uint32_t lease_time = htonl(LEASE_TIME); 273 uint32_t netmask = htonl(pData->netmask); 274 275 FILL_BOOTP_EXT(q, RFC1533_NETMASK, 4, &netmask); 276 FILL_BOOTP_EXT(q, RFC1533_GATEWAY, 4, &saddr.sin_addr); 277 281 278 dns_addr_dhcp.s_addr = htonl(ntohl(special_addr.s_addr) | CTL_DNS); 282 memcpy(q, &dns_addr_dhcp, 4); 283 q += 4; 284 285 *q++ = RFC2132_LEASE_TIME; 286 *q++ = 4; 287 val = htonl(LEASE_TIME); 288 memcpy(q, &val, 4); 289 q += 4; 279 FILL_BOOTP_EXT(q, RFC1533_DNS, 4, &dns_addr_dhcp.s_addr); 280 281 FILL_BOOTP_EXT(q, RFC2132_LEASE_TIME, 4, &lease_time); 290 282 291 283 if (*slirp_hostname) 292 284 { 293 285 val = (int)strlen(slirp_hostname); 294 *q++ = RFC1533_HOSTNAME; 295 *q++ = val; 296 memcpy(q, slirp_hostname, val); 297 q += val; 286 FILL_BOOTP_EXT(q, RFC1533_HOSTNAME, val, slirp_hostname); 298 287 } 299 288 … … 301 290 { 302 291 val = (int)strlen(pData->pszDomain); 303 *q++ = RFC1533_DOMAINNAME; 304 *q++ = val; 305 memcpy(q, pData->pszDomain, val); 306 q += val; 292 FILL_BOOTP_EXT(q, RFC1533_DOMAINNAME, val, pData->pszDomain); 307 293 } 308 294 } -
trunk/src/VBox/Devices/Network/slirp/bootp.h
r15093 r16214 114 114 }; 115 115 116 struct bootp_ext 117 { 118 uint8_t bpe_tag; 119 uint8_t bpe_len; 120 }; 121 116 122 void bootp_input(PNATState, struct mbuf *m);
Note:
See TracChangeset
for help on using the changeset viewer.

