Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 1493811 in mainline


Ignore:
Timestamp:
2012-02-11T19:11:08Z (8 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
4f64a52
Parents:
e767dbf
Message:

Ethernet PDU encoding and decoding.

Location:
uspace/srv/ethip
Files:
3 added
5 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/ethip/Makefile

    re767dbf r1493811  
    3232SOURCES = \
    3333        ethip.c \
    34         ethip_nic.c
     34        ethip_nic.c \
     35        pdu.c
    3536
    3637include $(USPACE_PREFIX)/Makefile.common
  • uspace/srv/ethip/ethip.c

    re767dbf r1493811  
    2727 */
    2828
    29 /** @addtogroup inet
     29/** @addtogroup ethip
    3030 * @{
    3131 */
     
    3333 * @file
    3434 * @brief IP link provider for Ethernet
     35 *
     36 * Based on the IETF RFC 894 standard.
    3537 */
    3638
     
    4547#include "ethip.h"
    4648#include "ethip_nic.h"
     49#include "pdu.h"
     50#include "std.h"
    4751
    4852#define NAME "eth"
     
    158162static int ethip_send(iplink_conn_t *conn, iplink_srv_sdu_t *sdu)
    159163{
     164        ethip_nic_t *nic = (ethip_nic_t *)conn->srv->arg;
     165        eth_frame_t frame;
     166        void *data;
     167        size_t size;
     168        int rc;
     169
    160170        log_msg(LVL_DEBUG, "ethip_send()");
    161         return EOK;
     171
     172        frame.dest.addr = 0xdeeedeeedeee;
     173        frame.src.addr =  0xaafeedfaceee;
     174        frame.etype_len = ETYPE_IP;
     175        frame.data = sdu->data;
     176        frame.size = sdu->size;
     177
     178        rc = eth_pdu_encode(&frame, &data, &size);
     179        if (rc != EOK)
     180                return rc;
     181
     182        rc = ethip_nic_send(nic, data, size);
     183        free(data);
     184
     185        return rc;
     186}
     187
     188int ethip_received(iplink_srv_t *srv, void *data, size_t size)
     189{
     190        eth_frame_t frame;
     191        iplink_srv_sdu_t sdu;
     192        int rc;
     193
     194        rc = eth_pdu_decode(data, size, &frame);
     195        if (rc != EOK)
     196                return rc;
     197
     198        sdu.data = frame.data;
     199        sdu.size = frame.size;
     200        (void) sdu;
     201        //rc = iplink_ev_recv(conn, &sdu);
     202
     203        free(frame.data);
     204        return rc;
    162205}
    163206
  • uspace/srv/ethip/ethip.h

    re767dbf r1493811  
    2727 */
    2828
    29 /** @addtogroup inet
     29/** @addtogroup ethip
    3030 * @{
    3131 */
     
    3737#ifndef ETHIP_H_
    3838#define ETHIP_H_
     39
     40#include <adt/list.h>
     41#include <async.h>
     42#include <inet/iplink_srv.h>
     43#include <loc.h>
     44#include <sys/types.h>
    3945
    4046typedef struct ethip_nic {
     
    4854} ethip_nic_t;
    4955
     56/** IEEE MAC-48 identifier */
     57typedef struct {
     58        /** MAC Address (in lowest 48 bits) */
     59        uint64_t addr;
     60} mac48_addr_t;
     61
     62/** Ethernet frame */
     63typedef struct {
     64        /** Destination Address */
     65        mac48_addr_t dest;
     66        /** Source Address */
     67        mac48_addr_t src;
     68        /** Ethertype or Length */
     69        uint16_t etype_len;
     70        /** Payload */
     71        void *data;
     72        /** Payload size */
     73        size_t size;
     74} eth_frame_t;
     75
    5076extern int ethip_iplink_init(ethip_nic_t *);
     77extern int ethip_received(iplink_srv_t *, void *, size_t);
     78
    5179
    5280#endif
  • uspace/srv/ethip/ethip_nic.c

    re767dbf r1493811  
    2727 */
    2828
    29 /** @addtogroup inet
     29/** @addtogroup ethip
    3030 * @{
    3131 */
     
    201201    ipc_call_t *call)
    202202{
     203        int rc;
     204        void *data;
     205        size_t size;
     206
    203207        log_msg(LVL_DEBUG, "ethip_nic_received()");
    204         async_answer_0(callid, ENOTSUP);
     208
     209        rc = async_data_write_accept(&data, false, 0, 0, 0, &size);
     210        if (rc != EOK) {
     211                log_msg(LVL_DEBUG, "data_write_accept() failed");
     212                return;
     213        }
     214
     215        rc = ethip_received(&nic->iplink, data, size);
     216        free(data);
     217
     218        async_answer_0(callid, rc);
    205219}
    206220
     
    277291}
    278292
     293int ethip_nic_send(ethip_nic_t *nic, void *data, size_t size)
     294{
     295        return nic_send_frame(nic->sess, data, size);
     296}
     297
    279298/** @}
    280299 */
  • uspace/srv/ethip/ethip_nic.h

    re767dbf r1493811  
    2727 */
    2828
    29 /** @addtogroup inet
     29/** @addtogroup ethip
    3030 * @{
    3131 */
     
    4242extern int ethip_nic_discovery_start(void);
    4343extern ethip_nic_t *ethip_nic_find_by_iplink_sid(service_id_t);
     44extern int ethip_nic_send(ethip_nic_t *, void *, size_t);
     45
    4446
    4547#endif
Note: See TracChangeset for help on using the changeset viewer.