Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/dhcp/dhcp.c

    r8d58fca rb7155d7  
    11/*
    2  * Copyright (c) 2013 Jiri Svoboda
     2 * Copyright (c) 2022 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4242#include <fibril_synch.h>
    4343#include <inet/addr.h>
     44#include <inet/eth_addr.h>
    4445#include <inet/dnsr.h>
    4546#include <inet/inetcfg.h>
    4647#include <io/log.h>
    4748#include <loc.h>
     49#include <rndgen.h>
    4850#include <stdio.h>
    4951#include <stdlib.h>
     
    9496        /** DNS server */
    9597        inet_addr_t dns_server;
     98        /** Transaction ID */
     99        uint32_t xid;
    96100} dhcp_offer_t;
    97101
     
    113117        /** Last received offer */
    114118        dhcp_offer_t offer;
     119        /** Random number generator */
     120        rndgen_t *rndgen;
    115121} dhcp_link_t;
    116122
     
    153159        dhcp_hdr_t *hdr = (dhcp_hdr_t *)msgbuf;
    154160        uint8_t *opt = msgbuf + sizeof(dhcp_hdr_t);
     161        uint32_t xid;
     162        errno_t rc;
     163        size_t i;
     164
     165        rc = rndgen_uint32(dlink->rndgen, &xid);
     166        if (rc != EOK)
     167                return rc;
    155168
    156169        memset(msgbuf, 0, MAX_MSG_SIZE);
    157170        hdr->op = op_bootrequest;
    158171        hdr->htype = 1; /* AHRD_ETHERNET */
    159         hdr->hlen = sizeof(addr48_t);
    160         hdr->xid = host2uint32_t_be(42);
    161         hdr->flags = flag_broadcast;
    162 
    163         addr48(dlink->link_info.mac_addr, hdr->chaddr);
     172        hdr->hlen = ETH_ADDR_SIZE;
     173        hdr->xid = host2uint32_t_be(xid);
     174        hdr->flags = host2uint16_t_be(flag_broadcast);
     175
     176        eth_addr_encode(&dlink->link_info.mac_addr, hdr->chaddr);
    164177        hdr->opt_magic = host2uint32_t_be(dhcp_opt_magic);
    165178
    166         opt[0] = opt_msg_type;
    167         opt[1] = 1;
    168         opt[2] = msg_dhcpdiscover;
    169         opt[3] = opt_end;
    170 
    171         return dhcp_send(&dlink->dt, msgbuf, sizeof(dhcp_hdr_t) + 4);
     179        i = 0;
     180
     181        opt[i++] = opt_msg_type;
     182        opt[i++] = 1;
     183        opt[i++] = msg_dhcpdiscover;
     184
     185        opt[i++] = opt_param_req_list;
     186        opt[i++] = 3;
     187        opt[i++] = 1; /* subnet mask */
     188        opt[i++] = 6; /* DNS server */
     189        opt[i++] = 3; /* router */
     190
     191        opt[i++] = opt_end;
     192
     193        return dhcp_send(&dlink->dt, msgbuf, sizeof(dhcp_hdr_t) + i);
    172194}
    173195
     
    182204        hdr->htype = 1; /* AHRD_ETHERNET */
    183205        hdr->hlen = 6;
    184         hdr->xid = host2uint32_t_be(42);
    185         hdr->flags = flag_broadcast;
    186         hdr->ciaddr = host2uint32_t_be(offer->oaddr.addr);
    187         addr48(dlink->link_info.mac_addr, hdr->chaddr);
     206        hdr->xid = host2uint32_t_be(offer->xid);
     207        hdr->flags = host2uint16_t_be(flag_broadcast);
     208        eth_addr_encode(&dlink->link_info.mac_addr, hdr->chaddr);
    188209        hdr->opt_magic = host2uint32_t_be(dhcp_opt_magic);
    189210
     
    257278
    258279        inet_naddr_set(yiaddr.addr, 0, &offer->oaddr);
     280        offer->xid = uint32_t_be2host(hdr->xid);
    259281
    260282        msgb = (uint8_t *)msg;
     
    456478                return ENOMEM;
    457479
     480        rc = rndgen_create(&dlink->rndgen);
     481        if (rc != EOK)
     482                goto error;
     483
    458484        dlink->link_id = link_id;
    459485        dlink->timeout = fibril_timer_create(NULL);
     
    493519        return EOK;
    494520error:
     521        if (dlink != NULL && dlink->rndgen != NULL)
     522                rndgen_destroy(dlink->rndgen);
    495523        if (dlink != NULL && dlink->timeout != NULL)
    496524                fibril_timer_destroy(dlink->timeout);
Note: See TracChangeset for help on using the changeset viewer.