Commit 512176dbd81b0afb7185416ab2a28a340978b85b
1 parent
fb6cf1d0
fixed dhcp for windows client
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@784 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
32 additions
and
5 deletions
slirp/bootp.c
| @@ -33,6 +33,7 @@ | @@ -33,6 +33,7 @@ | ||
| 33 | 33 | ||
| 34 | typedef struct { | 34 | typedef struct { |
| 35 | uint8_t allocated; | 35 | uint8_t allocated; |
| 36 | + uint8_t macaddr[6]; | ||
| 36 | } BOOTPClient; | 37 | } BOOTPClient; |
| 37 | 38 | ||
| 38 | BOOTPClient bootp_clients[NB_ADDR]; | 39 | BOOTPClient bootp_clients[NB_ADDR]; |
| @@ -63,6 +64,23 @@ static BOOTPClient *get_new_addr(struct in_addr *paddr) | @@ -63,6 +64,23 @@ static BOOTPClient *get_new_addr(struct in_addr *paddr) | ||
| 63 | return bc; | 64 | return bc; |
| 64 | } | 65 | } |
| 65 | 66 | ||
| 67 | +static BOOTPClient *find_addr(struct in_addr *paddr, const uint8_t *macaddr) | ||
| 68 | +{ | ||
| 69 | + BOOTPClient *bc; | ||
| 70 | + int i; | ||
| 71 | + | ||
| 72 | + for(i = 0; i < NB_ADDR; i++) { | ||
| 73 | + if (!memcmp(macaddr, bootp_clients[i].macaddr, 6)) | ||
| 74 | + goto found; | ||
| 75 | + } | ||
| 76 | + return NULL; | ||
| 77 | + found: | ||
| 78 | + bc = &bootp_clients[i]; | ||
| 79 | + bc->allocated = 1; | ||
| 80 | + paddr->s_addr = htonl(ntohl(special_addr.s_addr) | (i + START_ADDR)); | ||
| 81 | + return bc; | ||
| 82 | +} | ||
| 83 | + | ||
| 66 | static void dhcp_decode(const uint8_t *buf, int size, | 84 | static void dhcp_decode(const uint8_t *buf, int size, |
| 67 | int *pmsg_type) | 85 | int *pmsg_type) |
| 68 | { | 86 | { |
| @@ -131,10 +149,19 @@ static void bootp_reply(struct bootp_t *bp) | @@ -131,10 +149,19 @@ static void bootp_reply(struct bootp_t *bp) | ||
| 131 | m->m_data += sizeof(struct udpiphdr); | 149 | m->m_data += sizeof(struct udpiphdr); |
| 132 | memset(rbp, 0, sizeof(struct bootp_t)); | 150 | memset(rbp, 0, sizeof(struct bootp_t)); |
| 133 | 151 | ||
| 134 | - bc = get_new_addr(&daddr.sin_addr); | ||
| 135 | - if (!bc) { | ||
| 136 | - dprintf("no address left\n"); | ||
| 137 | - return; | 152 | + if (dhcp_msg_type == DHCPDISCOVER) { |
| 153 | + bc = get_new_addr(&daddr.sin_addr); | ||
| 154 | + if (!bc) { | ||
| 155 | + dprintf("no address left\n"); | ||
| 156 | + return; | ||
| 157 | + } | ||
| 158 | + memcpy(bc->macaddr, client_ethaddr, 6); | ||
| 159 | + } else { | ||
| 160 | + bc = find_addr(&daddr.sin_addr, bp->bp_hwaddr); | ||
| 161 | + if (!bc) { | ||
| 162 | + dprintf("no address assigned\n"); | ||
| 163 | + return; | ||
| 164 | + } | ||
| 138 | } | 165 | } |
| 139 | dprintf("offered addr=%08x\n", ntohl(daddr.sin_addr.s_addr)); | 166 | dprintf("offered addr=%08x\n", ntohl(daddr.sin_addr.s_addr)); |
| 140 | 167 |
slirp/slirp.c
| @@ -74,7 +74,7 @@ static int get_dns_addr(struct in_addr *pdns_addr) | @@ -74,7 +74,7 @@ static int get_dns_addr(struct in_addr *pdns_addr) | ||
| 74 | 74 | ||
| 75 | void slirp_init(void) | 75 | void slirp_init(void) |
| 76 | { | 76 | { |
| 77 | - debug_init("/tmp/slirp.log", DEBUG_DEFAULT); | 77 | + // debug_init("/tmp/slirp.log", DEBUG_DEFAULT); |
| 78 | 78 | ||
| 79 | link_up = 1; | 79 | link_up = 1; |
| 80 | 80 |