netdev.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2015 Kaspar Schleiser <kaspar@schleiser.de>
3  * 2015 Ell-i open source co-operative
4  * 2015-2017 Freie Universität Berlin
5  * 2014 Martine Lenders <mlenders@inf.fu-berlin.de>
6  *
7  * This file is subject to the terms and conditions of the GNU Lesser General
8  * Public License v2.1. See the file LICENSE in the top level directory for
9  * more details.
10  */
11 
12 #pragma once
13 
192 #ifdef __cplusplus
193 extern "C" {
194 #endif
195 
196 #include <stdint.h>
197 #include <errno.h>
198 
199 #include "iolist.h"
200 #include "net/netopt.h"
201 #include "kernel_defines.h"
202 
203 #ifdef MODULE_L2FILTER
204 #include "net/l2filter.h"
205 #endif
206 
214 enum {
215  NETDEV_TYPE_UNKNOWN,
216  NETDEV_TYPE_TEST,
217  NETDEV_TYPE_RAW,
218  NETDEV_TYPE_ETHERNET,
219  NETDEV_TYPE_IEEE802154,
220  NETDEV_TYPE_BLE,
221  NETDEV_TYPE_CC110X,
222  NETDEV_TYPE_LORA,
223  NETDEV_TYPE_NRFMIN,
224  NETDEV_TYPE_NRF24L01P_NG,
225  NETDEV_TYPE_SLIP,
226  NETDEV_TYPE_ESP_NOW,
227 };
234 typedef enum {
240 #if IS_USED(MODULE_NETDEV_LEGACY_API) || DOXYGEN
264 #endif
272  /* expand this list if needed */
274 
281  int16_t rssi;
282  uint8_t lqi;
283 };
284 
288 typedef struct netdev netdev_t;
289 
297 
306 typedef enum {
308  NETDEV_AT86RF215,
309  NETDEV_AT86RF2XX,
310  NETDEV_CC2538,
311  NETDEV_DOSE,
312  NETDEV_ENC28J60,
313  NETDEV_KW41ZRF,
314  NETDEV_MRF24J40,
315  NETDEV_NRF802154,
316  NETDEV_STM32_ETH,
317  NETDEV_CC110X,
318  NETDEV_SX127X,
319  NETDEV_SAM0_ETH,
320  NETDEV_ESP_NOW,
321  NETDEV_NRF24L01P_NG,
322  NETDEV_SOCKET_ZEP,
323  NETDEV_SX126X,
324  NETDEV_SX1280,
325  NETDEV_CC2420,
326  NETDEV_ETHOS,
327  NETDEV_SLIPDEV,
328  NETDEV_TAP,
329  NETDEV_W5100,
330  NETDEV_ENCX24J600,
331  NETDEV_ATWINC15X0,
332  NETDEV_KW2XRF,
333  NETDEV_ESP_ETH,
334  NETDEV_ESP_WIFI,
335  NETDEV_CDC_ECM,
336  NETDEV_TINYUSB,
337  NETDEV_W5500,
338  /* add more if needed */
339 } netdev_type_t;
345 #define NETDEV_INDEX_ANY (0xFF)
346 
347 #if DOXYGEN
352 #define CONFIG_NETDEV_REGISTER_SIGNAL 0
353 #endif
354 
364 struct netdev {
365  const struct netdev_driver *driver;
367  void *context;
368 #ifdef MODULE_NETDEV_LAYER
369  netdev_t *lower;
370 #endif
371 #ifdef MODULE_L2FILTER
373 #endif
374 #ifdef MODULE_NETDEV_REGISTER
375  netdev_type_t type;
376  uint8_t index;
377 #endif
378 };
379 
393 void netdev_register_signal(struct netdev *dev, netdev_type_t type, uint8_t index);
394 
403 static inline void netdev_register(struct netdev *dev, netdev_type_t type, uint8_t index)
404 {
405 #ifdef MODULE_NETDEV_REGISTER
406  dev->type = type;
407  dev->index = index;
408 #else
409  (void)dev;
410  (void)type;
411  (void)index;
412 #endif
413 
415  netdev_register_signal(dev, type, index);
416  }
417 }
418 
425 typedef struct netdev_driver {
461  int (*send)(netdev_t *dev, const iolist_t *iolist);
462 
493  int (*confirm_send)(netdev_t *dev, void *info);
494 
530  int (*recv)(netdev_t *dev, void *buf, size_t len, void *info);
531 
542  int (*init)(netdev_t *dev);
543 
560  void (*isr)(netdev_t *dev);
561 
583  int (*get)(netdev_t *dev, netopt_t opt,
584  void *value, size_t max_len);
585 
609  int (*set)(netdev_t *dev, netopt_t opt,
610  const void *value, size_t value_len);
612 
623 static inline int netdev_get_notsup(netdev_t *dev, netopt_t opt,
624  void *value, size_t max_len)
625 {
626  (void)dev;
627  (void)opt;
628  (void)value;
629  (void)max_len;
630  return -ENOTSUP;
631 }
632 
643 static inline int netdev_set_notsup(netdev_t *dev, netopt_t opt,
644  const void *value, size_t value_len)
645 {
646  (void)dev;
647  (void)opt;
648  (void)value;
649  (void)value_len;
650  return -ENOTSUP;
651 }
652 
662 {
663  if (netdev->event_callback) {
665  }
666 }
667 #ifdef __cplusplus
668 }
669 #endif
670 
#define ENOTSUP
Not supported (may be the same value as [EOPNOTSUPP]).
Definition: errno.h:129
static void netdev_trigger_event_isr(netdev_t *netdev)
Informs netdev there was an interrupt request from the network device.
Definition: netdev.h:661
void netdev_register_signal(struct netdev *dev, netdev_type_t type, uint8_t index)
Signal that the netdev_register function registered the device.
static int netdev_get_notsup(netdev_t *dev, netopt_t opt, void *value, size_t max_len)
Convenience function for declaring get() as not supported in general.
Definition: netdev.h:623
#define CONFIG_NETDEV_REGISTER_SIGNAL
Call netdev_register_signal when the netdev device is registered.
Definition: netdev.h:352
static void netdev_register(struct netdev *dev, netdev_type_t type, uint8_t index)
Register a device with netdev.
Definition: netdev.h:403
netdev_type_t
Driver types for netdev.
Definition: netdev.h:306
struct netdev_driver netdev_driver_t
Structure to hold driver interface -> function mapping.
void(* netdev_event_cb_t)(netdev_t *dev, netdev_event_t event)
Event callback for signaling event to upper layers.
Definition: netdev.h:296
static int netdev_set_notsup(netdev_t *dev, netopt_t opt, const void *value, size_t value_len)
Convenience function for declaring set() as not supported in general.
Definition: netdev.h:643
netdev_event_t
Possible event types that are send from the device driver to the upper layer.
Definition: netdev.h:234
@ NETDEV_ANY
Will match any device type.
Definition: netdev.h:307
@ NETDEV_EVENT_TX_STARTED
started to transfer a frame
Definition: netdev.h:238
@ NETDEV_EVENT_ISR
driver needs it's ISR handled
Definition: netdev.h:235
@ NETDEV_EVENT_LINK_UP
link established
Definition: netdev.h:265
@ NETDEV_EVENT_TX_NOACK
ACK requested but not received.
Definition: netdev.h:256
@ NETDEV_EVENT_RX_COMPLETE
finished receiving a frame
Definition: netdev.h:237
@ NETDEV_EVENT_CRC_ERROR
wrong CRC
Definition: netdev.h:269
@ NETDEV_EVENT_TX_MEDIUM_BUSY
couldn't transfer frame
Definition: netdev.h:263
@ NETDEV_EVENT_TX_TIMEOUT
timeout when sending
Definition: netdev.h:267
@ NETDEV_EVENT_FHSS_CHANGE_CHANNEL
channel changed
Definition: netdev.h:270
@ NETDEV_EVENT_RX_STARTED
started to receive a frame
Definition: netdev.h:236
@ NETDEV_EVENT_TX_COMPLETE_DATA_PENDING
transfer frame complete and data pending flag
Definition: netdev.h:248
@ NETDEV_EVENT_TX_COMPLETE
transfer frame complete
Definition: netdev.h:239
@ NETDEV_EVENT_RX_TIMEOUT
timeout when receiving
Definition: netdev.h:268
@ NETDEV_EVENT_LINK_DOWN
link gone
Definition: netdev.h:266
@ NETDEV_EVENT_CAD_DONE
channel activity detection done
Definition: netdev.h:271
#define CONFIG_L2FILTER_LISTSIZE
Number of slots in each filter list (filter entries per device)
Definition: l2filter.h:59
netopt_t
Global list of configuration options available throughout the network stack, e.g.
Definition: netopt.h:44
iolist scatter / gather IO
Common macros and compiler attributes/pragmas configuration.
Link layer address filter interface definition.
#define IS_ACTIVE(macro)
Allows to verify a macro definition outside the preprocessor.
Definition: modules.h:59
Definition of global configuration options.
event structure
Definition: event.h:145
iolist structure definition
Definition: iolist.h:38
Filter list entries.
Definition: l2filter.h:70
Structure to hold driver interface -> function mapping.
Definition: netdev.h:425
int(* get)(netdev_t *dev, netopt_t opt, void *value, size_t max_len)
Get an option value from a given network device.
Definition: netdev.h:583
int(* send)(netdev_t *dev, const iolist_t *iolist)
Start transmission of the given frame and return directly.
Definition: netdev.h:461
int(* confirm_send)(netdev_t *dev, void *info)
Fetch the status of a transmission and perform any potential cleanup.
Definition: netdev.h:493
int(* set)(netdev_t *dev, netopt_t opt, const void *value, size_t value_len)
Set an option value for a given network device.
Definition: netdev.h:609
int(* recv)(netdev_t *dev, void *buf, size_t len, void *info)
Drop a received frame, OR get the length of a received frame, OR get a received frame.
Definition: netdev.h:530
int(* init)(netdev_t *dev)
the driver's initialization function
Definition: netdev.h:542
void(* isr)(netdev_t *dev)
a driver's user-space ISR handler
Definition: netdev.h:560
Received frame status information for most radios.
Definition: netdev.h:280
uint8_t lqi
LQI of a received frame.
Definition: netdev.h:282
int16_t rssi
RSSI of a received frame in dBm.
Definition: netdev.h:281
Structure to hold driver state.
Definition: netdev.h:364
const struct netdev_driver * driver
ptr to that driver's interface.
Definition: netdev.h:365
void * context
ptr to network stack context
Definition: netdev.h:367
netdev_event_cb_t event_callback
callback for device events
Definition: netdev.h:366