Commit 4d3c5db4 authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'net-ipv4-some-drop-reason-cleanup-and-improvements'

Antoine Tenart says:

====================
net: ipv4: some drop reason cleanup and improvements

A few patches that were laying around cleaning up and improving drop
reasons in net/ipv4.
====================

Link: https://patch.msgid.link/20250915091958.15382-1-atenart@kernel.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents b73b8146 9e1e2f4e
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -404,7 +404,7 @@ static inline struct sk_buff *skb_recv_udp(struct sock *sk, unsigned int flags,
	return __skb_recv_udp(sk, flags, &off, err);
}

int udp_v4_early_demux(struct sk_buff *skb);
enum skb_drop_reason udp_v4_early_demux(struct sk_buff *skb);
bool udp_sk_rx_dst_set(struct sock *sk, struct dst_entry *dst);
int udp_err(struct sk_buff *, u32);
int udp_abort(struct sock *sk, int err);
+14 −15
Original line number Diff line number Diff line
@@ -263,10 +263,11 @@ int ip_local_deliver(struct sk_buff *skb)
}
EXPORT_SYMBOL(ip_local_deliver);

static inline bool ip_rcv_options(struct sk_buff *skb, struct net_device *dev)
static inline enum skb_drop_reason
ip_rcv_options(struct sk_buff *skb, struct net_device *dev)
{
	struct ip_options *opt;
	const struct iphdr *iph;
	struct ip_options *opt;

	/* It looks as overkill, because not all
	   IP options require packet mangling.
@@ -277,7 +278,7 @@ static inline bool ip_rcv_options(struct sk_buff *skb, struct net_device *dev)
	*/
	if (skb_cow(skb, skb_headroom(skb))) {
		__IP_INC_STATS(dev_net(dev), IPSTATS_MIB_INDISCARDS);
		goto drop;
		return SKB_DROP_REASON_NOMEM;
	}

	iph = ip_hdr(skb);
@@ -286,7 +287,7 @@ static inline bool ip_rcv_options(struct sk_buff *skb, struct net_device *dev)

	if (ip_options_compile(dev_net(dev), opt, skb)) {
		__IP_INC_STATS(dev_net(dev), IPSTATS_MIB_INHDRERRORS);
		goto drop;
		return SKB_DROP_REASON_IP_INHDR;
	}

	if (unlikely(opt->srr)) {
@@ -298,17 +299,15 @@ static inline bool ip_rcv_options(struct sk_buff *skb, struct net_device *dev)
					net_info_ratelimited("source route option %pI4 -> %pI4\n",
							     &iph->saddr,
							     &iph->daddr);
				goto drop;
				return SKB_DROP_REASON_NOT_SPECIFIED;
			}
		}

		if (ip_options_rcv_srr(skb, dev))
			goto drop;
			return SKB_DROP_REASON_NOT_SPECIFIED;
	}

	return false;
drop:
	return true;
	return SKB_NOT_DROPPED_YET;
}

static bool ip_can_use_hint(const struct sk_buff *skb, const struct iphdr *iph,
@@ -319,7 +318,7 @@ static bool ip_can_use_hint(const struct sk_buff *skb, const struct iphdr *iph,
}

int tcp_v4_early_demux(struct sk_buff *skb);
int udp_v4_early_demux(struct sk_buff *skb);
enum skb_drop_reason udp_v4_early_demux(struct sk_buff *skb);
static int ip_rcv_finish_core(struct net *net,
			      struct sk_buff *skb, struct net_device *dev,
			      const struct sk_buff *hint)
@@ -335,7 +334,6 @@ static int ip_rcv_finish_core(struct net *net,
			goto drop_error;
	}

	drop_reason = SKB_DROP_REASON_NOT_SPECIFIED;
	if (READ_ONCE(net->ipv4.sysctl_ip_early_demux) &&
	    !skb_dst(skb) &&
	    !skb->sk &&
@@ -354,7 +352,6 @@ static int ip_rcv_finish_core(struct net *net,
				drop_reason = udp_v4_early_demux(skb);
				if (unlikely(drop_reason))
					goto drop_error;
				drop_reason = SKB_DROP_REASON_NOT_SPECIFIED;

				/* must reload iph, skb->head might have changed */
				iph = ip_hdr(skb);
@@ -372,7 +369,6 @@ static int ip_rcv_finish_core(struct net *net,
						   ip4h_dscp(iph), dev);
		if (unlikely(drop_reason))
			goto drop_error;
		drop_reason = SKB_DROP_REASON_NOT_SPECIFIED;
	} else {
		struct in_device *in_dev = __in_dev_get_rcu(dev);

@@ -391,8 +387,11 @@ static int ip_rcv_finish_core(struct net *net,
	}
#endif

	if (iph->ihl > 5 && ip_rcv_options(skb, dev))
	if (iph->ihl > 5) {
		drop_reason = ip_rcv_options(skb, dev);
		if (drop_reason)
			goto drop;
	}

	rt = skb_rtable(skb);
	if (rt->rt_type == RTN_MULTICAST) {
+6 −6
Original line number Diff line number Diff line
@@ -2811,7 +2811,7 @@ static struct sock *__udp4_lib_demux_lookup(struct net *net,
	return NULL;
}

int udp_v4_early_demux(struct sk_buff *skb)
enum skb_drop_reason udp_v4_early_demux(struct sk_buff *skb)
{
	struct net *net = dev_net(skb->dev);
	struct in_device *in_dev = NULL;
@@ -2825,7 +2825,7 @@ int udp_v4_early_demux(struct sk_buff *skb)

	/* validate the packet */
	if (!pskb_may_pull(skb, skb_transport_offset(skb) + sizeof(struct udphdr)))
		return 0;
		return SKB_NOT_DROPPED_YET;

	iph = ip_hdr(skb);
	uh = udp_hdr(skb);
@@ -2834,12 +2834,12 @@ int udp_v4_early_demux(struct sk_buff *skb)
		in_dev = __in_dev_get_rcu(skb->dev);

		if (!in_dev)
			return 0;
			return SKB_NOT_DROPPED_YET;

		ours = ip_check_mc_rcu(in_dev, iph->daddr, iph->saddr,
				       iph->protocol);
		if (!ours)
			return 0;
			return SKB_NOT_DROPPED_YET;

		sk = __udp4_lib_mcast_demux_lookup(net, uh->dest, iph->daddr,
						   uh->source, iph->saddr,
@@ -2850,7 +2850,7 @@ int udp_v4_early_demux(struct sk_buff *skb)
	}

	if (!sk)
		return 0;
		return SKB_NOT_DROPPED_YET;

	skb->sk = sk;
	DEBUG_NET_WARN_ON_ONCE(sk_is_refcounted(sk));
@@ -2877,7 +2877,7 @@ int udp_v4_early_demux(struct sk_buff *skb)
						     ip4h_dscp(iph),
						     skb->dev, in_dev, &itag);
	}
	return 0;
	return SKB_NOT_DROPPED_YET;
}

int udp_rcv(struct sk_buff *skb)