mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-13 22:19:17 -04:00
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: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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))
|
||||
goto drop;
|
||||
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) {
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user