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); } }
/* 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; }
/* * 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); }
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); }