mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-01-18 12:52:44 +01:00
cc95939050
Since some layers need to get options from their neighboring layers the previous behavior is potentially stack breaking when testing with this module since no reply is given to this requests, reply blocking the requesting thread in the process.
151 lines
3.5 KiB
C
151 lines
3.5 KiB
C
/*
|
|
* Copyright (C) 2015 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 net_pktdump
|
|
* @{
|
|
*
|
|
* @file
|
|
* @brief Generic module to dump packages received via netapi to STDOUT
|
|
*
|
|
* @author Hauke Petersen <hauke.petersen@fu-berlin.de>
|
|
*
|
|
* @}
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
|
|
#include "thread.h"
|
|
#include "msg.h"
|
|
#include "kernel.h"
|
|
#include "net/ng_pktdump.h"
|
|
#include "net/ng_netbase.h"
|
|
|
|
/**
|
|
* @brief PID of the pktdump thread
|
|
*/
|
|
static kernel_pid_t _pid = KERNEL_PID_UNDEF;
|
|
|
|
/**
|
|
* @brief Stack for the pktdump thread
|
|
*/
|
|
static char _stack[NG_PKTDUMP_STACKSIZE];
|
|
|
|
static void _dump_type(ng_nettype_t type)
|
|
{
|
|
switch (type) {
|
|
case NG_NETTYPE_UNDEF:
|
|
printf("NETTYPE_UNDEF (%i)", type);
|
|
break;
|
|
|
|
#ifdef MODULE_NG_SIXLOWPAN
|
|
case NG_NETTYPE_SIXLOWPAN:
|
|
printf("NETTYPE_SIXLOPAN (%i)", type);
|
|
break;
|
|
#endif
|
|
#ifdef MODULE_NG_IPV6
|
|
case NG_NETTYPE_IPV6:
|
|
printf("NETTYPE_IPV6 (%i)", type);
|
|
break;
|
|
#endif
|
|
#ifdef MODULE_NG_ICMPV6
|
|
case NG_NETTYPE_ICMPV6:
|
|
printf("NETTYPE_ICMPV6 (%i)", type);
|
|
break;
|
|
#endif
|
|
#ifdef MODULE_NG_TCP
|
|
case NG_NETTYPE_TCP:
|
|
printf("NETTYPE_TCP (%i)", type);
|
|
break;
|
|
#endif
|
|
#ifdef MODULE_NG_UDP
|
|
case NG_NETTYPE_UDP:
|
|
printf("NETTYPE_UDP (%i)", type);
|
|
break;
|
|
#endif
|
|
#ifdef TEST_SUITES
|
|
case NG_NETTYPE_TEST:
|
|
printf("NETTYPE_TEST (%i)", type);
|
|
break;
|
|
#endif
|
|
default:
|
|
printf("NETTYPE_UNKNOWN (%i)", type);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void _dump(ng_pktsnip_t *pkt)
|
|
{
|
|
int snips = 0;
|
|
int size = 0;
|
|
ng_pktsnip_t *snip = pkt;
|
|
|
|
while (snip != NULL) {
|
|
printf("~~ SNIP %2i - size: %3i byte, type: ", snips, snip->size);
|
|
_dump_type(snip->type);
|
|
puts("");
|
|
++snips;
|
|
size += snip->size;
|
|
snip = snip->next;
|
|
}
|
|
printf("~~ PKT - %2i snips, total size: %3i byte\n", snips, size);
|
|
ng_pktbuf_release(pkt);
|
|
}
|
|
|
|
static void *_eventloop(void *arg)
|
|
{
|
|
(void)arg;
|
|
msg_t msg, reply;
|
|
msg_t msg_queue[NG_PKTDUMP_MSG_QUEUE_SIZE];
|
|
|
|
/* setup the message queue */
|
|
msg_init_queue(msg_queue, NG_PKTDUMP_MSG_QUEUE_SIZE);
|
|
|
|
reply.content.value = (uint32_t)(-ENOTSUP);
|
|
reply.type = NG_NETAPI_MSG_TYPE_ACK;
|
|
|
|
while (1) {
|
|
msg_receive(&msg);
|
|
|
|
switch (msg.type) {
|
|
case NG_NETAPI_MSG_TYPE_RCV:
|
|
puts("PKTDUMP: data received:");
|
|
_dump((ng_pktsnip_t *)msg.content.ptr);
|
|
break;
|
|
case NG_NETAPI_MSG_TYPE_SND:
|
|
puts("PKTDUMP: data to send:");
|
|
_dump((ng_pktsnip_t *)msg.content.ptr);
|
|
break;
|
|
case NG_NETAPI_MSG_TYPE_GET:
|
|
case NG_NETAPI_MSG_TYPE_SET:
|
|
msg_reply(&msg, &reply);
|
|
break;
|
|
default:
|
|
puts("PKTDUMP: received something unexpected");
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* never reached */
|
|
return NULL;
|
|
}
|
|
|
|
kernel_pid_t ng_pktdump_getpid(void)
|
|
{
|
|
return _pid;
|
|
}
|
|
|
|
kernel_pid_t ng_pktdump_init(void)
|
|
{
|
|
if (_pid == KERNEL_PID_UNDEF) {
|
|
_pid = thread_create(_stack, sizeof(_stack), NG_PKTDUMP_PRIO,
|
|
CREATE_STACKTEST, _eventloop, NULL, "pktdump");
|
|
}
|
|
return _pid;
|
|
}
|