vti4: eliminated some duplicate code.
The ipip tunnel introduced in commit dd9ee34440
("vti4: Fix a ipip
packet processing bug in 'IPCOMP' virtual tunnel") largely duplicated
the existing vti_input and vti_recv functions. Refactored to
deduplicate the common code.
Signed-off-by: Jeremy Sowden <jeremy@azazel.net>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
This commit is contained in:
parent
65fd2c2afa
commit
f981c57ffd
|
@ -50,7 +50,7 @@ static unsigned int vti_net_id __read_mostly;
|
|||
static int vti_tunnel_init(struct net_device *dev);
|
||||
|
||||
static int vti_input(struct sk_buff *skb, int nexthdr, __be32 spi,
|
||||
int encap_type)
|
||||
int encap_type, bool update_skb_dev)
|
||||
{
|
||||
struct ip_tunnel *tunnel;
|
||||
const struct iphdr *iph = ip_hdr(skb);
|
||||
|
@ -65,32 +65,8 @@ static int vti_input(struct sk_buff *skb, int nexthdr, __be32 spi,
|
|||
|
||||
XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip4 = tunnel;
|
||||
|
||||
return xfrm_input(skb, nexthdr, spi, encap_type);
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
drop:
|
||||
kfree_skb(skb);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vti_input_ipip(struct sk_buff *skb, int nexthdr, __be32 spi,
|
||||
int encap_type)
|
||||
{
|
||||
struct ip_tunnel *tunnel;
|
||||
const struct iphdr *iph = ip_hdr(skb);
|
||||
struct net *net = dev_net(skb->dev);
|
||||
struct ip_tunnel_net *itn = net_generic(net, vti_net_id);
|
||||
|
||||
tunnel = ip_tunnel_lookup(itn, skb->dev->ifindex, TUNNEL_NO_KEY,
|
||||
iph->saddr, iph->daddr, 0);
|
||||
if (tunnel) {
|
||||
if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb))
|
||||
goto drop;
|
||||
|
||||
XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip4 = tunnel;
|
||||
|
||||
skb->dev = tunnel->dev;
|
||||
if (update_skb_dev)
|
||||
skb->dev = tunnel->dev;
|
||||
|
||||
return xfrm_input(skb, nexthdr, spi, encap_type);
|
||||
}
|
||||
|
@ -101,20 +77,28 @@ drop:
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int vti_rcv(struct sk_buff *skb)
|
||||
static int vti_input_proto(struct sk_buff *skb, int nexthdr, __be32 spi,
|
||||
int encap_type)
|
||||
{
|
||||
XFRM_SPI_SKB_CB(skb)->family = AF_INET;
|
||||
XFRM_SPI_SKB_CB(skb)->daddroff = offsetof(struct iphdr, daddr);
|
||||
|
||||
return vti_input(skb, ip_hdr(skb)->protocol, 0, 0);
|
||||
return vti_input(skb, nexthdr, spi, encap_type, false);
|
||||
}
|
||||
|
||||
static int vti_rcv_ipip(struct sk_buff *skb)
|
||||
static int vti_rcv(struct sk_buff *skb, __be32 spi, bool update_skb_dev)
|
||||
{
|
||||
XFRM_SPI_SKB_CB(skb)->family = AF_INET;
|
||||
XFRM_SPI_SKB_CB(skb)->daddroff = offsetof(struct iphdr, daddr);
|
||||
|
||||
return vti_input_ipip(skb, ip_hdr(skb)->protocol, ip_hdr(skb)->saddr, 0);
|
||||
return vti_input(skb, ip_hdr(skb)->protocol, spi, 0, update_skb_dev);
|
||||
}
|
||||
|
||||
static int vti_rcv_proto(struct sk_buff *skb)
|
||||
{
|
||||
return vti_rcv(skb, 0, false);
|
||||
}
|
||||
|
||||
static int vti_rcv_tunnel(struct sk_buff *skb)
|
||||
{
|
||||
return vti_rcv(skb, ip_hdr(skb)->saddr, true);
|
||||
}
|
||||
|
||||
static int vti_rcv_cb(struct sk_buff *skb, int err)
|
||||
|
@ -447,31 +431,31 @@ static void __net_init vti_fb_tunnel_init(struct net_device *dev)
|
|||
}
|
||||
|
||||
static struct xfrm4_protocol vti_esp4_protocol __read_mostly = {
|
||||
.handler = vti_rcv,
|
||||
.input_handler = vti_input,
|
||||
.handler = vti_rcv_proto,
|
||||
.input_handler = vti_input_proto,
|
||||
.cb_handler = vti_rcv_cb,
|
||||
.err_handler = vti4_err,
|
||||
.priority = 100,
|
||||
};
|
||||
|
||||
static struct xfrm4_protocol vti_ah4_protocol __read_mostly = {
|
||||
.handler = vti_rcv,
|
||||
.input_handler = vti_input,
|
||||
.handler = vti_rcv_proto,
|
||||
.input_handler = vti_input_proto,
|
||||
.cb_handler = vti_rcv_cb,
|
||||
.err_handler = vti4_err,
|
||||
.priority = 100,
|
||||
};
|
||||
|
||||
static struct xfrm4_protocol vti_ipcomp4_protocol __read_mostly = {
|
||||
.handler = vti_rcv,
|
||||
.input_handler = vti_input,
|
||||
.handler = vti_rcv_proto,
|
||||
.input_handler = vti_input_proto,
|
||||
.cb_handler = vti_rcv_cb,
|
||||
.err_handler = vti4_err,
|
||||
.priority = 100,
|
||||
};
|
||||
|
||||
static struct xfrm_tunnel ipip_handler __read_mostly = {
|
||||
.handler = vti_rcv_ipip,
|
||||
.handler = vti_rcv_tunnel,
|
||||
.err_handler = vti4_err,
|
||||
.priority = 0,
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue