gnrc_networking example: add capability to send UDP packets repeatedly
This commit is contained in:
parent
14f3a11d33
commit
289d40d84e
@ -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) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user