xfrm: remove eth_proto value from xfrm_state_afinfo
authorFlorian Westphal <fw@strlen.de>
Fri, 3 May 2019 15:46:18 +0000 (17:46 +0200)
committerSteffen Klassert <steffen.klassert@secunet.com>
Thu, 6 Jun 2019 06:34:50 +0000 (08:34 +0200)
xfrm_prepare_input needs to lookup the state afinfo backend again to fetch
the address family ethernet protocol value.

There are only two address families, so a switch statement is simpler.
While at it, use u8 for family and proto and remove the owner member --
its not used anywhere.

Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
include/net/xfrm.h
net/ipv4/xfrm4_state.c
net/ipv6/xfrm6_state.c
net/xfrm/xfrm_input.c

index 4325cb7..812994a 100644 (file)
@@ -346,10 +346,8 @@ void km_state_expired(struct xfrm_state *x, int hard, u32 portid);
 int __xfrm_state_delete(struct xfrm_state *x);
 
 struct xfrm_state_afinfo {
-       unsigned int                    family;
-       unsigned int                    proto;
-       __be16                          eth_proto;
-       struct module                   *owner;
+       u8                              family;
+       u8                              proto;
        const struct xfrm_type          *type_map[IPPROTO_MAX];
        const struct xfrm_type_offload  *type_offload_map[IPPROTO_MAX];
 
index 62c96da..f8ed3c3 100644 (file)
@@ -34,8 +34,6 @@ int xfrm4_extract_header(struct sk_buff *skb)
 static struct xfrm_state_afinfo xfrm4_state_afinfo = {
        .family                 = AF_INET,
        .proto                  = IPPROTO_IPIP,
-       .eth_proto              = htons(ETH_P_IP),
-       .owner                  = THIS_MODULE,
        .output                 = xfrm4_output,
        .output_finish          = xfrm4_output_finish,
        .extract_input          = xfrm4_extract_input,
index 1782ebb..78daade 100644 (file)
@@ -40,8 +40,6 @@ int xfrm6_extract_header(struct sk_buff *skb)
 static struct xfrm_state_afinfo xfrm6_state_afinfo = {
        .family                 = AF_INET6,
        .proto                  = IPPROTO_IPV6,
-       .eth_proto              = htons(ETH_P_IPV6),
-       .owner                  = THIS_MODULE,
        .output                 = xfrm6_output,
        .output_finish          = xfrm6_output_finish,
        .extract_input          = xfrm6_extract_input,
index 314973a..8a00cc9 100644 (file)
@@ -359,28 +359,28 @@ static int xfrm_prepare_input(struct xfrm_state *x, struct sk_buff *skb)
        afinfo = xfrm_state_afinfo_get_rcu(x->outer_mode.family);
        if (likely(afinfo))
                err = afinfo->extract_input(x, skb);
+       rcu_read_unlock();
 
-       if (err) {
-               rcu_read_unlock();
+       if (err)
                return err;
-       }
 
        if (x->sel.family == AF_UNSPEC) {
                inner_mode = xfrm_ip2inner_mode(x, XFRM_MODE_SKB_CB(skb)->protocol);
-               if (!inner_mode) {
-                       rcu_read_unlock();
+               if (!inner_mode)
                        return -EAFNOSUPPORT;
-               }
        }
 
-       afinfo = xfrm_state_afinfo_get_rcu(inner_mode->family);
-       if (unlikely(!afinfo)) {
-               rcu_read_unlock();
-               return -EAFNOSUPPORT;
+       switch (inner_mode->family) {
+       case AF_INET:
+               skb->protocol = htons(ETH_P_IP);
+               break;
+       case AF_INET6:
+               skb->protocol = htons(ETH_P_IPV6);
+       default:
+               WARN_ON_ONCE(1);
+               break;
        }
 
-       skb->protocol = afinfo->eth_proto;
-       rcu_read_unlock();
        return xfrm_inner_mode_encap_remove(x, inner_mode, skb);
 }