Commit 0928a95ffe91862938cee997c9e30602fa7884ab

Authored by Jan Kiszka
Committed by Anthony Liguori
1 parent f8d926e9

slirp: Reassign same address to same DHCP client

In case a client restarts a DHCP recovery without releasing its old
address, reassign the same address to prevent consuming free addresses
and moving away from the standard client address.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Showing 1 changed file with 5 additions and 3 deletions
slirp/bootp.c
... ... @@ -49,13 +49,15 @@ if (slirp_debug &amp; DBG_CALL) { fprintf(dfd, fmt, ## __VA_ARGS__); fflush(dfd); }
49 49 #define dprintf(fmt, ...)
50 50 #endif
51 51  
52   -static BOOTPClient *get_new_addr(struct in_addr *paddr)
  52 +static BOOTPClient *get_new_addr(struct in_addr *paddr,
  53 + const uint8_t *macaddr)
53 54 {
54 55 BOOTPClient *bc;
55 56 int i;
56 57  
57 58 for(i = 0; i < NB_ADDR; i++) {
58   - if (!bootp_clients[i].allocated)
  59 + bc = &bootp_clients[i];
  60 + if (!bc->allocated || !memcmp(macaddr, bc->macaddr, 6))
59 61 goto found;
60 62 }
61 63 return NULL;
... ... @@ -192,7 +194,7 @@ static void bootp_reply(const struct bootp_t *bp)
192 194 }
193 195 if (!bc) {
194 196 new_addr:
195   - bc = get_new_addr(&daddr.sin_addr);
  197 + bc = get_new_addr(&daddr.sin_addr, client_ethaddr);
196 198 if (!bc) {
197 199 dprintf("no address left\n");
198 200 return;
... ...