-
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
sys/net/gnrc/neterr: use gnrc_tx_sync #15695
base: master
Are you sure you want to change the base?
Conversation
The new `gnrc_tx_sync` module allows users of the GNRC network stack to synchronize with the actual transmission of outgoing packets. This is directly integrated into gnrc_sock. Hence, if `gnrc_tx_sync` is used, calls to e.g. sock_udp_send() will block until the network stack has processed the message. Use cases: 1. Prevent packet drop when sending at high rate - If the application is sending faster than the stack can handle, the message queues will overflow and outgoing packets are lost 2. Passing auxiliary data about the transmission back the stack - When e.g. the number of required retransmissions, the transmission time stamp, etc. should be made available to a user of an UDP sock, a synchronization mechanism is needed 3. Simpler error reporting without footguns - The current approach of using `core/msg` for passing up error messages is difficult to use if other message come in. Currently, gnrc_sock is busy-waiting and fetching messages from the message queue until the number of expected status reports is received. It will enqueue all non-status-report messages again at the end of the queue. This has multiple issues: - Busy waiting is especially in lower power scenarios with time slotted MAC protocols harmful, as the CPU will remain active and consume power even though the it could sleep until the TX slot is reached - The status reports from the network stack are send to the user thread blocking. If the message queue of the user thread is full, the network stack would block until the user stack can fetch the messages. If another higher priority thread would start sending a message, it would busy wait for its status reports to completely come in. Hence, the first thread doesn't get CPU time to fetch messages and unblock the network stack. As a result, the system would lock up completely. - Just adding the error/status code to the gnrc_tx_sync_t would preallocate and reserve memory for the error reporting. That way gnrc_sock does not need to search through the message queue for status reports and the network stack does not need to block for the user thread fetching it.
Re-wired gnrc_neterr to use gnrc_tx_sync to transfer error/status codes back up the stack.
Needs rebase, now that #15694 is merged. |
Yep. But it also depends on a I'll give this a look right now and if this isn't too much effort, I can PR this today. Otherwise this will have to wait a bit for, as I have some other projects to currently attend to. |
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. If you want me to ignore this issue, please mark it with the "State: don't stale" label. Thank you for your contributions. |
I will revive this, hopefully soonish |
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. If you want me to ignore this issue, please mark it with the "State: don't stale" label. Thank you for your contributions. |
Contribution description
This PR rewires
gnrc_neterr
to build upon #15694. Citing from #15694 for motivating this change:Testing procedure
gnrc_sock
should still work withgnrc_neterr
usedtests/netdev_test
should still workexamples/gnrc_lorawan
should still workIssues/PRs references
Depends on and includes #15694