gnrc_sixlowpan_frag_rb: seperate out classic frag specific code
This commit is contained in:
parent
a7d082d9b8
commit
2a74d32ea9
@ -129,41 +129,68 @@ void gnrc_sixlowpan_frag_rb_add(gnrc_netif_hdr_t *netif_hdr,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _rbuf_add(gnrc_netif_hdr_t *netif_hdr, gnrc_pktsnip_t *pkt,
|
#ifndef NDEBUG
|
||||||
size_t offset, unsigned page)
|
static bool _valid_offset(gnrc_pktsnip_t *pkt, size_t offset)
|
||||||
{
|
{
|
||||||
gnrc_sixlowpan_frag_rb_t *entry;
|
return (sixlowpan_frag_1_is(pkt->data) && (offset == 0)) ||
|
||||||
sixlowpan_frag_n_t *frag = pkt->data;
|
(sixlowpan_frag_n_is(pkt->data) &&
|
||||||
uint8_t *data = ((uint8_t *)pkt->data) + sizeof(sixlowpan_frag_t);
|
(offset == sixlowpan_frag_offset(pkt->data)));
|
||||||
size_t frag_size;
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* check if provided offset is the same as in fragment */
|
static uint8_t *_6lo_frag_payload(gnrc_pktsnip_t *pkt)
|
||||||
assert(((((frag->disp_size.u8[0] & SIXLOWPAN_FRAG_DISP_MASK) ==
|
{
|
||||||
SIXLOWPAN_FRAG_1_DISP)) && (offset == 0)) ||
|
if (sixlowpan_frag_1_is(pkt->data)) {
|
||||||
((((frag->disp_size.u8[0] & SIXLOWPAN_FRAG_DISP_MASK) ==
|
return ((uint8_t *)pkt->data) + sizeof(sixlowpan_frag_t);
|
||||||
SIXLOWPAN_FRAG_N_DISP)) && (offset == (frag->offset * 8U))));
|
}
|
||||||
gnrc_sixlowpan_frag_rb_gc();
|
else {
|
||||||
entry = _rbuf_get(gnrc_netif_hdr_get_src_addr(netif_hdr), netif_hdr->src_l2addr_len,
|
return ((uint8_t *)pkt->data) + sizeof(sixlowpan_frag_n_t);
|
||||||
gnrc_netif_hdr_get_dst_addr(netif_hdr), netif_hdr->dst_l2addr_len,
|
}
|
||||||
byteorder_ntohs(frag->disp_size) & SIXLOWPAN_FRAG_SIZE_MASK,
|
|
||||||
byteorder_ntohs(frag->tag), page);
|
|
||||||
|
|
||||||
if (entry == NULL) {
|
|
||||||
DEBUG("6lo rbuf: reassembly buffer full.\n");
|
|
||||||
gnrc_pktbuf_release(pkt);
|
|
||||||
return RBUF_ADD_ERROR;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* dispatches in the first fragment are ignored */
|
static size_t _6lo_frag_size(gnrc_pktsnip_t *pkt, size_t offset, uint8_t *data)
|
||||||
|
{
|
||||||
|
size_t frag_size;
|
||||||
|
|
||||||
if (offset == 0) {
|
if (offset == 0) {
|
||||||
frag_size = pkt->size - sizeof(sixlowpan_frag_t);
|
frag_size = pkt->size - sizeof(sixlowpan_frag_t);
|
||||||
if (data[0] == SIXLOWPAN_UNCOMP) {
|
if (data[0] == SIXLOWPAN_UNCOMP) {
|
||||||
|
/* subtract SIXLOWPAN_UNCOMP byte from fragment size,
|
||||||
|
* data pointer must be changed by caller (see _rbuf_add()) */
|
||||||
frag_size--;
|
frag_size--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
frag_size = pkt->size - sizeof(sixlowpan_frag_n_t);
|
frag_size = pkt->size - sizeof(sixlowpan_frag_n_t);
|
||||||
data++; /* FRAGN header is one byte longer (offset) */
|
}
|
||||||
|
return frag_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int _rbuf_add(gnrc_netif_hdr_t *netif_hdr, gnrc_pktsnip_t *pkt,
|
||||||
|
size_t offset, unsigned page)
|
||||||
|
{
|
||||||
|
gnrc_sixlowpan_frag_rb_t *entry;
|
||||||
|
uint8_t *data;
|
||||||
|
size_t frag_size;
|
||||||
|
uint16_t datagram_size;
|
||||||
|
uint16_t datagram_tag;
|
||||||
|
|
||||||
|
/* check if provided offset is the same as in fragment */
|
||||||
|
assert(_valid_offset(pkt, offset));
|
||||||
|
data = _6lo_frag_payload(pkt);
|
||||||
|
frag_size = _6lo_frag_size(pkt, offset, data);
|
||||||
|
datagram_size = sixlowpan_frag_datagram_size(pkt->data);
|
||||||
|
datagram_tag = sixlowpan_frag_datagram_tag(pkt->data);
|
||||||
|
|
||||||
|
gnrc_sixlowpan_frag_rb_gc();
|
||||||
|
entry = _rbuf_get(gnrc_netif_hdr_get_src_addr(netif_hdr), netif_hdr->src_l2addr_len,
|
||||||
|
gnrc_netif_hdr_get_dst_addr(netif_hdr), netif_hdr->dst_l2addr_len,
|
||||||
|
datagram_size, datagram_tag, page);
|
||||||
|
|
||||||
|
if (entry == NULL) {
|
||||||
|
DEBUG("6lo rbuf: reassembly buffer full.\n");
|
||||||
|
gnrc_pktbuf_release(pkt);
|
||||||
|
return RBUF_ADD_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((offset + frag_size) > entry->super.datagram_size) {
|
if ((offset + frag_size) > entry->super.datagram_size) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user