Skip to content
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/sock: add sock_aux_ttl #19836

Merged
merged 2 commits into from
Jul 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions makefiles/pseudomodules.inc.mk
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
15 changes: 15 additions & 0 deletions sys/include/net/sock.h
Original file line number Diff line number Diff line change
Expand Up @@ -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),
};

/**
Expand Down
8 changes: 8 additions & 0 deletions sys/include/net/sock/udp.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
10 changes: 10 additions & 0 deletions sys/net/gnrc/sock/udp/gnrc_sock_udp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
5 changes: 5 additions & 0 deletions tests/net/gnrc_sock_udp/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
8 changes: 7 additions & 1 deletion tests/net/gnrc_sock_udp/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down Expand Up @@ -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());
}
Expand Down