40 |
|
|
41 |
|
static const uint8_t rfc1533_cookie[] = { RFC1533_COOKIE }; |
42 |
|
|
43 |
– |
#ifdef DEBUG |
44 |
– |
#define dprintf(fmt, args...) \ |
45 |
– |
if (slirp_debug & DBG_CALL) { fprintf(dfd, fmt, ## args); fflush(dfd); } |
46 |
– |
#else |
47 |
– |
#define dprintf(fmt, args...) |
48 |
– |
#endif |
49 |
– |
|
43 |
|
static BOOTPClient *get_new_addr(struct in_addr *paddr) |
44 |
|
{ |
45 |
|
BOOTPClient *bc; |
100 |
|
if (p >= p_end) |
101 |
|
break; |
102 |
|
len = *p++; |
110 |
– |
dprintf("dhcp: tag=0x%02x len=%d\n", tag, len); |
103 |
|
|
104 |
|
switch(tag) { |
105 |
|
case RFC2132_MSG_TYPE: |
126 |
|
|
127 |
|
/* extract exact DHCP msg type */ |
128 |
|
dhcp_decode(bp->bp_vend, DHCP_OPT_LEN, &dhcp_msg_type); |
137 |
– |
dprintf("bootp packet op=%d msgtype=%d\n", bp->bp_op, dhcp_msg_type); |
129 |
|
|
130 |
|
if (dhcp_msg_type == 0) |
131 |
|
dhcp_msg_type = DHCPREQUEST; /* Force reply for old BOOTP clients */ |
146 |
|
if (dhcp_msg_type == DHCPDISCOVER) { |
147 |
|
new_addr: |
148 |
|
bc = get_new_addr(&daddr.sin_addr); |
149 |
< |
if (!bc) { |
159 |
< |
dprintf("no address left\n"); |
149 |
> |
if (!bc) |
150 |
|
return; |
161 |
– |
} |
151 |
|
memcpy(bc->macaddr, client_ethaddr, 6); |
152 |
|
} else { |
153 |
|
bc = find_addr(&daddr.sin_addr, bp->bp_hwaddr); |
157 |
|
goto new_addr; |
158 |
|
} |
159 |
|
} |
171 |
– |
dprintf("offered addr=%08x\n", ntohl(daddr.sin_addr.s_addr)); |
160 |
|
|
161 |
|
saddr.sin_addr.s_addr = htonl(ntohl(special_addr.s_addr) | CTL_ALIAS); |
162 |
|
saddr.sin_port = htons(BOOTP_SERVER); |