netdev dummy test driver

Provides a test dummy for the netdev interface.

See the following simple packet traversal timer for an example. Note that this example assumes that the stack doesn’t require any option values from the device and that the stack doesn’t create packets on its own or looses packets (neither of those can be assumed for in-production stacks).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdint.h>

#include "mutex.h"
#include "net/af.h"
#include "net/conn/udp.h"
#include "net/ipv6/addr.h"
#include "net/netdev_test.h"
#include "xtimer.h"

#define PKT_NUMBER   (1000)

static netdev_test_t dev;
static uint32_t last_start;
static uint32_t sum = 0;
static mutex_t wait = MUTEX_INIT;

int _send_timer(netdev_t *dev, const iolist_t *iolist)
{
    (void)dev;
    (void)iolist;

    sum += (xtimer_now_usec() - last_start);
    mutex_unlock(&wait);
}

int main(void) {
    ipv6_addr_t dst = IPV6_ADDR_UNSPECIFIED;

    netdev_test_setup(&dev, NULL);
    dev->driver->init((netdev_t *)&dev)
    // initialize stack and connect `dev` to it
    // ...
    mutex_lock(&wait);
    for (int i = 0; i < PKT_NUMBER; i++) {
        last_start = xtimer_now_usec();
        conn_udp_sendto("abcd", sizeof("abcd"), NULL, 0, &dst, sizeof(dst),
                        AF_INET6, 0xcafe, 0xcafe);
        mutex_lock(&wait);
    }
    printf("Average send packet traversal time: %u\n", sum / PKT_NUMBER);
    mutex_unlock(&wait);
    return 0;
}

To provide options to the stack, the netdev_test.h::netdev_test_t::get_cbs for the specific options need to be set. To catch lost packets and additional sent by the stack the send handler needs to be adapted accordingly.

int(* netdev_test_send_cb_t()

Callback type to handle send command.

Parameters

dev:network device descriptor
iolist:io vector list to send

Return values

  • number of bytes sent
  • <= 0 on error
int(* netdev_test_recv_cb_t()

Callback type to handle receive command.

Parameters

dev:network device descriptor
buf:buffer to write into or NULL
len:maximum number of bytes to read
info:status information for the received packet. Might be of different type for different netdev devices. May be NULL if not needed or applicable

Return values

  • <=0 on error
  • number of bytes read if buf != NULL
  • currently received packet size if buf == NULL
int(* netdev_test_init_cb_t()

Callback type to handle device initialization.

Parameters

dev:network device descriptor

Return values

  • <= on error
  • 0 on success
void(* netdev_test_isr_cb_t()

Callback type to handle user-space ISR events.

Parameters

dev:network device descriptor

int(* netdev_test_get_cb_t()

Callback type to handle get commands.

Parameters

dev:network device descriptor
value:pointer to store the option’s value in
max_len:maximal amount of bytes that fit into value

Return values

  • number of bytes written to value
  • <0 on error
int(* netdev_test_set_cb_t()

Callback type to handle set commands.

Parameters

dev:network device descriptor
value:value to set
value_len:the length of value

Return values

  • number of bytes used from value
  • <0 on error
void netdev_test_set_send_cb(netdev_test_t * dev, netdev_test.h::netdev_test_send_cb_t send_cb)

override send callback

Parameters

dev:a netdev dummy test driver device
send_cb:a send callback

void netdev_test_set_recv_cb(netdev_test_t * dev, netdev_test.h::netdev_test_recv_cb_t recv_cb)

override receive callback

Parameters

dev:a netdev dummy test driver device
recv_cb:a receive callback

void netdev_test_set_init_cb(netdev_test_t * dev, netdev_test.h::netdev_test_init_cb_t init_cb)

override initialization callback

Parameters

dev:a netdev dummy test driver device
init_cb:an initialization callback

void netdev_test_set_isr_cb(netdev_test_t * dev, netdev_test.h::netdev_test_isr_cb_t isr_cb)

override ISR event handler callback

Parameters

dev:a netdev dummy test driver device
isr_cb:an ISR event handler callback

void netdev_test_set_get_cb(netdev_test_t * dev, netopt.h::netopt_t opt, netdev_test.h::netdev_test_get_cb_t get_cb)

override get callback for a certain option type

Parameters

dev:a netdev dummy test driver device
opt:an option type
get_cb:a get callback for opt

void netdev_test_set_set_cb(netdev_test_t * dev, netopt.h::netopt_t opt, netdev_test.h::netdev_test_set_cb_t set_cb)

override get callback for a certain option type

Parameters

dev:a netdev dummy test driver device
opt:an option type
set_cb:a set callback for opt

void netdev_test_setup(netdev_test_t * dev, void * state)

Setup a given netdev dummy test driver device.

Parameters

dev:a netdev dummy test driver device to initialize
state:external state for the device

void netdev_test_reset(netdev_test_t * dev)

Resets all callbacks for the device to NULL.

Parameters

dev:a netdev dummy test driver device to initialize

struct netdev_test_t

Device descriptor for netdev dummy test driver devices.

netdev.h::netdev_t netdev

netdev fields

superclass

netdev_test.h::netdev_test_send_cb_t send_cb

device specific fields

callback to handle send command

netdev_test.h::netdev_test_recv_cb_t recv_cb

callback to handle receive command

netdev_test.h::netdev_test_init_cb_t init_cb

callback to handle initialization events

netdev_test.h::netdev_test_isr_cb_t isr_cb

callback to handle ISR events

netdev_test.h::netdev_test_get_cb_t get_cbs()

callback to handle get command

netdev_test.h::netdev_test_set_cb_t set_cbs()

callback to handle set command

void * state

external state for the device

mutex_t mutex

mutex for the device