Ignore:
File:
1 edited

Legend:

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

    ra17356fd r1d24ad3  
    5656static int ethip_close(iplink_srv_t *srv);
    5757static int ethip_send(iplink_srv_t *srv, iplink_sdu_t *sdu);
    58 static int ethip_send6(iplink_srv_t *srv, iplink_sdu6_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);
    6159static int ethip_addr_add(iplink_srv_t *srv, inet_addr_t *addr);
    6260static int ethip_addr_remove(iplink_srv_t *srv, inet_addr_t *addr);
     
    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
     
    173169       
    174170        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;
    175184        eth_frame_t frame;
    176185       
    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);
    185         frame.etype_len = ETYPE_IP;
    186         frame.data = sdu->data;
    187         frame.size = sdu->size;
     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        }
    188207       
    189208        void *data;
    190209        size_t size;
    191210        rc = eth_pdu_encode(&frame, &data, &size);
    192         if (rc != EOK)
    193                 return rc;
    194        
    195         rc = ethip_nic_send(nic, data, size);
    196         free(data);
    197        
    198         return rc;
    199 }
    200 
    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;
    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);
    217211        if (rc != EOK)
    218212                return rc;
     
    274268}
    275269
    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 
    286270static int ethip_addr_add(iplink_srv_t *srv, inet_addr_t *addr)
    287271{
Note: See TracChangeset for help on using the changeset viewer.