mirror of
https://github.com/torvalds/linux.git
synced 2025-04-12 16:47:42 +00:00
ipv4: Convert ip_route_input_noref() to dscp_t.
Pass a dscp_t variable to ip_route_input_noref(), instead of a plain u8, to prevent accidental setting of ECN bits in ->flowi4_tos. Callers of ip_route_input_noref() to consider are: * arp_process() in net/ipv4/arp.c. This function sets the tos parameter to 0, which is already a valid dscp_t value, so it doesn't need to be adjusted for the new prototype. * ip_route_input(), which already has a dscp_t variable to pass as parameter. We just need to remove the inet_dscp_to_dsfield() conversion. * ipvlan_l3_rcv(), bpf_lwt_input_reroute(), ip_expire(), ip_rcv_finish_core(), xfrm4_rcv_encap_finish() and xfrm4_rcv_encap(), which get the DSCP directly from IPv4 headers and can simply use the ip4h_dscp() helper. While there, declare the IPv4 header pointers as const in ipvlan_l3_rcv() and bpf_lwt_input_reroute(). Also, modify the declaration of ip_route_input_noref() in include/net/route.h so that it matches the prototype of its implementation in net/ipv4/route.c. Signed-off-by: Guillaume Nault <gnault@redhat.com> Reviewed-by: David Ahern <dsahern@kernel.org> Link: https://patch.msgid.link/a8a747bed452519c4d0cc06af32c7e7795d7b627.1727807926.git.gnault@redhat.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
7e863e5db6
commit
66fb6386d3
@ -2,6 +2,8 @@
|
||||
/* Copyright (c) 2014 Mahesh Bandewar <maheshb@google.com>
|
||||
*/
|
||||
|
||||
#include <net/ip.h>
|
||||
|
||||
#include "ipvlan.h"
|
||||
|
||||
static unsigned int ipvlan_netid __read_mostly;
|
||||
@ -48,11 +50,11 @@ static struct sk_buff *ipvlan_l3_rcv(struct net_device *dev,
|
||||
switch (proto) {
|
||||
case AF_INET:
|
||||
{
|
||||
struct iphdr *ip4h = ip_hdr(skb);
|
||||
const struct iphdr *ip4h = ip_hdr(skb);
|
||||
int err;
|
||||
|
||||
err = ip_route_input_noref(skb, ip4h->daddr, ip4h->saddr,
|
||||
ip4h->tos, sdev);
|
||||
ip4h_dscp(ip4h), sdev);
|
||||
if (unlikely(err))
|
||||
goto out;
|
||||
break;
|
||||
|
@ -201,8 +201,8 @@ static inline struct rtable *ip_route_output_gre(struct net *net, struct flowi4
|
||||
int ip_mc_validate_source(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
||||
u8 tos, struct net_device *dev,
|
||||
struct in_device *in_dev, u32 *itag);
|
||||
int ip_route_input_noref(struct sk_buff *skb, __be32 dst, __be32 src,
|
||||
u8 tos, struct net_device *devin);
|
||||
int ip_route_input_noref(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
||||
dscp_t dscp, struct net_device *dev);
|
||||
int ip_route_use_hint(struct sk_buff *skb, __be32 dst, __be32 src,
|
||||
u8 tos, struct net_device *devin,
|
||||
const struct sk_buff *hint);
|
||||
@ -213,8 +213,7 @@ static inline int ip_route_input(struct sk_buff *skb, __be32 dst, __be32 src,
|
||||
int err;
|
||||
|
||||
rcu_read_lock();
|
||||
err = ip_route_input_noref(skb, dst, src, inet_dscp_to_dsfield(dscp),
|
||||
devin);
|
||||
err = ip_route_input_noref(skb, dst, src, dscp, devin);
|
||||
if (!err) {
|
||||
skb_dst_force(skb);
|
||||
if (!skb_dst(skb))
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include <linux/bpf.h>
|
||||
#include <net/lwtunnel.h>
|
||||
#include <net/gre.h>
|
||||
#include <net/ip.h>
|
||||
#include <net/ip6_route.h>
|
||||
#include <net/ipv6_stubs.h>
|
||||
#include <net/inet_dscp.h>
|
||||
@ -91,12 +92,12 @@ static int bpf_lwt_input_reroute(struct sk_buff *skb)
|
||||
|
||||
if (skb->protocol == htons(ETH_P_IP)) {
|
||||
struct net_device *dev = skb_dst(skb)->dev;
|
||||
struct iphdr *iph = ip_hdr(skb);
|
||||
const struct iphdr *iph = ip_hdr(skb);
|
||||
|
||||
dev_hold(dev);
|
||||
skb_dst_drop(skb);
|
||||
err = ip_route_input_noref(skb, iph->daddr, iph->saddr,
|
||||
iph->tos, dev);
|
||||
ip4h_dscp(iph), dev);
|
||||
dev_put(dev);
|
||||
} else if (skb->protocol == htons(ETH_P_IPV6)) {
|
||||
skb_dst_drop(skb);
|
||||
|
@ -175,8 +175,8 @@ static void ip_expire(struct timer_list *t)
|
||||
|
||||
/* skb has no dst, perform route lookup again */
|
||||
iph = ip_hdr(head);
|
||||
err = ip_route_input_noref(head, iph->daddr, iph->saddr,
|
||||
iph->tos, head->dev);
|
||||
err = ip_route_input_noref(head, iph->daddr, iph->saddr, ip4h_dscp(iph),
|
||||
head->dev);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
|
@ -363,7 +363,7 @@ static int ip_rcv_finish_core(struct net *net, struct sock *sk,
|
||||
*/
|
||||
if (!skb_valid_dst(skb)) {
|
||||
err = ip_route_input_noref(skb, iph->daddr, iph->saddr,
|
||||
iph->tos, dev);
|
||||
ip4h_dscp(iph), dev);
|
||||
if (unlikely(err))
|
||||
goto drop_error;
|
||||
} else {
|
||||
|
@ -2465,14 +2465,14 @@ static int ip_route_input_rcu(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
||||
}
|
||||
|
||||
int ip_route_input_noref(struct sk_buff *skb, __be32 daddr, __be32 saddr,
|
||||
u8 tos, struct net_device *dev)
|
||||
dscp_t dscp, struct net_device *dev)
|
||||
{
|
||||
struct fib_result res;
|
||||
int err;
|
||||
|
||||
tos &= INET_DSCP_MASK;
|
||||
rcu_read_lock();
|
||||
err = ip_route_input_rcu(skb, daddr, saddr, tos, dev, &res);
|
||||
err = ip_route_input_rcu(skb, daddr, saddr, inet_dscp_to_dsfield(dscp),
|
||||
dev, &res);
|
||||
rcu_read_unlock();
|
||||
|
||||
return err;
|
||||
|
@ -33,7 +33,7 @@ static inline int xfrm4_rcv_encap_finish(struct net *net, struct sock *sk,
|
||||
const struct iphdr *iph = ip_hdr(skb);
|
||||
|
||||
if (ip_route_input_noref(skb, iph->daddr, iph->saddr,
|
||||
iph->tos, skb->dev))
|
||||
ip4h_dscp(iph), skb->dev))
|
||||
goto drop;
|
||||
}
|
||||
|
||||
|
@ -76,7 +76,7 @@ int xfrm4_rcv_encap(struct sk_buff *skb, int nexthdr, __be32 spi,
|
||||
const struct iphdr *iph = ip_hdr(skb);
|
||||
|
||||
if (ip_route_input_noref(skb, iph->daddr, iph->saddr,
|
||||
iph->tos, skb->dev))
|
||||
ip4h_dscp(iph), skb->dev))
|
||||
goto drop;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user