mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-12-24 22:13:52 +01:00
Merge pull request #12682 from miri64/gnrc_sock/fix/consider-all-snips-for-error
gnrc_sock: consider all pktsnip for gnrc_neterr reporting
This commit is contained in:
commit
918a4ac04d
@ -490,7 +490,7 @@ static void _send_unicast(gnrc_pktsnip_t *pkt, bool prep_hdr,
|
||||
if (gnrc_ipv6_nib_get_next_hop_l2addr(&ipv6_hdr->dst, netif, pkt,
|
||||
&nce) < 0) {
|
||||
/* packet is released by NIB */
|
||||
DEBUG("ipv6: no link-layer address or interface for next hop to %s",
|
||||
DEBUG("ipv6: no link-layer address or interface for next hop to %s\n",
|
||||
ipv6_addr_to_str(addr_str, &ipv6_hdr->dst, sizeof(addr_str)));
|
||||
return;
|
||||
}
|
||||
|
||||
@ -120,6 +120,9 @@ ssize_t gnrc_sock_send(gnrc_pktsnip_t *payload, sock_ip_ep_t *local,
|
||||
kernel_pid_t iface = KERNEL_PID_UNDEF;
|
||||
gnrc_nettype_t type;
|
||||
size_t payload_len = gnrc_pkt_len(payload);
|
||||
#ifdef MODULE_GNRC_NETERR
|
||||
unsigned status_subs = 0;
|
||||
#endif
|
||||
|
||||
if (local->family != remote->family) {
|
||||
gnrc_pktbuf_release(payload);
|
||||
@ -172,7 +175,14 @@ ssize_t gnrc_sock_send(gnrc_pktsnip_t *payload, sock_ip_ep_t *local,
|
||||
LL_PREPEND(pkt, netif);
|
||||
}
|
||||
#ifdef MODULE_GNRC_NETERR
|
||||
gnrc_neterr_reg(pkt); /* no error should occur since pkt was created here */
|
||||
/* cppcheck-suppress uninitvar
|
||||
* (reason: pkt is initialized in AF_INET6 case above, otherwise function
|
||||
* will return early) */
|
||||
for (gnrc_pktsnip_t *ptr = pkt; ptr != NULL; ptr = ptr->next) {
|
||||
/* no error should occur since pkt was created here */
|
||||
gnrc_neterr_reg(ptr);
|
||||
status_subs++;
|
||||
}
|
||||
#endif
|
||||
if (!gnrc_netapi_dispatch_send(type, GNRC_NETREG_DEMUX_CTX_ALL, pkt)) {
|
||||
/* this should not happen, but just in case */
|
||||
@ -180,17 +190,34 @@ ssize_t gnrc_sock_send(gnrc_pktsnip_t *payload, sock_ip_ep_t *local,
|
||||
return -EBADMSG;
|
||||
}
|
||||
#ifdef MODULE_GNRC_NETERR
|
||||
msg_t err_report;
|
||||
err_report.type = 0;
|
||||
uint32_t last_status = GNRC_NETERR_SUCCESS;
|
||||
|
||||
while (err_report.type != GNRC_NETERR_MSG_TYPE) {
|
||||
msg_try_receive(&err_report);
|
||||
if (err_report.type != GNRC_NETERR_MSG_TYPE) {
|
||||
msg_try_send(&err_report, sched_active_pid);
|
||||
while (status_subs--) {
|
||||
msg_t err_report;
|
||||
err_report.type = 0;
|
||||
|
||||
while (err_report.type != GNRC_NETERR_MSG_TYPE) {
|
||||
msg_try_receive(&err_report);
|
||||
if (err_report.type != GNRC_NETERR_MSG_TYPE) {
|
||||
msg_try_send(&err_report, sched_active_pid);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (err_report.content.value != GNRC_NETERR_SUCCESS) {
|
||||
return (int)(-err_report.content.value);
|
||||
if (err_report.content.value != last_status) {
|
||||
int res = (int)(-err_report.content.value);
|
||||
|
||||
for (unsigned i = 0; i < status_subs; i++) {
|
||||
err_report.type = 0;
|
||||
/* remove remaining status reports from queue */
|
||||
while (err_report.type != GNRC_NETERR_MSG_TYPE) {
|
||||
msg_try_receive(&err_report);
|
||||
if (err_report.type != GNRC_NETERR_MSG_TYPE) {
|
||||
msg_try_send(&err_report, sched_active_pid);
|
||||
}
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
last_status = err_report.content.value;
|
||||
}
|
||||
#endif
|
||||
return payload_len;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user