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