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


Ignore:
Timestamp:
2015-07-28T11:28:14Z (9 years ago)
Author:
Maurizio Lombardi <m.lombardi85@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
6accc5cf
Parents:
df2bce3 (diff), 47726b5e (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:

Merge from the mainline

File:
1 edited

Legend:

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

    rdf2bce3 rfb4d788  
    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         src_addr_size = sizeof(src_addr);
    98         rc = recvfrom(dt->fd, msgbuf, MAX_MSG_SIZE, 0,
    99             (struct sockaddr *)&src_addr, &src_addr_size);
    100         if (rc < 0) {
    101                 log_msg(LOG_DEFAULT, LVL_ERROR, "recvfrom failed (%d)", rc);
    102                 return rc;
     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;
    103112        }
    104113
    105         recv_size = (size_t)rc;
    106         *rmsg = msgbuf;
    107         *rsize = recv_size;
     114        log_msg(LOG_DEFAULT, LVL_NOTE, "dhcp_recv_msg() - call recv_cb");
     115        dt->recv_cb(dt->cb_arg, msgbuf, s);
     116}
    108117
    109         return EOK;
     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}
     122
     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");
    110126}
    111127
     
    113129    dhcp_recv_cb_t recv_cb, void *arg)
    114130{
    115         int fd;
    116         struct sockaddr_in laddr;
    117         int fid;
     131        udp_t *udp = NULL;
     132        udp_assoc_t *assoc = NULL;
     133        inet_ep2_t epp;
    118134        int rc;
    119135
    120         log_msg(LOG_DEFAULT, LVL_DEBUG, "dhcptransport_init()");
     136        log_msg(LOG_DEFAULT, LVL_DEBUG, "dhcp_transport_init()");
    121137
    122         laddr.sin_family = AF_INET;
    123         laddr.sin_port = htons(dhcp_client_port);
    124         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;
    125142
    126         fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
    127         if (fd < 0) {
    128                 rc = EIO;
    129                 goto error;
    130         }
    131 
    132         log_msg(LOG_DEFAULT, LVL_DEBUG, "Bind socket.");
    133         rc = bind(fd, (struct sockaddr *)&laddr, sizeof(laddr));
     143        rc = udp_create(&udp);
    134144        if (rc != EOK) {
    135145                rc = EIO;
     
    137147        }
    138148
    139         log_msg(LOG_DEFAULT, LVL_DEBUG, "Set socket options");
    140         rc = setsockopt(fd, SOL_SOCKET, SO_IPLINK, &link_id, sizeof(link_id));
     149        rc = udp_assoc_create(udp, &epp, &dhcp_transport_cb, dt, &assoc);
    141150        if (rc != EOK) {
    142151                rc = EIO;
     
    144153        }
    145154
    146         dt->fd = fd;
     155        dt->udp = udp;
     156        dt->assoc = assoc;
    147157        dt->recv_cb = recv_cb;
    148158        dt->cb_arg = arg;
    149159
    150         fid = fibril_create(dhcp_recv_fibril, dt);
    151         if (fid == 0) {
    152                 rc = ENOMEM;
    153                 goto error;
    154         }
    155 
    156         dt->recv_fid = fid;
    157         fibril_add_ready(fid);
    158 
    159160        return EOK;
    160161error:
    161         closesocket(fd);
     162        udp_assoc_destroy(assoc);
     163        udp_destroy(udp);
    162164        return rc;
    163165}
     
    165167void dhcp_transport_fini(dhcp_transport_t *dt)
    166168{
    167         closesocket(dt->fd);
    168 }
    169 
    170 static int dhcp_recv_fibril(void *arg)
    171 {
    172         dhcp_transport_t *dt = (dhcp_transport_t *)arg;
    173         void *msg;
    174         size_t size = (size_t) -1;
    175         int rc;
    176 
    177         while (true) {
    178                 rc = dhcp_recv_msg(dt, &msg, &size);
    179                 if (rc != EOK)
    180                         break;
    181 
    182                 assert(size != (size_t) -1);
    183 
    184                 dt->recv_cb(dt->cb_arg, msg, size);
    185         }
    186 
    187         return EOK;
     169        udp_assoc_destroy(dt->assoc);
     170        udp_destroy(dt->udp);
    188171}
    189172
Note: See TracChangeset for help on using the changeset viewer.