Ignore:
File:
1 edited

Legend:

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

    r1bbc6dc r8d58fca  
    11/*
    2  * Copyright (c) 2024 Jiri Svoboda
     2 * Copyright (c) 2013 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4242#include <fibril_synch.h>
    4343#include <inet/addr.h>
    44 #include <inet/eth_addr.h>
    4544#include <inet/dnsr.h>
    4645#include <inet/inetcfg.h>
    4746#include <io/log.h>
    4847#include <loc.h>
    49 #include <rndgen.h>
    5048#include <stdio.h>
    5149#include <stdlib.h>
     
    7068/** List of registered links (of dhcp_link_t) */
    7169static list_t dhcp_links;
    72 
    73 bool inetcfg_inited = false;
    7470
    7571static void dhcpsrv_discover_timeout(void *);
     
    9894        /** DNS server */
    9995        inet_addr_t dns_server;
    100         /** Transaction ID */
    101         uint32_t xid;
    10296} dhcp_offer_t;
    10397
     
    119113        /** Last received offer */
    120114        dhcp_offer_t offer;
    121         /** Random number generator */
    122         rndgen_t *rndgen;
    123115} dhcp_link_t;
    124116
     
    161153        dhcp_hdr_t *hdr = (dhcp_hdr_t *)msgbuf;
    162154        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;
    170155
    171156        memset(msgbuf, 0, MAX_MSG_SIZE);
    172157        hdr->op = op_bootrequest;
    173158        hdr->htype = 1; /* AHRD_ETHERNET */
    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);
     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);
    179164        hdr->opt_magic = host2uint32_t_be(dhcp_opt_magic);
    180165
    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);
     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);
    196172}
    197173
     
    206182        hdr->htype = 1; /* AHRD_ETHERNET */
    207183        hdr->hlen = 6;
    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);
     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);
    211188        hdr->opt_magic = host2uint32_t_be(dhcp_opt_magic);
    212189
     
    280257
    281258        inet_naddr_set(yiaddr.addr, 0, &offer->oaddr);
    282         offer->xid = uint32_t_be2host(hdr->xid);
    283259
    284260        msgb = (uint8_t *)msg;
     
    470446        log_msg(LOG_DEFAULT, LVL_DEBUG, "dhcpsrv_link_add(%zu)", link_id);
    471447
    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 
    483448        if (dhcpsrv_link_find(link_id) != NULL) {
    484449                log_msg(LOG_DEFAULT, LVL_NOTE, "Link %zu already added",
     
    490455        if (dlink == NULL)
    491456                return ENOMEM;
    492 
    493         rc = rndgen_create(&dlink->rndgen);
    494         if (rc != EOK)
    495                 goto error;
    496457
    497458        dlink->link_id = link_id;
     
    532493        return EOK;
    533494error:
    534         if (dlink != NULL && dlink->rndgen != NULL)
    535                 rndgen_destroy(dlink->rndgen);
    536495        if (dlink != NULL && dlink->timeout != NULL)
    537496                fibril_timer_destroy(dlink->timeout);
Note: See TracChangeset for help on using the changeset viewer.