Merge pull request #5228 from OlegHahm/gnrc_ipv6_hdr_get

gnrc ipv6: convenient function to get the header
pr/spi.typo
Martine Lenders 7 years ago committed by GitHub
commit dd7fb1c63b

@ -134,6 +134,19 @@ kernel_pid_t gnrc_ipv6_init(void);
*/
void gnrc_ipv6_demux(kernel_pid_t iface, gnrc_pktsnip_t *current, gnrc_pktsnip_t *pkt, uint8_t nh);
/**
* @brief Get the IPv6 header from a given list of @ref gnrc_pktsnip_t
*
* This function may be used with e.g. a pointer to a (full) UDP datagram.
*
* @param[in] pkt The pointer to the first @ref gnrc_pktsnip_t of the
* packet.
*
* @return A pointer to the @ref ipv6_hdr_t of the packet.
* @return NULL if the packet does not contain an IPv6 header.
*/
ipv6_hdr_t *gnrc_ipv6_get_header(gnrc_pktsnip_t *pkt);
#ifdef __cplusplus
}
#endif

@ -196,6 +196,17 @@ void gnrc_ipv6_demux(kernel_pid_t iface, gnrc_pktsnip_t *current, gnrc_pktsnip_t
assert(false);
}
ipv6_hdr_t *gnrc_ipv6_get_header(gnrc_pktsnip_t *pkt)
{
ipv6_hdr_t *hdr = NULL;
gnrc_pktsnip_t *tmp = gnrc_pktsnip_search_type(pkt, GNRC_NETTYPE_IPV6);
if ((tmp) && ipv6_hdr_is(tmp->data)) {
hdr = ((ipv6_hdr_t*) tmp->data);
}
return hdr;
}
/* internal functions */
static void _dispatch_next_header(gnrc_pktsnip_t *current, gnrc_pktsnip_t *pkt,
uint8_t nh, bool interested)

@ -0,0 +1 @@
include $(RIOTBASE)/Makefile.base

