Revision 1a0ca1e1 slirp/bootp.c
b/slirp/bootp.c | ||
---|---|---|
149 | 149 |
struct in_addr preq_addr; |
150 | 150 |
int dhcp_msg_type, val; |
151 | 151 |
uint8_t *q; |
152 |
uint8_t client_ethaddr[ETH_ALEN]; |
|
152 | 153 |
|
153 | 154 |
/* extract exact DHCP msg type */ |
154 | 155 |
dhcp_decode(bp, &dhcp_msg_type, &preq_addr); |
... | ... | |
164 | 165 |
if (dhcp_msg_type != DHCPDISCOVER && |
165 | 166 |
dhcp_msg_type != DHCPREQUEST) |
166 | 167 |
return; |
167 |
/* XXX: this is a hack to get the client mac address */ |
|
168 |
memcpy(slirp->client_ethaddr, bp->bp_hwaddr, 6); |
|
168 |
|
|
169 |
/* Get client's hardware address from bootp request */ |
|
170 |
memcpy(client_ethaddr, bp->bp_hwaddr, ETH_ALEN); |
|
169 | 171 |
|
170 | 172 |
m = m_get(slirp); |
171 | 173 |
if (!m) { |
... | ... | |
178 | 180 |
|
179 | 181 |
if (dhcp_msg_type == DHCPDISCOVER) { |
180 | 182 |
if (preq_addr.s_addr != htonl(0L)) { |
181 |
bc = request_addr(slirp, &preq_addr, slirp->client_ethaddr);
|
|
183 |
bc = request_addr(slirp, &preq_addr, client_ethaddr); |
|
182 | 184 |
if (bc) { |
183 | 185 |
daddr.sin_addr = preq_addr; |
184 | 186 |
} |
185 | 187 |
} |
186 | 188 |
if (!bc) { |
187 | 189 |
new_addr: |
188 |
bc = get_new_addr(slirp, &daddr.sin_addr, slirp->client_ethaddr);
|
|
190 |
bc = get_new_addr(slirp, &daddr.sin_addr, client_ethaddr); |
|
189 | 191 |
if (!bc) { |
190 | 192 |
DPRINTF("no address left\n"); |
191 | 193 |
return; |
192 | 194 |
} |
193 | 195 |
} |
194 |
memcpy(bc->macaddr, slirp->client_ethaddr, 6);
|
|
196 |
memcpy(bc->macaddr, client_ethaddr, ETH_ALEN);
|
|
195 | 197 |
} else if (preq_addr.s_addr != htonl(0L)) { |
196 |
bc = request_addr(slirp, &preq_addr, slirp->client_ethaddr);
|
|
198 |
bc = request_addr(slirp, &preq_addr, client_ethaddr); |
|
197 | 199 |
if (bc) { |
198 | 200 |
daddr.sin_addr = preq_addr; |
199 |
memcpy(bc->macaddr, slirp->client_ethaddr, 6);
|
|
201 |
memcpy(bc->macaddr, client_ethaddr, ETH_ALEN);
|
|
200 | 202 |
} else { |
201 | 203 |
daddr.sin_addr.s_addr = 0; |
202 | 204 |
} |
... | ... | |
209 | 211 |
} |
210 | 212 |
} |
211 | 213 |
|
214 |
/* Update ARP table for this IP address */ |
|
215 |
arp_table_add(slirp, daddr.sin_addr.s_addr, client_ethaddr); |
|
216 |
|
|
212 | 217 |
saddr.sin_addr = slirp->vhost_addr; |
213 | 218 |
saddr.sin_port = htons(BOOTP_SERVER); |
214 | 219 |
|
... | ... | |
218 | 223 |
rbp->bp_xid = bp->bp_xid; |
219 | 224 |
rbp->bp_htype = 1; |
220 | 225 |
rbp->bp_hlen = 6; |
221 |
memcpy(rbp->bp_hwaddr, bp->bp_hwaddr, 6);
|
|
226 |
memcpy(rbp->bp_hwaddr, bp->bp_hwaddr, ETH_ALEN);
|
|
222 | 227 |
|
223 | 228 |
rbp->bp_yiaddr = daddr.sin_addr; /* Client IP address */ |
224 | 229 |
rbp->bp_siaddr = saddr.sin_addr; /* Server IP address */ |
Also available in: Unified diff