Ignore:
File:
1 edited

Legend:

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

    ra17356fd ra1a101d  
    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);
    58 static int ethip_send6(iplink_srv_t *srv, iplink_sdu6_t *sdu);
     57static int ethip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu);
    5958static int ethip_get_mtu(iplink_srv_t *srv, size_t *mtu);
    60 static int ethip_get_mac48(iplink_srv_t *srv, addr48_t *mac);
    61 static int ethip_addr_add(iplink_srv_t *srv, inet_addr_t *addr);
    62 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);
    6361
    6462static void ethip_client_conn(ipc_callid_t iid, ipc_call_t *icall, void *arg);
     
    6866        .close = ethip_close,
    6967        .send = ethip_send,
    70         .send6 = ethip_send6,
    7168        .get_mtu = ethip_get_mtu,
    72         .get_mac48 = ethip_get_mac48,
    7369        .addr_add = ethip_addr_add,
    7470        .addr_remove = ethip_addr_remove
     
    168164}
    169165
    170 static int ethip_send(iplink_srv_t *srv, iplink_sdu_t *sdu)
    171 {
     166static int ethip_send(iplink_srv_t *srv, iplink_srv_sdu_t *sdu)
     167{
     168        ethip_nic_t *nic = (ethip_nic_t *)srv->arg;
     169        eth_frame_t frame;
     170        void *data;
     171        size_t size;
     172        mac48_addr_t dest_mac_addr;
     173        int rc;
     174
    172175        log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_send()");
    173        
    174         ethip_nic_t *nic = (ethip_nic_t *) srv->arg;
    175         eth_frame_t frame;
    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);
     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;
    185186        frame.etype_len = ETYPE_IP;
    186187        frame.data = sdu->data;
    187188        frame.size = sdu->size;
    188        
    189         void *data;
    190         size_t size;
     189
    191190        rc = eth_pdu_encode(&frame, &data, &size);
    192191        if (rc != EOK)
    193192                return rc;
    194        
     193
    195194        rc = ethip_nic_send(nic, data, size);
    196195        free(data);
    197        
     196
    198197        return rc;
    199198}
    200199
    201 static 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;
     200int ethip_received(iplink_srv_t *srv, void *data, size_t size)
     201{
     202        log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_received(): srv=%p", srv);
     203        ethip_nic_t *nic = (ethip_nic_t *)srv->arg;
    206204        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 
    226 int ethip_received(iplink_srv_t *srv, void *data, size_t size)
    227 {
    228         log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_received(): srv=%p", srv);
    229         ethip_nic_t *nic = (ethip_nic_t *) srv->arg;
    230        
     205        iplink_srv_sdu_t sdu;
     206        int rc;
     207
     208        log_msg(LOG_DEFAULT, LVL_DEBUG, "ethip_received()");
     209
    231210        log_msg(LOG_DEFAULT, LVL_DEBUG, " - eth_pdu_decode");
    232        
    233         eth_frame_t frame;
    234         int rc = eth_pdu_decode(data, size, &frame);
     211        rc = eth_pdu_decode(data, size, &frame);
    235212        if (rc != EOK) {
    236213                log_msg(LOG_DEFAULT, LVL_DEBUG, " - eth_pdu_decode failed");
    237214                return rc;
    238215        }
    239        
    240         iplink_recv_sdu_t sdu;
    241        
     216
    242217        switch (frame.etype_len) {
    243218        case ETYPE_ARP:
     
    246221        case ETYPE_IP:
    247222                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;
    248225                sdu.data = frame.data;
    249226                sdu.size = frame.size;
    250227                log_msg(LOG_DEFAULT, LVL_DEBUG, " - call iplink_ev_recv");
    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);
     228                rc = iplink_ev_recv(&nic->iplink, &sdu);
    259229                break;
    260230        default:
     
    262232                    frame.etype_len);
    263233        }
    264        
     234
    265235        free(frame.data);
    266236        return rc;
     
    274244}
    275245
    276 static 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 
    286 static int ethip_addr_add(iplink_srv_t *srv, inet_addr_t *addr)
    287 {
    288         ethip_nic_t *nic = (ethip_nic_t *) srv->arg;
    289        
     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);
    290251        return ethip_nic_addr_add(nic, addr);
    291252}
    292253
    293 static 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);
     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);
    298260}
    299261
Note: See TracChangeset for help on using the changeset viewer.