1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/tests/net/socket_zep/main.c

174 lines
4.6 KiB
C

/*
* Copyright (C) 2016 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.
*/
/**
* @ingroup tests
* @{
*
* @file
* @brief Test application for socket_zep network device driver
*
* @author Martine Lenders <m.lenders@fu-berlin.de>
*
* @}
*/
#include <errno.h>
#include <inttypes.h>
#include <stdio.h>
#include "byteorder.h"
#include "net/ieee802154.h"
#include "net/netdev/ieee802154_submac.h"
#include "sched.h"
#include "socket_zep.h"
#include "socket_zep_params.h"
#include "socket_zep_params.h"
#include "test_utils/expect.h"
#include "thread.h"
#include "msg.h"
#include "od.h"
#define MSG_QUEUE_SIZE (8)
#define MSG_TYPE_ISR (0x3456)
#define RECVBUF_SIZE (IEEE802154_FRAME_LEN_MAX)
static uint8_t _recvbuf[RECVBUF_SIZE];
static msg_t _msg_queue[MSG_QUEUE_SIZE];
static socket_zep_t _dev;
static netdev_ieee802154_submac_t _socket_zep_netdev;
static kernel_pid_t _main_pid;
static void _event_cb(netdev_t *dev, netdev_event_t event);
static void _print_info(netdev_t *netdev);
static void test_init(void)
{
const socket_zep_params_t *p = &socket_zep_params[0];
netdev_t *netdev = &_socket_zep_netdev.dev.netdev;
printf("Initializing socket ZEP with (local: [%s]:%s, remote: [%s]:%s)\n",
p->local_addr, p->local_port, p->remote_addr, p->remote_port);
netdev_register(&_socket_zep_netdev.dev.netdev, NETDEV_SOCKET_ZEP, 0);
netdev->event_callback = _event_cb;
netdev_ieee802154_submac_init(&_socket_zep_netdev);
socket_zep_hal_setup(&_dev, &_socket_zep_netdev.submac.dev);
socket_zep_setup(&_dev, p);
expect(netdev->driver->init(netdev) >= 0);
_print_info(netdev);
}
static void test_send__iolist_not_NULL(void)
{
iolist_t iolist[] = { { .iol_base = "Hello", .iol_len = sizeof("Hello") },
{ .iol_base = "World", .iol_len = sizeof("World") } };
iolist[0].iol_next = &iolist[1];
netdev_t *netdev = &_socket_zep_netdev.dev.netdev;
puts("Send 'Hello\\0World\\0'");
int res = netdev->driver->send(netdev, iolist);
expect((res < 0) || (res == 0));
if ((res < 0) && (errno == ECONNREFUSED)) {
puts("No remote socket exists (use scripts in `tests/` to have proper tests)");
}
}
static void test_recv(void)
{
puts("Waiting for an incoming message (use `make test`)");
while (1) {
netdev_t *netdev = &_socket_zep_netdev.dev.netdev;
msg_t msg;
msg_receive(&msg);
if (msg.type == MSG_TYPE_ISR) {
netdev->driver->isr(netdev);
}
else {
puts("unexpected message type");
}
}
}
int main(void)
{
puts("Socket ZEP device driver test");
msg_init_queue(_msg_queue, MSG_QUEUE_SIZE);
_main_pid = thread_getpid();
test_init();
test_send__iolist_not_NULL();
test_recv(); /* does not return */
puts("ALL TESTS SUCCESSFUL");
return 0;
}
static void _recv(netdev_t *dev)
{
netdev_ieee802154_rx_info_t rx_info;
const int exp_len = dev->driver->recv(dev, NULL, 0, NULL);
int data_len;
expect(exp_len >= 0);
expect(((unsigned)exp_len) <= sizeof(_recvbuf));
data_len = dev->driver->recv(dev, _recvbuf, exp_len, &rx_info);
if (data_len < 0) {
puts("Received invalid packet");
}
else {
expect(data_len <= exp_len);
printf("RSSI: %u, LQI: %u, Data:\n", rx_info.rssi, rx_info.lqi);
if (data_len > 0) {
od_hex_dump(_recvbuf, data_len, OD_WIDTH_DEFAULT);
}
}
}
static void _event_cb(netdev_t *dev, netdev_event_t event)
{
if (event == NETDEV_EVENT_ISR) {
msg_t msg;
msg.type = MSG_TYPE_ISR;
msg.content.ptr = dev;
if (msg_send(&msg, _main_pid) <= 0) {
puts("possibly lost interrupt.");
}
}
else {
switch (event) {
case NETDEV_EVENT_RX_COMPLETE:
{
_recv(dev);
break;
}
default:
break;
}
}
}
static void _print_info(netdev_t *netdev)
{
uint64_t long_addr;
uint16_t short_addr;
expect(netdev->driver->get(netdev, NETOPT_ADDRESS, &short_addr,
sizeof(short_addr)) == sizeof(uint16_t));
expect(netdev->driver->get(netdev, NETOPT_ADDRESS_LONG, &long_addr,
sizeof(long_addr)) == sizeof(uint64_t));
/* we are on native, so using PRIu* is okay */
printf("(Hwaddrs: %04" PRIx16 ", %016" PRIx64 ")\n",
byteorder_htons(short_addr).u16,
byteorder_htonll(long_addr).u64);
}