Changeset 02a09ed in mainline for uspace/srv


Ignore:
Timestamp:
2013-06-28T20:20:03Z (12 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
1d24ad3
Parents:
edf0d27
Message:

add basic infrastructure for IPv6 (inactive)
make inet_addr_t a universal address type

Location:
uspace/srv/net
Files:
2 deleted
32 edited

Legend:

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

    redf0d27 r02a09ed  
    8484}
    8585
    86 static void dnsr_name2host_srv(dnsr_client_t *client, ipc_callid_t callid,
    87     ipc_call_t *call)
    88 {
     86static void dnsr_name2host_srv(dnsr_client_t *client, ipc_callid_t iid,
     87    ipc_call_t *icall)
     88{
     89        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_get_srvaddr_srv()");
     90       
    8991        char *name;
     92        int rc = async_data_write_accept((void **) &name, true, 0,
     93            DNS_NAME_MAX_SIZE, 0, NULL);
     94        if (rc != EOK) {
     95                async_answer_0(iid, rc);
     96                return;
     97        }
     98       
    9099        dns_host_info_t *hinfo;
    91         ipc_callid_t rcallid;
    92         size_t size;
    93         sysarg_t retval;
    94         size_t act_size;
    95         int rc;
    96 
    97         log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_get_srvaddr_srv()");
    98 
    99         rc = async_data_write_accept((void **) &name, true, 0,
    100             DNS_NAME_MAX_SIZE, 0, NULL);
    101         if (rc != EOK) {
    102                 async_answer_0(callid, rc);
    103                 return;
    104         }
    105 
    106         if (!async_data_read_receive(&rcallid, &size)) {
    107                 async_answer_0(rcallid, EREFUSED);
    108                 async_answer_0(callid, EREFUSED);
    109                 return;
    110         }
    111 
    112100        rc = dns_name2host(name, &hinfo);
    113101        if (rc != EOK) {
    114                 async_answer_0(rcallid, rc);
    115                 async_answer_0(callid, rc);
    116                 return;
    117         }
    118        
    119         uint32_t addr;
    120         rc = inet_addr_pack(&hinfo->addr, &addr);
    121         if (rc != EOK) {
    122                 async_answer_0(rcallid, rc);
    123                 async_answer_0(callid, rc);
    124                 return;
    125         }
    126 
    127         act_size = str_size(hinfo->cname);
    128         if (act_size > size) {
    129                 async_answer_0(rcallid, EOVERFLOW);
    130                 async_answer_0(callid, EOVERFLOW);
    131                 return;
    132         }
    133 
    134         retval = async_data_read_finalize(rcallid, hinfo->cname, act_size);
    135         async_answer_1(callid, retval, (sysarg_t) addr);
    136 
    137         dns_hostinfo_destroy(hinfo);
    138 }
    139 
    140 static void dnsr_get_srvaddr_srv(dnsr_client_t *client, ipc_callid_t iid,
    141     ipc_call_t *icall)
    142 {
    143         log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_get_srvaddr_srv()");
     102                async_answer_0(iid, rc);
     103                return;
     104        }
    144105       
    145106        ipc_callid_t callid;
     
    157118        }
    158119       
     120        rc = async_data_read_finalize(callid, &hinfo->addr, size);
     121        if (rc != EOK) {
     122                async_answer_0(callid, rc);
     123                async_answer_0(iid, rc);
     124                return;
     125        }
     126       
     127        if (!async_data_read_receive(&callid, &size)) {
     128                async_answer_0(callid, EREFUSED);
     129                async_answer_0(iid, EREFUSED);
     130                return;
     131        }
     132       
     133        size_t act_size = str_size(hinfo->cname);
     134        if (act_size > size) {
     135                async_answer_0(callid, EINVAL);
     136                async_answer_0(iid, EINVAL);
     137                return;
     138        }
     139       
     140        rc = async_data_read_finalize(callid, hinfo->cname, act_size);
     141        if (rc != EOK)
     142                async_answer_0(callid, rc);
     143       
     144        async_answer_0(iid, (sysarg_t) rc);
     145       
     146        dns_hostinfo_destroy(hinfo);
     147}
     148
     149static void dnsr_get_srvaddr_srv(dnsr_client_t *client, ipc_callid_t iid,
     150    ipc_call_t *icall)
     151{
     152        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_get_srvaddr_srv()");
     153       
     154        ipc_callid_t callid;
     155        size_t size;
     156        if (!async_data_read_receive(&callid, &size)) {
     157                async_answer_0(callid, EREFUSED);
     158                async_answer_0(iid, EREFUSED);
     159                return;
     160        }
     161       
     162        if (size != sizeof(inet_addr_t)) {
     163                async_answer_0(callid, EINVAL);
     164                async_answer_0(iid, EINVAL);
     165                return;
     166        }
     167       
    159168        // FIXME locking
    160169       
    161         sysarg_t retval =
    162             async_data_read_finalize(callid, &dns_server_addr, size);
    163         async_answer_0(iid, retval);
     170        int rc = async_data_read_finalize(callid, &dns_server_addr, size);
     171        if (rc != EOK)
     172                async_answer_0(callid, rc);
     173       
     174        async_answer_0(iid, rc);
    164175}
    165176
     
    185196        // FIXME locking
    186197       
    187         sysarg_t retval =
    188             async_data_write_finalize(callid, &dns_server_addr, size);
    189         async_answer_0(iid, retval);
     198        int rc = async_data_write_finalize(callid, &dns_server_addr, size);
     199        if (rc != EOK)
     200                async_answer_0(callid, rc);
     201       
     202        async_answer_0(iid, (sysarg_t) rc);
    190203}
    191204
  • uspace/srv/net/dnsrsrv/query.c

    redf0d27 r02a09ed  
    128128
    129129                        info->cname = str_dup(rr->name);
    130                         inet_addr_unpack(dns_uint32_t_decode(rr->rdata, rr->rdata_size),
     130                        inet_addr_set(dns_uint32_t_decode(rr->rdata, rr->rdata_size),
    131131                            &info->addr);
    132132                       
  • uspace/srv/net/dnsrsrv/transport.c

    redf0d27 r02a09ed  
    183183int dns_request(dns_message_t *req, dns_message_t **rresp)
    184184{
    185         int rc;
     185        trans_req_t *treq = NULL;
     186       
    186187        void *req_data;
    187188        size_t req_size;
     189        int rc = dns_message_encode(req, &req_data, &req_size);
     190        if (rc != EOK)
     191                goto error;
     192       
    188193        struct sockaddr_in addr;
    189         trans_req_t *treq;
    190         int ntry;
    191 
    192         req_data = NULL;
    193         treq = NULL;
    194 
    195         addr.sin_family = AF_INET;
    196         addr.sin_port = htons(DNS_SERVER_PORT);
    197         inet_addr_sockaddr_in(&dns_server_addr, &addr);
    198 
    199         rc = dns_message_encode(req, &req_data, &req_size);
    200         if (rc != EOK)
    201                 goto error;
    202 
    203         ntry = 0;
    204 
     194        struct sockaddr_in6 addr6;
     195        uint16_t af =
     196            inet_addr_sockaddr_in(&dns_server_addr, &addr, &addr6);
     197       
     198        struct sockaddr *address;
     199        socklen_t addrlen;
     200       
     201        switch (af) {
     202        case AF_INET:
     203                addr.sin_port = htons(DNS_SERVER_PORT);
     204                address = (struct sockaddr *) &addr;
     205                addrlen = sizeof(addr);
     206                break;
     207        case AF_INET6:
     208                addr6.sin6_port = htons(DNS_SERVER_PORT);
     209                address = (struct sockaddr *) &addr6;
     210                addrlen = sizeof(addr6);
     211                break;
     212        default:
     213                rc = EAFNOSUPPORT;
     214                goto error;
     215        }
     216       
     217        size_t ntry = 0;
     218       
    205219        while (ntry < REQ_RETRY_MAX) {
    206220                rc = sendto(transport_fd, req_data, req_size, 0,
    207                     (struct sockaddr *) &addr, sizeof(addr));
     221                    (struct sockaddr *) address, addrlen);
    208222                if (rc != EOK)
    209223                        goto error;
  • uspace/srv/net/ethip/arp.c

    redf0d27 r02a09ed  
    3838#include <io/log.h>
    3939#include <inet/iplink_srv.h>
     40#include <inet/addr.h>
    4041#include <stdlib.h>
    41 
     42#include <net/socket_codes.h>
    4243#include "arp.h"
    4344#include "atrans.h"
     
    5455void arp_received(ethip_nic_t *nic, eth_frame_t *frame)
    5556{
    56         int rc;
     57        log_msg(LOG_DEFAULT, LVL_DEBUG, "arp_received()");
     58       
    5759        arp_eth_packet_t packet;
    58         arp_eth_packet_t reply;
    59         ethip_link_addr_t *laddr;
    60 
    61         log_msg(LOG_DEFAULT, LVL_DEBUG, "arp_received()");
    62 
    63         rc = arp_pdu_decode(frame->data, frame->size, &packet);
     60        int rc = arp_pdu_decode(frame->data, frame->size, &packet);
    6461        if (rc != EOK)
    6562                return;
    66 
     63       
    6764        log_msg(LOG_DEFAULT, LVL_DEBUG, "ARP PDU decoded, opcode=%d, tpa=%x",
    6865            packet.opcode, packet.target_proto_addr);
    69 
    70         laddr = ethip_nic_addr_find(nic, packet.target_proto_addr);
    71         if (laddr != NULL) {
    72                 log_msg(LOG_DEFAULT, LVL_DEBUG, "Request/reply to my address");
    73 
    74                 (void) atrans_add(packet.sender_proto_addr,
    75                     &packet.sender_hw_addr);
    76 
    77                 if (packet.opcode == aop_request) {
    78                         reply.opcode = aop_reply;
    79                         reply.sender_hw_addr = nic->mac_addr;
    80                         reply.sender_proto_addr = laddr->addr;
    81                         reply.target_hw_addr = packet.sender_hw_addr;
    82                         reply.target_proto_addr = packet.sender_proto_addr;
    83 
    84                         arp_send_packet(nic, &reply);
    85                 }
     66       
     67        inet_addr_t addr;
     68        inet_addr_set(packet.target_proto_addr, &addr);
     69       
     70        ethip_link_addr_t *laddr = ethip_nic_addr_find(nic, &addr);
     71        if (laddr == NULL)
     72                return;
     73       
     74        addr32_t laddr_v4;
     75        uint16_t laddr_af = inet_addr_get(&laddr->addr, &laddr_v4, NULL);
     76        if (laddr_af != AF_INET)
     77                return;
     78       
     79        log_msg(LOG_DEFAULT, LVL_DEBUG, "Request/reply to my address");
     80       
     81        (void) atrans_add(packet.sender_proto_addr,
     82            packet.sender_hw_addr);
     83       
     84        if (packet.opcode == aop_request) {
     85                arp_eth_packet_t reply;
     86               
     87                reply.opcode = aop_reply;
     88                addr48(nic->mac_addr, reply.sender_hw_addr);
     89                reply.sender_proto_addr = laddr_v4;
     90                addr48(packet.sender_hw_addr, reply.target_hw_addr);
     91                reply.target_proto_addr = packet.sender_proto_addr;
     92               
     93                arp_send_packet(nic, &reply);
    8694        }
    8795}
    8896
    89 int arp_translate(ethip_nic_t *nic, uint32_t src_addr, uint32_t ip_addr,
    90     mac48_addr_t *mac_addr)
     97int arp_translate(ethip_nic_t *nic, addr32_t src_addr, addr32_t ip_addr,
     98    addr48_t mac_addr)
    9199{
    92         int rc;
    93         arp_eth_packet_t packet;
    94 
    95         rc = atrans_lookup(ip_addr, mac_addr);
     100        int rc = atrans_lookup(ip_addr, mac_addr);
    96101        if (rc == EOK)
    97102                return EOK;
    98 
     103       
     104        arp_eth_packet_t packet;
     105       
    99106        packet.opcode = aop_request;
    100         packet.sender_hw_addr = nic->mac_addr;
     107        addr48(nic->mac_addr, packet.sender_hw_addr);
    101108        packet.sender_proto_addr = src_addr;
    102         packet.target_hw_addr.addr = MAC48_BROADCAST;
     109        addr48(addr48_broadcast, packet.target_hw_addr);
    103110        packet.target_proto_addr = ip_addr;
    104 
     111       
    105112        rc = arp_send_packet(nic, &packet);
    106113        if (rc != EOK)
     
    128135                return rc;
    129136
    130         frame.dest.addr = packet->target_hw_addr.addr;
    131         frame.src.addr =  packet->sender_hw_addr.addr;
     137        addr48(packet->target_hw_addr, frame.dest);
     138        addr48(packet->sender_hw_addr, frame.src);
    132139        frame.etype_len = ETYPE_ARP;
    133140        frame.data = pdata;
  • uspace/srv/net/ethip/arp.h

    redf0d27 r02a09ed  
    3939
    4040#include <inet/iplink_srv.h>
     41#include <inet/addr.h>
    4142#include "ethip.h"
    4243
    4344extern void arp_received(ethip_nic_t *, eth_frame_t *);
    44 extern int arp_translate(ethip_nic_t *, uint32_t, uint32_t, mac48_addr_t *);
     45extern int arp_translate(ethip_nic_t *, addr32_t, addr32_t, addr48_t);
    4546
    4647#endif
  • uspace/srv/net/ethip/atrans.c

    redf0d27 r02a09ed  
    6262}
    6363
    64 int atrans_add(uint32_t ip_addr, mac48_addr_t *mac_addr)
     64int atrans_add(uint32_t ip_addr, addr48_t mac_addr)
    6565{
    6666        ethip_atrans_t *atrans;
     
    7272
    7373        atrans->ip_addr = ip_addr;
    74         atrans->mac_addr = *mac_addr;
     74        addr48(mac_addr, atrans->mac_addr);
    7575
    7676        fibril_mutex_lock(&atrans_list_lock);
     
    106106}
    107107
    108 int atrans_lookup(uint32_t ip_addr, mac48_addr_t *mac_addr)
     108int atrans_lookup(uint32_t ip_addr, addr48_t mac_addr)
    109109{
    110         ethip_atrans_t *atrans;
    111 
    112110        fibril_mutex_lock(&atrans_list_lock);
    113         atrans = atrans_find(ip_addr);
     111        ethip_atrans_t *atrans = atrans_find(ip_addr);
    114112        if (atrans == NULL) {
    115113                fibril_mutex_unlock(&atrans_list_lock);
    116114                return ENOENT;
    117115        }
    118 
     116       
    119117        fibril_mutex_unlock(&atrans_list_lock);
    120         *mac_addr = atrans->mac_addr;
     118        addr48(atrans->mac_addr, mac_addr);
    121119        return EOK;
    122120}
  • uspace/srv/net/ethip/atrans.h

    redf0d27 r02a09ed  
    3939
    4040#include <inet/iplink_srv.h>
     41#include <inet/addr.h>
    4142#include "ethip.h"
    4243
    43 extern int atrans_add(uint32_t, mac48_addr_t *);
     44extern int atrans_add(uint32_t, addr48_t);
    4445extern int atrans_remove(uint32_t);
    45 extern int atrans_lookup(uint32_t, mac48_addr_t *);
     46extern int atrans_lookup(uint32_t, addr48_t);
    4647extern int atrans_wait_timeout(suseconds_t);
    4748
  • uspace/srv/net/ethip/ethip.c

    redf0d27 r02a09ed  
    4444#include <stdio.h>
    4545#include <stdlib.h>
    46 
     46#include <net/socket_codes.h>
    4747#include "arp.h"
    4848#include "ethip.h"
     
    5555static int ethip_open(iplink_srv_t *srv);
    5656static int ethip_close(iplink_srv_t *srv);
    57 static int ethip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu);
     57static int ethip_send(iplink_srv_t *srv, iplink_sdu_t *sdu);
    5858static int ethip_get_mtu(iplink_srv_t *srv, size_t *mtu);
    59 static int ethip_addr_add(iplink_srv_t *srv, uint32_t addr);
    60 static int ethip_addr_remove(iplink_srv_t *srv, uint32_t addr);
     59static int ethip_addr_add(iplink_srv_t *srv, inet_addr_t *addr);
     60static int ethip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr);
    6161
    6262static void ethip_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg);
     
    164164}
    165165
    166 static int ethip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu)
    167 {
    168         ethip_nic_t *nic = (ethip_nic_t *)srv->arg;
     166static int ethip_send(iplink_srv_t *srv, iplink_sdu_t *sdu)
     167{
     168        log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_send()");
     169       
     170        ethip_nic_t *nic = (ethip_nic_t *) srv->arg;
     171       
     172        addr32_t src_v4;
     173        addr128_t src_v6;
     174        uint16_t src_af = inet_addr_get(&sdu->src, &src_v4, &src_v6);
     175       
     176        addr32_t dest_v4;
     177        addr128_t dest_v6;
     178        uint16_t dest_af = inet_addr_get(&sdu->dest, &dest_v4, &dest_v6);
     179       
     180        if (src_af != dest_af)
     181                return EINVAL;
     182       
     183        int rc;
    169184        eth_frame_t frame;
     185       
     186        switch (src_af) {
     187        case AF_INET:
     188                rc = arp_translate(nic, src_v4, dest_v4, frame.dest);
     189                if (rc != EOK) {
     190                        log_msg(LOG_DEFAULT, LVL_WARN, "Failed to look up IPv4 address 0x%"
     191                            PRIx32, dest_v4);
     192                        return rc;
     193                }
     194               
     195                addr48(nic->mac_addr, frame.src);
     196                frame.etype_len = ETYPE_IP;
     197                frame.data = sdu->data;
     198                frame.size = sdu->size;
     199               
     200                break;
     201        case AF_INET6:
     202                // FIXME TODO
     203                return ENOTSUP;
     204        default:
     205                return EINVAL;
     206        }
     207       
    170208        void *data;
    171209        size_t size;
    172         mac48_addr_t dest_mac_addr;
    173         int rc;
    174 
    175         log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_send()");
    176 
    177         rc = arp_translate(nic, sdu->lsrc, sdu->ldest, &dest_mac_addr);
    178         if (rc != EOK) {
    179                 log_msg(LOG_DEFAULT, LVL_WARN, "Failed to look up IP address 0x%" PRIx32,
    180                     sdu->ldest);
    181                 return rc;
    182         }
    183 
    184         frame.dest      = dest_mac_addr;
    185         frame.src       = nic->mac_addr;
    186         frame.etype_len = ETYPE_IP;
    187         frame.data = sdu->data;
    188         frame.size = sdu->size;
    189 
    190210        rc = eth_pdu_encode(&frame, &data, &size);
    191211        if (rc != EOK)
     
    201221{
    202222        log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_received(): srv=%p", srv);
    203         ethip_nic_t *nic = (ethip_nic_t *)srv->arg;
     223        ethip_nic_t *nic = (ethip_nic_t *) srv->arg;
     224       
     225        log_msg(LOG_DEFAULT, LVL_DEBUG, " - eth_pdu_decode");
     226       
    204227        eth_frame_t frame;
    205         iplink_srv_sdu_t sdu;
    206         int rc;
    207 
    208         log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_received()");
    209 
    210         log_msg(LOG_DEFAULT, LVL_DEBUG, " - eth_pdu_decode");
    211         rc = eth_pdu_decode(data, size, &frame);
     228        int rc = eth_pdu_decode(data, size, &frame);
    212229        if (rc != EOK) {
    213230                log_msg(LOG_DEFAULT, LVL_DEBUG, " - eth_pdu_decode failed");
    214231                return rc;
    215232        }
    216 
     233       
     234        iplink_recv_sdu_t sdu;
     235       
    217236        switch (frame.etype_len) {
    218237        case ETYPE_ARP:
     
    221240        case ETYPE_IP:
    222241                log_msg(LOG_DEFAULT, LVL_DEBUG, " - construct SDU");
    223                 sdu.lsrc = 0;
    224                 sdu.ldest = 0;
    225242                sdu.data = frame.data;
    226243                sdu.size = frame.size;
    227244                log_msg(LOG_DEFAULT, LVL_DEBUG, " - call iplink_ev_recv");
    228                 rc = iplink_ev_recv(&nic->iplink, &sdu);
     245                rc = iplink_ev_recv(&nic->iplink, &sdu, AF_INET);
    229246                break;
    230247        default:
     
    244261}
    245262
    246 static int ethip_addr_add(iplink_srv_t *srv, uint32_t addr)
    247 {
    248         log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_addr_add(0x%" PRIx32 ")", addr);
    249        
     263static int ethip_addr_add(iplink_srv_t *srv, inet_addr_t *addr)
     264{
    250265        ethip_nic_t *nic = (ethip_nic_t *) srv->arg;
    251266       
     
    253268}
    254269
    255 static int ethip_addr_remove(iplink_srv_t *srv, uint32_t addr)
    256 {
    257         log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_addr_remove(0x%" PRIx32 ")", addr);
    258        
    259         ethip_nic_t *nic = (ethip_nic_t *)srv->arg;
    260        
    261         return ethip_nic_addr_add(nic, addr);
     270static int ethip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr)
     271{
     272        ethip_nic_t *nic = (ethip_nic_t *) srv->arg;
     273       
     274        return ethip_nic_addr_remove(nic, addr);
    262275}
    263276
  • uspace/srv/net/ethip/ethip.h

    redf0d27 r02a09ed  
    4141#include <async.h>
    4242#include <inet/iplink_srv.h>
     43#include <inet/addr.h>
    4344#include <loc.h>
    4445#include <sys/types.h>
    4546
    46 #define MAC48_BROADCAST 0xffffffffffff
    47 
    4847typedef struct {
    4948        link_t addr_list;
    50         uint32_t addr;
     49        inet_addr_t addr;
    5150} ethip_link_addr_t;
    52 
    53 /** IEEE MAC-48 identifier */
    54 typedef struct {
    55         /** MAC Address (in lowest 48 bits) */
    56         uint64_t addr;
    57 } mac48_addr_t;
    5851
    5952typedef struct ethip_nic {
     
    6760
    6861        /** MAC address */
    69         mac48_addr_t mac_addr;
     62        addr48_t mac_addr;
    7063        /** List of IP addresses configured on this link */
    7164        list_t addr_list; /* of ethip_link_addr_t */
     
    7568typedef struct {
    7669        /** Destination Address */
    77         mac48_addr_t dest;
     70        addr48_t dest;
    7871        /** Source Address */
    79         mac48_addr_t src;
     72        addr48_t src;
    8073        /** Ethertype or Length */
    8174        uint16_t etype_len;
     
    10295        arp_opcode_t opcode;
    10396        /** Sender hardware address */
    104         mac48_addr_t sender_hw_addr;
     97        addr48_t sender_hw_addr;
    10598        /** Sender protocol address */
    10699        uint32_t sender_proto_addr;
    107100        /** Target hardware address */
    108         mac48_addr_t target_hw_addr;
     101        addr48_t target_hw_addr;
    109102        /** Target protocol address */
    110103        uint32_t target_proto_addr;
     
    115108        link_t atrans_list;
    116109        uint32_t ip_addr;
    117         mac48_addr_t mac_addr;
     110        addr48_t mac_addr;
    118111} ethip_atrans_t;
    119112
  • uspace/srv/net/ethip/ethip_nic.c

    redf0d27 r02a09ed  
    121121}
    122122
    123 static ethip_link_addr_t *ethip_nic_addr_new(uint32_t addr)
     123static ethip_link_addr_t *ethip_nic_addr_new(inet_addr_t *addr)
    124124{
    125125        ethip_link_addr_t *laddr = calloc(1, sizeof(ethip_link_addr_t));
     
    131131       
    132132        link_initialize(&laddr->addr_list);
    133         laddr->addr = addr;
     133        laddr->addr = *addr;
    134134       
    135135        return laddr;
     
    193193                goto error;
    194194        }
    195 
    196         mac48_decode(nic_address.address, &nic->mac_addr);
     195       
     196        addr48(nic_address.address, nic->mac_addr);
    197197
    198198        rc = nic_set_state(nic->sess, NIC_STATE_ACTIVE);
     
    203203        }
    204204
    205         log_msg(LOG_DEFAULT, LVL_DEBUG, "Initialized IP link service, MAC = 0x%" PRIx64,
    206             nic->mac_addr.addr);
     205        log_msg(LOG_DEFAULT, LVL_DEBUG, "Initialized IP link service,");
    207206
    208207        return EOK;
     
    335334}
    336335
    337 int ethip_nic_addr_add(ethip_nic_t *nic, uint32_t addr)
     336int ethip_nic_addr_add(ethip_nic_t *nic, inet_addr_t *addr)
    338337{
    339338        log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_nic_addr_add()");
     
    347346}
    348347
    349 int ethip_nic_addr_remove(ethip_nic_t *nic, uint32_t addr)
     348int ethip_nic_addr_remove(ethip_nic_t *nic, inet_addr_t *addr)
    350349{
    351350        log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_nic_addr_remove()");
     
    361360
    362361ethip_link_addr_t *ethip_nic_addr_find(ethip_nic_t *nic,
    363     uint32_t addr)
     362    inet_addr_t *addr)
    364363{
    365364        log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_nic_addr_find()");
     
    369368                    ethip_link_addr_t, addr_list);
    370369               
    371                 if (addr == laddr->addr)
     370                if (inet_addr_compare(addr, &laddr->addr))
    372371                        return laddr;
    373372        }
  • uspace/srv/net/ethip/ethip_nic.h

    redf0d27 r02a09ed  
    3939
    4040#include <ipc/loc.h>
     41#include <inet/addr.h>
    4142#include "ethip.h"
    4243
     
    4445extern ethip_nic_t *ethip_nic_find_by_iplink_sid(service_id_t);
    4546extern int ethip_nic_send(ethip_nic_t *, void *, size_t);
    46 extern int ethip_nic_addr_add(ethip_nic_t *, uint32_t);
    47 extern int ethip_nic_addr_remove(ethip_nic_t *, uint32_t);
    48 extern ethip_link_addr_t *ethip_nic_addr_find(ethip_nic_t *, uint32_t);
     47extern int ethip_nic_addr_add(ethip_nic_t *, inet_addr_t *);
     48extern int ethip_nic_addr_remove(ethip_nic_t *, inet_addr_t *);
     49extern ethip_link_addr_t *ethip_nic_addr_find(ethip_nic_t *, inet_addr_t *);
    4950
    5051#endif
  • uspace/srv/net/ethip/pdu.c

    redf0d27 r02a09ed  
    6262
    6363        hdr = (eth_header_t *)data;
    64         mac48_encode(&frame->src, hdr->src);
    65         mac48_encode(&frame->dest, hdr->dest);
     64        addr48(frame->src, hdr->src);
     65        addr48(frame->dest, hdr->dest);
    6666        hdr->etype_len = host2uint16_t_be(frame->etype_len);
    6767
     
    6969            frame->size);
    7070
    71         log_msg(LOG_DEFAULT, LVL_DEBUG, "Encoding Ethernet frame "
    72             "src=%" PRIx64 " dest=%" PRIx64 " etype=%x",
    73             frame->src.addr, frame->dest.addr, frame->etype_len);
    7471        log_msg(LOG_DEFAULT, LVL_DEBUG, "Encoded Ethernet frame (%zu bytes)", size);
    7572
     
    9895                return ENOMEM;
    9996
    100         mac48_decode(hdr->src, &frame->src);
    101         mac48_decode(hdr->dest, &frame->dest);
     97        addr48(hdr->src, frame->src);
     98        addr48(hdr->dest, frame->dest);
    10299        frame->etype_len = uint16_t_be2host(hdr->etype_len);
    103100
     
    105102            frame->size);
    106103
    107         log_msg(LOG_DEFAULT, LVL_DEBUG, "Decoding Ethernet frame "
    108             "src=%" PRIx64 " dest=%" PRIx64 " etype=%x",
    109             frame->src.addr, frame->dest.addr, frame->etype_len);
    110104        log_msg(LOG_DEFAULT, LVL_DEBUG, "Decoded Ethernet frame payload (%zu bytes)", frame->size);
    111105
    112106        return EOK;
    113 }
    114 
    115 void mac48_encode(mac48_addr_t *addr, void *buf)
    116 {
    117         uint64_t val;
    118         uint8_t *bbuf = (uint8_t *)buf;
    119         int i;
    120 
    121         val = addr->addr;
    122         for (i = 0; i < MAC48_BYTES; i++)
    123                 bbuf[i] = (val >> (8 * (MAC48_BYTES - i - 1))) & 0xff;
    124 }
    125 
    126 void mac48_decode(void *data, mac48_addr_t *addr)
    127 {
    128         uint64_t val;
    129         uint8_t *bdata = (uint8_t *)data;
    130         int i;
    131 
    132         val = 0;
    133         for (i = 0; i < MAC48_BYTES; i++)
    134                 val |= (uint64_t)bdata[i] << (8 * (MAC48_BYTES - i - 1));
    135 
    136         addr->addr = val;
    137107}
    138108
     
    168138        pfmt->proto_addr_size = IPV4_ADDR_SIZE;
    169139        pfmt->opcode = host2uint16_t_be(fopcode);
    170         mac48_encode(&packet->sender_hw_addr, pfmt->sender_hw_addr);
     140        addr48(packet->sender_hw_addr, pfmt->sender_hw_addr);
    171141        pfmt->sender_proto_addr =
    172142            host2uint32_t_be(packet->sender_proto_addr);
    173         mac48_encode(&packet->target_hw_addr, pfmt->target_hw_addr);
     143        addr48(packet->target_hw_addr, pfmt->target_hw_addr);
    174144        pfmt->target_proto_addr =
    175145            host2uint32_t_be(packet->target_proto_addr);
     
    227197        }
    228198
    229         mac48_decode(pfmt->sender_hw_addr, &packet->sender_hw_addr);
     199        addr48(pfmt->sender_hw_addr, packet->sender_hw_addr);
    230200        packet->sender_proto_addr =
    231201            uint32_t_be2host(pfmt->sender_proto_addr);
    232         mac48_decode(pfmt->target_hw_addr, &packet->target_hw_addr);
     202        addr48(pfmt->target_hw_addr, packet->target_hw_addr);
    233203        packet->target_proto_addr =
    234204            uint32_t_be2host(pfmt->target_proto_addr);
  • uspace/srv/net/ethip/pdu.h

    redf0d27 r02a09ed  
    4242extern int eth_pdu_encode(eth_frame_t *, void **, size_t *);
    4343extern int eth_pdu_decode(void *, size_t, eth_frame_t *);
    44 extern void mac48_encode(mac48_addr_t *, void *);
    45 extern void mac48_decode(void *, mac48_addr_t *);
    4644extern int arp_pdu_encode(arp_eth_packet_t *, void **, size_t *);
    4745extern int arp_pdu_decode(void *, size_t, arp_eth_packet_t *);
  • uspace/srv/net/ethip/std.h

    redf0d27 r02a09ed  
    3939
    4040#include <sys/types.h>
     41#include <inet/addr.h>
    4142
    4243#define ETH_ADDR_SIZE       6
     
    4748typedef struct {
    4849        /** Destination Address */
    49         uint8_t dest[ETH_ADDR_SIZE];
     50        addr48_t dest;
    5051        /** Source Address */
    51         uint8_t src[ETH_ADDR_SIZE];
     52        addr48_t src;
    5253        /** Ethertype or Length */
    5354        uint16_t etype_len;
     
    6768        uint16_t opcode;
    6869        /** Sender hardware address */
    69         uint8_t sender_hw_addr[ETH_ADDR_SIZE];
     70        addr48_t sender_hw_addr;
    7071        /** Sender protocol address */
    7172        uint32_t sender_proto_addr;
    7273        /** Target hardware address */
    73         uint8_t target_hw_addr[ETH_ADDR_SIZE];
     74        addr48_t target_hw_addr;
    7475        /** Target protocol address */
    7576        uint32_t target_proto_addr;
     
    8788/** IP Ethertype */
    8889enum ether_type {
    89         ETYPE_ARP = 0x0806,
    90         ETYPE_IP  = 0x0800
     90        ETYPE_ARP  = 0x0806,
     91        ETYPE_IP   = 0x0800,
     92        ETYPE_IPV6 = 0x86DD
    9193};
    9294
  • uspace/srv/net/inetsrv/Makefile

    redf0d27 r02a09ed  
    3535        inetsrv.c \
    3636        inet_link.c \
    37         inet_util.c \
    3837        inetcfg.c \
    3938        inetping.c \
  • uspace/srv/net/inetsrv/addrobj.c

    redf0d27 r02a09ed  
    4242#include <stdlib.h>
    4343#include <str.h>
    44 
    4544#include "addrobj.h"
    4645#include "inetsrv.h"
    4746#include "inet_link.h"
    48 #include "inet_util.h"
    4947
    5048static inet_addrobj_t *inet_addrobj_find_by_name_locked(const char *, inet_link_t *);
     
    106104/** Find address object matching address @a addr.
    107105 *
    108  * @param addr  Address
    109  * @oaram find  iaf_net to find network (using mask),
    110  *              iaf_addr to find local address (exact match)
     106 * @param addr Address
     107 * @oaram find iaf_net to find network (using mask),
     108 *             iaf_addr to find local address (exact match)
     109 *
    111110 */
    112111inet_addrobj_t *inet_addrobj_find(inet_addr_t *addr, inet_addrobj_find_t find)
    113112{
    114         uint32_t addr_addr;
    115         int rc = inet_addr_pack(addr, &addr_addr);
    116         if (rc != EOK)
    117                 return NULL;
    118        
    119113        fibril_mutex_lock(&addr_list_lock);
    120114       
     
    123117                    inet_addrobj_t, addr_list);
    124118               
    125                 uint32_t naddr_addr;
    126                 uint8_t naddr_bits;
    127                 rc = inet_naddr_pack(&naddr->naddr, &naddr_addr, &naddr_bits);
    128                 if (rc != EOK)
    129                         continue;
    130                
    131                 uint32_t mask = inet_netmask(naddr_bits);
    132                 if ((naddr_addr & mask) == (addr_addr & mask)) {
     119                if (inet_naddr_compare_mask(&naddr->naddr, addr)) {
    133120                        fibril_mutex_unlock(&addr_list_lock);
    134121                        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_addrobj_find: found %p",
     
    227214        inet_naddr_addr(&addr->naddr, &lsrc_addr);
    228215       
    229         inet_addr_t *ldest_addr = ldest;
    230        
    231         return inet_link_send_dgram(addr->ilink, &lsrc_addr, ldest_addr, dgram,
     216        return inet_link_send_dgram(addr->ilink, &lsrc_addr, ldest, dgram,
    232217            proto, ttl, df);
    233218}
  • uspace/srv/net/inetsrv/icmp.c

    redf0d27 r02a09ed  
    4040#include <mem.h>
    4141#include <stdlib.h>
    42 
     42#include <net/socket_codes.h>
    4343#include "icmp.h"
    4444#include "icmp_std.h"
     
    129129        inetping_sdu_t sdu;
    130130       
    131         int rc = inet_addr_pack(&dgram->src, &sdu.src);
    132         if (rc != EOK)
    133                 return rc;
     131        uint16_t family = inet_addr_get(&dgram->src, &sdu.src, NULL);
     132        if (family != AF_INET)
     133                return EINVAL;
    134134       
    135         rc = inet_addr_pack(&dgram->dest, &sdu.dest);
    136         if (rc != EOK)
    137                 return rc;
     135        family = inet_addr_get(&dgram->dest, &sdu.dest, NULL);
     136        if (family != AF_INET)
     137                return EINVAL;
    138138       
    139139        sdu.seq_no = uint16_t_be2host(reply->seq_no);
     
    168168        inet_dgram_t dgram;
    169169       
    170         inet_addr_unpack(sdu->src, &dgram.src);
    171         inet_addr_unpack(sdu->dest, &dgram.dest);
     170        inet_addr_set(sdu->src, &dgram.src);
     171        inet_addr_set(sdu->dest, &dgram.dest);
    172172       
    173173        dgram.tos = ICMP_TOS;
  • uspace/srv/net/inetsrv/inet_link.c

    redf0d27 r02a09ed  
    4343#include <stdlib.h>
    4444#include <str.h>
    45 
     45#include <net/socket_codes.h>
    4646#include "addrobj.h"
    4747#include "inetsrv.h"
     
    4949#include "pdu.h"
    5050
    51 static int inet_link_open(service_id_t sid);
    52 static int inet_iplink_recv(iplink_t *ilink, iplink_sdu_t *sdu);
     51static int inet_link_open(service_id_t);
     52static int inet_iplink_recv(iplink_t *, iplink_recv_sdu_t *, uint16_t);
    5353
    5454static iplink_ev_ops_t inet_iplink_ev_ops = {
     
    5959static FIBRIL_MUTEX_INITIALIZE(inet_discovery_lock);
    6060
    61 static int inet_iplink_recv(iplink_t *iplink, iplink_sdu_t *sdu)
    62 {
     61static int inet_iplink_recv(iplink_t *iplink, iplink_recv_sdu_t *sdu, uint16_t af)
     62{
     63        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_iplink_recv()");
     64       
     65        int rc;
    6366        inet_packet_t packet;
    64         int rc;
    65 
    66         log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_iplink_recv()");
    67         rc = inet_pdu_decode(sdu->data, sdu->size, &packet);
     67       
     68        switch (af) {
     69        case AF_INET:
     70                rc = inet_pdu_decode(sdu->data, sdu->size, &packet);
     71                break;
     72        case AF_INET6:
     73                // FIXME TODO
     74                return ENOTSUP;
     75        default:
     76                log_msg(LOG_DEFAULT, LVL_DEBUG, "invalid address family");
     77                return EINVAL;
     78        }
     79       
    6880        if (rc != EOK) {
    6981                log_msg(LOG_DEFAULT, LVL_DEBUG, "failed decoding PDU");
     
    228240
    229241        return EOK;
    230 
     242       
    231243error:
    232244        if (ilink->iplink != NULL)
     
    277289       
    278290        iplink_sdu_t sdu;
    279        
    280         int rc = inet_addr_pack(lsrc, &sdu.lsrc);
    281         if (rc != EOK)
    282                 return rc;
    283        
    284         rc = inet_addr_pack(ldest, &sdu.ldest);
    285         if (rc != EOK)
    286                 return rc;
    287        
    288291        size_t offs = 0;
     292        int rc;
     293       
     294        sdu.src = *lsrc;
     295        sdu.dest = *ldest;
     296       
    289297        do {
     298                /* Encode one fragment */
    290299                size_t roffs;
    291                
    292                 /* Encode one fragment */
    293300                rc = inet_pdu_encode(&packet, offs, ilink->def_mtu, &sdu.data,
    294301                    &sdu.size, &roffs);
  • uspace/srv/net/inetsrv/inetcfg.c

    redf0d27 r02a09ed  
    236236}
    237237
    238 static void inetcfg_addr_create_static_srv(ipc_callid_t callid,
    239     ipc_call_t *call)
    240 {
     238static void inetcfg_addr_create_static_srv(ipc_callid_t iid,
     239    ipc_call_t *icall)
     240{
     241        log_msg(LOG_DEFAULT, LVL_DEBUG, "inetcfg_addr_create_static_srv()");
     242       
     243        sysarg_t link_id = IPC_GET_ARG1(*icall);
     244       
     245        ipc_callid_t callid;
     246        size_t size;
     247        if (!async_data_write_receive(&callid, &size)) {
     248                async_answer_0(callid, EINVAL);
     249                async_answer_0(iid, EINVAL);
     250                return;
     251        }
     252       
     253        if (size != sizeof(inet_naddr_t)) {
     254                async_answer_0(callid, EINVAL);
     255                async_answer_0(iid, EINVAL);
     256                return;
     257        }
     258       
     259        inet_naddr_t naddr;
     260        int rc = async_data_write_finalize(callid, &naddr, size);
     261        if (rc != EOK) {
     262                async_answer_0(callid, rc);
     263                async_answer_0(iid, rc);
     264                return;
     265        }
     266       
    241267        char *name;
    242         inet_naddr_t naddr;
    243         sysarg_t link_id;
    244         sysarg_t addr_id;
    245         int rc;
    246 
    247         log_msg(LOG_DEFAULT, LVL_DEBUG, "inetcfg_addr_create_static_srv()");
    248 
    249268        rc = async_data_write_accept((void **) &name, true, 0, LOC_NAME_MAXLEN,
    250269            0, NULL);
    251270        if (rc != EOK) {
    252                 async_answer_0(callid, rc);
    253                 return;
    254         }
    255 
    256         inet_naddr_unpack(IPC_GET_ARG1(*call), IPC_GET_ARG2(*call), &naddr);
    257         link_id = IPC_GET_ARG3(*call);
    258 
    259         addr_id = 0;
     271                async_answer_0(iid, rc);
     272                return;
     273        }
     274       
     275        sysarg_t addr_id = 0;
    260276        rc = inetcfg_addr_create_static(name, &naddr, link_id, &addr_id);
    261277        free(name);
    262         async_answer_1(callid, rc, addr_id);
     278        async_answer_1(iid, rc, addr_id);
    263279}
    264280
     
    276292}
    277293
    278 static void inetcfg_addr_get_srv(ipc_callid_t callid, ipc_call_t *call)
     294static void inetcfg_addr_get_srv(ipc_callid_t iid, ipc_call_t *icall)
    279295{
    280296        log_msg(LOG_DEFAULT, LVL_DEBUG, "inetcfg_addr_get_srv()");
    281297       
    282         sysarg_t addr_id = IPC_GET_ARG1(*call);
     298        sysarg_t addr_id = IPC_GET_ARG1(*icall);
    283299       
    284300        inet_addr_info_t ainfo;
     
    288304        ainfo.name = NULL;
    289305       
    290         ipc_callid_t rcallid;
    291         size_t max_size;
    292        
    293         if (!async_data_read_receive(&rcallid, &max_size)) {
    294                 async_answer_0(rcallid, EREFUSED);
    295                 async_answer_0(callid, EREFUSED);
    296                 return;
    297         }
    298        
    299306        int rc = inetcfg_addr_get(addr_id, &ainfo);
    300307        if (rc != EOK) {
    301                 async_answer_0(callid, rc);
    302                 return;
    303         }
    304        
    305         uint32_t naddr_addr;
    306         uint8_t naddr_bits;
    307         rc = inet_naddr_pack(&ainfo.naddr, &naddr_addr, &naddr_bits);
    308         if (rc != EOK) {
    309                 async_answer_0(callid, rc);
    310                 return;
    311         }
    312        
    313         sysarg_t retval = async_data_read_finalize(rcallid, ainfo.name,
    314             min(max_size, str_size(ainfo.name)));
     308                async_answer_0(iid, rc);
     309                return;
     310        }
     311       
     312        ipc_callid_t callid;
     313        size_t size;
     314        if (!async_data_read_receive(&callid, &size)) {
     315                async_answer_0(callid, EREFUSED);
     316                async_answer_0(iid, EREFUSED);
     317                return;
     318        }
     319       
     320        if (size != sizeof(inet_naddr_t)) {
     321                async_answer_0(callid, EINVAL);
     322                async_answer_0(iid, EINVAL);
     323                return;
     324        }
     325       
     326        rc = async_data_read_finalize(callid, &ainfo.naddr, size);
     327        if (rc != EOK) {
     328                async_answer_0(callid, rc);
     329                async_answer_0(iid, rc);
     330                return;
     331        }
     332       
     333        if (!async_data_read_receive(&callid, &size)) {
     334                async_answer_0(callid, EREFUSED);
     335                async_answer_0(iid, EREFUSED);
     336                return;
     337        }
     338       
     339        rc = async_data_read_finalize(callid, ainfo.name,
     340            min(size, str_size(ainfo.name)));
    315341        free(ainfo.name);
    316342       
    317         async_answer_3(callid, retval, (sysarg_t) naddr_addr,
    318             (sysarg_t) naddr_bits, ainfo.ilink);
     343        if (rc != EOK) {
     344                async_answer_0(callid, rc);
     345                async_answer_0(iid, rc);
     346                return;
     347        }
     348       
     349        async_answer_1(iid, (sysarg_t) rc, ainfo.ilink);
    319350}
    320351
     
    477508}
    478509
    479 static void inetcfg_sroute_create_srv(ipc_callid_t callid,
    480     ipc_call_t *call)
     510static void inetcfg_sroute_create_srv(ipc_callid_t iid,
     511    ipc_call_t *icall)
    481512{
    482513        log_msg(LOG_DEFAULT, LVL_DEBUG, "inetcfg_sroute_create_srv()");
     514
     515        ipc_callid_t callid;
     516        size_t size;
     517        if (!async_data_write_receive(&callid, &size)) {
     518                async_answer_0(callid, EINVAL);
     519                async_answer_0(iid, EINVAL);
     520                return;
     521        }
     522       
     523        if (size != sizeof(inet_naddr_t)) {
     524                async_answer_0(callid, EINVAL);
     525                async_answer_0(iid, EINVAL);
     526                return;
     527        }
     528       
     529        inet_naddr_t dest;
     530        int rc = async_data_write_finalize(callid, &dest, size);
     531        if (rc != EOK) {
     532                async_answer_0(callid, rc);
     533                async_answer_0(iid, rc);
     534                return;
     535        }
     536       
     537        if (!async_data_write_receive(&callid, &size)) {
     538                async_answer_0(callid, EINVAL);
     539                async_answer_0(iid, EINVAL);
     540                return;
     541        }
     542       
     543        if (size != sizeof(inet_addr_t)) {
     544                async_answer_0(callid, EINVAL);
     545                async_answer_0(iid, EINVAL);
     546                return;
     547        }
     548       
     549        inet_addr_t router;
     550        rc = async_data_write_finalize(callid, &router, size);
     551        if (rc != EOK) {
     552                async_answer_0(callid, rc);
     553                async_answer_0(iid, rc);
     554                return;
     555        }
    483556       
    484557        char *name;
    485         int rc = async_data_write_accept((void **) &name, true, 0, LOC_NAME_MAXLEN,
     558        rc = async_data_write_accept((void **) &name, true, 0, LOC_NAME_MAXLEN,
    486559            0, NULL);
    487560        if (rc != EOK) {
    488                 async_answer_0(callid, rc);
    489                 return;
    490         }
    491        
    492         inet_naddr_t dest;
    493         inet_addr_t router;
    494        
    495         inet_naddr_unpack(IPC_GET_ARG1(*call), IPC_GET_ARG2(*call), &dest);
    496         inet_addr_unpack(IPC_GET_ARG3(*call), &router);
     561                async_answer_0(iid, rc);
     562                return;
     563        }
    497564       
    498565        sysarg_t sroute_id = 0;
    499566        rc = inetcfg_sroute_create(name, &dest, &router, &sroute_id);
    500567        free(name);
    501         async_answer_1(callid, rc, sroute_id);
     568        async_answer_1(iid, rc, sroute_id);
    502569}
    503570
     
    515582}
    516583
    517 static void inetcfg_sroute_get_srv(ipc_callid_t callid, ipc_call_t *call)
     584static void inetcfg_sroute_get_srv(ipc_callid_t iid, ipc_call_t *icall)
    518585{
    519586        log_msg(LOG_DEFAULT, LVL_DEBUG, "inetcfg_sroute_get_srv()");
    520587       
    521         sysarg_t sroute_id = IPC_GET_ARG1(*call);
     588        sysarg_t sroute_id = IPC_GET_ARG1(*icall);
    522589       
    523590        inet_sroute_info_t srinfo;
     
    527594        srinfo.name = NULL;
    528595       
    529         ipc_callid_t rcallid;
    530         size_t max_size;
    531         if (!async_data_read_receive(&rcallid, &max_size)) {
    532                 async_answer_0(rcallid, EREFUSED);
    533                 async_answer_0(callid, EREFUSED);
    534                 return;
    535         }
    536        
    537596        int rc = inetcfg_sroute_get(sroute_id, &srinfo);
    538597        if (rc != EOK) {
    539                 async_answer_0(callid, rc);
    540                 return;
    541         }
    542        
    543         uint32_t dest_addr;
    544         uint8_t dest_bits;
    545         rc = inet_naddr_pack(&srinfo.dest, &dest_addr, &dest_bits);
    546         if (rc != EOK) {
    547                 async_answer_0(callid, rc);
    548                 return;
    549         }
    550        
    551         uint32_t router_addr;
    552         rc = inet_addr_pack(&srinfo.router, &router_addr);
    553         if (rc != EOK) {
    554                 async_answer_0(callid, rc);
    555                 return;
    556         }
    557        
    558         sysarg_t retval = async_data_read_finalize(rcallid, srinfo.name,
    559             min(max_size, str_size(srinfo.name)));
     598                async_answer_0(iid, rc);
     599                return;
     600        }
     601       
     602        ipc_callid_t callid;
     603        size_t size;
     604        if (!async_data_read_receive(&callid, &size)) {
     605                async_answer_0(callid, EREFUSED);
     606                async_answer_0(iid, EREFUSED);
     607                return;
     608        }
     609       
     610        if (size != sizeof(inet_naddr_t)) {
     611                async_answer_0(callid, EINVAL);
     612                async_answer_0(iid, EINVAL);
     613                return;
     614        }
     615       
     616        rc = async_data_read_finalize(callid, &srinfo.dest, size);
     617        if (rc != EOK) {
     618                async_answer_0(callid, rc);
     619                async_answer_0(iid, rc);
     620                return;
     621        }
     622       
     623        if (!async_data_read_receive(&callid, &size)) {
     624                async_answer_0(callid, EREFUSED);
     625                async_answer_0(iid, EREFUSED);
     626                return;
     627        }
     628       
     629        if (size != sizeof(inet_addr_t)) {
     630                async_answer_0(callid, EINVAL);
     631                async_answer_0(iid, EINVAL);
     632                return;
     633        }
     634       
     635        rc = async_data_read_finalize(callid, &srinfo.router, size);
     636        if (rc != EOK) {
     637                async_answer_0(callid, rc);
     638                async_answer_0(iid, rc);
     639                return;
     640        }
     641       
     642        if (!async_data_read_receive(&callid, &size)) {
     643                async_answer_0(callid, EREFUSED);
     644                async_answer_0(iid, EREFUSED);
     645                return;
     646        }
     647       
     648        rc = async_data_read_finalize(callid, srinfo.name,
     649            min(size, str_size(srinfo.name)));
    560650        free(srinfo.name);
    561651       
    562         async_answer_3(callid, retval, (sysarg_t) dest_addr,
    563             (sysarg_t) dest_bits, (sysarg_t) router_addr);
     652        async_answer_0(iid, (sysarg_t) rc);
    564653}
    565654
  • uspace/srv/net/inetsrv/inetping.c

    redf0d27 r02a09ed  
    4343#include <stdlib.h>
    4444#include <sys/types.h>
    45 
     45#include <net/socket_codes.h>
    4646#include "icmp.h"
    4747#include "icmp_std.h"
     
    5555static uint16_t inetping_ident = 0;
    5656
    57 static inetping_client_t *inetping_client_find(uint16_t);
    58 
    5957static int inetping_send(inetping_client_t *client, inetping_sdu_t *sdu)
    6058{
     
    6260}
    6361
    64 static int inetping_get_srcaddr(inetping_client_t *client, uint32_t remote,
    65     uint32_t *local)
     62static int inetping_get_srcaddr(inetping_client_t *client, addr32_t remote,
     63    addr32_t *local)
    6664{
    6765        inet_addr_t remote_addr;
    68         inet_addr_unpack(remote, &remote_addr);
     66        inet_addr_set(remote, &remote_addr);
    6967       
    7068        inet_addr_t local_addr;
     
    7371                return rc;
    7472       
    75         return inet_addr_pack(&local_addr, local);
     73        uint16_t family = inet_addr_get(&local_addr, local, NULL);
     74        if (family != AF_INET)
     75                return EINVAL;
     76       
     77        return EOK;
     78}
     79
     80static inetping_client_t *inetping_client_find(uint16_t ident)
     81{
     82        fibril_mutex_lock(&client_list_lock);
     83       
     84        list_foreach(client_list, link) {
     85                inetping_client_t *client = list_get_instance(link,
     86                    inetping_client_t, client_list);
     87               
     88                if (client->ident == ident) {
     89                        fibril_mutex_unlock(&client_list_lock);
     90                        return client;
     91                }
     92        }
     93       
     94        fibril_mutex_unlock(&client_list_lock);
     95        return NULL;
    7696}
    7797
    7898int inetping_recv(uint16_t ident, inetping_sdu_t *sdu)
    7999{
    80         inetping_client_t *client;
    81         async_exch_t *exch;
    82         ipc_call_t answer;
    83 
    84         client = inetping_client_find(ident);
     100        inetping_client_t *client = inetping_client_find(ident);
    85101        if (client == NULL) {
    86102                log_msg(LOG_DEFAULT, LVL_DEBUG, "Unknown ICMP ident. Dropping.");
    87103                return ENOENT;
    88104        }
    89 
    90         exch = async_exchange_begin(client->sess);
    91 
     105       
     106        async_exch_t *exch = async_exchange_begin(client->sess);
     107       
     108        ipc_call_t answer;
    92109        aid_t req = async_send_3(exch, INETPING_EV_RECV, (sysarg_t) sdu->src,
    93110            (sysarg_t) sdu->dest, sdu->seq_no, &answer);
    94111        int rc = async_data_write_start(exch, sdu->data, sdu->size);
     112       
    95113        async_exchange_end(exch);
    96114       
     
    170188}
    171189
    172 static inetping_client_t *inetping_client_find(uint16_t ident)
    173 {
    174         fibril_mutex_lock(&client_list_lock);
    175 
    176         list_foreach(client_list, link) {
    177                 inetping_client_t *client = list_get_instance(link,
    178                     inetping_client_t, client_list);
    179 
    180                 if (client->ident == ident) {
    181                         fibril_mutex_unlock(&client_list_lock);
    182                         return client;
    183                 }
    184         }
    185 
    186         fibril_mutex_unlock(&client_list_lock);
    187         return NULL;
    188 }
    189 
    190190void inetping_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg)
    191191{
    192         inetping_client_t client;
    193         int rc;
    194 
    195192        log_msg(LOG_DEFAULT, LVL_DEBUG, "inetping_conn()");
    196 
     193       
    197194        /* Accept the connection */
    198195        async_answer_0(iid, EOK);
    199 
    200         rc = inetping_client_init(&client);
     196       
     197        inetping_client_t client;
     198        int rc = inetping_client_init(&client);
    201199        if (rc != EOK)
    202200                return;
  • uspace/srv/net/inetsrv/inetsrv.c

    redf0d27 r02a09ed  
    4646#include <stdlib.h>
    4747#include <sys/types.h>
    48 
     48#include <net/socket_codes.h>
    4949#include "addrobj.h"
    5050#include "icmp.h"
     
    202202        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_get_srcaddr_srv()");
    203203       
     204        addr32_t remote_v4 = IPC_GET_ARG1(*call);
     205        uint8_t tos = IPC_GET_ARG2(*call);
     206       
    204207        inet_addr_t remote;
    205         inet_addr_unpack(IPC_GET_ARG1(*call), &remote);
    206         uint8_t tos = IPC_GET_ARG2(*call);
     208        inet_addr_set(remote_v4, &remote);
    207209       
    208210        inet_addr_t local;
     
    213215        }
    214216       
    215         uint32_t local_addr;
    216         rc = inet_addr_pack(&local, &local_addr);
    217         if (rc != EOK) {
    218                 async_answer_0(callid, rc);
     217        addr32_t local_v4;
     218        uint16_t family = inet_addr_get(&local, &local_v4, NULL);
     219        if (family != AF_INET) {
     220                async_answer_0(callid, EINVAL);
    219221                return;
    220222        }
    221223       
    222         async_answer_1(callid, rc, (sysarg_t) local_addr);
     224        async_answer_1(callid, rc, (sysarg_t) local_v4);
    223225}
    224226
     
    228230        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_send_srv()");
    229231       
     232        addr32_t src_v4 = IPC_GET_ARG1(*call);
     233        addr32_t dest_v4 = IPC_GET_ARG2(*call);
     234       
    230235        inet_dgram_t dgram;
    231236       
    232         inet_addr_unpack(IPC_GET_ARG1(*call), &dgram.src);
    233         inet_addr_unpack(IPC_GET_ARG2(*call), &dgram.dest);
     237        inet_addr_set(src_v4, &dgram.src);
     238        inet_addr_set(dest_v4, &dgram.dest);
    234239        dgram.tos = IPC_GET_ARG3(*call);
    235240       
     
    371376int inet_ev_recv(inet_client_t *client, inet_dgram_t *dgram)
    372377{
    373         uint32_t src;
    374         int rc = inet_addr_pack(&dgram->src, &src);
    375         if (rc != EOK)
    376                 return rc;
    377        
    378         uint32_t dest;
    379         rc = inet_addr_pack(&dgram->dest, &dest);
    380         if (rc != EOK)
    381                 return rc;
    382        
    383378        async_exch_t *exch = async_exchange_begin(client->sess);
    384379       
    385380        ipc_call_t answer;
    386         aid_t req = async_send_3(exch, INET_EV_RECV, (sysarg_t) src,
    387             (sysarg_t) dest, dgram->tos, &answer);
    388         rc = async_data_write_start(exch, dgram->data, dgram->size);
    389         async_exchange_end(exch);
    390        
    391         if (rc != EOK) {
     381        aid_t req = async_send_1(exch, INET_EV_RECV, dgram->tos, &answer);
     382       
     383        int rc = async_data_write_start(exch, &dgram->src, sizeof(inet_addr_t));
     384        if (rc != EOK) {
     385                async_exchange_end(exch);
    392386                async_forget(req);
    393387                return rc;
    394388        }
    395389       
     390        rc = async_data_write_start(exch, &dgram->dest, sizeof(inet_addr_t));
     391        if (rc != EOK) {
     392                async_exchange_end(exch);
     393                async_forget(req);
     394                return rc;
     395        }
     396       
     397        rc = async_data_write_start(exch, dgram->data, dgram->size);
     398       
     399        async_exchange_end(exch);
     400       
     401        if (rc != EOK) {
     402                async_forget(req);
     403                return rc;
     404        }
     405       
    396406        sysarg_t retval;
    397407        async_wait_for(req, &retval);
    398         if (retval != EOK)
    399                 return retval;
    400        
    401         return EOK;
     408       
     409        return (int) retval;
    402410}
    403411
  • uspace/srv/net/inetsrv/pdu.c

    redf0d27 r02a09ed  
    4444#include <mem.h>
    4545#include <stdlib.h>
    46 
     46#include <net/socket_codes.h>
    4747#include "inetsrv.h"
    4848#include "inet_std.h"
     
    106106    void **rdata, size_t *rsize, size_t *roffs)
    107107{
    108         uint32_t src_addr;
    109         int rc = inet_addr_pack(&packet->src, &src_addr);
    110         if (rc != EOK)
    111                 return rc;
    112        
    113         uint32_t dest_addr;
    114         rc = inet_addr_pack(&packet->dest, &dest_addr);
    115         if (rc != EOK)
    116                 return rc;
     108        addr32_t src_v4;
     109        addr128_t src_v6;
     110        uint16_t src_af = inet_addr_get(&packet->src, &src_v4, &src_v6);
     111       
     112        addr32_t dest_v4;
     113        addr128_t dest_v6;
     114        uint16_t dest_af = inet_addr_get(&packet->dest, &dest_v4, &dest_v6);
     115       
     116        if (src_af != dest_af)
     117                return EINVAL;
    117118       
    118119        /* Upper bound for fragment offset field */
     
    123124                return ELIMIT;
    124125       
    125         size_t hdr_size = sizeof(ip_header_t);
     126        size_t hdr_size;
     127       
     128        switch (src_af) {
     129        case AF_INET:
     130                hdr_size = sizeof(ip_header_t);
     131                break;
     132        case AF_INET6:
     133                // FIXME TODO
     134                assert(false);
     135        default:
     136                assert(false);
     137        }
     138       
    126139        size_t data_offs = ROUND_UP(hdr_size, 4);
    127140       
     
    164177       
    165178        /* Encode header fields */
    166         ip_header_t *hdr = (ip_header_t *) data;
    167        
    168         hdr->ver_ihl = (4 << VI_VERSION_l) | (hdr_size / sizeof(uint32_t));
    169         hdr->tos = packet->tos;
    170         hdr->tot_len = host2uint16_t_be(size);
    171         hdr->id = host2uint16_t_be(ident);
    172         hdr->flags_foff = host2uint16_t_be(flags_foff);
    173         hdr->ttl = packet->ttl;
    174         hdr->proto = packet->proto;
    175         hdr->chksum = 0;
    176         hdr->src_addr = host2uint32_t_be(src_addr);
    177         hdr->dest_addr = host2uint32_t_be(dest_addr);
    178        
    179         /* Compute checksum */
    180         uint16_t chksum = inet_checksum_calc(INET_CHECKSUM_INIT, (void *) hdr,
    181             hdr_size);
    182         hdr->chksum = host2uint16_t_be(chksum);
     179        ip_header_t *hdr;
     180       
     181        switch (src_af) {
     182        case AF_INET:
     183                hdr = (ip_header_t *) data;
     184               
     185                hdr->ver_ihl =
     186                    (4 << VI_VERSION_l) | (hdr_size / sizeof(uint32_t));
     187                hdr->tos = packet->tos;
     188                hdr->tot_len = host2uint16_t_be(size);
     189                hdr->id = host2uint16_t_be(ident);
     190                hdr->flags_foff = host2uint16_t_be(flags_foff);
     191                hdr->ttl = packet->ttl;
     192                hdr->proto = packet->proto;
     193                hdr->chksum = 0;
     194                hdr->src_addr = host2uint32_t_be(src_v4);
     195                hdr->dest_addr = host2uint32_t_be(dest_v4);
     196               
     197                /* Compute checksum */
     198                uint16_t chksum = inet_checksum_calc(INET_CHECKSUM_INIT,
     199                    (void *) hdr, hdr_size);
     200                hdr->chksum = host2uint16_t_be(chksum);
     201               
     202                break;
     203        case AF_INET6:
     204                // FIXME TODO
     205                return ENOTSUP;
     206        default:
     207                assert(false);
     208        }
    183209       
    184210        /* Copy payload */
     
    194220int inet_pdu_decode(void *data, size_t size, inet_packet_t *packet)
    195221{
    196         ip_header_t *hdr;
    197         size_t tot_len;
    198         size_t data_offs;
    199         uint8_t version;
    200         uint16_t ident;
    201         uint16_t flags_foff;
    202         uint16_t foff;
    203 
    204222        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_pdu_decode()");
    205223       
     
    208226                return EINVAL;
    209227        }
    210 
    211         hdr = (ip_header_t *)data;
    212 
    213         version = BIT_RANGE_EXTRACT(uint8_t, VI_VERSION_h, VI_VERSION_l,
    214             hdr->ver_ihl);
     228       
     229        ip_header_t *hdr = (ip_header_t *) data;
     230       
     231        uint8_t version = BIT_RANGE_EXTRACT(uint8_t, VI_VERSION_h,
     232            VI_VERSION_l, hdr->ver_ihl);
    215233        if (version != 4) {
    216234                log_msg(LOG_DEFAULT, LVL_DEBUG, "Version (%d) != 4", version);
    217235                return EINVAL;
    218236        }
    219 
    220         tot_len = uint16_t_be2host(hdr->tot_len);
     237       
     238        size_t tot_len = uint16_t_be2host(hdr->tot_len);
    221239        if (tot_len < sizeof(ip_header_t)) {
    222240                log_msg(LOG_DEFAULT, LVL_DEBUG, "Total Length too small (%zu)", tot_len);
     
    229247                return EINVAL;
    230248        }
    231 
    232         ident = uint16_t_be2host(hdr->id);
    233         flags_foff = uint16_t_be2host(hdr->flags_foff);
    234         foff = BIT_RANGE_EXTRACT(uint16_t, FF_FRAGOFF_h, FF_FRAGOFF_l,
     249       
     250        uint16_t ident = uint16_t_be2host(hdr->id);
     251        uint16_t flags_foff = uint16_t_be2host(hdr->flags_foff);
     252        uint16_t foff = BIT_RANGE_EXTRACT(uint16_t, FF_FRAGOFF_h, FF_FRAGOFF_l,
    235253            flags_foff);
    236254        /* XXX Checksum */
    237 
    238         inet_addr_unpack(uint32_t_be2host(hdr->src_addr), &packet->src);
    239         inet_addr_unpack(uint32_t_be2host(hdr->dest_addr), &packet->dest);
     255       
     256        inet_addr_set(uint32_t_be2host(hdr->src_addr), &packet->src);
     257        inet_addr_set(uint32_t_be2host(hdr->dest_addr), &packet->dest);
    240258        packet->tos = hdr->tos;
    241259        packet->proto = hdr->proto;
     
    248266       
    249267        /* XXX IP options */
    250         data_offs = sizeof(uint32_t) * BIT_RANGE_EXTRACT(uint8_t, VI_IHL_h,
    251             VI_IHL_l, hdr->ver_ihl);
    252 
     268        size_t data_offs = sizeof(uint32_t) *
     269            BIT_RANGE_EXTRACT(uint8_t, VI_IHL_h, VI_IHL_l, hdr->ver_ihl);
     270       
    253271        packet->size = tot_len - data_offs;
    254272        packet->data = calloc(packet->size, 1);
  • uspace/srv/net/inetsrv/sroute.c

    redf0d27 r02a09ed  
    4242#include <stdlib.h>
    4343#include <str.h>
    44 
    4544#include "sroute.h"
    4645#include "inetsrv.h"
    4746#include "inet_link.h"
    48 #include "inet_util.h"
    4947
    5048static FIBRIL_MUTEX_INITIALIZE(sroute_list_lock);
     
    9795inet_sroute_t *inet_sroute_find(inet_addr_t *addr)
    9896{
    99         uint32_t addr_addr;
    100         int rc = inet_addr_pack(addr, &addr_addr);
    101         if (rc != EOK)
    102                 return NULL;
     97        uint16_t addr_af = inet_addr_get(addr, NULL, NULL);
    10398       
    10499        inet_sroute_t *best = NULL;
     
    111106                    inet_sroute_t, sroute_list);
    112107               
    113                 uint32_t dest_addr;
    114108                uint8_t dest_bits;
    115                 rc = inet_naddr_pack(&sroute->dest, &dest_addr, &dest_bits);
    116                 if (rc != EOK)
     109                uint16_t dest_af = inet_naddr_get(&sroute->dest, NULL, NULL,
     110                    &dest_bits);
     111               
     112                /* Skip comparison with different address family */
     113                if (addr_af != dest_af)
    117114                        continue;
    118115               
     
    121118                        continue;
    122119               
    123                 uint32_t mask = inet_netmask(dest_bits);
    124                 if ((dest_addr & mask) == (addr_addr & mask)) {
     120                if (inet_naddr_compare_mask(&sroute->dest, addr)) {
    125121                        log_msg(LOG_DEFAULT, LVL_DEBUG, "inet_sroute_find: found candidate %p",
    126122                            sroute);
  • uspace/srv/net/loopip/loopip.c

    redf0d27 r02a09ed  
    3939#include <errno.h>
    4040#include <inet/iplink_srv.h>
     41#include <inet/addr.h>
    4142#include <io/log.h>
    4243#include <loc.h>
     
    4849static int loopip_open(iplink_srv_t *srv);
    4950static int loopip_close(iplink_srv_t *srv);
    50 static int loopip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu);
     51static int loopip_send(iplink_srv_t *srv, iplink_sdu_t *sdu);
    5152static int loopip_get_mtu(iplink_srv_t *srv, size_t *mtu);
    52 static int loopip_addr_add(iplink_srv_t *srv, uint32_t addr);
    53 static int loopip_addr_remove(iplink_srv_t *srv, uint32_t addr);
     53static int loopip_addr_add(iplink_srv_t *srv, inet_addr_t *addr);
     54static int loopip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr);
    5455
    5556static void loopip_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg);
     
    6970typedef struct {
    7071        link_t link;
    71         iplink_srv_sdu_t sdu;
     72       
     73        uint16_t af;
     74        iplink_recv_sdu_t sdu;
    7275} rqueue_entry_t;
    7376
     
    7780                log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_recv_fibril(): Wait for one item");
    7881                link_t *link = prodcons_consume(&loopip_rcv_queue);
    79                 rqueue_entry_t *rqe = list_get_instance(link, rqueue_entry_t, link);
    80 
    81                 (void) iplink_ev_recv(&loopip_iplink, &rqe->sdu);
     82                rqueue_entry_t *rqe =
     83                    list_get_instance(link, rqueue_entry_t, link);
     84               
     85                (void) iplink_ev_recv(&loopip_iplink, &rqe->sdu, rqe->af);
     86               
     87                free(rqe->sdu.data);
     88                free(rqe);
    8289        }
    8390       
     
    8794static int loopip_init(void)
    8895{
    89         int rc;
    90         service_id_t sid;
    91         category_id_t iplink_cat;
    92         const char *svc_name = "net/loopback";
    93        
    9496        async_set_client_connection(loopip_client_conn);
    9597       
    96         rc = loc_server_register(NAME);
     98        int rc = loc_server_register(NAME);
    9799        if (rc != EOK) {
    98100                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering server.");
     
    105107       
    106108        prodcons_initialize(&loopip_rcv_queue);
    107 
     109       
     110        const char *svc_name = "net/loopback";
     111        service_id_t sid;
    108112        rc = loc_service_register(svc_name, &sid);
    109113        if (rc != EOK) {
    110                 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service %s.", svc_name);
    111                 return rc;
    112         }
    113 
     114                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service %s.",
     115                    svc_name);
     116                return rc;
     117        }
     118       
     119        category_id_t iplink_cat;
    114120        rc = loc_category_get_id("iplink", &iplink_cat, IPC_FLAG_BLOCKING);
    115121        if (rc != EOK) {
     
    120126        rc = loc_service_add_to_cat(sid, iplink_cat);
    121127        if (rc != EOK) {
    122                 log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding %s to category.", svc_name);
     128                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding %s to category.",
     129                    svc_name);
    123130                return rc;
    124131        }
     
    151158}
    152159
    153 static int loopip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu)
    154 {
    155         rqueue_entry_t *rqe;
    156 
     160static int loopip_send(iplink_srv_t *srv, iplink_sdu_t *sdu)
     161{
    157162        log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_send()");
    158 
    159         rqe = calloc(1, sizeof(rqueue_entry_t));
     163       
     164        addr32_t src_v4;
     165        addr128_t src_v6;
     166        uint16_t src_af = inet_addr_get(&sdu->src, &src_v4, &src_v6);
     167       
     168        addr32_t dest_v4;
     169        addr128_t dest_v6;
     170        uint16_t dest_af = inet_addr_get(&sdu->dest, &dest_v4, &dest_v6);
     171       
     172        if (src_af != dest_af)
     173                return EINVAL;
     174       
     175        rqueue_entry_t *rqe = calloc(1, sizeof(rqueue_entry_t));
    160176        if (rqe == NULL)
    161177                return ENOMEM;
     
    164180         * Clone SDU
    165181         */
    166         rqe->sdu.lsrc = sdu->ldest;
    167         rqe->sdu.ldest = sdu->lsrc;
     182        rqe->af = src_af;
    168183        rqe->sdu.data = malloc(sdu->size);
    169184        if (rqe->sdu.data == NULL) {
     
    190205}
    191206
    192 static int loopip_addr_add(iplink_srv_t *srv, uint32_t addr)
    193 {
    194         log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_addr_add(0x%" PRIx32 ")", addr);
    195         return EOK;
    196 }
    197 
    198 static int loopip_addr_remove(iplink_srv_t *srv, uint32_t addr)
    199 {
    200         log_msg(LOG_DEFAULT, LVL_DEBUG, "loopip_addr_remove(0x%" PRIx32 ")", addr);
     207static int loopip_addr_add(iplink_srv_t *srv, inet_addr_t *addr)
     208{
     209        return EOK;
     210}
     211
     212static int loopip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr)
     213{
    201214        return EOK;
    202215}
     
    204217int main(int argc, char *argv[])
    205218{
    206         int rc;
    207 
    208         printf(NAME ": HelenOS loopback IP link provider\n");
    209 
    210         if (log_init(NAME) != EOK) {
    211                 printf(NAME ": Failed to initialize logging.\n");
    212                 return 1;
     219        printf("%s: HelenOS loopback IP link provider\n", NAME);
     220       
     221        int rc = log_init(NAME);
     222        if (rc != EOK) {
     223                printf("%s: Failed to initialize logging.\n", NAME);
     224                return rc;
    213225        }
    214226       
    215227        rc = loopip_init();
    216228        if (rc != EOK)
    217                 return 1;
    218 
    219         printf(NAME ": Accepting connections.\n");
     229                return rc;
     230       
     231        printf("%s: Accepting connections.\n", NAME);
    220232        task_retval(0);
    221233        async_manager();
  • uspace/srv/net/slip/slip.c

    redf0d27 r02a09ed  
    3838#include <stdint.h>
    3939#include <loc.h>
     40#include <net/socket_codes.h>
     41#include <inet/addr.h>
    4042#include <inet/iplink_srv.h>
    4143#include <device/char_dev.h>
     
    5052#define SLIP_END        0300
    5153#define SLIP_ESC        0333
    52 #define SLIP_ESC_END    0334
     54#define SLIP_ESC_END    0334
    5355#define SLIP_ESC_ESC    0335
    5456
    5557static int slip_open(iplink_srv_t *);
    5658static int slip_close(iplink_srv_t *);
    57 static int slip_send(iplink_srv_t *, iplink_srv_sdu_t *);
     59static int slip_send(iplink_srv_t *, iplink_sdu_t *);
    5860static int slip_get_mtu(iplink_srv_t *, size_t *);
    59 static int slip_addr_add(iplink_srv_t *, uint32_t);
    60 static int slip_addr_remove(iplink_srv_t *, uint32_t);
     61static int slip_addr_add(iplink_srv_t *, inet_addr_t *);
     62static int slip_addr_remove(iplink_srv_t *, inet_addr_t *);
    6163
    6264static iplink_srv_t slip_iplink;
     
    118120}
    119121
    120 int slip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu)
     122int slip_send(iplink_srv_t *srv, iplink_sdu_t *sdu)
    121123{
    122124        async_sess_t *sess = (async_sess_t *) srv->arg;
     
    137139                case SLIP_END:
    138140                        write_buffered(sess, SLIP_ESC);
    139                         write_buffered(sess, SLIP_ESC_END);     
     141                        write_buffered(sess, SLIP_ESC_END);
    140142                        break;
    141143                case SLIP_ESC:
     
    161163}
    162164
    163 int slip_addr_add(iplink_srv_t *srv, uint32_t addr)
     165int slip_addr_add(iplink_srv_t *srv, inet_addr_t *addr)
    164166{
    165167        log_msg(LOG_DEFAULT, LVL_DEBUG, "slip_addr_add()");
     
    167169}
    168170
    169 int slip_addr_remove(iplink_srv_t *srv, uint32_t addr)
     171int slip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr)
    170172{
    171173        log_msg(LOG_DEFAULT, LVL_DEBUG, "slip_addr_remove()");
     
    207209        async_sess_t *sess = (async_sess_t *) arg;
    208210        static uint8_t recv_final[SLIP_MTU];
    209         iplink_srv_sdu_t sdu;
     211        iplink_recv_sdu_t sdu;
    210212        uint8_t ch;
    211213        int rc;
    212214
    213         sdu.lsrc = 0;
    214         sdu.ldest = 0;
    215215        sdu.data = recv_final;
    216216
     
    222222                                if (sdu.size == 0) {
    223223                                        /*
    224                                          * Discard the empty SLIP datagram.
    225                                          */
     224                                         * Discard the empty SLIP datagram.
     225                                         */
    226226                                        break;
    227227                                }
     
    260260
    261261pass:
    262                 rc = iplink_ev_recv(&slip_iplink, &sdu);
     262                rc = iplink_ev_recv(&slip_iplink, &sdu, AF_INET);
    263263                if (rc != EOK) {
    264264                        log_msg(LOG_DEFAULT, LVL_ERROR,
  • uspace/srv/net/tcp/pdu.c

    redf0d27 r02a09ed  
    4040#include <mem.h>
    4141#include <stdlib.h>
     42#include <net/socket_codes.h>
    4243#include "pdu.h"
    4344#include "segment.h"
     
    144145}
    145146
    146 static void tcp_phdr_setup(tcp_pdu_t *pdu, tcp_phdr_t *phdr)
    147 {
    148         // FIXME: Check for correctness
    149        
    150         uint32_t src_addr;
    151         inet_addr_pack(&pdu->src_addr, &src_addr);
    152        
    153         uint32_t dest_addr;
    154         inet_addr_pack(&pdu->dest_addr, &dest_addr);
    155        
    156         phdr->src_addr = host2uint32_t_be(src_addr);
    157         phdr->dest_addr = host2uint32_t_be(dest_addr);
    158         phdr->zero = 0;
    159         phdr->protocol = 6; /* XXX Magic number */
    160         phdr->tcp_length = host2uint16_t_be(pdu->header_size + pdu->text_size);
     147static uint16_t tcp_phdr_setup(tcp_pdu_t *pdu, tcp_phdr_t *phdr)
     148{
     149        addr32_t src_v4;
     150        addr128_t src_v6;
     151        uint16_t src_af = inet_addr_get(&pdu->src, &src_v4, &src_v6);
     152       
     153        addr32_t dest_v4;
     154        addr128_t dest_v6;
     155        uint16_t dest_af = inet_addr_get(&pdu->dest, &dest_v4, &dest_v6);
     156       
     157        assert(src_af == dest_af);
     158       
     159        switch (src_af) {
     160        case AF_INET:
     161                phdr->src = host2uint32_t_be(src_v4);
     162                phdr->dest = host2uint32_t_be(dest_v4);
     163                phdr->zero = 0;
     164                phdr->protocol = IP_PROTO_TCP;
     165                phdr->tcp_length =
     166                    host2uint16_t_be(pdu->header_size + pdu->text_size);
     167                break;
     168        case AF_INET6:
     169                // FIXME TODO
     170                assert(false);
     171        default:
     172                assert(false);
     173        }
     174       
     175        return src_af;
    161176}
    162177
     
    243258        uint16_t cs_phdr;
    244259        uint16_t cs_headers;
    245         uint16_t cs_all;
    246260        tcp_phdr_t phdr;
    247 
    248         tcp_phdr_setup(pdu, &phdr);
    249         cs_phdr = tcp_checksum_calc(TCP_CHECKSUM_INIT, (void *)&phdr,
    250             sizeof(tcp_phdr_t));
     261       
     262        uint16_t af = tcp_phdr_setup(pdu, &phdr);
     263        switch (af) {
     264        case AF_INET:
     265                cs_phdr = tcp_checksum_calc(TCP_CHECKSUM_INIT, (void *) &phdr,
     266                    sizeof(tcp_phdr_t));
     267                break;
     268        case AF_INET6:
     269                // FIXME TODO
     270                assert(false);
     271        default:
     272                assert(false);
     273        }
     274       
    251275        cs_headers = tcp_checksum_calc(cs_phdr, pdu->header, pdu->header_size);
    252         cs_all = tcp_checksum_calc(cs_headers, pdu->text, pdu->text_size);
    253 
    254         return cs_all;
     276        return tcp_checksum_calc(cs_headers, pdu->text, pdu->text_size);
    255277}
    256278
     
    279301
    280302        sp->local.port = uint16_t_be2host(hdr->dest_port);
    281         sp->local.addr = pdu->dest_addr;
     303        sp->local.addr = pdu->dest;
    282304        sp->foreign.port = uint16_t_be2host(hdr->src_port);
    283         sp->foreign.addr = pdu->src_addr;
     305        sp->foreign.addr = pdu->src;
    284306
    285307        *seg = nseg;
     
    298320                return ENOMEM;
    299321
    300         npdu->src_addr = sp->local.addr;
    301         npdu->dest_addr = sp->foreign.addr;
     322        npdu->src = sp->local.addr;
     323        npdu->dest = sp->foreign.addr;
    302324        tcp_header_encode(sp, seg, &npdu->header, &npdu->header_size);
    303325
  • uspace/srv/net/tcp/sock.c

    redf0d27 r02a09ed  
    354354}
    355355
    356 static void tcp_sock_connect(tcp_client_t *client, ipc_callid_t callid, ipc_call_t call)
    357 {
    358         int rc;
    359         struct sockaddr_in *addr;
    360         int socket_id;
     356static void tcp_sock_connect(tcp_client_t *client, ipc_callid_t callid,
     357    ipc_call_t call)
     358{
     359        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_connect()");
     360       
     361        struct sockaddr_in6 *addr6 = NULL;
    361362        size_t addr_len;
    362         socket_core_t *sock_core;
    363         tcp_sockdata_t *socket;
    364         tcp_error_t trc;
    365         tcp_sock_t lsocket;
    366         tcp_sock_t fsocket;
    367 
    368         log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_connect()");
    369 
    370         rc = async_data_write_accept((void **) &addr, false, 0, 0, 0, &addr_len);
    371         if (rc != EOK || addr_len != sizeof(struct sockaddr_in)) {
     363        int rc = async_data_write_accept((void **) &addr6, false, 0, 0, 0, &addr_len);
     364        if (rc != EOK) {
    372365                async_answer_0(callid, rc);
    373366                return;
    374367        }
    375 
    376         socket_id = SOCKET_GET_SOCKET_ID(call);
    377 
    378         sock_core = socket_cores_find(&client->sockets, socket_id);
     368       
     369        if ((addr_len != sizeof(struct sockaddr_in)) &&
     370            (addr_len != sizeof(struct sockaddr_in6))) {
     371                async_answer_0(callid, EINVAL);
     372                goto out;
     373        }
     374       
     375        struct sockaddr_in *addr = (struct sockaddr_in *) addr6;
     376       
     377        int socket_id = SOCKET_GET_SOCKET_ID(call);
     378        socket_core_t *sock_core = socket_cores_find(&client->sockets,
     379            socket_id);
    379380        if (sock_core == NULL) {
    380381                async_answer_0(callid, ENOTSOCK);
    381                 return;
    382         }
    383 
    384         socket = (tcp_sockdata_t *)sock_core->specific_data;
     382                goto out;
     383        }
     384       
     385        tcp_sockdata_t *socket =
     386            (tcp_sockdata_t *) sock_core->specific_data;
     387       
    385388        if (sock_core->port <= 0) {
    386389                rc = socket_bind_free_port(&gsock, sock_core,
     
    389392                if (rc != EOK) {
    390393                        async_answer_0(callid, rc);
    391                         return;
     394                        goto out;
    392395                }
    393396               
    394397                last_used_port = sock_core->port;
    395398        }
    396 
     399       
    397400        fibril_mutex_lock(&socket->lock);
    398 
     401       
    399402        if (inet_addr_is_any(&socket->laddr)) {
    400403                /* Determine local IP address */
     
    402405                inet_addr_t rem_addr;
    403406               
    404                 inet_addr_unpack(uint32_t_be2host(addr->sin_addr.s_addr),
    405                     &rem_addr);
     407                switch (addr->sin_family) {
     408                case AF_INET:
     409                        inet_sockaddr_in_addr(addr, &rem_addr);
     410                        break;
     411                case AF_INET6:
     412                        inet_sockaddr_in6_addr(addr6, &rem_addr);
     413                        break;
     414                default:
     415                        fibril_mutex_unlock(&socket->lock);
     416                        async_answer_0(callid, EINVAL);
     417                        goto out;
     418                }
     419               
    406420                rc = inet_get_srcaddr(&rem_addr, 0, &loc_addr);
    407421                if (rc != EOK) {
     
    410424                        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_connect: Failed to "
    411425                            "determine local address.");
    412                         return;
     426                        goto out;
    413427                }
    414428               
     
    416430        }
    417431       
     432        tcp_sock_t lsocket;
     433        tcp_sock_t fsocket;
     434       
    418435        lsocket.addr = socket->laddr;
    419436        lsocket.port = sock_core->port;
    420437       
    421         inet_addr_unpack(uint32_t_be2host(addr->sin_addr.s_addr),
    422             &fsocket.addr);
     438        switch (addr->sin_family) {
     439        case AF_INET:
     440                inet_sockaddr_in_addr(addr, &fsocket.addr);
     441                break;
     442        case AF_INET6:
     443                inet_sockaddr_in6_addr(addr6, &fsocket.addr);
     444                break;
     445        default:
     446                fibril_mutex_unlock(&socket->lock);
     447                async_answer_0(callid, EINVAL);
     448                goto out;
     449        }
     450       
    423451        fsocket.port = uint16_t_be2host(addr->sin_port);
    424 
    425         trc = tcp_uc_open(&lsocket, &fsocket, ap_active, 0, &socket->conn);
    426 
     452       
     453        tcp_error_t trc = tcp_uc_open(&lsocket, &fsocket, ap_active, 0,
     454            &socket->conn);
     455       
    427456        if (socket->conn != NULL)
    428                 socket->conn->name = (char *)"C";
    429 
     457                socket->conn->name = (char *) "C";
     458       
    430459        fibril_mutex_unlock(&socket->lock);
    431460       
     
    445474       
    446475        async_answer_0(callid, rc);
     476       
     477out:
     478        if (addr6 != NULL)
     479                free(addr6);
    447480}
    448481
     
    662695static void tcp_sock_recvfrom(tcp_client_t *client, ipc_callid_t callid, ipc_call_t call)
    663696{
    664         int socket_id;
    665         int flags;
    666         size_t addr_length, length;
    667         socket_core_t *sock_core;
    668         tcp_sockdata_t *socket;
    669         ipc_call_t answer;
    670         ipc_callid_t rcallid;
    671         size_t data_len;
    672         struct sockaddr_in addr;
    673         tcp_sock_t *rsock;
    674         int rc;
    675 
    676697        log_msg(LOG_DEFAULT, LVL_DEBUG, "%p: tcp_sock_recv[from]()", client);
    677 
    678         socket_id = SOCKET_GET_SOCKET_ID(call);
    679         flags = SOCKET_GET_FLAGS(call);
    680 
    681         sock_core = socket_cores_find(&client->sockets, socket_id);
     698       
     699        int socket_id = SOCKET_GET_SOCKET_ID(call);
     700       
     701        socket_core_t *sock_core =
     702            socket_cores_find(&client->sockets, socket_id);
    682703        if (sock_core == NULL) {
    683704                async_answer_0(callid, ENOTSOCK);
    684705                return;
    685706        }
    686 
    687         socket = (tcp_sockdata_t *)sock_core->specific_data;
     707       
     708        tcp_sockdata_t *socket =
     709            (tcp_sockdata_t *) sock_core->specific_data;
     710       
    688711        fibril_mutex_lock(&socket->lock);
    689712       
     
    693716                return;
    694717        }
    695 
    696         (void)flags;
    697 
     718       
    698719        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_recvfrom(): lock recv_buffer_lock");
     720       
    699721        fibril_mutex_lock(&socket->recv_buffer_lock);
    700         while (socket->recv_buffer_used == 0 && socket->recv_error == TCP_EOK) {
     722        while ((socket->recv_buffer_used == 0) &&
     723            (socket->recv_error == TCP_EOK)) {
    701724                log_msg(LOG_DEFAULT, LVL_DEBUG, "wait for recv_buffer_cv + recv_buffer_used != 0");
    702725                fibril_condvar_wait(&socket->recv_buffer_cv,
     
    705728       
    706729        log_msg(LOG_DEFAULT, LVL_DEBUG, "Got data in sock recv_buffer");
    707 
    708         data_len = socket->recv_buffer_used;
    709         rc = socket->recv_error;
    710 
    711         switch (socket->recv_error) {
     730       
     731        size_t data_len = socket->recv_buffer_used;
     732        tcp_error_t trc = socket->recv_error;
     733        int rc;
     734       
     735        switch (trc) {
    712736        case TCP_EOK:
    713737                rc = EOK;
     
    732756                return;
    733757        }
    734 
     758       
     759        ipc_callid_t rcallid;
     760       
    735761        if (IPC_GET_IMETHOD(call) == NET_SOCKET_RECVFROM) {
    736762                /* Fill address */
    737                 rsock = &socket->conn->ident.foreign;
     763                tcp_sock_t *rsock = &socket->conn->ident.foreign;
     764                struct sockaddr_in addr;
     765                struct sockaddr_in6 addr6;
     766                size_t addr_length;
    738767               
    739                 uint32_t rsock_addr;
    740                 int rc = inet_addr_pack(&rsock->addr, &rsock_addr);
    741                 if (rc != EOK) {
    742                         fibril_mutex_unlock(&socket->recv_buffer_lock);
    743                         fibril_mutex_unlock(&socket->lock);
    744                         async_answer_0(callid, rc);
    745                         return;
    746                 }
     768                uint16_t addr_af = inet_addr_sockaddr_in(&rsock->addr, &addr,
     769                    &addr6);
    747770               
    748                 addr.sin_family = AF_INET;
    749                 addr.sin_addr.s_addr = host2uint32_t_be(rsock_addr);
    750                 addr.sin_port = host2uint16_t_be(rsock->port);
    751 
    752                 log_msg(LOG_DEFAULT, LVL_DEBUG, "addr read receive");
    753                 if (!async_data_read_receive(&rcallid, &addr_length)) {
     771                switch (addr_af) {
     772                case AF_INET:
     773                        addr.sin_port = host2uint16_t_be(rsock->port);
     774                       
     775                        log_msg(LOG_DEFAULT, LVL_DEBUG, "addr read receive");
     776                        if (!async_data_read_receive(&rcallid, &addr_length)) {
     777                                fibril_mutex_unlock(&socket->recv_buffer_lock);
     778                                fibril_mutex_unlock(&socket->lock);
     779                                async_answer_0(callid, EINVAL);
     780                                return;
     781                        }
     782                       
     783                        if (addr_length > sizeof(addr))
     784                                addr_length = sizeof(addr);
     785                       
     786                        log_msg(LOG_DEFAULT, LVL_DEBUG, "addr read finalize");
     787                        rc = async_data_read_finalize(rcallid, &addr, addr_length);
     788                        if (rc != EOK) {
     789                                fibril_mutex_unlock(&socket->recv_buffer_lock);
     790                                fibril_mutex_unlock(&socket->lock);
     791                                async_answer_0(callid, EINVAL);
     792                                return;
     793                        }
     794                       
     795                        break;
     796                case AF_INET6:
     797                        addr6.sin6_port = host2uint16_t_be(rsock->port);
     798                       
     799                        log_msg(LOG_DEFAULT, LVL_DEBUG, "addr6 read receive");
     800                        if (!async_data_read_receive(&rcallid, &addr_length)) {
     801                                fibril_mutex_unlock(&socket->recv_buffer_lock);
     802                                fibril_mutex_unlock(&socket->lock);
     803                                async_answer_0(callid, EINVAL);
     804                                return;
     805                        }
     806                       
     807                        if (addr_length > sizeof(addr6))
     808                                addr_length = sizeof(addr6);
     809                       
     810                        log_msg(LOG_DEFAULT, LVL_DEBUG, "addr6 read finalize");
     811                        rc = async_data_read_finalize(rcallid, &addr6, addr_length);
     812                        if (rc != EOK) {
     813                                fibril_mutex_unlock(&socket->recv_buffer_lock);
     814                                fibril_mutex_unlock(&socket->lock);
     815                                async_answer_0(callid, EINVAL);
     816                                return;
     817                        }
     818                       
     819                        break;
     820                default:
    754821                        fibril_mutex_unlock(&socket->recv_buffer_lock);
    755822                        fibril_mutex_unlock(&socket->lock);
     
    757824                        return;
    758825                }
    759 
    760                 if (addr_length > sizeof(addr))
    761                         addr_length = sizeof(addr);
    762 
    763                 log_msg(LOG_DEFAULT, LVL_DEBUG, "addr read finalize");
    764                 rc = async_data_read_finalize(rcallid, &addr, addr_length);
    765                 if (rc != EOK) {
    766                         fibril_mutex_unlock(&socket->recv_buffer_lock);
    767                         fibril_mutex_unlock(&socket->lock);
    768                         async_answer_0(callid, EINVAL);
    769                         return;
    770                 }
    771826        }
    772827       
    773828        log_msg(LOG_DEFAULT, LVL_DEBUG, "data read receive");
     829       
     830        size_t length;
    774831        if (!async_data_read_receive(&rcallid, &length)) {
    775832                fibril_mutex_unlock(&socket->recv_buffer_lock);
     
    783840       
    784841        log_msg(LOG_DEFAULT, LVL_DEBUG, "data read finalize");
     842       
    785843        rc = async_data_read_finalize(rcallid, socket->recv_buffer, length);
    786844       
    787845        socket->recv_buffer_used -= length;
     846       
    788847        log_msg(LOG_DEFAULT, LVL_DEBUG, "tcp_sock_recvfrom: %zu left in buffer",
    789848            socket->recv_buffer_used);
     849       
    790850        if (socket->recv_buffer_used > 0) {
    791851                memmove(socket->recv_buffer, socket->recv_buffer + length,
     
    795855       
    796856        fibril_condvar_broadcast(&socket->recv_buffer_cv);
    797 
    798         if (length < data_len && rc == EOK)
     857       
     858        if ((length < data_len) && (rc == EOK))
    799859                rc = EOVERFLOW;
    800 
     860       
     861        ipc_call_t answer;
     862       
    801863        SOCKET_SET_READ_DATA_LENGTH(answer, length);
    802864        async_answer_1(callid, EOK, IPC_GET_ARG1(answer));
  • uspace/srv/net/tcp/std.h

    redf0d27 r02a09ed  
    3939
    4040#include <sys/types.h>
     41#include <inet/addr.h>
     42
     43#define IP_PROTO_TCP  6
    4144
    4245/** TCP Header (fixed part) */
     
    7578typedef struct {
    7679        /** Source address */
    77         uint32_t src_addr;
     80        uint32_t src;
    7881        /** Destination address */
    79         uint32_t dest_addr;
     82        uint32_t dest;
    8083        /** Zero */
    8184        uint8_t zero;
  • uspace/srv/net/tcp/tcp.c

    redf0d27 r02a09ed  
    115115        }
    116116
    117         pdu->src_addr = dgram->src;
    118         pdu->dest_addr = dgram->dest;
     117        pdu->src = dgram->src;
     118        pdu->dest = dgram->dest;
    119119
    120120        tcp_received_pdu(pdu);
     
    143143            pdu->text_size);
    144144
    145         dgram.src = pdu->src_addr;
    146         dgram.dest = pdu->dest_addr;
     145        dgram.src = pdu->src;
     146        dgram.dest = pdu->dest;
    147147        dgram.tos = 0;
    148148        dgram.data = pdu_raw;
  • uspace/srv/net/tcp/tcp_type.h

    redf0d27 r02a09ed  
    306306typedef struct {
    307307        /** Source address */
    308         inet_addr_t src_addr;
     308        inet_addr_t src;
    309309        /** Destination address */
    310         inet_addr_t dest_addr;
    311        
     310        inet_addr_t dest;
    312311        /** Encoded header */
    313312        void *header;
  • uspace/srv/net/udp/pdu.c

    redf0d27 r02a09ed  
    4040#include <mem.h>
    4141#include <stdlib.h>
    42 
     42#include <inet/addr.h>
     43#include <net/socket_codes.h>
    4344#include "msg.h"
    4445#include "pdu.h"
     
    8485}
    8586
    86 static void udp_phdr_setup(udp_pdu_t *pdu, udp_phdr_t *phdr)
    87 {
    88         // FIXME: Check for correctness
    89        
    90         uint32_t src;
    91         inet_addr_pack(&pdu->src, &src);
    92        
    93         uint32_t dest;
    94         inet_addr_pack(&pdu->dest, &dest);
    95        
    96         phdr->src_addr = host2uint32_t_be(src);
    97         phdr->dest_addr = host2uint32_t_be(dest);
    98         phdr->zero = 0;
    99         phdr->protocol = IP_PROTO_UDP;
    100         phdr->udp_length = host2uint16_t_be(pdu->data_size);
     87static uint16_t udp_phdr_setup(udp_pdu_t *pdu, udp_phdr_t *phdr)
     88{
     89        addr32_t src_v4;
     90        addr128_t src_v6;
     91        uint16_t src_af = inet_addr_get(&pdu->src, &src_v4, &src_v6);
     92       
     93        addr32_t dest_v4;
     94        addr128_t dest_v6;
     95        uint16_t dest_af = inet_addr_get(&pdu->dest, &dest_v4, &dest_v6);
     96       
     97        assert(src_af == dest_af);
     98       
     99        switch (src_af) {
     100        case AF_INET:
     101                phdr->src_addr = host2uint32_t_be(src_v4);
     102                phdr->dest_addr = host2uint32_t_be(dest_v4);
     103                phdr->zero = 0;
     104                phdr->protocol = IP_PROTO_UDP;
     105                phdr->udp_length = host2uint16_t_be(pdu->data_size);
     106                break;
     107        case AF_INET6:
     108                // FIXME TODO
     109                assert(false);
     110        default:
     111                assert(false);
     112        }
     113       
     114        return src_af;
    101115}
    102116
     
    115129{
    116130        uint16_t cs_phdr;
    117         uint16_t cs_all;
    118131        udp_phdr_t phdr;
    119 
    120         udp_phdr_setup(pdu, &phdr);
    121         cs_phdr = udp_checksum_calc(UDP_CHECKSUM_INIT, (void *)&phdr,
    122             sizeof(udp_phdr_t));
    123         cs_all = udp_checksum_calc(cs_phdr, pdu->data, pdu->data_size);
    124 
    125         return cs_all;
     132       
     133        uint16_t af = udp_phdr_setup(pdu, &phdr);
     134        switch (af) {
     135        case AF_INET:
     136                cs_phdr = udp_checksum_calc(UDP_CHECKSUM_INIT, (void *) &phdr,
     137                    sizeof(udp_phdr_t));
     138                break;
     139        case AF_INET6:
     140                // FIXME TODO
     141                assert(false);
     142        default:
     143                assert(false);
     144        }
     145       
     146        return udp_checksum_calc(cs_phdr, pdu->data, pdu->data_size);
    126147}
    127148
  • uspace/srv/net/udp/sock.c

    redf0d27 r02a09ed  
    159159static void udp_sock_bind(udp_client_t *client, ipc_callid_t callid, ipc_call_t call)
    160160{
    161         int rc;
    162         struct sockaddr_in *addr;
    163         size_t addr_size;
    164         socket_core_t *sock_core;
    165         udp_sockdata_t *socket;
    166         udp_sock_t fsock;
    167         udp_error_t urc;
    168 
    169161        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_bind()");
    170162        log_msg(LOG_DEFAULT, LVL_DEBUG, " - async_data_write_accept");
    171 
    172         addr = NULL;
    173 
    174         rc = async_data_write_accept((void **) &addr, false, 0, 0, 0, &addr_size);
     163       
     164        struct sockaddr_in6 *addr6 = NULL;
     165        size_t addr_len;
     166        int rc = async_data_write_accept((void **) &addr6, false, 0, 0, 0, &addr_len);
    175167        if (rc != EOK) {
    176168                async_answer_0(callid, rc);
    177                 goto out;
    178         }
    179        
    180         if (addr_size != sizeof(struct sockaddr_in)) {
     169                return;
     170        }
     171       
     172        if ((addr_len != sizeof(struct sockaddr_in)) &&
     173            (addr_len != sizeof(struct sockaddr_in6))) {
    181174                async_answer_0(callid, EINVAL);
    182175                goto out;
    183176        }
    184177       
     178        struct sockaddr_in *addr = (struct sockaddr_in *) addr6;
     179       
    185180        log_msg(LOG_DEFAULT, LVL_DEBUG, " - call socket_bind");
     181       
    186182        rc = socket_bind(&client->sockets, &gsock, SOCKET_GET_SOCKET_ID(call),
    187             addr, addr_size, UDP_FREE_PORTS_START, UDP_FREE_PORTS_END,
     183            addr6, addr_len, UDP_FREE_PORTS_START, UDP_FREE_PORTS_END,
    188184            last_used_port);
    189185        if (rc != EOK) {
     
    193189       
    194190        log_msg(LOG_DEFAULT, LVL_DEBUG, " - call socket_cores_find");
    195         sock_core = socket_cores_find(&client->sockets, SOCKET_GET_SOCKET_ID(call));
     191       
     192        socket_core_t *sock_core = socket_cores_find(&client->sockets,
     193            SOCKET_GET_SOCKET_ID(call));
    196194        if (sock_core == NULL) {
    197195                async_answer_0(callid, ENOENT);
    198196                goto out;
    199197        }
    200 
    201         socket = (udp_sockdata_t *) sock_core->specific_data;
    202        
    203         inet_addr_unpack(uint32_t_be2host(addr->sin_addr.s_addr),
    204             &fsock.addr);
    205         fsock.port = sock_core->port;
    206         urc = udp_uc_set_local(socket->assoc, &fsock);
    207 
     198       
     199        udp_sockdata_t *socket =
     200            (udp_sockdata_t *) sock_core->specific_data;
     201       
     202        udp_sock_t fsocket;
     203       
     204        fsocket.port = sock_core->port;
     205       
     206        switch (addr->sin_family) {
     207        case AF_INET:
     208                inet_sockaddr_in_addr(addr, &fsocket.addr);
     209                break;
     210        case AF_INET6:
     211                inet_sockaddr_in6_addr(addr6, &fsocket.addr);
     212                break;
     213        default:
     214                async_answer_0(callid, EINVAL);
     215                goto out;
     216        }
     217       
     218        udp_error_t urc = udp_uc_set_local(socket->assoc, &fsocket);
     219       
    208220        switch (urc) {
    209221        case UDP_EOK:
     
    225237        log_msg(LOG_DEFAULT, LVL_DEBUG, " - success");
    226238        async_answer_0(callid, rc);
     239       
    227240out:
    228         if (addr != NULL)
    229                 free(addr);
     241        if (addr6 != NULL)
     242                free(addr6);
    230243}
    231244
     
    252265        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_send()");
    253266       
    254         struct sockaddr_in *addr = NULL;
    255         udp_sock_t fsock;
    256         udp_sock_t *fsock_ptr;
     267        struct sockaddr_in6 *addr6 = NULL;
     268        struct sockaddr_in *addr;
     269        udp_sock_t fsocket;
     270        udp_sock_t *fsocket_ptr;
    257271       
    258272        if (IPC_GET_IMETHOD(call) == NET_SOCKET_SENDTO) {
    259                 size_t addr_size;
    260                 int rc = async_data_write_accept((void **) &addr, false,
    261                     0, 0, 0, &addr_size);
     273                size_t addr_len;
     274                int rc = async_data_write_accept((void **) &addr6, false,
     275                    0, 0, 0, &addr_len);
    262276                if (rc != EOK) {
    263277                        async_answer_0(callid, rc);
    264                         goto out;
    265                 }
    266                
    267                 if (addr_size != sizeof(struct sockaddr_in)) {
     278                        return;
     279                }
     280               
     281                if ((addr_len != sizeof(struct sockaddr_in)) &&
     282                    (addr_len != sizeof(struct sockaddr_in6))) {
    268283                        async_answer_0(callid, EINVAL);
    269284                        goto out;
    270285                }
    271286               
    272                 inet_addr_unpack(uint32_t_be2host(addr->sin_addr.s_addr),
    273                     &fsock.addr);
    274                 fsock.port = uint16_t_be2host(addr->sin_port);
    275                 fsock_ptr = &fsock;
     287                addr = (struct sockaddr_in *) addr6;
     288               
     289                switch (addr->sin_family) {
     290                case AF_INET:
     291                        inet_sockaddr_in_addr(addr, &fsocket.addr);
     292                        break;
     293                case AF_INET6:
     294                        inet_sockaddr_in6_addr(addr6, &fsocket.addr);
     295                        break;
     296                default:
     297                        async_answer_0(callid, EINVAL);
     298                        goto out;
     299                }
     300               
     301                fsocket.port = uint16_t_be2host(addr->sin_port);
     302                fsocket_ptr = &fsocket;
    276303        } else
    277                 fsock_ptr = NULL;
     304                fsocket_ptr = NULL;
    278305       
    279306        int socket_id = SOCKET_GET_SOCKET_ID(call);
     
    321348                inet_addr_t rem_addr;
    322349               
    323                 rem_addr = fsock_ptr ? fsock.addr :
     350                rem_addr = fsocket_ptr ? fsocket.addr :
    324351                    socket->assoc->ident.foreign.addr;
    325352               
     
    361388               
    362389                udp_error_t urc =
    363                     udp_uc_send(socket->assoc, fsock_ptr, buffer, length, 0);
     390                    udp_uc_send(socket->assoc, fsocket_ptr, buffer, length, 0);
    364391               
    365392                switch (urc) {
     
    396423       
    397424out:
    398         if (addr != NULL)
    399                 free(addr);
     425        if (addr6 != NULL)
     426                free(addr6);
    400427}
    401428
    402429static void udp_sock_recvfrom(udp_client_t *client, ipc_callid_t callid, ipc_call_t call)
    403430{
    404         int socket_id;
    405         int flags;
    406         size_t addr_length, length;
    407         socket_core_t *sock_core;
    408         udp_sockdata_t *socket;
    409         ipc_call_t answer;
    410         ipc_callid_t rcallid;
    411         size_t data_len;
    412         udp_error_t urc;
    413         udp_sock_t *rsock;
    414         struct sockaddr_in addr;
    415         int rc;
    416 
    417431        log_msg(LOG_DEFAULT, LVL_DEBUG, "%p: udp_sock_recv[from]()", client);
    418 
    419         socket_id = SOCKET_GET_SOCKET_ID(call);
    420         flags = SOCKET_GET_FLAGS(call);
    421 
    422         sock_core = socket_cores_find(&client->sockets, socket_id);
     432       
     433        int socket_id = SOCKET_GET_SOCKET_ID(call);
     434       
     435        socket_core_t *sock_core =
     436            socket_cores_find(&client->sockets, socket_id);
    423437        if (sock_core == NULL) {
    424438                async_answer_0(callid, ENOTSOCK);
    425439                return;
    426440        }
    427 
    428         socket = (udp_sockdata_t *)sock_core->specific_data;
     441       
     442        udp_sockdata_t *socket =
     443            (udp_sockdata_t *) sock_core->specific_data;
     444       
    429445        fibril_mutex_lock(&socket->lock);
    430446       
     
    434450                return;
    435451        }
    436 
    437         (void)flags;
    438 
     452       
    439453        log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_recvfrom(): lock recv_buffer lock");
     454       
    440455        fibril_mutex_lock(&socket->recv_buffer_lock);
    441         while (socket->recv_buffer_used == 0 && socket->recv_error == UDP_EOK) {
     456       
     457        while ((socket->recv_buffer_used == 0) &&
     458            (socket->recv_error == UDP_EOK)) {
    442459                log_msg(LOG_DEFAULT, LVL_DEBUG, "udp_sock_recvfrom(): wait for cv");
    443460                fibril_condvar_wait(&socket->recv_buffer_cv,
     
    446463       
    447464        log_msg(LOG_DEFAULT, LVL_DEBUG, "Got data in sock recv_buffer");
    448 
    449         rsock = &socket->recv_fsock;
    450         data_len = socket->recv_buffer_used;
    451         urc = socket->recv_error;
    452 
     465       
     466        size_t data_len = socket->recv_buffer_used;
     467        udp_error_t urc = socket->recv_error;
     468       
    453469        log_msg(LOG_DEFAULT, LVL_DEBUG, "**** recv data_len=%zu", data_len);
    454 
     470       
     471        int rc;
     472       
    455473        switch (urc) {
    456474        case UDP_EOK:
     
    476494                return;
    477495        }
    478 
     496       
     497        ipc_callid_t rcallid;
     498        size_t addr_size = 0;
     499       
    479500        if (IPC_GET_IMETHOD(call) == NET_SOCKET_RECVFROM) {
    480501                /* Fill address */
    481                 uint32_t rsock_addr;
    482                 int rc = inet_addr_pack(&rsock->addr, &rsock_addr);
    483                 if (rc != EOK) {
    484                         fibril_mutex_unlock(&socket->recv_buffer_lock);
    485                         fibril_mutex_unlock(&socket->lock);
    486                         async_answer_0(callid, rc);
    487                         return;
    488                 }
    489                
    490                 addr.sin_family = AF_INET;
    491                 addr.sin_addr.s_addr = host2uint32_t_be(rsock_addr);
    492                 addr.sin_port = host2uint16_t_be(rsock->port);
    493 
    494                 log_msg(LOG_DEFAULT, LVL_DEBUG, "addr read receive");
    495                 if (!async_data_read_receive(&rcallid, &addr_length)) {
     502                udp_sock_t *rsock = &socket->recv_fsock;
     503                struct sockaddr_in addr;
     504                struct sockaddr_in6 addr6;
     505                size_t addr_length;
     506               
     507                uint16_t addr_af = inet_addr_sockaddr_in(&rsock->addr, &addr,
     508                    &addr6);
     509               
     510                switch (addr_af) {
     511                case AF_INET:
     512                        addr.sin_port = host2uint16_t_be(rsock->port);
     513                       
     514                        log_msg(LOG_DEFAULT, LVL_DEBUG, "addr read receive");
     515                        if (!async_data_read_receive(&rcallid, &addr_length)) {
     516                                fibril_mutex_unlock(&socket->recv_buffer_lock);
     517                                fibril_mutex_unlock(&socket->lock);
     518                                async_answer_0(callid, EINVAL);
     519                                return;
     520                        }
     521                       
     522                        if (addr_length > sizeof(addr))
     523                                addr_length = sizeof(addr);
     524                       
     525                        addr_size = sizeof(addr);
     526                       
     527                        log_msg(LOG_DEFAULT, LVL_DEBUG, "addr read finalize");
     528                        rc = async_data_read_finalize(rcallid, &addr, addr_length);
     529                        if (rc != EOK) {
     530                                fibril_mutex_unlock(&socket->recv_buffer_lock);
     531                                fibril_mutex_unlock(&socket->lock);
     532                                async_answer_0(callid, EINVAL);
     533                                return;
     534                        }
     535                       
     536                        break;
     537                case AF_INET6:
     538                        addr6.sin6_port = host2uint16_t_be(rsock->port);
     539                       
     540                        log_msg(LOG_DEFAULT, LVL_DEBUG, "addr6 read receive");
     541                        if (!async_data_read_receive(&rcallid, &addr_length)) {
     542                                fibril_mutex_unlock(&socket->recv_buffer_lock);
     543                                fibril_mutex_unlock(&socket->lock);
     544                                async_answer_0(callid, EINVAL);
     545                                return;
     546                        }
     547                       
     548                        if (addr_length > sizeof(addr6))
     549                                addr_length = sizeof(addr6);
     550                       
     551                        addr_size = sizeof(addr6);
     552                       
     553                        log_msg(LOG_DEFAULT, LVL_DEBUG, "addr6 read finalize");
     554                        rc = async_data_read_finalize(rcallid, &addr6, addr_length);
     555                        if (rc != EOK) {
     556                                fibril_mutex_unlock(&socket->recv_buffer_lock);
     557                                fibril_mutex_unlock(&socket->lock);
     558                                async_answer_0(callid, EINVAL);
     559                                return;
     560                        }
     561                       
     562                        break;
     563                default:
    496564                        fibril_mutex_unlock(&socket->recv_buffer_lock);
    497565                        fibril_mutex_unlock(&socket->lock);
     
    499567                        return;
    500568                }
    501 
    502                 if (addr_length > sizeof(addr))
    503                         addr_length = sizeof(addr);
    504 
    505                 log_msg(LOG_DEFAULT, LVL_DEBUG, "addr read finalize");
    506                 rc = async_data_read_finalize(rcallid, &addr, addr_length);
    507                 if (rc != EOK) {
    508                         fibril_mutex_unlock(&socket->recv_buffer_lock);
    509                         fibril_mutex_unlock(&socket->lock);
    510                         async_answer_0(callid, EINVAL);
    511                         return;
    512                 }
    513         }
    514 
     569        }
     570       
    515571        log_msg(LOG_DEFAULT, LVL_DEBUG, "data read receive");
     572       
     573        size_t length;
    516574        if (!async_data_read_receive(&rcallid, &length)) {
    517575                fibril_mutex_unlock(&socket->recv_buffer_lock);
     
    525583       
    526584        log_msg(LOG_DEFAULT, LVL_DEBUG, "data read finalize");
     585       
    527586        rc = async_data_read_finalize(rcallid, socket->recv_buffer, length);
    528 
    529         if (length < data_len && rc == EOK)
     587       
     588        if ((length < data_len) && (rc == EOK))
    530589                rc = EOVERFLOW;
    531590       
    532591        log_msg(LOG_DEFAULT, LVL_DEBUG, "read_data_length <- %zu", length);
     592       
     593        ipc_call_t answer;
     594       
    533595        IPC_SET_ARG2(answer, 0);
    534596        SOCKET_SET_READ_DATA_LENGTH(answer, length);
    535         SOCKET_SET_ADDRESS_LENGTH(answer, sizeof(addr));
     597        SOCKET_SET_ADDRESS_LENGTH(answer, addr_size);
    536598        async_answer_3(callid, EOK, IPC_GET_ARG1(answer),
    537599            IPC_GET_ARG2(answer), IPC_GET_ARG3(answer));
     
    634696                        log_msg(LOG_DEFAULT, LVL_DEBUG, "[] urc != UDP_EOK, break");
    635697                        fibril_condvar_broadcast(&sock->recv_buffer_cv);
     698                        fibril_mutex_unlock(&sock->recv_buffer_lock);
    636699                        break;
    637700                }
Note: See TracChangeset for help on using the changeset viewer.