static void test_pktbuf_mark__pkt_NOT_NULL__pkt_data_NULL(void) { ng_pktsnip_t pkt = { 1, NULL, NULL, sizeof(TEST_STRING16), NG_NETTYPE_TEST }; TEST_ASSERT_NULL(ng_pktbuf_mark(&pkt, sizeof(TEST_STRING16) - 1, NG_NETTYPE_TEST)); TEST_ASSERT_NULL(pkt.next); TEST_ASSERT_NULL(pkt.data); TEST_ASSERT_EQUAL_INT(sizeof(TEST_STRING16), pkt.size); TEST_ASSERT_EQUAL_INT(NG_NETTYPE_TEST, pkt.type); TEST_ASSERT_EQUAL_INT(1, pkt.users); }
static void test_pktbuf_mark__pkt_NOT_NULL__size_0(void) { ng_pktsnip_t *pkt = ng_pktbuf_add(NULL, TEST_STRING16, sizeof(TEST_STRING16), NG_NETTYPE_TEST); TEST_ASSERT_NOT_NULL(pkt); TEST_ASSERT_NULL(ng_pktbuf_mark(pkt, 0, NG_NETTYPE_TEST)); TEST_ASSERT_NULL(pkt->next); TEST_ASSERT_NOT_NULL(pkt->data); TEST_ASSERT_EQUAL_STRING(TEST_STRING16, pkt->data); TEST_ASSERT_EQUAL_INT(sizeof(TEST_STRING16), pkt->size); TEST_ASSERT_EQUAL_INT(NG_NETTYPE_TEST, pkt->type); TEST_ASSERT_EQUAL_INT(1, pkt->users); }
static void test_pktbuf_mark__success_aligned(void) { uint8_t *data = (uint8_t *)(TEST_STRING16); ng_pktsnip_t *pkt1 = ng_pktbuf_add(NULL, data, sizeof(TEST_STRING16), NG_NETTYPE_TEST); ng_pktsnip_t *pkt2; uint8_t exp_data1[sizeof(TEST_STRING16) - 8]; uint8_t exp_data2[8]; memcpy(exp_data1, data + sizeof(exp_data2), sizeof(exp_data1)); memcpy(exp_data2, data, sizeof(exp_data2)); TEST_ASSERT_NOT_NULL(pkt1); TEST_ASSERT_NOT_NULL((pkt2 = ng_pktbuf_mark(pkt1, 8, NG_NETTYPE_UNDEF))); TEST_ASSERT(ng_pktbuf_is_sane()); TEST_ASSERT(pkt1->next == pkt2); TEST_ASSERT_NOT_NULL(pkt1->data); TEST_ASSERT_EQUAL_INT(0, memcmp(exp_data1, pkt1->data, pkt1->size)); TEST_ASSERT_EQUAL_INT(sizeof(TEST_STRING16) - 8, pkt1->size); TEST_ASSERT_EQUAL_INT(NG_NETTYPE_TEST, pkt1->type); TEST_ASSERT_EQUAL_INT(1, pkt1->users); TEST_ASSERT_NULL(pkt2->next); TEST_ASSERT_NOT_NULL(pkt2->data); TEST_ASSERT_EQUAL_INT(0, memcmp(exp_data2, pkt2->data, pkt2->size)); TEST_ASSERT_EQUAL_INT(8, pkt2->size); TEST_ASSERT_EQUAL_INT(NG_NETTYPE_UNDEF, pkt2->type); TEST_ASSERT_EQUAL_INT(1, pkt2->users); /* check if slightly larger packet would override data */ ng_pktbuf_remove_snip(pkt1, pkt2); pkt2 = ng_pktbuf_add(NULL, TEST_STRING12, 12, NG_NETTYPE_TEST); TEST_ASSERT(ng_pktbuf_is_sane()); TEST_ASSERT_NOT_NULL(pkt1->data); TEST_ASSERT_EQUAL_INT(0, memcmp(exp_data1, pkt1->data, pkt1->size)); TEST_ASSERT_EQUAL_INT(sizeof(TEST_STRING16) - 8, pkt1->size); TEST_ASSERT_EQUAL_INT(NG_NETTYPE_TEST, pkt1->type); TEST_ASSERT_EQUAL_INT(1, pkt1->users); /* check if everything can be cleaned up */ ng_pktbuf_release(pkt1); ng_pktbuf_release(pkt2); TEST_ASSERT(ng_pktbuf_is_empty()); }
bool ng_ipv6_ext_demux(kernel_pid_t iface, ng_pktsnip_t *pkt, uint8_t nh) { ng_pktsnip_t *ext_snip; ng_ipv6_ext_t *ext; unsigned int offset = 0; ext = ((ng_ipv6_ext_t *)(((uint8_t *)pkt->data) + sizeof(ng_ipv6_hdr_t))); bool c = true; while (c) { switch (nh) { case PROTNUM_IPV6_EXT_HOPOPT: case PROTNUM_IPV6_EXT_DST: case PROTNUM_IPV6_EXT_RH: case PROTNUM_IPV6_EXT_FRAG: case PROTNUM_IPV6_EXT_AH: case PROTNUM_IPV6_EXT_ESP: case PROTNUM_IPV6_EXT_MOB: /* TODO: add handling of types */ nh = ext->nh; offset += ((ext->len * NG_IPV6_EXT_LEN_UNIT) + NG_IPV6_EXT_LEN_UNIT); ext = ng_ipv6_ext_get_next((ng_ipv6_ext_t *)ext); break; default: c = false; offset += ((ext->len * NG_IPV6_EXT_LEN_UNIT) + NG_IPV6_EXT_LEN_UNIT); ext = ng_ipv6_ext_get_next((ng_ipv6_ext_t *)ext); break; } } ext_snip = ng_pktbuf_mark(pkt, offset, NG_NETTYPE_IPV6); if (ext_snip == NULL) { return false; } ng_ipv6_demux(iface, pkt, nh); /* demultiplex next header */ return true; }
static void test_pktbuf_mark__pkt_NULL__size_not_0(void) { TEST_ASSERT_NULL(ng_pktbuf_mark(NULL, sizeof(TEST_STRING4), NG_NETTYPE_TEST)); }
static void test_pktbuf_mark__pkt_NULL__size_0(void) { TEST_ASSERT_NULL(ng_pktbuf_mark(NULL, 0, NG_NETTYPE_TEST)); }
static void _receive(ng_pktsnip_t *pkt) { kernel_pid_t iface = KERNEL_PID_UNDEF; ng_pktsnip_t *ipv6, *netif; ng_ipv6_hdr_t *hdr; assert(pkt != NULL); LL_SEARCH_SCALAR(pkt, netif, type, NG_NETTYPE_NETIF); if (netif != NULL) { iface = ((ng_netif_hdr_t *)netif->data)->if_pid; } if ((pkt->next != NULL) && (pkt->next->type == NG_NETTYPE_IPV6) && (pkt->next->size == sizeof(ng_ipv6_hdr_t))) { /* IP header was already marked. Take it. */ ipv6 = pkt->next; if (!ng_ipv6_hdr_is(ipv6->data)) { DEBUG("ipv6: Received packet was not IPv6, dropping packet\n"); ng_pktbuf_release(pkt); return; } } else { if (!ng_ipv6_hdr_is(pkt->data)) { DEBUG("ipv6: Received packet was not IPv6, dropping packet\n"); ng_pktbuf_release(pkt); return; } /* seize ipv6 as a temporary variable */ ipv6 = ng_pktbuf_start_write(pkt); if (ipv6 == NULL) { DEBUG("ipv6: unable to get write access to packet, drop it\n"); ng_pktbuf_release(pkt); return; } pkt = ipv6; /* reset pkt from temporary variable */ ipv6 = ng_pktbuf_mark(pkt, sizeof(ng_ipv6_hdr_t), NG_NETTYPE_IPV6); if (ipv6 == NULL) { DEBUG("ipv6: error marking IPv6 header, dropping packet\n"); ng_pktbuf_release(pkt); return; } } /* extract header */ hdr = (ng_ipv6_hdr_t *)ipv6->data; DEBUG("ipv6: Received (src = %s, ", ng_ipv6_addr_to_str(addr_str, &(hdr->src), sizeof(addr_str))); DEBUG("dst = %s, next header = %" PRIu8 ", length = %" PRIu16 ")\n", ng_ipv6_addr_to_str(addr_str, &(hdr->dst), sizeof(addr_str)), hdr->nh, byteorder_ntohs(hdr->len)); if (_pkt_not_for_me(&iface, hdr)) { /* if packet is not for me */ DEBUG("ipv6: packet destination not this host\n"); #ifdef MODULE_NG_IPV6_ROUTER /* only routers redirect */ /* redirect to next hop */ DEBUG("ipv6: decrement hop limit to %" PRIu8 "\n", hdr->hl - 1); /* TODO: check if receiving interface is router */ if (--(hdr->hl) > 0) { /* drop packets that *reach* Hop Limit 0 */ ng_pktsnip_t *tmp = pkt; DEBUG("ipv6: forward packet to next hop\n"); /* pkt might not be writable yet, if header was given above */ pkt = ng_pktbuf_start_write(tmp); ipv6 = ng_pktbuf_start_write(ipv6); if ((ipv6 == NULL) || (pkt == NULL)) { DEBUG("ipv6: unable to get write access to packet: dropping it\n"); ng_pktbuf_release(tmp); return; } ng_pktbuf_release(ipv6->next); /* remove headers around IPV6 */ ipv6->next = pkt; /* reorder for sending */ pkt->next = NULL; _send(ipv6, false); } else { DEBUG("ipv6: hop limit reached 0: drop packet\n"); ng_pktbuf_release(pkt); return; } #else /* MODULE_NG_IPV6_ROUTER */ DEBUG("ipv6: dropping packet\n"); /* non rounting hosts just drop the packet */ ng_pktbuf_release(pkt); return; #endif /* MODULE_NG_IPV6_ROUTER */ } /* IPv6 internal demuxing (ICMPv6, Extension headers etc.) */ ng_ipv6_demux(iface, pkt, hdr->nh); }
static void _receive(ng_pktsnip_t *pkt) { ng_pktsnip_t *payload; uint8_t *dispatch; /* seize payload as a temporary variable */ payload = ng_pktbuf_start_write(pkt); /* need to duplicate since pkt->next * might get replaced */ if (payload == NULL) { DEBUG("6lo: can not get write access on received packet\n"); #if defined(DEVELHELP) && ENABLE_DEBUG ng_pktbuf_stats(); #endif ng_pktbuf_release(pkt); return; } pkt = payload; /* reset pkt from temporary variable */ LL_SEARCH_SCALAR(pkt, payload, type, NG_NETTYPE_SIXLOWPAN); if ((payload == NULL) || (payload->size < 1)) { DEBUG("6lo: Received packet has no 6LoWPAN payload\n"); ng_pktbuf_release(pkt); return; } dispatch = payload->data; if (dispatch[0] == SIXLOWPAN_UNCOMP) { ng_pktsnip_t *sixlowpan; DEBUG("6lo: received uncompressed IPv6 packet\n"); payload = ng_pktbuf_start_write(payload); if (payload == NULL) { DEBUG("6lo: can not get write access on received packet\n"); #if defined(DEVELHELP) && ENABLE_DEBUG ng_pktbuf_stats(); #endif ng_pktbuf_release(pkt); return; } /* packet is uncompressed: just mark and remove the dispatch */ sixlowpan = ng_pktbuf_mark(payload, sizeof(uint8_t), NG_NETTYPE_SIXLOWPAN); if (sixlowpan == NULL) { DEBUG("6lo: can not mark 6LoWPAN dispatch\n"); ng_pktbuf_release(pkt); return; } pkt = ng_pktbuf_remove_snip(pkt, sixlowpan); } #ifdef MODULE_NG_SIXLOWPAN_FRAG else if (sixlowpan_frag_is((sixlowpan_frag_t *)dispatch)) { DEBUG("6lo: received 6LoWPAN fragment\n"); ng_sixlowpan_frag_handle_pkt(pkt); return; } #endif #ifdef MODULE_NG_SIXLOWPAN_IPHC else if (sixlowpan_iphc_is(dispatch)) { size_t dispatch_size; ng_pktsnip_t *sixlowpan; ng_pktsnip_t *ipv6 = ng_pktbuf_add(NULL, NULL, sizeof(ipv6_hdr_t), NG_NETTYPE_IPV6); if ((ipv6 == NULL) || (dispatch_size = ng_sixlowpan_iphc_decode(ipv6, pkt, 0)) == 0) { DEBUG("6lo: error on IPHC decoding\n"); if (ipv6 != NULL) { ng_pktbuf_release(ipv6); } ng_pktbuf_release(pkt); return; } sixlowpan = ng_pktbuf_mark(pkt, dispatch_size, NG_NETTYPE_SIXLOWPAN); if (sixlowpan == NULL) { DEBUG("6lo: error on marking IPHC dispatch\n"); ng_pktbuf_release(ipv6); ng_pktbuf_release(pkt); return; } /* Remove IPHC dispatch */ ng_pktbuf_remove_snip(pkt, sixlowpan); /* Insert IPv6 header instead */ ipv6->next = pkt->next; pkt->next = ipv6; } #endif else { DEBUG("6lo: dispatch %02" PRIx8 " ... is not supported\n", dispatch[0]); ng_pktbuf_release(pkt); return; } payload->type = NG_NETTYPE_IPV6; if (!ng_netapi_dispatch_receive(NG_NETTYPE_IPV6, NG_NETREG_DEMUX_CTX_ALL, pkt)) { DEBUG("6lo: No receivers for this packet found\n"); ng_pktbuf_release(pkt); } }