Ignore:
File:
1 edited

Legend:

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

    r9ae6fc7 rf0a2720  
    4646#include "pdu.h"
    4747
     48#define MAC48_BYTES 6
     49
    4850/** Encode Ethernet PDU. */
    4951int eth_pdu_encode(eth_frame_t *frame, void **rdata, size_t *rsize)
     
    6062
    6163        hdr = (eth_header_t *)data;
    62         addr48(frame->src, hdr->src);
    63         addr48(frame->dest, hdr->dest);
     64        mac48_encode(&frame->src, hdr->src);
     65        mac48_encode(&frame->dest, hdr->dest);
    6466        hdr->etype_len = host2uint16_t_be(frame->etype_len);
    6567
     
    6769            frame->size);
    6870
    69         log_msg(LOG_DEFAULT, LVL_DEBUG, "Encoded Ethernet frame (%zu bytes)", size);
     71        log_msg(LVL_DEBUG, "Encoding Ethernet frame "
     72            "src=%" PRIx64 " dest=%" PRIx64 " etype=%x",
     73            frame->src.addr, frame->dest.addr, frame->etype_len);
     74        log_msg(LVL_DEBUG, "Encoded Ethernet frame (%zu bytes)", size);
    7075
    7176        *rdata = data;
     
    7984        eth_header_t *hdr;
    8085
    81         log_msg(LOG_DEFAULT, LVL_DEBUG, "eth_pdu_decode()");
     86        log_msg(LVL_DEBUG, "eth_pdu_decode()");
    8287
    8388        if (size < sizeof(eth_header_t)) {
    84                 log_msg(LOG_DEFAULT, LVL_DEBUG, "PDU too short (%zu)", size);
     89                log_msg(LVL_DEBUG, "PDU too short (%zu)", size);
    8590                return EINVAL;
    8691        }
     
    9398                return ENOMEM;
    9499
    95         addr48(hdr->src, frame->src);
    96         addr48(hdr->dest, frame->dest);
     100        mac48_decode(hdr->src, &frame->src);
     101        mac48_decode(hdr->dest, &frame->dest);
    97102        frame->etype_len = uint16_t_be2host(hdr->etype_len);
    98103
     
    100105            frame->size);
    101106
    102         log_msg(LOG_DEFAULT, LVL_DEBUG, "Decoded Ethernet frame payload (%zu bytes)", frame->size);
    103 
    104         return EOK;
     107        log_msg(LVL_DEBUG, "Decoding Ethernet frame "
     108            "src=%" PRIx64 " dest=%" PRIx64 " etype=%x",
     109            frame->src.addr, frame->dest.addr, frame->etype_len);
     110        log_msg(LVL_DEBUG, "Decoded Ethernet frame payload (%zu bytes)", frame->size);
     111
     112        return EOK;
     113}
     114
     115void mac48_encode(mac48_addr_t *addr, void *buf)
     116{
     117        uint64_t val;
     118        uint8_t *bbuf = (uint8_t *)buf;
     119        int i;
     120
     121        val = addr->addr;
     122        for (i = 0; i < MAC48_BYTES; i++)
     123                bbuf[i] = (val >> (8 * (MAC48_BYTES - i - 1))) & 0xff;
     124}
     125
     126void mac48_decode(void *data, mac48_addr_t *addr)
     127{
     128        uint64_t val;
     129        uint8_t *bdata = (uint8_t *)data;
     130        int i;
     131
     132        val = 0;
     133        for (i = 0; i < MAC48_BYTES; i++)
     134                val |= (uint64_t)bdata[i] << (8 * (MAC48_BYTES - i - 1));
     135
     136        addr->addr = val;
    105137}
    106138
     
    113145        uint16_t fopcode;
    114146
    115         log_msg(LOG_DEFAULT, LVL_DEBUG, "arp_pdu_encode()");
     147        log_msg(LVL_DEBUG, "arp_pdu_encode()");
    116148
    117149        size = sizeof(arp_eth_packet_fmt_t);
     
    136168        pfmt->proto_addr_size = IPV4_ADDR_SIZE;
    137169        pfmt->opcode = host2uint16_t_be(fopcode);
    138         addr48(packet->sender_hw_addr, pfmt->sender_hw_addr);
     170        mac48_encode(&packet->sender_hw_addr, pfmt->sender_hw_addr);
    139171        pfmt->sender_proto_addr =
    140             host2uint32_t_be(packet->sender_proto_addr);
    141         addr48(packet->target_hw_addr, pfmt->target_hw_addr);
     172            host2uint32_t_be(packet->sender_proto_addr.ipv4);
     173        mac48_encode(&packet->target_hw_addr, pfmt->target_hw_addr);
    142174        pfmt->target_proto_addr =
    143             host2uint32_t_be(packet->target_proto_addr);
     175            host2uint32_t_be(packet->target_proto_addr.ipv4);
    144176
    145177        *rdata = data;
     
    153185        arp_eth_packet_fmt_t *pfmt;
    154186
    155         log_msg(LOG_DEFAULT, LVL_DEBUG, "arp_pdu_decode()");
     187        log_msg(LVL_DEBUG, "arp_pdu_decode()");
    156188
    157189        if (size < sizeof(arp_eth_packet_fmt_t)) {
    158                 log_msg(LOG_DEFAULT, LVL_DEBUG, "ARP PDU too short (%zu)", size);
     190                log_msg(LVL_DEBUG, "ARP PDU too short (%zu)", size);
    159191                return EINVAL;
    160192        }
     
    163195
    164196        if (uint16_t_be2host(pfmt->hw_addr_space) != AHRD_ETHERNET) {
    165                 log_msg(LOG_DEFAULT, LVL_DEBUG, "HW address space != %u (%" PRIu16 ")",
     197                log_msg(LVL_DEBUG, "HW address space != %u (%" PRIu16 ")",
    166198                    AHRD_ETHERNET, uint16_t_be2host(pfmt->hw_addr_space));
    167199                return EINVAL;
     
    169201
    170202        if (uint16_t_be2host(pfmt->proto_addr_space) != 0x0800) {
    171                 log_msg(LOG_DEFAULT, LVL_DEBUG, "Proto address space != %u (%" PRIu16 ")",
     203                log_msg(LVL_DEBUG, "Proto address space != %u (%" PRIu16 ")",
    172204                    ETYPE_IP, uint16_t_be2host(pfmt->proto_addr_space));
    173205                return EINVAL;
     
    175207
    176208        if (pfmt->hw_addr_size != ETH_ADDR_SIZE) {
    177                 log_msg(LOG_DEFAULT, LVL_DEBUG, "HW address size != %zu (%zu)",
     209                log_msg(LVL_DEBUG, "HW address size != %zu (%zu)",
    178210                    (size_t)ETH_ADDR_SIZE, (size_t)pfmt->hw_addr_size);
    179211                return EINVAL;
     
    181213
    182214        if (pfmt->proto_addr_size != IPV4_ADDR_SIZE) {
    183                 log_msg(LOG_DEFAULT, LVL_DEBUG, "Proto address size != %zu (%zu)",
     215                log_msg(LVL_DEBUG, "Proto address size != %zu (%zu)",
    184216                    (size_t)IPV4_ADDR_SIZE, (size_t)pfmt->proto_addr_size);
    185217                return EINVAL;
     
    190222        case AOP_REPLY: packet->opcode = aop_reply; break;
    191223        default:
    192                 log_msg(LOG_DEFAULT, LVL_DEBUG, "Invalid ARP opcode (%" PRIu16 ")",
     224                log_msg(LVL_DEBUG, "Invalid ARP opcode (%" PRIu16 ")",
    193225                    uint16_t_be2host(pfmt->opcode));
    194226                return EINVAL;
    195227        }
    196228
    197         addr48(pfmt->sender_hw_addr, packet->sender_hw_addr);
    198         packet->sender_proto_addr =
     229        mac48_decode(pfmt->sender_hw_addr, &packet->sender_hw_addr);
     230        packet->sender_proto_addr.ipv4 =
    199231            uint32_t_be2host(pfmt->sender_proto_addr);
    200         addr48(pfmt->target_hw_addr, packet->target_hw_addr);
    201         packet->target_proto_addr =
     232        mac48_decode(pfmt->target_hw_addr, &packet->target_hw_addr);
     233        packet->target_proto_addr.ipv4 =
    202234            uint32_t_be2host(pfmt->target_proto_addr);
    203         log_msg(LOG_DEFAULT, LVL_DEBUG, "packet->tpa = %x\n", pfmt->target_proto_addr);
    204 
    205         return EOK;
    206 }
     235        log_msg(LVL_DEBUG, "packet->tpa = %x\n", pfmt->target_proto_addr);
     236
     237        return EOK;
     238}
     239
    207240
    208241/** @}
Note: See TracChangeset for help on using the changeset viewer.