Changeset ee1c2d9 in mainline for uspace/srv/net/dhcp/transport.c


Ignore:
Timestamp:
2015-06-13T18:30:18Z (9 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
a157846
Parents:
0453261 (diff), 2f9a8e8 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

mainline changes

File:
1 edited

Legend:

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

    r0453261 ree1c2d9  
    3636
    3737#include <bitops.h>
     38#include <errno.h>
    3839#include <inet/addr.h>
    3940#include <inet/dnsr.h>
     
    4142#include <io/log.h>
    4243#include <loc.h>
    43 #include <net/in.h>
    44 #include <net/inet.h>
    45 #include <net/socket.h>
    4644#include <stdio.h>
    4745#include <stdlib.h>
     
    6765} dhcp_offer_t;
    6866
    69 static int dhcp_recv_fibril(void *);
     67static void dhcp_recv_msg(udp_assoc_t *, udp_rmsg_t *);
     68static void dhcp_recv_err(udp_assoc_t *, udp_rerr_t *);
     69static void dhcp_link_state(udp_assoc_t *, udp_link_state_t);
     70
     71static udp_cb_t dhcp_transport_cb = {
     72        .recv_msg = dhcp_recv_msg,
     73        .recv_err = dhcp_recv_err,
     74        .link_state = dhcp_link_state
     75};
    7076
    7177int dhcp_send(dhcp_transport_t *dt, void *msg, size_t size)
    7278{
    73         struct sockaddr_in addr;
     79        inet_ep_t ep;
    7480        int rc;
    7581
    76         addr.sin_family = AF_INET;
    77         addr.sin_port = htons(dhcp_server_port);
    78         addr.sin_addr.s_addr = htonl(addr32_broadcast_all_hosts);
     82        inet_ep_init(&ep);
     83        ep.port = dhcp_server_port;
     84        inet_addr_set(addr32_broadcast_all_hosts, &ep.addr);
    7985
    80         rc = sendto(dt->fd, msg, size, 0,
    81             (struct sockaddr *)&addr, sizeof(addr));
     86        rc = udp_assoc_send_msg(dt->assoc, &ep, msg, size);
    8287        if (rc != EOK) {
    83                 log_msg(LOG_DEFAULT, LVL_ERROR, "Sending failed");
     88                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed sending message");
    8489                return rc;
    8590        }
     
    8893}
    8994
    90 static int dhcp_recv_msg(dhcp_transport_t *dt, void **rmsg, size_t *rsize)
     95static void dhcp_recv_msg(udp_assoc_t *assoc, udp_rmsg_t *rmsg)
    9196{
    92         struct sockaddr_in src_addr;
    93         socklen_t src_addr_size;
    94         size_t recv_size;
     97        dhcp_transport_t *dt;
     98        size_t s;
    9599        int rc;
    96100
    97         if (dt->fd < 0) {
    98                 /* Terminated */
    99                 return EIO;
     101        log_msg(LOG_DEFAULT, LVL_NOTE, "dhcp_recv_msg()");
     102
     103        dt = (dhcp_transport_t *)udp_assoc_userptr(assoc);
     104        s = udp_rmsg_size(rmsg);
     105        if (s > MAX_MSG_SIZE)
     106                s = MAX_MSG_SIZE; /* XXX */
     107
     108        rc = udp_rmsg_read(rmsg, 0, msgbuf, s);
     109        if (rc != EOK) {
     110                log_msg(LOG_DEFAULT, LVL_ERROR, "Error receiving message.");
     111                return;
    100112        }
    101113
    102         src_addr_size = sizeof(src_addr);
    103         rc = recvfrom(dt->fd, msgbuf, MAX_MSG_SIZE, 0,
    104             (struct sockaddr *)&src_addr, &src_addr_size);
    105         if (rc < 0) {
    106                 log_msg(LOG_DEFAULT, LVL_ERROR, "recvfrom failed (%d)", rc);
    107                 return rc;
    108         }
     114        log_msg(LOG_DEFAULT, LVL_NOTE, "dhcp_recv_msg() - call recv_cb");
     115        dt->recv_cb(dt->cb_arg, msgbuf, s);
     116}
    109117
    110         recv_size = (size_t)rc;
    111         *rmsg = msgbuf;
    112         *rsize = recv_size;
     118static void dhcp_recv_err(udp_assoc_t *assoc, udp_rerr_t *rerr)
     119{
     120        log_msg(LOG_DEFAULT, LVL_WARN, "Ignoring ICMP error");
     121}
    113122
    114         return EOK;
     123static void dhcp_link_state(udp_assoc_t *assoc, udp_link_state_t ls)
     124{
     125        log_msg(LOG_DEFAULT, LVL_NOTE, "Link state change");
    115126}
    116127
     
    118129    dhcp_recv_cb_t recv_cb, void *arg)
    119130{
    120         int fd;
    121         struct sockaddr_in laddr;
    122         int fid;
     131        udp_t *udp = NULL;
     132        udp_assoc_t *assoc = NULL;
     133        inet_ep2_t epp;
    123134        int rc;
    124135
    125         log_msg(LOG_DEFAULT, LVL_DEBUG, "dhcptransport_init()");
     136        log_msg(LOG_DEFAULT, LVL_DEBUG, "dhcp_transport_init()");
    126137
    127         laddr.sin_family = AF_INET;
    128         laddr.sin_port = htons(dhcp_client_port);
    129         laddr.sin_addr.s_addr = INADDR_ANY;
     138        inet_ep2_init(&epp);
     139        epp.local.addr.version = ip_v4;
     140        epp.local.port = dhcp_client_port;
     141        epp.local_link = link_id;
    130142
    131         fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
    132         if (fd < 0) {
    133                 rc = EIO;
    134                 goto error;
    135         }
    136 
    137         log_msg(LOG_DEFAULT, LVL_DEBUG, "Bind socket.");
    138         rc = bind(fd, (struct sockaddr *)&laddr, sizeof(laddr));
     143        rc = udp_create(&udp);
    139144        if (rc != EOK) {
    140145                rc = EIO;
     
    142147        }
    143148
    144         log_msg(LOG_DEFAULT, LVL_DEBUG, "Set socket options");
    145         rc = setsockopt(fd, SOL_SOCKET, SO_IPLINK, &link_id, sizeof(link_id));
     149        rc = udp_assoc_create(udp, &epp, &dhcp_transport_cb, dt, &assoc);
    146150        if (rc != EOK) {
    147151                rc = EIO;
     
    149153        }
    150154
    151         dt->fd = fd;
     155        dt->udp = udp;
     156        dt->assoc = assoc;
    152157        dt->recv_cb = recv_cb;
    153158        dt->cb_arg = arg;
    154159
    155         fid = fibril_create(dhcp_recv_fibril, dt);
    156         if (fid == 0) {
    157                 rc = ENOMEM;
    158                 goto error;
    159         }
    160 
    161         dt->recv_fid = fid;
    162         fibril_add_ready(fid);
    163 
    164160        return EOK;
    165161error:
    166         closesocket(fd);
     162        udp_assoc_destroy(assoc);
     163        udp_destroy(udp);
    167164        return rc;
    168165}
     
    170167void dhcp_transport_fini(dhcp_transport_t *dt)
    171168{
    172         closesocket(dt->fd);
    173         dt->fd = -1;
    174 }
    175 
    176 static int dhcp_recv_fibril(void *arg)
    177 {
    178         dhcp_transport_t *dt = (dhcp_transport_t *)arg;
    179         void *msg;
    180         size_t size = (size_t) -1;
    181         int rc;
    182 
    183         while (true) {
    184                 rc = dhcp_recv_msg(dt, &msg, &size);
    185                 if (rc != EOK)
    186                         break;
    187 
    188                 assert(size != (size_t) -1);
    189 
    190                 dt->recv_cb(dt->cb_arg, msg, size);
    191         }
    192 
    193         return EOK;
     169        udp_assoc_destroy(dt->assoc);
     170        udp_destroy(dt->udp);
    194171}
    195172
Note: See TracChangeset for help on using the changeset viewer.