mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-01-17 06:12:43 +01:00
tests/net/gnrc_sock_ip: add support for extension header handling
This commit is contained in:
parent
875aecb327
commit
988592ce54
@ -30,6 +30,19 @@
|
|||||||
#include "constants.h"
|
#include "constants.h"
|
||||||
#include "stack.h"
|
#include "stack.h"
|
||||||
|
|
||||||
|
#include "byteorder.h"
|
||||||
|
#include "net/gnrc/ipv6/ext/opt.h"
|
||||||
|
|
||||||
|
void gnrc_ipv6_ext_opt_rpl_cb(gnrc_pktsnip_t *pkt, ipv6_ext_opt_rpl_t *opt)
|
||||||
|
{
|
||||||
|
(void)pkt;
|
||||||
|
uint16_t rank = byteorder_ntohs(opt->rank);
|
||||||
|
|
||||||
|
printf("got RPL opt with rank %u\n", rank);
|
||||||
|
opt->rank = byteorder_htons(++rank);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#define _TEST_BUFFER_SIZE (128)
|
#define _TEST_BUFFER_SIZE (128)
|
||||||
|
|
||||||
#define CALL(fn) puts("Calling " # fn); fn; tear_down()
|
#define CALL(fn) puts("Calling " # fn); fn; tear_down()
|
||||||
|
@ -103,13 +103,38 @@ static inline bool _res(gnrc_pktsnip_t *pkt, bool res)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint8_t _final_nh(gnrc_pktsnip_t *ipv6, uint8_t nh)
|
||||||
|
{
|
||||||
|
#ifdef MODULE_GNRC_IPV6_EXT_OPT
|
||||||
|
while (ipv6->next && ipv6->next->type == GNRC_NETTYPE_IPV6_EXT) {
|
||||||
|
ipv6 = ipv6->next;
|
||||||
|
nh = ((ipv6_ext_t *)(ipv6->data))->nh;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
(void)ipv6;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return nh;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gnrc_pktsnip_t *_final_snip(gnrc_pktsnip_t *ipv6)
|
||||||
|
{
|
||||||
|
#ifdef MODULE_GNRC_IPV6_EXT_OPT
|
||||||
|
while (ipv6->next && ipv6->next->type == GNRC_NETTYPE_IPV6_EXT) {
|
||||||
|
ipv6 = ipv6->next;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return ipv6;
|
||||||
|
}
|
||||||
|
|
||||||
bool _check_packet(const ipv6_addr_t *src, const ipv6_addr_t *dst,
|
bool _check_packet(const ipv6_addr_t *src, const ipv6_addr_t *dst,
|
||||||
uint8_t proto, void *data, size_t data_len,
|
uint8_t proto, void *data, size_t data_len,
|
||||||
uint16_t netif)
|
uint16_t netif)
|
||||||
{
|
{
|
||||||
gnrc_pktsnip_t *pkt, *ipv6;
|
gnrc_pktsnip_t *pkt, *ipv6, *payload;
|
||||||
ipv6_hdr_t *ipv6_hdr;
|
ipv6_hdr_t *ipv6_hdr;
|
||||||
msg_t msg;
|
msg_t msg;
|
||||||
|
uint8_t nh;
|
||||||
|
|
||||||
msg_receive(&msg);
|
msg_receive(&msg);
|
||||||
if (msg.type != GNRC_NETAPI_MSG_TYPE_SND) {
|
if (msg.type != GNRC_NETAPI_MSG_TYPE_SND) {
|
||||||
@ -135,12 +160,14 @@ bool _check_packet(const ipv6_addr_t *src, const ipv6_addr_t *dst,
|
|||||||
return _res(pkt, false);
|
return _res(pkt, false);
|
||||||
}
|
}
|
||||||
ipv6_hdr = ipv6->data;
|
ipv6_hdr = ipv6->data;
|
||||||
|
nh = _final_nh(ipv6, ipv6_hdr->nh);
|
||||||
|
payload = _final_snip(ipv6)->next;
|
||||||
return _res(pkt, (memcmp(src, &ipv6_hdr->src, sizeof(ipv6_addr_t)) == 0) &&
|
return _res(pkt, (memcmp(src, &ipv6_hdr->src, sizeof(ipv6_addr_t)) == 0) &&
|
||||||
(memcmp(dst, &ipv6_hdr->dst, sizeof(ipv6_addr_t)) == 0) &&
|
(memcmp(dst, &ipv6_hdr->dst, sizeof(ipv6_addr_t)) == 0) &&
|
||||||
(ipv6_hdr->nh == proto) &&
|
(nh == proto) &&
|
||||||
(ipv6->next != NULL) &&
|
(payload != NULL) &&
|
||||||
(data_len == ipv6->next->size) &&
|
(data_len == payload->size) &&
|
||||||
(memcmp(data, ipv6->next->data, data_len) == 0));
|
(memcmp(data, payload->data, data_len) == 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
Loading…
Reference in New Issue
Block a user