Ignore:
File:
1 edited

Legend:

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

    r06a1d077 r1d24ad3  
    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, iplink_srv_addr_t *addr);
    60 static int ethip_addr_remove(iplink_srv_t *srv, iplink_srv_addr_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);
     
    7373static int ethip_init(void)
    7474{
    75         int rc;
    76 
    7775        async_set_client_connection(ethip_client_conn);
    78 
    79         rc = loc_server_register(NAME);
    80         if (rc != EOK) {
    81                 log_msg(LVL_ERROR, "Failed registering server.");
     76       
     77        int rc = loc_server_register(NAME);
     78        if (rc != EOK) {
     79                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering server.");
    8280                return rc;
    8381        }
    84 
     82       
    8583        rc = ethip_nic_discovery_start();
    8684        if (rc != EOK)
    8785                return rc;
    88 
     86       
    8987        return EOK;
    9088}
     
    9896        char *svc_name = NULL;
    9997
    100         log_msg(LVL_DEBUG, "ethip_iplink_init()");
     98        log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_iplink_init()");
    10199
    102100        iplink_srv_init(&nic->iplink);
     
    106104        rc = asprintf(&svc_name, "net/eth%u", ++link_num);
    107105        if (rc < 0) {
    108                 log_msg(LVL_ERROR, "Out of memory.");
     106                log_msg(LOG_DEFAULT, LVL_ERROR, "Out of memory.");
    109107                goto error;
    110108        }
     
    112110        rc = loc_service_register(svc_name, &sid);
    113111        if (rc != EOK) {
    114                 log_msg(LVL_ERROR, "Failed registering service %s.", svc_name);
     112                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed registering service %s.", svc_name);
    115113                goto error;
    116114        }
     
    120118        rc = loc_category_get_id("iplink", &iplink_cat, IPC_FLAG_BLOCKING);
    121119        if (rc != EOK) {
    122                 log_msg(LVL_ERROR, "Failed resolving category 'iplink'.");
     120                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed resolving category 'iplink'.");
    123121                goto error;
    124122        }
     
    126124        rc = loc_service_add_to_cat(sid, iplink_cat);
    127125        if (rc != EOK) {
    128                 log_msg(LVL_ERROR, "Failed adding %s to category.", svc_name);
     126                log_msg(LOG_DEFAULT, LVL_ERROR, "Failed adding %s to category.", svc_name);
    129127                goto error;
    130128        }
     
    144142
    145143        sid = (service_id_t)IPC_GET_ARG1(*icall);
    146         log_msg(LVL_DEBUG, "ethip_client_conn(%u)", (unsigned)sid);
     144        log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_client_conn(%u)", (unsigned)sid);
    147145        nic = ethip_nic_find_by_iplink_sid(sid);
    148146        if (nic == NULL) {
    149                 log_msg(LVL_WARN, "Uknown service ID.");
     147                log_msg(LOG_DEFAULT, LVL_WARN, "Uknown service ID.");
    150148                return;
    151149        }
     
    156154static int ethip_open(iplink_srv_t *srv)
    157155{
    158         log_msg(LVL_DEBUG, "ethip_open()");
     156        log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_open()");
    159157        return EOK;
    160158}
     
    162160static int ethip_close(iplink_srv_t *srv)
    163161{
    164         log_msg(LVL_DEBUG, "ethip_close()");
    165         return EOK;
    166 }
    167 
    168 static int ethip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu)
    169 {
    170         ethip_nic_t *nic = (ethip_nic_t *)srv->arg;
     162        log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_close()");
     163        return EOK;
     164}
     165
     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;
    171184        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       
    172208        void *data;
    173209        size_t size;
    174         mac48_addr_t dest_mac_addr;
    175         int rc;
    176 
    177         log_msg(LVL_DEBUG, "ethip_send()");
    178 
    179         rc = arp_translate(nic, &sdu->lsrc, &sdu->ldest, &dest_mac_addr);
    180         if (rc != EOK) {
    181                 log_msg(LVL_WARN, "Failed to look up IP address 0x%" PRIx32,
    182                     sdu->ldest.ipv4);
    183                 return rc;
    184         }
    185 
    186         frame.dest      = dest_mac_addr;
    187         frame.src       = nic->mac_addr;
    188         frame.etype_len = ETYPE_IP;
    189         frame.data = sdu->data;
    190         frame.size = sdu->size;
    191 
    192210        rc = eth_pdu_encode(&frame, &data, &size);
    193211        if (rc != EOK)
    194212                return rc;
    195 
     213       
    196214        rc = ethip_nic_send(nic, data, size);
    197215        free(data);
    198 
     216       
    199217        return rc;
    200218}
     
    202220int ethip_received(iplink_srv_t *srv, void *data, size_t size)
    203221{
    204         log_msg(LVL_DEBUG, "ethip_received(): srv=%p", srv);
    205         ethip_nic_t *nic = (ethip_nic_t *)srv->arg;
     222        log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_received(): srv=%p", srv);
     223        ethip_nic_t *nic = (ethip_nic_t *) srv->arg;
     224       
     225        log_msg(LOG_DEFAULT, LVL_DEBUG, " - eth_pdu_decode");
     226       
    206227        eth_frame_t frame;
    207         iplink_srv_sdu_t sdu;
    208         int rc;
    209 
    210         log_msg(LVL_DEBUG, "ethip_received()");
    211 
    212         log_msg(LVL_DEBUG, " - eth_pdu_decode");
    213         rc = eth_pdu_decode(data, size, &frame);
    214         if (rc != EOK) {
    215                 log_msg(LVL_DEBUG, " - eth_pdu_decode failed");
     228        int rc = eth_pdu_decode(data, size, &frame);
     229        if (rc != EOK) {
     230                log_msg(LOG_DEFAULT, LVL_DEBUG, " - eth_pdu_decode failed");
    216231                return rc;
    217232        }
    218 
     233       
     234        iplink_recv_sdu_t sdu;
     235       
    219236        switch (frame.etype_len) {
    220237        case ETYPE_ARP:
     
    222239                break;
    223240        case ETYPE_IP:
    224                 log_msg(LVL_DEBUG, " - construct SDU");
    225                 sdu.lsrc.ipv4 = (192 << 24) | (168 << 16) | (0 << 8) | 1;
    226                 sdu.ldest.ipv4 = (192 << 24) | (168 << 16) | (0 << 8) | 4;
     241                log_msg(LOG_DEFAULT, LVL_DEBUG, " - construct SDU");
    227242                sdu.data = frame.data;
    228243                sdu.size = frame.size;
    229                 log_msg(LVL_DEBUG, " - call iplink_ev_recv");
    230                 rc = iplink_ev_recv(&nic->iplink, &sdu);
     244                log_msg(LOG_DEFAULT, LVL_DEBUG, " - call iplink_ev_recv");
     245                rc = iplink_ev_recv(&nic->iplink, &sdu, AF_INET);
     246                break;
     247        case ETYPE_IPV6:
     248                log_msg(LOG_DEFAULT, LVL_DEBUG, " - construct SDU IPv6");
     249                sdu.data = frame.data;
     250                sdu.size = frame.size;
     251                log_msg(LOG_DEFAULT, LVL_DEBUG, " - call iplink_ev_recv");
     252                rc = iplink_ev_recv(&nic->iplink, &sdu, AF_INET6);
    231253                break;
    232254        default:
    233                 log_msg(LVL_DEBUG, "Unknown ethertype 0x%" PRIx16,
     255                log_msg(LOG_DEFAULT, LVL_DEBUG, "Unknown ethertype 0x%" PRIx16,
    234256                    frame.etype_len);
    235257        }
    236 
     258       
    237259        free(frame.data);
    238260        return rc;
     
    241263static int ethip_get_mtu(iplink_srv_t *srv, size_t *mtu)
    242264{
    243         log_msg(LVL_DEBUG, "ethip_get_mtu()");
     265        log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_get_mtu()");
    244266        *mtu = 1500;
    245267        return EOK;
    246268}
    247269
    248 static int ethip_addr_add(iplink_srv_t *srv, iplink_srv_addr_t *addr)
    249 {
    250         ethip_nic_t *nic = (ethip_nic_t *)srv->arg;
    251 
    252         log_msg(LVL_DEBUG, "ethip_addr_add(0x%" PRIx32 ")", addr->ipv4);
     270static int ethip_addr_add(iplink_srv_t *srv, inet_addr_t *addr)
     271{
     272        ethip_nic_t *nic = (ethip_nic_t *) srv->arg;
     273       
    253274        return ethip_nic_addr_add(nic, addr);
    254275}
    255276
    256 static int ethip_addr_remove(iplink_srv_t *srv, iplink_srv_addr_t *addr)
    257 {
    258         ethip_nic_t *nic = (ethip_nic_t *)srv->arg;
    259 
    260         log_msg(LVL_DEBUG, "ethip_addr_remove(0x%" PRIx32 ")", addr->ipv4);
    261         return ethip_nic_addr_add(nic, addr);
     277static int ethip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr)
     278{
     279        ethip_nic_t *nic = (ethip_nic_t *) srv->arg;
     280       
     281        return ethip_nic_addr_remove(nic, addr);
    262282}
    263283
     
    268288        printf(NAME ": HelenOS IP over Ethernet service\n");
    269289
    270         if (log_init(NAME, LVL_WARN) != EOK) {
     290        if (log_init(NAME) != EOK) {
    271291                printf(NAME ": Failed to initialize logging.\n");
    272292                return 1;
Note: See TracChangeset for help on using the changeset viewer.