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 {
271  /* expand this list if needed */
273 
280  int16_t rssi;
281  uint8_t lqi;
282 };
283 
287 typedef struct netdev netdev_t;
288 
294 typedef void (*netdev_event_cb_t)(netdev_t *dev, netdev_event_t event);
295 
304 typedef enum {
306  NETDEV_AT86RF215,
307  NETDEV_AT86RF2XX,
308  NETDEV_CC2538,
309  NETDEV_DOSE,
310  NETDEV_ENC28J60,
311  NETDEV_KW41ZRF,
312  NETDEV_MRF24J40,
313  NETDEV_NRF802154,
314  NETDEV_STM32_ETH,
315  NETDEV_CC110X,
316  NETDEV_SX127X,
317  NETDEV_SAM0_ETH,
318  NETDEV_ESP_NOW,
319  NETDEV_NRF24L01P_NG,
320  NETDEV_SOCKET_ZEP,
321  NETDEV_SX126X,
322  NETDEV_CC2420,
323  /* add more if needed */
324 } netdev_type_t;
330 #define NETDEV_INDEX_ANY (0xFF)
331 
341 struct netdev {
342  const struct netdev_driver *driver;
344  void *context;
345 #ifdef MODULE_NETDEV_LAYER
346  netdev_t *lower;
347 #endif
348 #ifdef MODULE_L2FILTER
350 #endif
351 #ifdef MODULE_NETDEV_REGISTER
352  netdev_type_t type;
353  uint8_t index;
354 #endif
355 };
356 
365 static inline void netdev_register(struct netdev *dev, netdev_type_t type, uint8_t index)
366 {
367 #ifdef MODULE_NETDEV_REGISTER
368  dev->type = type;
369  dev->index = index;
370 #else
371  (void) dev;
372  (void) type;
373  (void) index;
374 #endif
375 }
376 
383 typedef struct netdev_driver {
413  int (*send)(netdev_t *dev, const iolist_t *iolist);
414 
443  int (*confirm_send)(netdev_t *dev, void *info);
444 
480  int (*recv)(netdev_t *dev, void *buf, size_t len, void *info);
481 
492  int (*init)(netdev_t *dev);
493 
510  void (*isr)(netdev_t *dev);
511 
533  int (*get)(netdev_t *dev, netopt_t opt,
534  void *value, size_t max_len);
535 
559  int (*set)(netdev_t *dev, netopt_t opt,
560  const void *value, size_t value_len);
562 
573 static inline int netdev_get_notsup(netdev_t *dev, netopt_t opt,
574  void *value, size_t max_len)
575 {
576  (void)dev;
577  (void)opt;
578  (void)value;
579  (void)max_len;
580  return -ENOTSUP;
581 }
582 
593 static inline int netdev_set_notsup(netdev_t *dev, netopt_t opt,
594  const void *value, size_t value_len)
595 {
596  (void)dev;
597  (void)opt;
598  (void)value;
599  (void)value_len;
600  return -ENOTSUP;
601 }
602 
612 {
613  if (netdev->event_callback) {
614  netdev->event_callback(netdev, NETDEV_EVENT_ISR);
615  }
616 }
617 #ifdef __cplusplus
618 }
619 #endif
620 
621 #endif /* NET_NETDEV_H */
622 
Structure to hold driver interface -> function mapping.
Definition: netdev.h:383
iolist scatter / gather IO
driver needs it&#39;s ISR handled
Definition: netdev.h:236
static ssize_t recv(int socket, void *buffer, size_t length, int flags)
Receive a message from a connected socket.
Definition: socket.h:379
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:573
Link layer address filter interface definition.
Will match any device type.
Definition: netdev.h:305
netdev_event_t
Possible event types that are send from the device driver to the upper layer.
Definition: netdev.h:235
event structure
Definition: event.h:147
#define CONFIG_L2FILTER_LISTSIZE
Number of slots in each filter list (filter entries per device)
Definition: l2filter.h:59
netdev_type_t
Driver types for netdev.
Definition: netdev.h:304
started to transfer a frame
Definition: netdev.h:239
Received frame status information for most radios.
Definition: netdev.h:279
void * context
ptr to network stack context
Definition: netdev.h:344
started to receive a frame
Definition: netdev.h:237
ACK requested but not received.
Definition: netdev.h:256
Filter list entries.
Definition: l2filter.h:70
static void netdev_register(struct netdev *dev, netdev_type_t type, uint8_t index)
Register a device with netdev.
Definition: netdev.h:365
netopt_t
Global list of configuration options available throughout the network stack, e.g. ...
Definition: netopt.h:50
void(* netdev_event_cb_t)(netdev_t *dev, netdev_event_t event)
Event callback for signaling event to upper layers.
Definition: netdev.h:294
#define ENOTSUP
Not supported (may be the same value as [EOPNOTSUPP]).
Definition: errno.h:130
channel activity detection done
Definition: netdev.h:270
static void netdev_trigger_event_isr(netdev_t *netdev)
Informs netdev there was an interrupt request from the network device.
Definition: netdev.h:611
Structure to hold driver state.
Definition: netdev.h:341
link established
Definition: netdev.h:264
timeout when sending
Definition: netdev.h:266
netdev_event_cb_t event_callback
callback for device events
Definition: netdev.h:343
Definition of global configuration options.
transfer frame complete and data pending flag
Definition: netdev.h:248
couldn&#39;t transfer frame
Definition: netdev.h:263
struct netdev_driver netdev_driver_t
Structure to hold driver interface -> function mapping.
static ssize_t send(int socket, const void *buffer, size_t length, int flags)
Send a message on a socket.
Definition: socket.h:449
Common macros and compiler attributes/pragmas configuration.
finished receiving a frame
Definition: netdev.h:238
uint8_t lqi
LQI of a received frame.
Definition: netdev.h:281
iolist structure definition
Definition: iolist.h:39
transfer frame complete
Definition: netdev.h:240
const struct netdev_driver * driver
ptr to that driver&#39;s interface.
Definition: netdev.h:342
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:593
timeout when receiving
Definition: netdev.h:267
int16_t rssi
RSSI of a received frame in dBm.
Definition: netdev.h:280