Commit 0327bb1a authored by Cla Mattia Galliard's avatar Cla Mattia Galliard Committed by Benjamin Cabé
Browse files

net: pkt: Store `is_loopback` info in packet meta-data



Store the flag in the packet meta-data so that processing may be deferred
if necessary.

Signed-off-by: default avatarCla Mattia Galliard <clamattia@gmail.com>
parent d330e86e
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -237,6 +237,7 @@ struct net_pkt {
	uint8_t chksum_done : 1; /* Checksum has already been computed for
				  * the packet.
				  */
	uint8_t loopback : 1; /* Packet is a loop back packet. */
#if defined(CONFIG_NET_IP_FRAGMENT)
	uint8_t ip_reassembled : 1; /* Packet is a reassembled IP packet. */
#endif
@@ -1020,6 +1021,17 @@ static inline void net_pkt_set_ipv6_fragment_id(struct net_pkt *pkt,
}
#endif /* CONFIG_NET_IPV6_FRAGMENT */

static inline bool net_pkt_is_loopback(struct net_pkt *pkt)
{
	return !!(pkt->loopback);
}

static inline void net_pkt_set_loopback(struct net_pkt *pkt,
					bool loopback)
{
	pkt->loopback = loopback;
}

#if defined(CONFIG_NET_IP_FRAGMENT)
static inline bool net_pkt_is_ip_reassembled(struct net_pkt *pkt)
{
+2 −2
Original line number Diff line number Diff line
@@ -240,7 +240,7 @@ int net_ipv4_parse_hdr_options(struct net_pkt *pkt,
}
#endif

enum net_verdict net_ipv4_input(struct net_pkt *pkt, bool is_loopback)
enum net_verdict net_ipv4_input(struct net_pkt *pkt)
{
	NET_PKT_DATA_ACCESS_CONTIGUOUS_DEFINE(ipv4_access, struct net_ipv4_hdr);
	NET_PKT_DATA_ACCESS_DEFINE(udp_access, struct net_udp_hdr);
@@ -301,7 +301,7 @@ enum net_verdict net_ipv4_input(struct net_pkt *pkt, bool is_loopback)
		net_pkt_update_length(pkt, pkt_len);
	}

	if (!is_loopback) {
	if (!net_pkt_is_loopback(pkt)) {
		if (net_ipv4_is_addr_loopback_raw(hdr->dst) ||
		    net_ipv4_is_addr_loopback_raw(hdr->src)) {
			NET_DBG("DROP: localhost packet");
+3 −3
Original line number Diff line number Diff line
@@ -475,7 +475,7 @@ static inline bool is_src_non_tentative_itself(const uint8_t *src)
	return false;
}

enum net_verdict net_ipv6_input(struct net_pkt *pkt, bool is_loopback)
enum net_verdict net_ipv6_input(struct net_pkt *pkt)
{
	NET_PKT_DATA_ACCESS_CONTIGUOUS_DEFINE(ipv6_access, struct net_ipv6_hdr);
	NET_PKT_DATA_ACCESS_DEFINE(udp_access, struct net_udp_hdr);
@@ -537,7 +537,7 @@ enum net_verdict net_ipv6_input(struct net_pkt *pkt, bool is_loopback)
		goto drop;
	}

	if (!is_loopback) {
	if (!net_pkt_is_loopback(pkt)) {
		if (net_ipv6_is_addr_loopback_raw(hdr->dst) ||
		    net_ipv6_is_addr_loopback_raw(hdr->src)) {
			NET_DBG("DROP: ::1 packet");
@@ -631,7 +631,7 @@ enum net_verdict net_ipv6_input(struct net_pkt *pkt, bool is_loopback)
	}

	if ((IS_ENABLED(CONFIG_NET_ROUTING) || IS_ENABLED(CONFIG_NET_ROUTE_MCAST)) &&
	    !is_loopback && is_src_non_tentative_itself(hdr->src)) {
	    !net_pkt_is_loopback(pkt) && is_src_non_tentative_itself(hdr->src)) {
		NET_DBG("DROP: src addr is %s", "mine");
		goto drop;
	}
+10 −11
Original line number Diff line number Diff line
@@ -64,8 +64,7 @@ LOG_MODULE_REGISTER(net_core, CONFIG_NET_CORE_LOG_LEVEL);
#include "net_stats.h"

#if defined(CONFIG_NET_NATIVE)
static inline enum net_verdict process_data(struct net_pkt *pkt,
					    bool is_loopback)
static inline enum net_verdict process_data(struct net_pkt *pkt)
{
	int ret;
	bool locally_routed = false;
@@ -93,7 +92,7 @@ static inline enum net_verdict process_data(struct net_pkt *pkt,
		return NET_DROP;
	}

	if (!is_loopback && !locally_routed) {
	if (!net_pkt_is_loopback(pkt) && !locally_routed) {
		ret = net_if_recv_data(net_pkt_iface(pkt), pkt);
		if (ret != NET_CONTINUE) {
			if (ret == NET_DROP) {
@@ -131,9 +130,9 @@ static inline enum net_verdict process_data(struct net_pkt *pkt,
		uint8_t vtc_vhl = NET_IPV6_HDR(pkt)->vtc & 0xf0;

		if (IS_ENABLED(CONFIG_NET_IPV6) && vtc_vhl == 0x60) {
			return net_ipv6_input(pkt, is_loopback);
			return net_ipv6_input(pkt);
		} else if (IS_ENABLED(CONFIG_NET_IPV4) && vtc_vhl == 0x40) {
			return net_ipv4_input(pkt, is_loopback);
			return net_ipv4_input(pkt);
		}

		NET_DBG("Unknown IP family packet (0x%x)", NET_IPV6_HDR(pkt)->vtc & 0xf0);
@@ -148,10 +147,10 @@ static inline enum net_verdict process_data(struct net_pkt *pkt,
	return NET_DROP;
}

static void processing_data(struct net_pkt *pkt, bool is_loopback)
static void processing_data(struct net_pkt *pkt)
{
again:
	switch (process_data(pkt, is_loopback)) {
	switch (process_data(pkt)) {
	case NET_CONTINUE:
		if (IS_ENABLED(CONFIG_NET_L2_VIRTUAL)) {
			/* If we have a tunneling packet, feed it back
@@ -421,7 +420,8 @@ int net_try_send_data(struct net_pkt *pkt, k_timeout_t timeout)
		 * to RX processing.
		 */
		NET_DBG("Loopback pkt %p back to us", pkt);
		processing_data(pkt, true);
		net_pkt_set_loopback(pkt, true);
		processing_data(pkt);
		ret = 0;
		goto err;
	}
@@ -481,7 +481,6 @@ err:

static void net_rx(struct net_if *iface, struct net_pkt *pkt)
{
	bool is_loopback = false;
	size_t pkt_len;

	pkt_len = net_pkt_get_len(pkt);
@@ -493,12 +492,12 @@ static void net_rx(struct net_if *iface, struct net_pkt *pkt)
	if (IS_ENABLED(CONFIG_NET_LOOPBACK)) {
#ifdef CONFIG_NET_L2_DUMMY
		if (net_if_l2(iface) == &NET_L2_GET_NAME(DUMMY)) {
			is_loopback = true;
			net_pkt_set_loopback(pkt, true);
		}
#endif
	}

	processing_data(pkt, is_loopback);
	processing_data(pkt);

	net_print_statistics();
	net_pkt_print();
+1 −0
Original line number Diff line number Diff line
@@ -2050,6 +2050,7 @@ static void clone_pkt_attributes(struct net_pkt *pkt, struct net_pkt *clone_pkt)
	net_pkt_set_rx_timestamping(clone_pkt, net_pkt_is_rx_timestamping(pkt));
	net_pkt_set_forwarding(clone_pkt, net_pkt_forwarding(pkt));
	net_pkt_set_chksum_done(clone_pkt, net_pkt_is_chksum_done(pkt));
	net_pkt_set_loopback(pkt, net_pkt_is_loopback(pkt));
	net_pkt_set_ip_reassembled(pkt, net_pkt_is_ip_reassembled(pkt));
	net_pkt_set_cooked_mode(clone_pkt, net_pkt_is_cooked_mode(pkt));
	net_pkt_set_ipv4_pmtu(clone_pkt, net_pkt_ipv4_pmtu(pkt));
Loading