1
0
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:
Martine Lenders 2019-11-12 11:45:50 +01:00 committed by GitHub
commit 918a4ac04d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 11 deletions

View File

@ -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;
}

View File

@ -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;