Merge pull request #11401 from miri64/tests/enh/i11398-testcase

tests: provide test case for malformed IEEE 802.15.4 packets
This commit is contained in:
Martine Lenders 2019-09-26 16:55:55 +02:00 committed by GitHub
commit ac9e80cfd0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 124 additions and 0 deletions

View File

@ -0,0 +1,15 @@
BOARD_WHITELIST = native
include ../Makefile.tests_common
TERMFLAGS ?= -z "0.0.0.0:17755,localhost:17754"
USEMODULE += socket_zep
USEMODULE += auto_init_gnrc_netif
USEMODULE += gnrc
USEMODULE += gnrc_netif_ieee802154
USEMODULE += gnrc_pktdump
TEST_ON_CI_WHITELIST += native
include $(RIOTBASE)/Makefile.include

View File

@ -0,0 +1,11 @@
Tests for `gnrc_netif_ieee802154`
=================================
Motivation for this test was a reproducible test case for issue [#11398].
Just run `make all test` for `native` to do run it.
The test may be extended with other test cases for the `gnrc_netif_ieee802154`
module in the future.
[#11398]: https://github.com/RIOT-OS/RIOT/issues/11398

View File

@ -0,0 +1,38 @@
/*
* Copyright (C) 2019 Freie Universität Berlin
*
* 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.
*/
/**
* @{
*
* @file
* @author Martine Lenders <m.lenders@fu-berlin.de>
*/
#include "net/gnrc.h"
#include "net/gnrc/netif.h"
#include "net/gnrc/pktdump.h"
int main(void)
{
char addr_str[GNRC_NETIF_L2ADDR_MAXLEN * 3];
gnrc_netif_t *netif = gnrc_netif_iter(NULL);
printf("l2_addr: %s\n", gnrc_netif_addr_to_str(netif->l2addr,
netif->l2addr_len,
addr_str));
gnrc_netreg_entry_t dump = GNRC_NETREG_ENTRY_INIT_PID(
GNRC_NETREG_DEMUX_CTX_ALL,
gnrc_pktdump_pid
);
gnrc_netreg_register(GNRC_NETTYPE_UNDEF, &dump);
return 0;
}
/** @} */

View File

@ -0,0 +1,60 @@
#!/usr/bin/env python3
# Copyright (C) 2019 Freie Universität Berlin
#
# 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.
import sys
import socket
from testrunner import run
from pexpect import EOF, TIMEOUT
from scapy.all import ZEP2, Dot15d4Data, Dot15d4FCS, raw
ZEP_V2_VERSION = 2
ZEP_V2_TYPE_DATA = 1
def testfunc(child):
with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
s.bind(("", 17754))
child.expect("l2_addr: ([0-9A-F:]+)")
dst = int(child.match.group(1).replace(':', ''), base=16)
# first send valid packet to check if communication is set up correctly
# generated with udp send <link-local> 61616 0 in tests/gnrc_udp
payload = b"\x7e\x33\xf3\x00"
payload = (
Dot15d4FCS(fcf_srcaddrmode=2, fcf_panidcompress=True,
fcf_frametype="Data") /
Dot15d4Data(dest_addr=dst, dest_panid=0x23, src_addr=dst-1) /
payload
)
packet = raw(
ZEP2(ver=ZEP_V2_VERSION, type=ZEP_V2_TYPE_DATA, channel=26,
length=len(payload)) / payload
)
s.sendto(packet, ("localhost", 17755))
child.expect("PKTDUMP: data received:")
child.expect("00000000 7E 33 F3 00")
child.expect("~~ PKT - 2 snips, total size: 16 byte")
payload = (
Dot15d4FCS(fcf_srcaddrmode=2, fcf_panidcompress=True,
fcf_frametype="Data") /
# just append destination PAN ID and address
bytes([0x23, 0x00, dst & 0xff, dst >> 8])
)
packet = raw(
ZEP2(ver=ZEP_V2_VERSION, type=ZEP_V2_TYPE_DATA, channel=26,
length=len(payload)) / payload
)
s.sendto(packet, ("localhost", 17755))
res = child.expect([TIMEOUT, EOF, "PKTDUMP: data received:"])
# we actually want the timeout here. The application either
# receives a bogus packet or crashes in an error case case
assert res == 0
if __name__ == "__main__":
sys.exit(run(testfunc, timeout=1))