Ignore:
File:
1 edited

Legend:

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

    r289cb7dd 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);
     
    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.ipv4);
    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)
    192212                return rc;
    193 
     213       
    194214        rc = ethip_nic_send(nic, data, size);
    195215        free(data);
    196 
     216       
    197217        return rc;
    198218}
     
    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.ipv4 = 0;
    224                 sdu.ldest.ipv4 = 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);
     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);
    229253                break;
    230254        default:
     
    232256                    frame.etype_len);
    233257        }
    234 
     258       
    235259        free(frame.data);
    236260        return rc;
     
    244268}
    245269
    246 static int ethip_addr_add(iplink_srv_t *srv, iplink_srv_addr_t *addr)
    247 {
    248         ethip_nic_t *nic = (ethip_nic_t *)srv->arg;
    249 
    250         log_msg(LOG_DEFAULT, 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       
    251274        return ethip_nic_addr_add(nic, addr);
    252275}
    253276
    254 static int ethip_addr_remove(iplink_srv_t *srv, iplink_srv_addr_t *addr)
    255 {
    256         ethip_nic_t *nic = (ethip_nic_t *)srv->arg;
    257 
    258         log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_addr_remove(0x%" PRIx32 ")", addr->ipv4);
    259         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);
    260282}
    261283
Note: See TracChangeset for help on using the changeset viewer.