@ -0,0 +1,153 @@
/*
* Copyright (C) 2016 INRIA
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @{
*
* @author Oliver Hahm <oliver.hahm@inria.fr>
* @file
*/
#include "embUnit.h"
#include "net/ipv6/addr.h"
#include "net/ipv6/hdr.h"
#include "net/gnrc/ipv6.h"
#include "net/gnrc/pktbuf.h"
#include "unittests-constants.h"
#include "tests-gnrc_ipv6.h"
#define DEFAULT_TEST_SRC { { \
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, \
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f \
} \
}
#define DEFAULT_TEST_DST { { \
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, \
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f \
} \
}
#define DEFAULT_TEST_V_TC_FL TEST_UINT32
#define DEFAULT_TEST_LEN TEST_UINT16
#define DEFAULT_TEST_NH TEST_UINT8
#define DEFAULT_TEST_HL TEST_UINT8
static gnrc_pktsnip_t *_pkt_w_ip_hdr, *_pkt_no_ip_hdr;
static void set_up(void)
{
ipv6_hdr_t ip = (ipv6_hdr_t) {
.v_tc_fl = byteorder_htonl(DEFAULT_TEST_V_TC_FL),
.len = byteorder_htons(DEFAULT_TEST_LEN),
.nh = DEFAULT_TEST_NH,
.hl = DEFAULT_TEST_HL,
.src = DEFAULT_TEST_SRC,
.dst = DEFAULT_TEST_DST
};
ipv6_hdr_set_version(&ip);
gnrc_pktbuf_init();
_pkt_w_ip_hdr = gnrc_pktbuf_add(NULL, NULL, 1, GNRC_NETTYPE_NETIF);
assert(_pkt_w_ip_hdr);
_pkt_w_ip_hdr = gnrc_pktbuf_add(_pkt_w_ip_hdr, &ip, sizeof(ipv6_hdr_t), GNRC_NETTYPE_IPV6);
assert(_pkt_w_ip_hdr);
_pkt_w_ip_hdr = gnrc_pktbuf_add(_pkt_w_ip_hdr, NULL, 1, GNRC_NETTYPE_UNDEF);
assert(_pkt_w_ip_hdr);
_pkt_no_ip_hdr = gnrc_pktbuf_add(NULL, NULL, 1, GNRC_NETTYPE_NETIF);
assert(_pkt_no_ip_hdr);
_pkt_no_ip_hdr = gnrc_pktbuf_add(_pkt_no_ip_hdr, NULL, 1, GNRC_NETTYPE_UNDEF);
assert(_pkt_no_ip_hdr);
}
static void tear_down(void)
{
gnrc_pktbuf_release(_pkt_w_ip_hdr->next->next);
gnrc_pktbuf_release(_pkt_no_ip_hdr->next);
}
static void test_gnrc_ipv6_get_header(void)
{
TEST_ASSERT_NOT_NULL(gnrc_ipv6_get_header(_pkt_w_ip_hdr));
}
static void test_gnrc_ipv6_get_header_no_header(void)
{
TEST_ASSERT_NULL(gnrc_ipv6_get_header(_pkt_no_ip_hdr));
}
static void test_gnrc_ipv6_get_header_check_version(void)
{
ipv6_hdr_t *hdr = gnrc_ipv6_get_header(_pkt_w_ip_hdr);
TEST_ASSERT(ipv6_hdr_get_version(hdr) == 0x06);
}
static void test_gnrc_ipv6_get_header_check_len(void)
{
ipv6_hdr_t *hdr = gnrc_ipv6_get_header(_pkt_w_ip_hdr);
TEST_ASSERT(byteorder_ntohs(hdr->len) == DEFAULT_TEST_LEN);
}
static void test_gnrc_ipv6_get_header_check_nh(void)
{
ipv6_hdr_t *hdr = gnrc_ipv6_get_header(_pkt_w_ip_hdr);
TEST_ASSERT(hdr->nh == DEFAULT_TEST_NH);
}
static void test_gnrc_ipv6_get_header_check_hl(void)
{
ipv6_hdr_t *hdr = gnrc_ipv6_get_header(_pkt_w_ip_hdr);
TEST_ASSERT(hdr->hl == DEFAULT_TEST_HL);
}
static void test_gnrc_ipv6_get_header_check_src(void)
{
ipv6_hdr_t *hdr = gnrc_ipv6_get_header(_pkt_w_ip_hdr);
ipv6_addr_t addr = DEFAULT_TEST_SRC;
TEST_ASSERT(ipv6_addr_equal(&(hdr->src), &addr));
}
static void test_gnrc_ipv6_get_header_check_dst(void)
{
ipv6_hdr_t *hdr = gnrc_ipv6_get_header(_pkt_w_ip_hdr);
ipv6_addr_t addr = DEFAULT_TEST_DST;
TEST_ASSERT(ipv6_addr_equal(&(hdr->dst), &addr));
}
Test *tests_gnrc_ipv6_tests(void)
{
EMB_UNIT_TESTFIXTURES(fixtures) {
new_TestFixture(test_gnrc_ipv6_get_header),
new_TestFixture(test_gnrc_ipv6_get_header_no_header),
new_TestFixture(test_gnrc_ipv6_get_header_check_version),
new_TestFixture(test_gnrc_ipv6_get_header_check_len),
new_TestFixture(test_gnrc_ipv6_get_header_check_nh),
new_TestFixture(test_gnrc_ipv6_get_header_check_hl),
new_TestFixture(test_gnrc_ipv6_get_header_check_src),
new_TestFixture(test_gnrc_ipv6_get_header_check_dst),
};
EMB_UNIT_TESTCALLER(gnrc_ipv6_tests, set_up, tear_down, fixtures);
return (Test *)&gnrc_ipv6_tests;
}
void tests_gnrc_ipv6(void)
{
TESTS_RUN(tests_gnrc_ipv6_tests());
}
/** @} */

@ -0,0 +1,37 @@
/*
* Copyright (C) 2016 INRIA
*
* This file is subject to the terms and conditions of the GNU Lesser
* General Public License v2.1. See the file LICENSE in the top level
* directory for more details.
*/
/**
* @addtogroup unittests
* @{
*
* @file
* @brief Unittests for the ``gnrc_ipv6`` module
*
* @author Oliver Hahm <oliver.hahm@inria.fr>
*/
#ifndef TESTS_GNRC_IPV6_H_
#define TESTS_GNRC_IPV6_H_
#include "embUnit.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief The entry point of this test suite.
*/
void tests_gnrc_ipv6(void);
#ifdef __cplusplus
}
#endif
#endif /* TESTS_GNRC_IPV6_H_ */
/** @} */
Loading…
Cancel
Save