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 
190 #ifndef NET_NETDEV_H
191 #define NET_NETDEV_H
192 
193 #ifdef __cplusplus
194 extern "C" {
195 #endif
196 
197 #include <stdint.h>
198 #include <errno.h>
199 
200 #include "iolist.h"
201 #include "net/netopt.h"
202 #include "kernel_defines.h"
203 
204 #ifdef MODULE_L2FILTER
205 #include "net/l2filter.h"
206 #endif
207 
215 enum {
216  NETDEV_TYPE_UNKNOWN,
217  NETDEV_TYPE_TEST,
218  NETDEV_TYPE_RAW,
219  NETDEV_TYPE_ETHERNET,
220  NETDEV_TYPE_IEEE802154,
221  NETDEV_TYPE_BLE,
222  NETDEV_TYPE_CC110X,
223  NETDEV_TYPE_LORA,
224  NETDEV_TYPE_NRFMIN,
225  NETDEV_TYPE_NRF24L01P_NG,
226  NETDEV_TYPE_SLIP,
227  NETDEV_TYPE_ESP_NOW,
228 };
235 typedef enum {
241 #if IS_USED(MODULE_NETDEV_LEGACY_API) || DOXYGEN
265 #endif
273  /* expand this list if needed */
275 
282  int16_t rssi;
283  uint8_t lqi;
284 };
285 
289 typedef struct netdev netdev_t;
290 
298 
307 typedef enum {
309  NETDEV_AT86RF215,
310  NETDEV_AT86RF2XX,
311  NETDEV_CC2538,
312  NETDEV_DOSE,
313  NETDEV_ENC28J60,
314  NETDEV_KW41ZRF,
315  NETDEV_MRF24J40,
316  NETDEV_NRF802154,
317  NETDEV_STM32_ETH,
318  NETDEV_CC110X,
319  NETDEV_SX127X,
320  NETDEV_SAM0_ETH,
321  NETDEV_ESP_NOW,
322  NETDEV_NRF24L01P_NG,
323  NETDEV_SOCKET_ZEP,
324  NETDEV_SX126X,
325  NETDEV_SX1280,
326  NETDEV_CC2420,
327  NETDEV_ETHOS,
328  NETDEV_SLIPDEV,
329  NETDEV_TAP,
330  NETDEV_W5100,
331  NETDEV_ENCX24J600,
332  NETDEV_ATWINC15X0,
333  NETDEV_KW2XRF,
334  NETDEV_ESP_ETH,
335  NETDEV_ESP_WIFI,
336  NETDEV_CDC_ECM,
337  NETDEV_TINYUSB,
338  NETDEV_W5500,
339  /* add more if needed */
340 } netdev_type_t;
346 #define NETDEV_INDEX_ANY (0xFF)
347 
348 #if DOXYGEN
353 #define CONFIG_NETDEV_REGISTER_SIGNAL 0
354 #endif
355 
365 struct netdev {
366  const struct netdev_driver *driver;
368  void *context;
369 #ifdef MODULE_NETDEV_LAYER
370  netdev_t *lower;
371 #endif
372 #ifdef MODULE_L2FILTER
374 #endif
375 #ifdef MODULE_NETDEV_REGISTER
376  netdev_type_t type;
377  uint8_t index;
378 #endif
379 };
380 
394 void netdev_register_signal(struct netdev *dev, netdev_type_t type, uint8_t index);
395 
404 static inline void netdev_register(struct netdev *dev, netdev_type_t type, uint8_t index)
405 {
406 #ifdef MODULE_NETDEV_REGISTER
407  dev->type = type;
408  dev->index = index;
409 #else
410  (void)dev;
411  (void)type;
412  (void)index;
413 #endif
414 
416  netdev_register_signal(dev, type, index);
417  }
418 }
419 
426 typedef struct netdev_driver {
462  int (*send)(netdev_t *dev, const iolist_t *iolist);
463 
494  int (*confirm_send)(netdev_t *dev, void *info);
495 
531  int (*recv)(netdev_t *dev, void *buf, size_t len, void *info);
532 
543  int (*init)(netdev_t *dev);
544 
561  void (*isr)(netdev_t *dev);
562 
584  int (*get)(netdev_t *dev, netopt_t opt,
585  void *value, size_t max_len);
586 
610  int (*set)(netdev_t *dev, netopt_t opt,
611  const void *value, size_t value_len);
613 
624 static inline int netdev_get_notsup(netdev_t *dev, netopt_t opt,
625  void *value, size_t max_len)
626 {
627  (void)dev;
628  (void)opt;
629  (void)value;
630  (void)max_len;
631  return -ENOTSUP;
632 }
633 
644 static inline int netdev_set_notsup(netdev_t *dev, netopt_t opt,
645  const void *value, size_t value_len)
646 {
647  (void)dev;
648  (void)opt;
649  (void)value;
650  (void)value_len;
651  return -ENOTSUP;
652 }
653 
663 {
664  if (netdev->event_callback) {
666  }
667 }
668 #ifdef __cplusplus
669 }
670 #endif
671 
672 #endif /* NET_NETDEV_H */
#define ENOTSUP
Not supported (may be the same value as [EOPNOTSUPP]).
Definition: errno.h:130
static void netdev_trigger_event_isr(netdev_t *netdev)
Informs netdev there was an interrupt request from the network device.
Definition: netdev.h:662
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:624
#define CONFIG_NETDEV_REGISTER_SIGNAL
Call netdev_register_signal when the netdev device is registered.
Definition: netdev.h:353
static void netdev_register(struct netdev *dev, netdev_type_t type, uint8_t index)
Register a device with netdev.
Definition: netdev.h:404
netdev_type_t
Driver types for netdev.
Definition: netdev.h:307
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:297
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:644
netdev_event_t
Possible event types that are send from the device driver to the upper layer.
Definition: netdev.h:235
@ NETDEV_ANY
Will match any device type.
Definition: netdev.h:308
@ NETDEV_EVENT_TX_STARTED
started to transfer a frame
Definition: netdev.h:239
@ NETDEV_EVENT_ISR
driver needs it's ISR handled
Definition: netdev.h:236
@ NETDEV_EVENT_LINK_UP
link established
Definition: netdev.h:266
@ NETDEV_EVENT_TX_NOACK
ACK requested but not received.
Definition: netdev.h:257
@ NETDEV_EVENT_RX_COMPLETE
finished receiving a frame
Definition: netdev.h:238
@ NETDEV_EVENT_CRC_ERROR
wrong CRC
Definition: netdev.h:270
@ NETDEV_EVENT_TX_MEDIUM_BUSY
couldn't transfer frame
Definition: netdev.h:264
@ NETDEV_EVENT_TX_TIMEOUT
timeout when sending
Definition: netdev.h:268
@ NETDEV_EVENT_FHSS_CHANGE_CHANNEL
channel changed
Definition: netdev.h:271
@ NETDEV_EVENT_RX_STARTED
started to receive a frame
Definition: netdev.h:237
@ NETDEV_EVENT_TX_COMPLETE_DATA_PENDING
transfer frame complete and data pending flag
Definition: netdev.h:249
@ NETDEV_EVENT_TX_COMPLETE
transfer frame complete
Definition: netdev.h:240
@ NETDEV_EVENT_RX_TIMEOUT
timeout when receiving
Definition: netdev.h:269
@ NETDEV_EVENT_LINK_DOWN
link gone
Definition: netdev.h:267
@ NETDEV_EVENT_CAD_DONE
channel activity detection done
Definition: netdev.h:272
#define CONFIG_L2FILTER_LISTSIZE
Number of slots in each filter list (filter entries per device)
Definition: l2filter.h:60
netopt_t
Global list of configuration options available throughout the network stack, e.g.
Definition: netopt.h:45
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:60
Definition of global configuration options.
event structure
Definition: event.h:148
iolist structure definition
Definition: iolist.h:39
Filter list entries.
Definition: l2filter.h:71
Structure to hold driver interface -> function mapping.
Definition: netdev.h:426
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:584
int(* send)(netdev_t *dev, const iolist_t *iolist)
Start transmission of the given frame and return directly.
Definition: netdev.h:462
int(* confirm_send)(netdev_t *dev, void *info)
Fetch the status of a transmission and perform any potential cleanup.
Definition: netdev.h:494
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:610
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:531
int(* init)(netdev_t *dev)
the driver's initialization function
Definition: netdev.h:543
void(* isr)(netdev_t *dev)
a driver's user-space ISR handler
Definition: netdev.h:561
Received frame status information for most radios.
Definition: netdev.h:281
uint8_t lqi
LQI of a received frame.
Definition: netdev.h:283
int16_t rssi
RSSI of a received frame in dBm.
Definition: netdev.h:282
Structure to hold driver state.
Definition: netdev.h:365
const struct netdev_driver * driver
ptr to that driver's interface.
Definition: netdev.h:366
void * context
ptr to network stack context
Definition: netdev.h:368
netdev_event_cb_t event_callback
callback for device events
Definition: netdev.h:367