Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset bd88bee in mainline


Ignore:
Timestamp:
2013-09-21T22:51:06Z (8 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master
Children:
66ec63a
Parents:
7af0cc5
Message:

Automatically start DHCP on ethernet links.

Location:
uspace
Files:
5 added
9 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/init/init.c

    r7af0cc5 rbd88bee  
    360360        srv_start("/srv/udp");
    361361        srv_start("/srv/dnsrsrv");
     362        srv_start("/srv/dhcp");
     363        srv_start("/srv/nconfsrv");
    362364       
    363365        srv_start("/srv/clipboard");
  • uspace/lib/c/Makefile

    r7af0cc5 rbd88bee  
    7777        generic/device/pci.c \
    7878        generic/device/ahci.c \
     79        generic/dhcp.c \
    7980        generic/dnsr.c \
    8081        generic/dlfcn.c \
  • uspace/lib/c/include/ipc/services.h

    r7af0cc5 rbd88bee  
    5454
    5555#define SERVICE_NAME_CORECFG    "corecfg"
     56#define SERVICE_NAME_DHCP       "net/dhcp"
    5657#define SERVICE_NAME_DNSR       "net/dnsr"
    5758#define SERVICE_NAME_INET       "net/inet"
  • uspace/srv/net/dhcp/Makefile

    r7af0cc5 rbd88bee  
    3131
    3232SOURCES = \
    33         dhcp.c
     33        dhcp.c \
     34        main.c
    3435
    3536include $(USPACE_PREFIX)/Makefile.common
  • uspace/srv/net/dhcp/dhcp.c

    r7af0cc5 rbd88bee  
    3939#include <inet/dnsr.h>
    4040#include <inet/inetcfg.h>
     41#include <io/log.h>
    4142#include <loc.h>
    4243#include <net/in.h>
     
    4647#include <stdlib.h>
    4748
     49#include "dhcp.h"
    4850#include "dhcp_std.h"
    4951
     
    113115            (struct sockaddr *)&addr, sizeof(addr));
    114116        if (rc != EOK) {
    115                 printf("Sending failed\n");
     117                log_msg(LOG_DEFAULT, LVL_ERROR, "Sending failed");
    116118                return rc;
    117119        }
     
    154156            (struct sockaddr *)&src_addr, &src_addr_size);
    155157        if (rc < 0) {
    156                 printf("recvfrom failed (%d)\n", rc);
     158                log_msg(LOG_DEFAULT, LVL_ERROR, "recvfrom failed (%d)", rc);
    157159                return rc;
    158160        }
     
    222224        size_t i;
    223225
    224         printf("Receive reply\n");
     226        log_msg(LOG_DEFAULT, LVL_DEBUG, "Receive reply");
    225227        memset(offer, 0, sizeof(*offer));
    226228
     
    231233                return rc;
    232234
    233         printf("Your IP address: %s\n", saddr);
     235        log_msg(LOG_DEFAULT, LVL_DEBUG, "Your IP address: %s", saddr);
    234236        free(saddr);
    235237
     
    240242                return rc;
    241243
    242         printf("Next server IP address: %s\n", saddr);
     244        log_msg(LOG_DEFAULT, LVL_DEBUG, "Next server IP address: %s", saddr);
    243245        free(saddr);
    244246
     
    249251                return rc;
    250252
    251         printf("Relay agent IP address: %s\n", saddr);
     253        log_msg(LOG_DEFAULT, LVL_DEBUG, "Relay agent IP address: %s", saddr);
    252254        free(saddr);
    253255
     
    320322
    321323        if (!have_server_id) {
    322                 printf("Missing server ID option.\n");
     324                log_msg(LOG_DEFAULT, LVL_ERROR, "Missing server ID option.");
    323325                return rc;
    324326        }
    325327
    326328        if (!have_subnet_mask) {
    327                 printf("Missing subnet mask option.\n");
     329                log_msg(LOG_DEFAULT, LVL_ERROR, "Missing subnet mask option.");
    328330                return rc;
    329331        }
     
    333335                return rc;
    334336
    335         printf("Offered network address: %s\n", saddr);
     337        log_msg(LOG_DEFAULT, LVL_DEBUG, "Offered network address: %s", saddr);
    336338        free(saddr);
    337339
     
    341343                        return rc;
    342344
    343                 printf("Router address: %s\n", saddr);
     345                log_msg(LOG_DEFAULT, LVL_DEBUG, "Router address: %s", saddr);
    344346                free(saddr);
    345347        }
     
    350352                        return rc;
    351353
    352                 printf("DNS server: %s\n", saddr);
     354                log_msg(LOG_DEFAULT, LVL_DEBUG, "DNS server: %s", saddr);
    353355                free(saddr);
    354356        }
     
    367369            &addr_id);
    368370        if (rc != EOK) {
    369                 printf("Error creating IP address %s (%d)\n", "dhcp4a", rc);
     371                log_msg(LOG_DEFAULT, LVL_ERROR,
     372                    "Error creating IP address %s (%d)", "dhcp4a", rc);
    370373                return rc;
    371374        }
     
    378381                rc = inetcfg_sroute_create("dhcpdef", &defr, &offer->router, &sroute_id);
    379382                if (rc != EOK) {
    380                         printf("Error creating default route %s (%d).\n", "dhcpdef",
    381                             rc);
     383                        log_msg(LOG_DEFAULT, LVL_ERROR, "Error creating "
     384                            "default route %s (%d).", "dhcpdef", rc);
    382385                        return rc;
    383386                }
     
    387390                rc = dnsr_set_srvaddr(&offer->dns_server);
    388391                if (rc != EOK) {
    389                         printf("%s: Error setting nameserver address (%d))\n",
    390                             NAME, rc);
     392                        log_msg(LOG_DEFAULT, LVL_ERROR, "%s: Error setting "
     393                            "nameserver address (%d))", NAME, rc);
    391394                        return rc;
    392395                }
     
    396399}
    397400
    398 int main(int argc, char *argv[])
     401int dhcpsrv_link_add(service_id_t link_id)
    399402{
    400403        int fd;
    401404        struct sockaddr_in laddr;
    402405        void *msg;
    403         service_id_t iplink;
    404406        size_t msg_size;
    405407        dhcp_offer_t offer;
    406408        int rc;
    407409
    408         if (argc < 2) {
    409                 printf("syntax: %s <ip-link>\n", NAME);
    410                 return 1;
    411         }
    412 
    413         rc = inetcfg_init();
     410        log_msg(LOG_DEFAULT, LVL_DEBUG, "dhcpsrv_link_add(%zu)", link_id);
     411
     412        /* Get link hardware address */
     413        rc = inetcfg_link_get(link_id, &link_info);
    414414        if (rc != EOK) {
    415                 printf("Error contacting inet configuration service.\n");
    416                 return 1;
    417         }
    418 
    419         rc = loc_service_get_id(argv[1], &iplink, 0);
    420         if (rc != EOK) {
    421                 printf("Error resolving service '%s'.\n", argv[1]);
    422                 return 1;
    423         }
    424 
    425         /* Get link hardware address */
    426         rc = inetcfg_link_get(iplink, &link_info);
    427         if (rc != EOK) {
    428                 printf("Error getting properties for link '%s'.\n", argv[1]);
    429                 return 1;
     415                log_msg(LOG_DEFAULT, LVL_ERROR, "Error getting properties "
     416                    "for link %zu.", link_id);
     417                return EIO;
    430418        }
    431419
     
    436424        fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
    437425        if (fd < 0)
    438                 return 1;
    439 
    440         printf("Bind socket.\n");
     426                return EIO;
     427
     428        log_msg(LOG_DEFAULT, LVL_DEBUG, "Bind socket.");
    441429        rc = bind(fd, (struct sockaddr *)&laddr, sizeof(laddr));
    442430        if (rc != EOK)
    443                 return 1;
    444 
    445         printf("Set socket options\n");
    446         rc = setsockopt(fd, SOL_SOCKET, SO_IPLINK, &iplink, sizeof(iplink));
    447         if (rc != EOK)
    448                 return 1;
     431                return EIO;
     432
     433        log_msg(LOG_DEFAULT, LVL_DEBUG, "Set socket options");
     434        rc = setsockopt(fd, SOL_SOCKET, SO_IPLINK, &link_id, sizeof(link_id));
     435        if (rc != EOK)
     436                return EIO;
    449437
    450438        transport_fd = fd;
    451439
    452         printf("Send DHCPDISCOVER\n");
     440        log_msg(LOG_DEFAULT, LVL_DEBUG, "Send DHCPDISCOVER");
    453441        rc = dhcp_send_discover();
    454442        if (rc != EOK)
    455                 return 1;
     443                return EIO;
    456444
    457445        rc = dhcp_recv_msg(&msg, &msg_size);
    458446        if (rc != EOK)
    459                 return 1;
    460 
    461         printf("Received %zu bytes\n", msg_size);
     447                return EIO;
     448
     449        log_msg(LOG_DEFAULT, LVL_DEBUG, "Received %zu bytes", msg_size);
    462450
    463451        rc = dhcp_recv_reply(msg, msg_size, &offer);
    464452        if (rc != EOK)
    465                 return 1;
     453                return EIO;
    466454
    467455        rc = dhcp_send_request(&offer);
    468456        if (rc != EOK)
    469                 return 1;
     457                return EIO;
    470458
    471459        rc = dhcp_recv_msg(&msg, &msg_size);
    472460        if (rc != EOK)
    473                 return 1;
    474 
    475         printf("Received %zu bytes\n", msg_size);
     461                return EIO;
     462
     463        log_msg(LOG_DEFAULT, LVL_DEBUG, "Received %zu bytes", msg_size);
    476464
    477465        rc = dhcp_recv_reply(msg, msg_size, &offer);
    478466        if (rc != EOK)
    479                 return 1;
    480 
    481         rc = dhcp_cfg_create(iplink, &offer);
    482         if (rc != EOK)
    483                 return 1;
     467                return EIO;
     468
     469        rc = dhcp_cfg_create(link_id, &offer);
     470        if (rc != EOK)
     471                return EIO;
    484472
    485473        closesocket(fd);
    486         return 0;
    487 }
     474        return EOK;
     475}
     476
     477int dhcpsrv_link_remove(service_id_t link_id)
     478{
     479        return ENOTSUP;
     480}
     481
    488482
    489483/** @}
  • uspace/srv/net/inetsrv/inet_link.c

    r7af0cc5 rbd88bee  
    251251        }
    252252       
     253        log_msg(LOG_DEFAULT, LVL_DEBUG, "Configured link '%s'.", ilink->svc_name);
    253254        return EOK;
    254255       
  • uspace/srv/net/inetsrv/inetcfg.c

    r7af0cc5 rbd88bee  
    750750                sysarg_t method = IPC_GET_IMETHOD(call);
    751751
     752                log_msg(LOG_DEFAULT, LVL_DEBUG, "method %d", (int)method);
    752753                if (!method) {
    753754                        /* The other side has hung up */
  • uspace/srv/net/nconfsrv/iplink.c

    r7af0cc5 rbd88bee  
    3838#include <errno.h>
    3939#include <fibril_synch.h>
     40#include <inet/dhcp.h>
    4041#include <inet/inetcfg.h>
    4142#include <io/log.h>
    4243#include <loc.h>
    4344#include <stdlib.h>
     45#include <str.h>
    4446
    4547#include "iplink.h"
     
    139141        }
    140142
     143        log_msg(LOG_DEFAULT, LVL_NOTE, "Configure link %s", nlink->svc_name);
    141144        rc = inetcfg_link_add(sid);
    142145        if (rc != EOK) {
     
    144147                    "'%s'.\n", nlink->svc_name);
    145148                goto error;
     149        }
     150
     151        if (str_lcmp(nlink->svc_name, "net/eth", str_length("net/eth")) == 0) {
     152                rc = dhcp_link_add(sid);
     153                if (rc != EOK) {
     154                        log_msg(LOG_DEFAULT, LVL_ERROR, "Failed configuring DHCP on "
     155                            " link '%s'.\n", nlink->svc_name);
     156                        goto error;
     157                }
    146158        }
    147159
  • uspace/srv/net/nconfsrv/nconfsrv.c

    r7af0cc5 rbd88bee  
    3939#include <errno.h>
    4040#include <fibril_synch.h>
     41#include <inet/dhcp.h>
    4142#include <inet/inetcfg.h>
    4243#include <io/log.h>
     
    6566        if (rc != EOK) {
    6667                log_msg(LOG_DEFAULT, LVL_ERROR, "Error contacting inet "
     68                    "configuration service.");
     69                return EIO;
     70        }
     71
     72        rc = dhcp_init();
     73        if (rc != EOK) {
     74                log_msg(LOG_DEFAULT, LVL_ERROR, "Error contacting dhcp "
    6775                    "configuration service.");
    6876                return EIO;
Note: See TracChangeset for help on using the changeset viewer.