Ejemplo n.º 1
0
static void _rx_event(ng_netdev_eth_t *netdev)
{
    dev_eth_t *dev = netdev->ethdev;
    int nread = dev->driver->recv(dev, (char*)recv_buffer, ETHERNET_MAX_LEN);

    DEBUG("ng_netdev_eth: read %d bytes\n", nread);

    if (nread > 0) {
        ethernet_hdr_t *hdr = (ethernet_hdr_t *)recv_buffer;
        ng_pktsnip_t *netif_hdr, *pkt;
        ng_nettype_t receive_type = NG_NETTYPE_UNDEF;
        size_t data_len = (nread - sizeof(ethernet_hdr_t));

        /* TODO: implement multicast groups? */

        netif_hdr = ng_pktbuf_add(NULL, NULL,
                                  sizeof(ng_netif_hdr_t) + (2 * ETHERNET_ADDR_LEN),
                                  NG_NETTYPE_NETIF);

        if (netif_hdr == NULL) {
            DEBUG("ng_netdev_eth: no space left in packet buffer\n");
            return;
        }

        ng_netif_hdr_init(netif_hdr->data, ETHERNET_ADDR_LEN, ETHERNET_ADDR_LEN);
        ng_netif_hdr_set_src_addr(netif_hdr->data, hdr->src, ETHERNET_ADDR_LEN);
        ng_netif_hdr_set_dst_addr(netif_hdr->data, hdr->dst, ETHERNET_ADDR_LEN);
        ((ng_netif_hdr_t *)netif_hdr->data)->if_pid = thread_getpid();

        receive_type = ng_nettype_from_ethertype(byteorder_ntohs(hdr->type));

        DEBUG("ng_netdev_eth: received packet from %02x:%02x:%02x:%02x:%02x:%02x "
              "of length %zu\n",
              hdr->src[0], hdr->src[1], hdr->src[2], hdr->src[3], hdr->src[4],
              hdr->src[5], data_len);
#if defined(MODULE_OD) && ENABLE_DEBUG
        od_hex_dump(hdr, nread, OD_WIDTH_DEFAULT);
#endif

        /* Mark netif header and payload for next layer */
        if ((pkt = ng_pktbuf_add(netif_hdr, recv_buffer + sizeof(ethernet_hdr_t),
                                 data_len, receive_type)) == NULL) {
            ng_pktbuf_release(netif_hdr);
            DEBUG("ng_netdev_eth: no space left in packet buffer\n");
            return;
        }

        if (netdev->event_cb != NULL) {
            netdev->event_cb(NETDEV_EVENT_RX_COMPLETE, pkt);
        }
        else {
            ng_pktbuf_release(pkt); /* netif_hdr is released automatically too */
        }
    }
    else {
        DEBUG("ng_netdev_eth: spurious _rx_event: %d\n", nread);
    }
}
Ejemplo n.º 2
0
/* shell commands */
int _netif_send(int argc, char **argv)
{
    kernel_pid_t dev;
    uint8_t addr[MAX_ADDR_LEN];
    size_t addr_len;
    ng_pktsnip_t *pkt;
    ng_netif_hdr_t *nethdr;
    uint8_t flags = 0x00;

    if (argc < 4) {
        printf("usage: %s <if> [<addr>|bcast] <data>\n", argv[0]);
        return 1;
    }

    /* parse interface */
    dev = (kernel_pid_t)atoi(argv[1]);

    if (!_is_iface(dev)) {
        puts("error: invalid interface given");
        return 1;
    }

    /* parse address */
    addr_len = ng_netif_addr_from_str(addr, sizeof(addr), argv[2]);

    if (addr_len == 0) {
        if (strcmp(argv[2], "bcast") == 0) {
            flags |= NG_NETIF_HDR_FLAGS_BROADCAST;
        }
        else {
            puts("error: invalid address given");
            return 1;
        }
    }

    /* put packet together */
    pkt = ng_pktbuf_add(NULL, argv[3], strlen(argv[3]), NG_NETTYPE_UNDEF);
    pkt = ng_pktbuf_add(pkt, NULL, sizeof(ng_netif_hdr_t) + addr_len,
                        NG_NETTYPE_NETIF);
    nethdr = (ng_netif_hdr_t *)pkt->data;
    ng_netif_hdr_init(nethdr, 0, addr_len);
    ng_netif_hdr_set_dst_addr(nethdr, addr, addr_len);
    nethdr->flags = flags;
    /* and send it */
    ng_netapi_send(dev, pkt);

    return 0;
}
Ejemplo n.º 3
0
/*
 * Event handlers
 */
