Ignore:
File:
1 edited

Legend:

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

    ra1a101d ra17356fd  
    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);
     58static int ethip_send6(iplink_srv_t *srv, iplink_sdu6_t *sdu);
    5859static 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);
     60static int ethip_get_mac48(iplink_srv_t *srv, addr48_t *mac);
     61static int ethip_addr_add(iplink_srv_t *srv, inet_addr_t *addr);
     62static int ethip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr);
    6163
    6264static void ethip_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg);
     
    6668        .close = ethip_close,
    6769        .send = ethip_send,
     70        .send6 = ethip_send6,
    6871        .get_mtu = ethip_get_mtu,
     72        .get_mac48 = ethip_get_mac48,
    6973        .addr_add = ethip_addr_add,
    7074        .addr_remove = ethip_addr_remove
     
    164168}
    165169
    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;
     170static int ethip_send(iplink_srv_t *srv, iplink_sdu_t *sdu)
     171{
     172        log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_send()");
     173       
     174        ethip_nic_t *nic = (ethip_nic_t *) srv->arg;
    169175        eth_frame_t frame;
    170         void *data;
    171         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;
     176       
     177        int rc = arp_translate(nic, sdu->src, sdu->dest, frame.dest);
     178        if (rc != EOK) {
     179                log_msg(LOG_DEFAULT, LVL_WARN, "Failed to look up IPv4 address 0x%"
     180                    PRIx32, sdu->dest);
     181                return rc;
     182        }
     183       
     184        addr48(nic->mac_addr, frame.src);
    186185        frame.etype_len = ETYPE_IP;
    187186        frame.data = sdu->data;
    188187        frame.size = sdu->size;
    189 
     188       
     189        void *data;
     190        size_t size;
    190191        rc = eth_pdu_encode(&frame, &data, &size);
    191192        if (rc != EOK)
    192193                return rc;
    193 
     194       
    194195        rc = ethip_nic_send(nic, data, size);
    195196        free(data);
    196 
     197       
    197198        return rc;
    198199}
    199200
     201static int ethip_send6(iplink_srv_t *srv, iplink_sdu6_t *sdu)
     202{
     203        log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_send6()");
     204       
     205        ethip_nic_t *nic = (ethip_nic_t *) srv->arg;
     206        eth_frame_t frame;
     207       
     208        addr48(sdu->dest, frame.dest);
     209        addr48(nic->mac_addr, frame.src);
     210        frame.etype_len = ETYPE_IPV6;
     211        frame.data = sdu->data;
     212        frame.size = sdu->size;
     213       
     214        void *data;
     215        size_t size;
     216        int rc = eth_pdu_encode(&frame, &data, &size);
     217        if (rc != EOK)
     218                return rc;
     219       
     220        rc = ethip_nic_send(nic, data, size);
     221        free(data);
     222       
     223        return rc;
     224}
     225
    200226int ethip_received(iplink_srv_t *srv, void *data, size_t size)
    201227{
    202228        log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_received(): srv=%p", srv);
    203         ethip_nic_t *nic = (ethip_nic_t *)srv->arg;
     229        ethip_nic_t *nic = (ethip_nic_t *) srv->arg;
     230       
     231        log_msg(LOG_DEFAULT, LVL_DEBUG, " - eth_pdu_decode");
     232       
    204233        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);
     234        int rc = eth_pdu_decode(data, size, &frame);
    212235        if (rc != EOK) {
    213236                log_msg(LOG_DEFAULT, LVL_DEBUG, " - eth_pdu_decode failed");
    214237                return rc;
    215238        }
    216 
     239       
     240        iplink_recv_sdu_t sdu;
     241       
    217242        switch (frame.etype_len) {
    218243        case ETYPE_ARP:
     
    221246        case ETYPE_IP:
    222247                log_msg(LOG_DEFAULT, LVL_DEBUG, " - construct SDU");
    223                 sdu.lsrc.ipv4 = (192 << 24) | (168 << 16) | (0 << 8) | 1;
    224                 sdu.ldest.ipv4 = (192 << 24) | (168 << 16) | (0 << 8) | 4;
    225248                sdu.data = frame.data;
    226249                sdu.size = frame.size;
    227250                log_msg(LOG_DEFAULT, LVL_DEBUG, " - call iplink_ev_recv");
    228                 rc = iplink_ev_recv(&nic->iplink, &sdu);
     251                rc = iplink_ev_recv(&nic->iplink, &sdu, AF_INET);
     252                break;
     253        case ETYPE_IPV6:
     254                log_msg(LOG_DEFAULT, LVL_DEBUG, " - construct SDU IPv6");
     255                sdu.data = frame.data;
     256                sdu.size = frame.size;
     257                log_msg(LOG_DEFAULT, LVL_DEBUG, " - call iplink_ev_recv");
     258                rc = iplink_ev_recv(&nic->iplink, &sdu, AF_INET6);
    229259                break;
    230260        default:
     
    232262                    frame.etype_len);
    233263        }
    234 
     264       
    235265        free(frame.data);
    236266        return rc;
     
    244274}
    245275
    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);
     276static int ethip_get_mac48(iplink_srv_t *srv, addr48_t *mac)
     277{
     278        log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_get_mac48()");
     279       
     280        ethip_nic_t *nic = (ethip_nic_t *) srv->arg;
     281        addr48(nic->mac_addr, *mac);
     282       
     283        return EOK;
     284}
     285
     286static int ethip_addr_add(iplink_srv_t *srv, inet_addr_t *addr)
     287{
     288        ethip_nic_t *nic = (ethip_nic_t *) srv->arg;
     289       
    251290        return ethip_nic_addr_add(nic, addr);
    252291}
    253292
    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);
     293static int ethip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr)
     294{
     295        ethip_nic_t *nic = (ethip_nic_t *) srv->arg;
     296       
     297        return ethip_nic_addr_remove(nic, addr);
    260298}
    261299
Note: See TracChangeset for help on using the changeset viewer.