Ignore:
File:
1 edited

Legend:

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

    r8d58fca r1bbc6dc  
    11/*
    2  * Copyright (c) 2013 Jiri Svoboda
     2 * Copyright (c) 2024 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>
     
    6870/** List of registered links (of dhcp_link_t) */
    6971static list_t dhcp_links;
     72
     73bool inetcfg_inited = false;
    7074
    7175static void dhcpsrv_discover_timeout(void *);
     
    9498        /** DNS server */
    9599        inet_addr_t dns_server;
     100        /** Transaction ID */
     101        uint32_t xid;
    96102} dhcp_offer_t;
    97103
     
    113119        /** Last received offer */
    114120        dhcp_offer_t offer;
     121        /** Random number generator */
     122        rndgen_t *rndgen;
    115123} dhcp_link_t;
    116124
     
    153161        dhcp_hdr_t *hdr = (dhcp_hdr_t *)msgbuf;
    154162        uint8_t *opt = msgbuf + sizeof(dhcp_hdr_t);
     163        uint32_t xid;
     164        errno_t rc;
     165        size_t i;
     166
     167        rc = rndgen_uint32(dlink->rndgen, &xid);
     168        if (rc != EOK)
     169                return rc;
    155170
    156171        memset(msgbuf, 0, MAX_MSG_SIZE);
    157172        hdr->op = op_bootrequest;
    158173        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);
     174        hdr->hlen = ETH_ADDR_SIZE;
     175        hdr->xid = host2uint32_t_be(xid);
     176        hdr->flags = host2uint16_t_be(flag_broadcast);
     177
     178        eth_addr_encode(&dlink->link_info.mac_addr, hdr->chaddr);
    164179        hdr->opt_magic = host2uint32_t_be(dhcp_opt_magic);
    165180
    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);
     181        i = 0;
     182
     183        opt[i++] = opt_msg_type;
     184        opt[i++] = 1;
     185        opt[i++] = msg_dhcpdiscover;
     186
     187        opt[i++] = opt_param_req_list;
     188        opt[i++] = 3;
     189        opt[i++] = 1; /* subnet mask */
     190        opt[i++] = 6; /* DNS server */
     191        opt[i++] = 3; /* router */
     192
     193        opt[i++] = opt_end;
     194
     195        return dhcp_send(&dlink->dt, msgbuf, sizeof(dhcp_hdr_t) + i);
    172196}
    173197
     
    182206        hdr->htype = 1; /* AHRD_ETHERNET */
    183207        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);
     208        hdr->xid = host2uint32_t_be(offer->xid);
     209        hdr->flags = host2uint16_t_be(flag_broadcast);
     210        eth_addr_encode(&dlink->link_info.mac_addr, hdr->chaddr);
    188211        hdr->opt_magic = host2uint32_t_be(dhcp_opt_magic);
    189212
     
    257280
    258281        inet_naddr_set(yiaddr.addr, 0, &offer->oaddr);
     282        offer->xid = uint32_t_be2host(hdr->xid);
    259283
    260284        msgb = (uint8_t *)msg;
     
    446470        log_msg(LOG_DEFAULT, LVL_DEBUG, "dhcpsrv_link_add(%zu)", link_id);
    447471
     472        if (!inetcfg_inited) {
     473                rc = inetcfg_init();
     474                if (rc != EOK) {
     475                        log_msg(LOG_DEFAULT, LVL_ERROR, "Error contacting "
     476                            "inet configuration service.\n");
     477                        return EIO;
     478                }
     479
     480                inetcfg_inited = true;
     481        }
     482
    448483        if (dhcpsrv_link_find(link_id) != NULL) {
    449484                log_msg(LOG_DEFAULT, LVL_NOTE, "Link %zu already added",
     
    455490        if (dlink == NULL)
    456491                return ENOMEM;
     492
     493        rc = rndgen_create(&dlink->rndgen);
     494        if (rc != EOK)
     495                goto error;
    457496
    458497        dlink->link_id = link_id;
     
    493532        return EOK;
    494533error:
     534        if (dlink != NULL && dlink->rndgen != NULL)
     535                rndgen_destroy(dlink->rndgen);
    495536        if (dlink != NULL && dlink->timeout != NULL)
    496537                fibril_timer_destroy(dlink->timeout);
Note: See TracChangeset for help on using the changeset viewer.