static void test_pktbuf_realloc_data__pkt_wrong(void) { ng_pktsnip_t pkt = { 1, NULL, TEST_STRING8, sizeof(TEST_STRING8), NG_NETTYPE_UNDEF }; TEST_ASSERT_EQUAL_INT(ENOENT, ng_pktbuf_realloc_data(&pkt, 0)); TEST_ASSERT(ng_pktbuf_is_empty()); }
static void test_pktbuf_realloc_data__further_down_the_line(void) { ng_pktsnip_t *pkt1, *pkt2, *header; void *exp_data; pkt1 = ng_pktbuf_add(NULL, TEST_STRING16, sizeof(TEST_STRING16), NG_NETTYPE_UNDEF); exp_data = pkt1->data; TEST_ASSERT_NOT_NULL(pkt1); header = ng_pktbuf_add(pkt1, pkt1->data, 4, NG_NETTYPE_UNDEF); pkt2 = ng_pktbuf_add(NULL, TEST_STRING16, sizeof(TEST_STRING16), NG_NETTYPE_UNDEF); TEST_ASSERT_NOT_NULL(header); TEST_ASSERT(header == pkt1->next); TEST_ASSERT_EQUAL_INT(4, header->size); TEST_ASSERT(((uint8_t *)pkt1->data) == (((uint8_t *)header->data) + 4)); TEST_ASSERT_EQUAL_INT(sizeof(TEST_STRING16) - 4, pkt1->size); TEST_ASSERT_EQUAL_INT(0, ng_pktbuf_realloc_data(header, 40)); TEST_ASSERT(exp_data != header->data); TEST_ASSERT_NULL(header->next); TEST_ASSERT_EQUAL_STRING(TEST_STRING16, header->data); TEST_ASSERT_EQUAL_INT(40, header->size); TEST_ASSERT_EQUAL_INT(NG_NETTYPE_UNDEF, header->type); TEST_ASSERT_EQUAL_INT(1, header->users); ng_pktbuf_release(pkt1); ng_pktbuf_release(pkt2); TEST_ASSERT(ng_pktbuf_is_empty()); }
static void test_pktbuf_realloc_data__nomemenough(void) { ng_pktsnip_t *pkt1, *pkt2; void *exp_data; pkt1 = ng_pktbuf_add(NULL, TEST_STRING8, sizeof(TEST_STRING8), NG_NETTYPE_UNDEF); exp_data = pkt1->data; TEST_ASSERT_NOT_NULL(pkt1); pkt2 = ng_pktbuf_add(NULL, NULL, 1, NG_NETTYPE_UNDEF); TEST_ASSERT_NOT_NULL(pkt2); TEST_ASSERT_NOT_NULL(ng_pktbuf_add(NULL, NULL, 4, NG_NETTYPE_UNDEF)); ng_pktbuf_release(pkt2); TEST_ASSERT_EQUAL_INT(0, ng_pktbuf_realloc_data(pkt1, 200)); TEST_ASSERT(exp_data != pkt1->data); TEST_ASSERT_NULL(pkt1->next); TEST_ASSERT_EQUAL_INT(200, pkt1->size); TEST_ASSERT_EQUAL_STRING(TEST_STRING8, pkt1->data); TEST_ASSERT_EQUAL_INT(NG_NETTYPE_UNDEF, pkt1->type); TEST_ASSERT_EQUAL_INT(1, pkt1->users); }
static void test_pktbuf_realloc_data__memfull(void) { ng_pktsnip_t *pkt = ng_pktbuf_add(NULL, NULL, sizeof(TEST_STRING8), NG_NETTYPE_TEST); TEST_ASSERT_EQUAL_INT(ENOMEM, ng_pktbuf_realloc_data(pkt, NG_PKTBUF_SIZE + 1)); ng_pktbuf_release(pkt); TEST_ASSERT(ng_pktbuf_is_empty()); }
static void test_pktbuf_realloc_data__memfull2(void) { ng_pktsnip_t *pkt = ng_pktbuf_add(NULL, NULL, sizeof(TEST_STRING8), NG_NETTYPE_UNDEF); TEST_ASSERT_NOT_NULL(pkt); TEST_ASSERT_NOT_NULL(ng_pktbuf_add(NULL, NULL, sizeof(TEST_STRING16), NG_NETTYPE_UNDEF)); TEST_ASSERT_EQUAL_INT(ENOMEM, ng_pktbuf_realloc_data(pkt, NG_PKTBUF_SIZE - sizeof(TEST_STRING8))); }
static void test_pktbuf_realloc_data__size_0(void) { ng_pktsnip_t *pkt = ng_pktbuf_add(NULL, NULL, sizeof(TEST_STRING8), NG_NETTYPE_UNDEF); TEST_ASSERT_EQUAL_INT(ENOMEM, ng_pktbuf_realloc_data(pkt, 0)); ng_pktbuf_release(pkt); TEST_ASSERT(ng_pktbuf_is_empty()); }
static void test_pktbuf_realloc_data__pkt_next_neq_NULL(void) { ng_pktsnip_t *pkt = ng_pktbuf_add(NULL, NULL, sizeof(TEST_STRING8), NG_NETTYPE_UNDEF); TEST_ASSERT_NOT_NULL(ng_pktbuf_add(pkt, pkt->data, sizeof(TEST_STRING4), NG_NETTYPE_UNDEF)); TEST_ASSERT_EQUAL_INT(EINVAL, ng_pktbuf_realloc_data(pkt, sizeof(TEST_STRING8) - 1)); ng_pktbuf_release(pkt); TEST_ASSERT(ng_pktbuf_is_empty()); }
static void test_pktbuf_realloc_data__pkt_users_gt_1(void) { ng_pktsnip_t *pkt = ng_pktbuf_add(NULL, NULL, sizeof(TEST_STRING8), NG_NETTYPE_UNDEF); ng_pktbuf_hold(pkt, 1); TEST_ASSERT_EQUAL_INT(EINVAL, ng_pktbuf_realloc_data(pkt, sizeof(TEST_STRING8) - 1)); ng_pktbuf_release(pkt); ng_pktbuf_release(pkt); TEST_ASSERT(ng_pktbuf_is_empty()); }
static void test_pktbuf_realloc_data__pkt_data_wrong(void) { ng_pktsnip_t *pkt = ng_pktbuf_add(NULL, NULL, sizeof(TEST_STRING8), NG_NETTYPE_UNDEF); void *orig_data = pkt->data; pkt->data = TEST_STRING8; TEST_ASSERT_EQUAL_INT(ENOENT, ng_pktbuf_realloc_data(pkt, 0)); pkt->data = orig_data; ng_pktbuf_release(pkt); TEST_ASSERT(ng_pktbuf_is_empty()); }
static void test_pktbuf_realloc_data__memenough(void) { ng_pktsnip_t *pkt; pkt = ng_pktbuf_add(NULL, NULL, sizeof(TEST_STRING16), NG_NETTYPE_TEST); TEST_ASSERT_NOT_NULL(pkt); TEST_ASSERT_EQUAL_INT(0, ng_pktbuf_realloc_data(pkt, sizeof(TEST_STRING8))); TEST_ASSERT_NULL(pkt->next); TEST_ASSERT_EQUAL_INT(sizeof(TEST_STRING8), pkt->size); TEST_ASSERT_EQUAL_INT(NG_NETTYPE_TEST, pkt->type); TEST_ASSERT_EQUAL_INT(1, pkt->users); }
static void test_pktbuf_realloc_data__success2(void) { ng_pktsnip_t *pkt; pkt = ng_pktbuf_add(NULL, TEST_STRING8, sizeof(TEST_STRING8), NG_NETTYPE_UNDEF); TEST_ASSERT_NOT_NULL(pkt); TEST_ASSERT_EQUAL_INT(0, ng_pktbuf_realloc_data(pkt, sizeof(TEST_STRING16))); TEST_ASSERT_NULL(pkt->next); TEST_ASSERT_EQUAL_STRING(TEST_STRING8, pkt->data); TEST_ASSERT_EQUAL_INT(sizeof(TEST_STRING16), pkt->size); TEST_ASSERT_EQUAL_INT(NG_NETTYPE_UNDEF, pkt->type); TEST_ASSERT_EQUAL_INT(1, pkt->users); }
static void test_pktbuf_realloc_data__shrink(void) { ng_pktsnip_t *pkt; void *exp_data; pkt = ng_pktbuf_add(NULL, NULL, sizeof(TEST_STRING16), NG_NETTYPE_TEST); exp_data = pkt->data; TEST_ASSERT_NOT_NULL(pkt); TEST_ASSERT_NOT_NULL(ng_pktbuf_add(NULL, NULL, 4, NG_NETTYPE_TEST)); TEST_ASSERT_EQUAL_INT(0, ng_pktbuf_realloc_data(pkt, 8)); TEST_ASSERT(exp_data == pkt->data); TEST_ASSERT_NULL(pkt->next); TEST_ASSERT_EQUAL_INT(8, pkt->size); TEST_ASSERT_EQUAL_INT(NG_NETTYPE_TEST, pkt->type); TEST_ASSERT_EQUAL_INT(1, pkt->users); }
static void test_pktbuf_realloc_data__success(void) { char exp_data[] = TEST_STRING16; ng_pktsnip_t *pkt; pkt = ng_pktbuf_add(NULL, TEST_STRING16, sizeof(TEST_STRING16), NG_NETTYPE_TEST); TEST_ASSERT_NOT_NULL(pkt); TEST_ASSERT_EQUAL_INT(0, ng_pktbuf_realloc_data(pkt, sizeof(TEST_STRING8))); TEST_ASSERT_NULL(pkt->next); TEST_ASSERT_EQUAL_INT(sizeof(TEST_STRING8), pkt->size); for (unsigned int i = 0; i < pkt->size; i++) { uint8_t *data = pkt->data; TEST_ASSERT_EQUAL_INT(exp_data[i], data[i]); } TEST_ASSERT_EQUAL_INT(NG_NETTYPE_TEST, pkt->type); TEST_ASSERT_EQUAL_INT(1, pkt->users); }
static void test_pktbuf_realloc_data__pkt_NULL(void) { TEST_ASSERT_EQUAL_INT(ENOENT, ng_pktbuf_realloc_data(NULL, 0)); TEST_ASSERT(ng_pktbuf_is_empty()); }
void rbuf_add(ng_netif_hdr_t *netif_hdr, ng_sixlowpan_frag_t *frag, size_t frag_size, size_t offset) { rbuf_t *entry; rbuf_int_t *ptr; uint8_t *data = ((uint8_t *)frag) + sizeof(ng_sixlowpan_frag_t); uint16_t dg_frag_size = frag_size; /* may differ on first fragment */ _rbuf_gc(); entry = _rbuf_get(ng_netif_hdr_get_src_addr(netif_hdr), netif_hdr->src_l2addr_len, ng_netif_hdr_get_dst_addr(netif_hdr), netif_hdr->dst_l2addr_len, byteorder_ntohs(frag->disp_size) & NG_SIXLOWPAN_FRAG_SIZE_MASK, byteorder_ntohs(frag->tag)); if (entry == NULL) { DEBUG("6lo rbuf: reassembly buffer full.\n"); return; } ptr = entry->ints; /* dispatches in the first fragment are ignored */ if (offset != 0) { switch (((uint8_t *)(entry->pkt->data))[0]) { case NG_SIXLOWPAN_UNCOMPRESSED: offset++; break; default: break; } data++; /* also don't take offset field */ } else { switch (data[0]) { case NG_SIXLOWPAN_UNCOMPRESSED: dg_frag_size--; break; default: break; } } if ((offset + frag_size) > entry->pkt->size) { DEBUG("6lo rfrag: fragment too big for resulting datagram, discarding datagram\n"); ng_pktbuf_release(entry->pkt); _rbuf_rem(entry); return; } while (ptr != NULL) { if (_rbuf_int_in(ptr, offset, offset + dg_frag_size - 1)) { DEBUG("6lo rfrag: overlapping or same intervals, discarding datagram\n"); ng_pktbuf_release(entry->pkt); _rbuf_rem(entry); return; } ptr = ptr->next; } if (_rbuf_update_ints(entry, offset, dg_frag_size)) { if (dg_frag_size < frag_size) { /* some dispatches do not count to datagram size and we need * more space because of that */ if (ng_pktbuf_realloc_data(entry->pkt, entry->pkt->size + (frag_size - dg_frag_size)) < 0) { DEBUG("6lo rbuf: could not reallocate packet data.\n"); return; } /* move already inserted fragments (frag_size - dg_frag_size) to the right */ if (entry->cur_size > 0) { for (int i = entry->pkt->size - (frag_size - dg_frag_size); i > 0; i--) { uint8_t *d = ((uint8_t *)(entry->pkt->data)) + i; *d = *(d - 1); } } } DEBUG("6lo rbuf: add fragment data\n"); entry->cur_size += (uint16_t)dg_frag_size; memcpy(((uint8_t *)entry->pkt->data) + offset, data, frag_size); } if (entry->cur_size == entry->datagram_size) { kernel_pid_t iface = netif_hdr->if_pid; ng_pktsnip_t *netif = ng_netif_hdr_build(entry->src, entry->src_len, entry->dst, entry->dst_len); if (netif == NULL) { DEBUG("6lo rbuf: error allocating netif header\n"); ng_pktbuf_release(entry->pkt); return; } netif_hdr = netif->data; netif_hdr->if_pid = iface; LL_APPEND(entry->pkt, netif); DEBUG("6lo rbuf: datagram complete, send to self\n"); ng_netapi_receive(thread_getpid(), entry->pkt); _rbuf_rem(entry); } }