From f6bca70d1129bed95b198593bf83f248ff132205 Mon Sep 17 00:00:00 2001 From: Marian Buschsieweke Date: Wed, 29 Jul 2020 10:56:07 +0200 Subject: [PATCH] sys/net/gnrc/netif/ethernet: Support RX timestamp --- drivers/include/net/netdev/eth.h | 19 +++++++++++++++++++ .../gnrc/netif/ethernet/gnrc_netif_ethernet.c | 9 +++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/drivers/include/net/netdev/eth.h b/drivers/include/net/netdev/eth.h index 318a1897f5..7b57fa7b7e 100644 --- a/drivers/include/net/netdev/eth.h +++ b/drivers/include/net/netdev/eth.h @@ -29,6 +29,25 @@ extern "C" { #endif +/** + * @name Flags for use in @ref netdev_eth_rx_info_t::flags + * @{ + */ +#define NETDEV_ETH_RX_INFO_FLAG_TIMESTAMP (0x01) /**< Timestamp valid */ +/** @} */ + +/** + * @brief Received frame status information for Ethernet devices + */ +typedef struct { + /** + * @brief Time of the reception of the start of frame delimiter in + * nanoseconds since epoch + */ + uint64_t timestamp; + uint8_t flags; /**< Flags e.g. used to mark other fields as valid */ +} netdev_eth_rx_info_t; + /** * @brief Fallback function for netdev ethernet devices' _get function * diff --git a/sys/net/gnrc/netif/ethernet/gnrc_netif_ethernet.c b/sys/net/gnrc/netif/ethernet/gnrc_netif_ethernet.c index 2a629852ea..bc159a8549 100644 --- a/sys/net/gnrc/netif/ethernet/gnrc_netif_ethernet.c +++ b/sys/net/gnrc/netif/ethernet/gnrc_netif_ethernet.c @@ -21,6 +21,7 @@ #include "net/ethernet/hdr.h" #include "net/gnrc.h" #include "net/gnrc/netif/ethernet.h" +#include "net/netdev/eth.h" #ifdef MODULE_GNRC_IPV6 #include "net/ipv6/hdr.h" #endif @@ -169,8 +170,9 @@ static int _send(gnrc_netif_t *netif, gnrc_pktsnip_t *pkt) static gnrc_pktsnip_t *_recv(gnrc_netif_t *netif) { netdev_t *dev = netif->dev; - int bytes_expected = dev->driver->recv(dev, NULL, 0, NULL); gnrc_pktsnip_t *pkt = NULL; + netdev_eth_rx_info_t rx_info = { .flags = 0 }; + int bytes_expected = dev->driver->recv(dev, NULL, 0, NULL); if (bytes_expected > 0) { pkt = gnrc_pktbuf_add(NULL, NULL, @@ -186,7 +188,7 @@ static gnrc_pktsnip_t *_recv(gnrc_netif_t *netif) goto out; } - int nread = dev->driver->recv(dev, pkt->data, bytes_expected, NULL); + int nread = dev->driver->recv(dev, pkt->data, bytes_expected, &rx_info); if (nread <= 0) { DEBUG("gnrc_netif_ethernet: read error.\n"); goto safe_out; @@ -245,6 +247,9 @@ static gnrc_pktsnip_t *_recv(gnrc_netif_t *netif) gnrc_netif_hdr_set_src_addr(netif_hdr->data, hdr->src, ETHERNET_ADDR_LEN); gnrc_netif_hdr_set_dst_addr(netif_hdr->data, hdr->dst, ETHERNET_ADDR_LEN); gnrc_netif_hdr_set_netif(netif_hdr->data, netif); + if (rx_info.flags & NETDEV_ETH_RX_INFO_FLAG_TIMESTAMP) { + gnrc_netif_hdr_set_timestamp(netif_hdr->data, rx_info.timestamp); + } gnrc_pktbuf_remove_snip(pkt, eth_hdr); pkt = gnrc_pkt_append(pkt, netif_hdr);