Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/net/udp/pdu.c

    r12df1f1 r8d48c7e  
    11/*
    2  * Copyright (c) 2012 Jiri Svoboda
     2 * Copyright (c) 2015 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    4141#include <stdlib.h>
    4242#include <inet/addr.h>
    43 #include <net/socket_codes.h>
    4443#include "msg.h"
    4544#include "pdu.h"
     
    8584}
    8685
    87 static uint16_t udp_phdr_setup(udp_pdu_t *pdu, udp_phdr_t *phdr,
     86static ip_ver_t udp_phdr_setup(udp_pdu_t *pdu, udp_phdr_t *phdr,
    8887    udp_phdr6_t *phdr6)
    8988{
    9089        addr32_t src_v4;
    9190        addr128_t src_v6;
    92         uint16_t src_af = inet_addr_get(&pdu->src, &src_v4, &src_v6);
    93        
     91        ip_ver_t src_ver = inet_addr_get(&pdu->src, &src_v4, &src_v6);
     92
    9493        addr32_t dest_v4;
    9594        addr128_t dest_v6;
    96         uint16_t dest_af = inet_addr_get(&pdu->dest, &dest_v4, &dest_v6);
    97        
    98         assert(src_af == dest_af);
    99        
    100         switch (src_af) {
    101         case AF_INET:
     95        ip_ver_t dest_ver = inet_addr_get(&pdu->dest, &dest_v4, &dest_v6);
     96
     97        assert(src_ver == dest_ver);
     98
     99        switch (src_ver) {
     100        case ip_v4:
    102101                phdr->src_addr = host2uint32_t_be(src_v4);
    103102                phdr->dest_addr = host2uint32_t_be(dest_v4);
     
    106105                phdr->udp_length = host2uint16_t_be(pdu->data_size);
    107106                break;
    108         case AF_INET6:
     107        case ip_v6:
    109108                host2addr128_t_be(src_v6, phdr6->src_addr);
    110109                host2addr128_t_be(dest_v6, phdr6->dest_addr);
     
    116115                assert(false);
    117116        }
    118        
    119         return src_af;
     117
     118        return src_ver;
    120119}
    121120
     
    136135        udp_phdr_t phdr;
    137136        udp_phdr6_t phdr6;
    138        
    139         uint16_t af = udp_phdr_setup(pdu, &phdr, &phdr6);
    140         switch (af) {
    141         case AF_INET:
     137
     138        ip_ver_t ver = udp_phdr_setup(pdu, &phdr, &phdr6);
     139        switch (ver) {
     140        case ip_v4:
    142141                cs_phdr = udp_checksum_calc(UDP_CHECKSUM_INIT, (void *) &phdr,
    143142                    sizeof(udp_phdr_t));
    144143                break;
    145         case AF_INET6:
     144        case ip_v6:
    146145                cs_phdr = udp_checksum_calc(UDP_CHECKSUM_INIT, (void *) &phdr6,
    147146                    sizeof(udp_phdr6_t));
     
    150149                assert(false);
    151150        }
    152        
     151
    153152        return udp_checksum_calc(cs_phdr, pdu->data, pdu->data_size);
    154153}
     
    163162
    164163/** Decode incoming PDU */
    165 int udp_pdu_decode(udp_pdu_t *pdu, udp_sockpair_t *sp, udp_msg_t **msg)
     164int udp_pdu_decode(udp_pdu_t *pdu, inet_ep2_t *epp, udp_msg_t **msg)
    166165{
    167166        udp_msg_t *nmsg;
     
    180179        hdr = (udp_header_t *)pdu->data;
    181180
    182         sp->foreign.port = uint16_t_be2host(hdr->src_port);
    183         sp->foreign.addr = pdu->src;
    184         sp->local.port = uint16_t_be2host(hdr->dest_port);
    185         sp->local.addr = pdu->dest;
     181        epp->local_link = pdu->iplink;
     182        epp->remote.port = uint16_t_be2host(hdr->src_port);
     183        epp->remote.addr = pdu->src;
     184        epp->local.port = uint16_t_be2host(hdr->dest_port);
     185        epp->local.addr = pdu->dest;
    186186
    187187        length = uint16_t_be2host(hdr->length);
     
    197197                return ENOMEM;
    198198
    199         nmsg->data = text;
    200199        nmsg->data_size = length - sizeof(udp_header_t);
     200        nmsg->data = malloc(nmsg->data_size);
     201        if (nmsg->data == NULL)
     202                return ENOMEM;
     203
     204        memcpy(nmsg->data, text, nmsg->data_size);
    201205
    202206        *msg = nmsg;
     
    205209
    206210/** Encode outgoing PDU */
    207 int udp_pdu_encode(udp_sockpair_t *sp, udp_msg_t *msg, udp_pdu_t **pdu)
     211int udp_pdu_encode(inet_ep2_t *epp, udp_msg_t *msg, udp_pdu_t **pdu)
    208212{
    209213        udp_pdu_t *npdu;
     
    215219                return ENOMEM;
    216220
    217         npdu->src = sp->local.addr;
    218         npdu->dest = sp->foreign.addr;
     221        npdu->iplink = epp->local_link;
     222        npdu->src = epp->local.addr;
     223        npdu->dest = epp->remote.addr;
    219224
    220225        npdu->data_size = sizeof(udp_header_t) + msg->data_size;
     
    226231
    227232        hdr = (udp_header_t *)npdu->data;
    228         hdr->src_port = host2uint16_t_be(sp->local.port);
    229         hdr->dest_port = host2uint16_t_be(sp->foreign.port);
     233        hdr->src_port = host2uint16_t_be(epp->local.port);
     234        hdr->dest_port = host2uint16_t_be(epp->remote.port);
    230235        hdr->length = host2uint16_t_be(npdu->data_size);
    231236        hdr->checksum = 0;
Note: See TracChangeset for help on using the changeset viewer.