Ignore:
File:
1 edited

Legend:

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

    r1d24ad3 r289cb7dd  
    4444#include <stdio.h>
    4545#include <stdlib.h>
    46 #include <net/socket_codes.h>
     46
    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_sdu_t *sdu);
     57static int ethip_send(iplink_srv_t *srv, iplink_srv_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, inet_addr_t *addr);
    60 static int ethip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr);
     59static int ethip_addr_add(iplink_srv_t *srv, iplink_srv_addr_t *addr);
     60static int ethip_addr_remove(iplink_srv_t *srv, iplink_srv_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_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;
     166static int ethip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu)
     167{
     168        ethip_nic_t *nic = (ethip_nic_t *)srv->arg;
    184169        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        
    208170        void *data;
    209171        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
    210190        rc = eth_pdu_encode(&frame, &data, &size);
    211191        if (rc != EOK)
    212192                return rc;
    213        
     193
    214194        rc = ethip_nic_send(nic, data, size);
    215195        free(data);
    216        
     196
    217197        return rc;
    218198}
     
    221201{
    222202        log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_received(): srv=%p", srv);
    223         ethip_nic_t *nic = (ethip_nic_t *) srv->arg;
    224        
     203        ethip_nic_t *nic = (ethip_nic_t *)srv->arg;
     204        eth_frame_t frame;
     205        iplink_srv_sdu_t sdu;
     206        int rc;
     207
     208        log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_received()");
     209
    225210        log_msg(LOG_DEFAULT, LVL_DEBUG, " - eth_pdu_decode");
    226        
    227         eth_frame_t frame;
    228         int rc = eth_pdu_decode(data, size, &frame);
     211        rc = eth_pdu_decode(data, size, &frame);
    229212        if (rc != EOK) {
    230213                log_msg(LOG_DEFAULT, LVL_DEBUG, " - eth_pdu_decode failed");
    231214                return rc;
    232215        }
    233        
    234         iplink_recv_sdu_t sdu;
    235        
     216
    236217        switch (frame.etype_len) {
    237218        case ETYPE_ARP:
     
    240221        case ETYPE_IP:
    241222                log_msg(LOG_DEFAULT, LVL_DEBUG, " - construct SDU");
     223                sdu.lsrc.ipv4 = 0;
     224                sdu.ldest.ipv4 = 0;
    242225                sdu.data = frame.data;
    243226                sdu.size = frame.size;
    244227                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);
     228                rc = iplink_ev_recv(&nic->iplink, &sdu);
    253229                break;
    254230        default:
     
    256232                    frame.etype_len);
    257233        }
    258        
     234
    259235        free(frame.data);
    260236        return rc;
     
    268244}
    269245
    270 static int ethip_addr_add(iplink_srv_t *srv, inet_addr_t *addr)
    271 {
    272         ethip_nic_t *nic = (ethip_nic_t *) srv->arg;
    273        
     246static 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);
    274251        return ethip_nic_addr_add(nic, addr);
    275252}
    276253
    277 static 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);
     254static 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);
    282260}
    283261
Note: See TracChangeset for help on using the changeset viewer.