1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
19836: sys/net/sock: add sock_aux_ttl r=maribu a=benpicco



Co-authored-by: Benjamin Valentin <benjamin.valentin@ml-pa.com>
This commit is contained in:
bors[bot] 2023-07-18 15:35:24 +00:00 committed by GitHub
commit b39d3a44d4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 46 additions and 1 deletions

View File

@ -513,6 +513,7 @@ PSEUDOMODULES += sock_async
PSEUDOMODULES += sock_aux_local
PSEUDOMODULES += sock_aux_rssi
PSEUDOMODULES += sock_aux_timestamp
PSEUDOMODULES += sock_aux_ttl
PSEUDOMODULES += sock_dtls
PSEUDOMODULES += sock_ip
PSEUDOMODULES += sock_tcp

View File

@ -319,6 +319,21 @@ enum {
* @ref sock_dtls_aux_tx_t::local.
*/
SOCK_AUX_SET_LOCAL = (1LU << 3),
/**
* @brief Flag to request the TTL value of received frame
*
* @note Select module `sock_aux_ttl` and a compatible network stack to
* use this
*
* Set this flag in the auxiliary data structure prior to the call of
* @ref sock_udp_recv_aux / @ref sock_ip_recv_aux / etc. to request the
* TTL value of a received frame. This flag will be cleared if the
* time to live was stored, otherwise it remains set.
*
* Depending on the family of the socket, the TTL value will be stored in
* @ref sock_udp_aux_rx_t::ttl or @ref sock_dtls_aux_rx_t::ttl.
*/
SOCK_AUX_GET_TTL = (1LU << 4),
};
/**

View File

@ -332,6 +332,14 @@ typedef struct {
*/
int16_t rssi;
#endif /* MODULE_SOCK_AUX_RSSI */
#if defined(MODULE_SOCK_AUX_TTL) || defined(DOXYGEN)
/**
* @brief TTL value of the received frame
*
* @see SOCK_AUX_GET_TTL
*/
uint8_t ttl;
#endif /* MODULE_SOCK_AUX_TTL */
sock_aux_flags_t flags; /**< Flags used request information */
} sock_udp_aux_rx_t;

View File

@ -305,6 +305,16 @@ ssize_t sock_udp_recv_buf_aux(sock_udp_t *sock, void **data, void **buf_ctx,
if ((aux != NULL) && (_aux.flags & GNRC_SOCK_RECV_AUX_FLAG_RSSI)) {
aux->flags &= ~SOCK_AUX_GET_RSSI;
}
#endif
#if IS_USED(MODULE_SOCK_AUX_TTL)
if ((aux != NULL) && (aux->flags & SOCK_AUX_GET_TTL)) {
gnrc_pktsnip_t *ip = gnrc_pktsnip_search_type(pkt, GNRC_NETTYPE_IPV6);
if (ip) {
ipv6_hdr_t *ip_hdr = ip->data;
aux->ttl = ip_hdr->hl;
aux->flags &= ~SOCK_AUX_GET_TTL;
}
}
#endif
*data = pkt->data;
*buf_ctx = pkt;

View File

@ -3,6 +3,7 @@ include ../Makefile.net_common
AUX_LOCAL ?= 1
AUX_TIMESTAMP ?= 1
AUX_RSSI ?= 1
AUX_TTL ?= 1
ifeq (1, $(AUX_LOCAL))
USEMODULE += sock_aux_local
@ -16,6 +17,10 @@ ifeq (1, $(AUX_RSSI))
USEMODULE += sock_aux_rssi
endif
ifeq (1, $(AUX_TTL))
USEMODULE += sock_aux_ttl
endif
USEMODULE += gnrc_sock_check_reuse
USEMODULE += sock_udp
USEMODULE += gnrc_ipv6

View File

@ -451,7 +451,7 @@ static void test_sock_udp_recv__aux(void)
static const inject_aux_t inject_aux = { .timestamp = 1337, .rssi = -11 };
sock_udp_ep_t result;
sock_udp_aux_rx_t aux = {
.flags = SOCK_AUX_GET_LOCAL | SOCK_AUX_GET_TIMESTAMP | SOCK_AUX_GET_RSSI
.flags = SOCK_AUX_GET_LOCAL | SOCK_AUX_GET_TIMESTAMP | SOCK_AUX_GET_RSSI | SOCK_AUX_GET_TTL
};
expect(0 == sock_udp_create(&_sock, &local, NULL, SOCK_FLAGS_REUSE_EP));
@ -483,6 +483,12 @@ static void test_sock_udp_recv__aux(void)
expect(inject_aux.rssi == aux.rssi);
#else
expect(aux.flags & SOCK_AUX_GET_RSSI);
#endif
#if IS_USED(MODULE_SOCK_AUX_TTL)
expect(!(aux.flags & SOCK_AUX_GET_TTL));
expect(64 == aux.ttl);
#else
expect(aux.flags & SOCK_AUX_GET_TTL);
#endif
expect(_check_net());
}