]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
xfrm: extract dst lookup parameters into a struct
authorEyal Birger <eyal.birger@gmail.com>
Tue, 3 Sep 2024 00:07:09 +0000 (17:07 -0700)
committerSteffen Klassert <steffen.klassert@secunet.com>
Mon, 23 Sep 2024 05:02:07 +0000 (07:02 +0200)
Preparation for adding more fields to dst lookup functions without
changing their signatures.

Signed-off-by: Eyal Birger <eyal.birger@gmail.com>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
include/net/xfrm.h
net/ipv4/xfrm4_policy.c
net/ipv6/xfrm6_policy.c
net/xfrm/xfrm_device.c
net/xfrm/xfrm_policy.c

index b6bfdc6416c797751a415e4498911c9faa96fbe4..f3ae5037270715fce33ea011ae2ca261c8fdfed2 100644 (file)
@@ -349,20 +349,23 @@ struct xfrm_if_cb {
 void xfrm_if_register_cb(const struct xfrm_if_cb *ifcb);
 void xfrm_if_unregister_cb(void);
 
+struct xfrm_dst_lookup_params {
+       struct net *net;
+       int tos;
+       int oif;
+       xfrm_address_t *saddr;
+       xfrm_address_t *daddr;
+       u32 mark;
+};
+
 struct net_device;
 struct xfrm_type;
 struct xfrm_dst;
 struct xfrm_policy_afinfo {
        struct dst_ops          *dst_ops;
-       struct dst_entry        *(*dst_lookup)(struct net *net,
-                                              int tos, int oif,
-                                              const xfrm_address_t *saddr,
-                                              const xfrm_address_t *daddr,
-                                              u32 mark);
-       int                     (*get_saddr)(struct net *net, int oif,
-                                            xfrm_address_t *saddr,
-                                            xfrm_address_t *daddr,
-                                            u32 mark);
+       struct dst_entry        *(*dst_lookup)(const struct xfrm_dst_lookup_params *params);
+       int                     (*get_saddr)(xfrm_address_t *saddr,
+                                            const struct xfrm_dst_lookup_params *params);
        int                     (*fill_dst)(struct xfrm_dst *xdst,
                                            struct net_device *dev,
                                            const struct flowi *fl);
@@ -1764,10 +1767,7 @@ static inline int xfrm_user_policy(struct sock *sk, int optname,
 }
 #endif
 
-struct dst_entry *__xfrm_dst_lookup(struct net *net, int tos, int oif,
-                                   const xfrm_address_t *saddr,
-                                   const xfrm_address_t *daddr,
-                                   int family, u32 mark);
+struct dst_entry *__xfrm_dst_lookup(int family, const struct xfrm_dst_lookup_params *params);
 
 struct xfrm_policy *xfrm_policy_alloc(struct net *net, gfp_t gfp);
 
index 0294fef577fab134c451d6180cd8aab87fc8ab01..ac1a28ef0c56085674c3436e42862ccb96ff0695 100644 (file)
 #include <net/ip.h>
 #include <net/l3mdev.h>
 
-static struct dst_entry *__xfrm4_dst_lookup(struct net *net, struct flowi4 *fl4,
-                                           int tos, int oif,
-                                           const xfrm_address_t *saddr,
-                                           const xfrm_address_t *daddr,
-                                           u32 mark)
+static struct dst_entry *__xfrm4_dst_lookup(struct flowi4 *fl4,
+                                           const struct xfrm_dst_lookup_params *params)
 {
        struct rtable *rt;
 
        memset(fl4, 0, sizeof(*fl4));
-       fl4->daddr = daddr->a4;
-       fl4->flowi4_tos = tos;
-       fl4->flowi4_l3mdev = l3mdev_master_ifindex_by_index(net, oif);
-       fl4->flowi4_mark = mark;
-       if (saddr)
-               fl4->saddr = saddr->a4;
-
-       rt = __ip_route_output_key(net, fl4);
+       fl4->daddr = params->daddr->a4;
+       fl4->flowi4_tos = params->tos;
+       fl4->flowi4_l3mdev = l3mdev_master_ifindex_by_index(params->net,
+                                                           params->oif);
+       fl4->flowi4_mark = params->mark;
+       if (params->saddr)
+               fl4->saddr = params->saddr->a4;
+
+       rt = __ip_route_output_key(params->net, fl4);
        if (!IS_ERR(rt))
                return &rt->dst;
 
        return ERR_CAST(rt);
 }
 
-static struct dst_entry *xfrm4_dst_lookup(struct net *net, int tos, int oif,
-                                         const xfrm_address_t *saddr,
-                                         const xfrm_address_t *daddr,
-                                         u32 mark)
+static struct dst_entry *xfrm4_dst_lookup(const struct xfrm_dst_lookup_params *params)
 {
        struct flowi4 fl4;
 
-       return __xfrm4_dst_lookup(net, &fl4, tos, oif, saddr, daddr, mark);
+       return __xfrm4_dst_lookup(&fl4, params);
 }
 
-static int xfrm4_get_saddr(struct net *net, int oif,
-                          xfrm_address_t *saddr, xfrm_address_t *daddr,
-                          u32 mark)
+static int xfrm4_get_saddr(xfrm_address_t *saddr,
+                          const struct xfrm_dst_lookup_params *params)
 {
        struct dst_entry *dst;
        struct flowi4 fl4;
 
-       dst = __xfrm4_dst_lookup(net, &fl4, 0, oif, NULL, daddr, mark);
+       dst = __xfrm4_dst_lookup(&fl4, params);
        if (IS_ERR(dst))
                return -EHOSTUNREACH;
 
index b1d81c4270ab3a1fd7bd08564c362c906f5f78ae..fc3f5eec6898576d546e01a336fce1ea414bdad9 100644 (file)
 #include <net/ip6_route.h>
 #include <net/l3mdev.h>
 
-static struct dst_entry *xfrm6_dst_lookup(struct net *net, int tos, int oif,
-                                         const xfrm_address_t *saddr,
-                                         const xfrm_address_t *daddr,
-                                         u32 mark)
+static struct dst_entry *xfrm6_dst_lookup(const struct xfrm_dst_lookup_params *params)
 {
        struct flowi6 fl6;
        struct dst_entry *dst;
        int err;
 
        memset(&fl6, 0, sizeof(fl6));
-       fl6.flowi6_l3mdev = l3mdev_master_ifindex_by_index(net, oif);
-       fl6.flowi6_mark = mark;
-       memcpy(&fl6.daddr, daddr, sizeof(fl6.daddr));
-       if (saddr)
-               memcpy(&fl6.saddr, saddr, sizeof(fl6.saddr));
+       fl6.flowi6_l3mdev = l3mdev_master_ifindex_by_index(params->net,
+                                                          params->oif);
+       fl6.flowi6_mark = params->mark;
+       memcpy(&fl6.daddr, params->daddr, sizeof(fl6.daddr));
+       if (params->saddr)
+               memcpy(&fl6.saddr, params->saddr, sizeof(fl6.saddr));
 
-       dst = ip6_route_output(net, NULL, &fl6);
+       dst = ip6_route_output(params->net, NULL, &fl6);
 
        err = dst->error;
        if (dst->error) {
@@ -50,15 +48,14 @@ static struct dst_entry *xfrm6_dst_lookup(struct net *net, int tos, int oif,
        return dst;
 }
 
-static int xfrm6_get_saddr(struct net *net, int oif,
-                          xfrm_address_t *saddr, xfrm_address_t *daddr,
-                          u32 mark)
+static int xfrm6_get_saddr(xfrm_address_t *saddr,
+                          const struct xfrm_dst_lookup_params *params)
 {
        struct dst_entry *dst;
        struct net_device *dev;
        struct inet6_dev *idev;
 
-       dst = xfrm6_dst_lookup(net, 0, oif, NULL, daddr, mark);
+       dst = xfrm6_dst_lookup(params);
        if (IS_ERR(dst))
                return -EHOSTUNREACH;
 
@@ -68,7 +65,8 @@ static int xfrm6_get_saddr(struct net *net, int oif,
                return -EHOSTUNREACH;
        }
        dev = idev->dev;
-       ipv6_dev_get_saddr(dev_net(dev), dev, &daddr->in6, 0, &saddr->in6);
+       ipv6_dev_get_saddr(dev_net(dev), dev, &params->daddr->in6, 0,
+                          &saddr->in6);
        dst_release(dst);
        return 0;
 }
index f123b7c9ec82594fd2c4b5275f3fc737ad5449cb..b33c4591e09a4f289f1e067a5a657854452f7f0f 100644 (file)
@@ -269,6 +269,8 @@ int xfrm_dev_state_add(struct net *net, struct xfrm_state *x,
 
        dev = dev_get_by_index(net, xuo->ifindex);
        if (!dev) {
+               struct xfrm_dst_lookup_params params;
+
                if (!(xuo->flags & XFRM_OFFLOAD_INBOUND)) {
                        saddr = &x->props.saddr;
                        daddr = &x->id.daddr;
@@ -277,9 +279,12 @@ int xfrm_dev_state_add(struct net *net, struct xfrm_state *x,
                        daddr = &x->props.saddr;
                }
 
-               dst = __xfrm_dst_lookup(net, 0, 0, saddr, daddr,
-                                       x->props.family,
-                                       xfrm_smark_get(0, x));
+               memset(&params, 0, sizeof(params));
+               params.net = net;
+               params.saddr = saddr;
+               params.daddr = daddr;
+               params.mark = xfrm_smark_get(0, x);
+               dst = __xfrm_dst_lookup(x->props.family, &params);
                if (IS_ERR(dst))
                        return (is_packet_offload) ? -EINVAL : 0;
 
index 914bac03b52ad42517835fbd6000b78b802720e9..ec8f2fe13a515ec0b4a403cbd1a8a77ad1b2259b 100644 (file)
@@ -270,10 +270,8 @@ static const struct xfrm_if_cb *xfrm_if_get_cb(void)
        return rcu_dereference(xfrm_if_cb);
 }
 
-struct dst_entry *__xfrm_dst_lookup(struct net *net, int tos, int oif,
-                                   const xfrm_address_t *saddr,
-                                   const xfrm_address_t *daddr,
-                                   int family, u32 mark)
+struct dst_entry *__xfrm_dst_lookup(int family,
+                                   const struct xfrm_dst_lookup_params *params)
 {
        const struct xfrm_policy_afinfo *afinfo;
        struct dst_entry *dst;
@@ -282,7 +280,7 @@ struct dst_entry *__xfrm_dst_lookup(struct net *net, int tos, int oif,
        if (unlikely(afinfo == NULL))
                return ERR_PTR(-EAFNOSUPPORT);
 
-       dst = afinfo->dst_lookup(net, tos, oif, saddr, daddr, mark);
+       dst = afinfo->dst_lookup(params);
 
        rcu_read_unlock();
 
@@ -296,6 +294,7 @@ static inline struct dst_entry *xfrm_dst_lookup(struct xfrm_state *x,
                                                xfrm_address_t *prev_daddr,
                                                int family, u32 mark)
 {
+       struct xfrm_dst_lookup_params params;
        struct net *net = xs_net(x);
        xfrm_address_t *saddr = &x->props.saddr;
        xfrm_address_t *daddr = &x->id.daddr;
@@ -310,7 +309,14 @@ static inline struct dst_entry *xfrm_dst_lookup(struct xfrm_state *x,
                daddr = x->coaddr;
        }
 
-       dst = __xfrm_dst_lookup(net, tos, oif, saddr, daddr, family, mark);
+       params.net = net;
+       params.saddr = saddr;
+       params.daddr = daddr;
+       params.tos = tos;
+       params.oif = oif;
+       params.mark = mark;
+
+       dst = __xfrm_dst_lookup(family, &params);
 
        if (!IS_ERR(dst)) {
                if (prev_saddr != saddr)
@@ -2432,15 +2438,15 @@ int __xfrm_sk_clone_policy(struct sock *sk, const struct sock *osk)
 }
 
 static int
-xfrm_get_saddr(struct net *net, int oif, xfrm_address_t *local,
-              xfrm_address_t *remote, unsigned short family, u32 mark)
+xfrm_get_saddr(unsigned short family, xfrm_address_t *saddr,
+              const struct xfrm_dst_lookup_params *params)
 {
        int err;
        const struct xfrm_policy_afinfo *afinfo = xfrm_policy_get_afinfo(family);
 
        if (unlikely(afinfo == NULL))
                return -EINVAL;
-       err = afinfo->get_saddr(net, oif, local, remote, mark);
+       err = afinfo->get_saddr(saddr, params);
        rcu_read_unlock();
        return err;
 }
@@ -2469,9 +2475,14 @@ xfrm_tmpl_resolve_one(struct xfrm_policy *policy, const struct flowi *fl,
                        remote = &tmpl->id.daddr;
                        local = &tmpl->saddr;
                        if (xfrm_addr_any(local, tmpl->encap_family)) {
-                               error = xfrm_get_saddr(net, fl->flowi_oif,
-                                                      &tmp, remote,
-                                                      tmpl->encap_family, 0);
+                               struct xfrm_dst_lookup_params params;
+
+                               memset(&params, 0, sizeof(params));
+                               params.net = net;
+                               params.oif = fl->flowi_oif;
+                               params.daddr = remote;
+                               error = xfrm_get_saddr(tmpl->encap_family, &tmp,
+                                                      &params);
                                if (error)
                                        goto fail;
                                local = &tmp;