gnrc_networking example: add capability to send UDP packets repeatedly

This commit is contained in:
Martine Lenders 2015-07-27 12:32:13 +02:00
parent 14f3a11d33
commit 289d40d84e

View File

@ -26,18 +26,18 @@
#include "net/gnrc/ipv6.h" #include "net/gnrc/ipv6.h"
#include "net/gnrc/udp.h" #include "net/gnrc/udp.h"
#include "net/gnrc/pktdump.h" #include "net/gnrc/pktdump.h"
#include "timex.h"
#include "vtimer.h"
static gnrc_netreg_entry_t server = {NULL, GNRC_NETREG_DEMUX_CTX_ALL, static gnrc_netreg_entry_t server = { NULL, GNRC_NETREG_DEMUX_CTX_ALL, KERNEL_PID_UNDEF };
KERNEL_PID_UNDEF};
static void send(char *addr_str, char *port_str, char *data) static void send(char *addr_str, char *port_str, char *data, unsigned int num,
unsigned int delay)
{ {
uint8_t port[2]; uint8_t port[2];
uint16_t tmp; uint16_t tmp;
gnrc_pktsnip_t *payload, *udp, *ip;
ipv6_addr_t addr; ipv6_addr_t addr;
gnrc_netreg_entry_t *sendto;
/* parse destination address */ /* parse destination address */
if (ipv6_addr_from_str(&addr, addr_str) == NULL) { if (ipv6_addr_from_str(&addr, addr_str) == NULL) {
@ -53,6 +53,8 @@ static void send(char *addr_str, char *port_str, char *data)
port[0] = (uint8_t)tmp; port[0] = (uint8_t)tmp;
port[1] = tmp >> 8; port[1] = tmp >> 8;
for (unsigned int i = 0; i < num; i++) {
gnrc_pktsnip_t *payload, *udp, *ip;
/* allocate payload */ /* allocate payload */
payload = gnrc_pktbuf_add(NULL, data, strlen(data), GNRC_NETTYPE_UNDEF); payload = gnrc_pktbuf_add(NULL, data, strlen(data), GNRC_NETTYPE_UNDEF);
if (payload == NULL) { if (payload == NULL) {
@ -74,19 +76,15 @@ static void send(char *addr_str, char *port_str, char *data)
return; return;
} }
/* send packet */ /* send packet */
sendto = gnrc_netreg_lookup(GNRC_NETTYPE_UDP, GNRC_NETREG_DEMUX_CTX_ALL); if (!gnrc_netapi_dispatch_send(GNRC_NETTYPE_UDP, GNRC_NETREG_DEMUX_CTX_ALL, ip)) {
if (sendto == NULL) {
puts("Error: unable to locate UDP thread"); puts("Error: unable to locate UDP thread");
gnrc_pktbuf_release(ip); gnrc_pktbuf_release(ip);
return; return;
} }
gnrc_pktbuf_hold(ip, gnrc_netreg_num(GNRC_NETTYPE_UDP, printf("Success: send %u byte to %s:%u\n", (unsigned)payload->size,
GNRC_NETREG_DEMUX_CTX_ALL) - 1); addr_str, tmp);
while (sendto != NULL) { vtimer_usleep(delay);
gnrc_netapi_send(sendto->pid, ip);
sendto = gnrc_netreg_getnext(sendto);
} }
printf("Success: send %i byte to %s:%u\n", payload->size, addr_str, tmp);
} }
static void start_server(char *port_str) static void start_server(char *port_str)
@ -133,11 +131,20 @@ int udp_cmd(int argc, char **argv)
} }
if (strcmp(argv[1], "send") == 0) { if (strcmp(argv[1], "send") == 0) {
uint32_t num = 1;
uint32_t delay = 1000000;
if (argc < 5) { if (argc < 5) {
printf("usage: %s send <addr> <port> <data>\n", argv[0]); printf("usage: %s send <addr> <port> <data> [<num> [<delay in us>]]\n",
argv[0]);
return 1; return 1;
} }
send(argv[2], argv[3], argv[4]); if (argc > 5) {
num = (uint32_t)atoi(argv[5]);
}
if (argc > 6) {
delay = (uint32_t)atoi(argv[6]);
}
send(argv[2], argv[3], argv[4], num, delay);
} }
else if (strcmp(argv[1], "server") == 0) { else if (strcmp(argv[1], "server") == 0) {
if (argc < 3) { if (argc < 3) {