static void _receive_data(void)
{
    packet_t *data;
    ng_pktsnip_t *pkt_head;
    ng_pktsnip_t *pkt;
    ng_netif_hdr_t *hdr;
    ng_nettype_t nettype;

    /* only read data if we have somewhere to send it to */
    if (_netdev->event_cb == NULL) {
        return;
    }

    /* get pointer to RX data buffer */
    data = &(_rx_buf[_rx_next ^ 1]);

    /* allocate and fill netif header */
    pkt_head = ng_pktbuf_add(NULL, NULL, sizeof(ng_netif_hdr_t) + 4,
                             NG_NETTYPE_UNDEF);
    if (pkt_head == NULL) {
        DEBUG("nrfmin: Error allocating netif header on RX\n");
        return;
    }
    hdr = (ng_netif_hdr_t *)pkt_head->data;
    ng_netif_hdr_init(hdr, 2, 2);
    hdr->if_pid = _netdev->mac_pid;
    ng_netif_hdr_set_src_addr(hdr, data->src_addr, 2);
    ng_netif_hdr_set_dst_addr(hdr, data->dst_addr, 2);

    /* allocate and fill payload */
    nettype = _nrftype_to_nettype(data->proto);
    pkt = ng_pktbuf_add(pkt_head, data->payload, data->length - 6, nettype);
    if (pkt == NULL) {
        DEBUG("nrfmin: Error allocating packet payload on RX\n");
        ng_pktbuf_release(pkt_head);
        return;
    }

    /* pass on the received packet */
    _netdev->event_cb(NETDEV_EVENT_RX_COMPLETE, pkt);
}
Ejemplo n.º 4
0
void icn_send(eui64_t *dst, ng_pktsnip_t *pkt)
{
    ng_netif_hdr_t *nethdr;
    uint8_t flags = 0x00;

    if (!_linkIsScheduled(dst)) {
        LOG_DEBUG("No direct neighbor, look for a route\n");
        eui64_t *tmp;
        tmp = _routeLookup(dst);
        if (tmp == NULL) {
            LOG_ERROR("Not route for %s found\n",
                    ng_netif_addr_to_str(l2addr_str, sizeof(l2addr_str),
                    dst->uint8, ADDR_LEN_64B));
            ng_pktbuf_release(pkt);
            return;
        }
        dst = tmp;
    }

    LOG_DEBUG("Sending to %s\n",
            ng_netif_addr_to_str(l2addr_str, sizeof(l2addr_str),
                dst->uint8, ADDR_LEN_64B));
    /* put packet together */
    if (pkt->type == NG_NETTYPE_NETIF) {
        LOG_DEBUG("packet has already a netif header\n");
    }
    else {
        LOG_DEBUG("creating netif header\n");
        pkt = ng_pktbuf_add(pkt, NULL, sizeof(ng_netif_hdr_t) + ADDR_LEN_64B,
                NG_NETTYPE_NETIF);
    }
    nethdr = (ng_netif_hdr_t *)pkt->data;
    ng_netif_hdr_init(nethdr, 0, ADDR_LEN_64B);
    ng_netif_hdr_set_dst_addr(nethdr, dst->uint8, ADDR_LEN_64B);
    nethdr->flags = flags;
    /* and send it */
    send_counter++;
    ng_netapi_send(*if_id, pkt);
}