-
Notifications
You must be signed in to change notification settings - Fork 2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
RFC: lower network stack rework #12688
Comments
@RIOT-OS/maintainers there have been some offline conversation with some maintainers (@haukepetersen, @bergzand, @kaspar030, @miri64, @leandrolanzieri, @PeterKietzmann). Unfortunately we didn't have time to discuss this during the RIOT summit, so I open this issue for syncing. All kind of feedback on the fundamentals or roadmap is more than welcome! |
Also related to this: #12469 |
@maribu added to the road map |
I thought we figured last week, that this makes things more complicated than it need be… |
What I meant with that was: make the MAC layer component independent of GNRC |
@miri64 rephrased :) |
#12128 would probably benefit from this as well. |
I renamed it to "lower network stack" rework, since the network interface are only one of the components involved |
I would like to share some thoughts about the "Write network stack independent network interfaces" part: After some time, I think it's different to distinguish these 2 elements:
For 1., it's clear that the representation of a network interface should be agnostic to the network stack (e.g running However, 2. doesn't necessarily need a unique entry point (e.g
And last but not least, solving the Any comments? |
To make this easier to follow, I will split this rework in 2 independent reworks:
|
Description
I'm opening this issue to synchronize and keep track of the netif rework.
Motivation and related issues
Mixed transceiver, PHY and MAC logic in netdev implementations and hardware
From the documentation, netdev acts as an interface to "provide a uniform API for network stacks to interacts with network device drivers".
In practice, the network stack interacts with an interface (e.g
gnrc_netif
) and then there's mixed transceiver, PHY and MAC layer logic.Some consequences of this:
RIOT/cpu/esp32/esp-wifi/esp_wifi_netdev.c
Line 169 in 03c467a
In this case, the device driver already calls a function with the packet. In order to pass it to the network stack, it's necessary to generate a fake ISR event and an extra copy.
at86rf2xx
radios go back to theidle_state
after sending. This behavior is not valid e.g in TSCHRelated work:
#7736
There is one thread per (gnrc_)netif
It's needed to allocate one
gnrc_netif_t
thread per network interface. Besides allocating more resources than needed, this is sometimes problematic for platforms that have several transceivers.See #10496
Netif relays on IPC messages for handling ISR events, send and receive.
Related work:
#9326
Network stacks don't share initialization logic, ISR processing and network interfaces
Each stack needs to handle radio events, auto_init logic and MAC layers.
Some consequences of this:
at86rf2xx
in OpenThread. It's similar in LWIP.Outcome
Separate transceiver, PHY and MAC logic
If we can provide interfaces between this components we could benefit of:
For IEEE802.15.4, the PHY layer can be implemented as a SubMAC layer (see #13376 ) in order to take advantage of the interface of most device drivers (MAC hw accelerations already included in the device).
Move auto-initialization and transceiver ISR logic out of the network interface
Moving the initialization and transceiver ISR logic out of the interface allows as to reuse code and immediately extend the support for more radios in LWIP, OpenThread, etc.
With this we could e.g get rid of these lines since the device initialization doesn't depend of the stack.
Remove the need of allocating one thread per interface
Interfaces can be represented with pointers. All events can be handled by only one thread or OS mechanism (e.g see #12474).
Improve support of software MAC layers
We shouldn't worry if a radio doesn't support Auto-ACK, retransmissions, etc. Also, we could have more powerful MAC layers (IEEE802.15.4 with security, pan coordinators, etc).
Write network stack independent network interfaces (see #12688 (comment))
This means the network interface is handled by the OS and not by the network stack. Network stacks can then reuse link layer logic (MAC, upper PHY). With this we can have a more uniform experience between different network stacks.
Proposed roadmap
This whole rework can be done in the following phases
1. Improve Link Layer support
2. Add required interfaces PHY and HAL interfaces
netdev_driver_t
API #12469)TBD
3. Rework and extend the
netif
API (TO BE REVISED, see #12688 (comment))This step is required in order to provide a network stack independent netif.
netif_t
a pointer instead of a stack defined type (netif: introduce generic network interface descriptor #11879)netif
API to add send/recv operations (analog tosock
, but intended to be used from network stacks or applications that send data via an interface)gnrc_netif
tonetif
gnrc_pktbuf
dependencies ingnrc_netif_xxx
functions)gnrc_netif
events to external event handlers + callbacks.gnrc_netif_ops_t
ops intonetif_ops_t
I will open a Github project to be able synchronize better.
Useful links
#11483
#11879
#11473
This is intended to be addressed to: #4876
The text was updated successfully, but these errors were encountered: