gnrc_udp.c adapt for nhc udp encoding and decoding

This commit is contained in:
Johann Fischer 2015-10-30 18:54:38 +01:00
parent a85d50b9d1
commit c6ab57f468

View File

@ -68,7 +68,7 @@ static uint16_t _calc_csum(gnrc_pktsnip_t *hdr, gnrc_pktsnip_t *pseudo_hdr,
uint16_t len = (uint16_t)hdr->size; uint16_t len = (uint16_t)hdr->size;
/* process the payload */ /* process the payload */
while (payload && payload != hdr) { while (payload && payload != hdr && payload != pseudo_hdr) {
csum = inet_csum_slice(csum, (uint8_t *)(payload->data), payload->size, len); csum = inet_csum_slice(csum, (uint8_t *)(payload->data), payload->size, len);
len += (uint16_t)payload->size; len += (uint16_t)payload->size;
payload = payload->next; payload = payload->next;
@ -104,21 +104,29 @@ static void _receive(gnrc_pktsnip_t *pkt)
return; return;
} }
pkt = udp; pkt = udp;
LL_SEARCH_SCALAR(pkt, ipv6, type, GNRC_NETTYPE_IPV6);
assert(ipv6 != NULL);
if ((ipv6->next != NULL) && (ipv6->next->type == GNRC_NETTYPE_UDP) &&
(ipv6->next->size == sizeof(udp_hdr_t))) {
/* UDP header was already marked. Take it. */
udp = ipv6->next;
}
else {
udp = gnrc_pktbuf_mark(pkt, sizeof(udp_hdr_t), GNRC_NETTYPE_UDP); udp = gnrc_pktbuf_mark(pkt, sizeof(udp_hdr_t), GNRC_NETTYPE_UDP);
if (udp == NULL) { if (udp == NULL) {
DEBUG("udp: error marking UDP header, dropping packet\n"); DEBUG("udp: error marking UDP header, dropping packet\n");
gnrc_pktbuf_release(pkt); gnrc_pktbuf_release(pkt);
return; return;
} }
}
/* mark payload as Type: UNDEF */ /* mark payload as Type: UNDEF */
pkt->type = GNRC_NETTYPE_UNDEF; pkt->type = GNRC_NETTYPE_UNDEF;
/* get explicit pointer to UDP header */ /* get explicit pointer to UDP header */
hdr = (udp_hdr_t *)udp->data; hdr = (udp_hdr_t *)udp->data;
LL_SEARCH_SCALAR(pkt, ipv6, type, GNRC_NETTYPE_IPV6);
assert(ipv6 != NULL);
/* validate checksum */ /* validate checksum */
if (_calc_csum(udp, ipv6, pkt)) { if (_calc_csum(udp, ipv6, pkt)) {
DEBUG("udp: received packet with invalid checksum, dropping it\n"); DEBUG("udp: received packet with invalid checksum, dropping it\n");