mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-25 08:02:56 +00:00
[IPSEC] xfrm: Abstract out encapsulation modes
This patch adds the structure xfrm_mode. It is meant to represent the operations carried out by transport/tunnel modes. By doing this we allow additional encapsulation modes to be added without clogging up the xfrm_input/xfrm_output paths. Candidate modes include 4-to-6 tunnel mode, 6-to-4 tunnel mode, and BEET modes. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
546be2405b
commit
b59f45d0b2
17 changed files with 553 additions and 170 deletions
|
@ -13,7 +13,6 @@
|
|||
#include <linux/string.h>
|
||||
#include <linux/netfilter.h>
|
||||
#include <linux/netfilter_ipv4.h>
|
||||
#include <net/inet_ecn.h>
|
||||
#include <net/ip.h>
|
||||
#include <net/xfrm.h>
|
||||
|
||||
|
@ -24,15 +23,6 @@ int xfrm4_rcv(struct sk_buff *skb)
|
|||
|
||||
EXPORT_SYMBOL(xfrm4_rcv);
|
||||
|
||||
static inline void ipip_ecn_decapsulate(struct sk_buff *skb)
|
||||
{
|
||||
struct iphdr *outer_iph = skb->nh.iph;
|
||||
struct iphdr *inner_iph = skb->h.ipiph;
|
||||
|
||||
if (INET_ECN_is_ce(outer_iph->tos))
|
||||
IP_ECN_set_ce(inner_iph);
|
||||
}
|
||||
|
||||
static int xfrm4_parse_spi(struct sk_buff *skb, u8 nexthdr, u32 *spi, u32 *seq)
|
||||
{
|
||||
switch (nexthdr) {
|
||||
|
@ -113,24 +103,10 @@ int xfrm4_rcv_encap(struct sk_buff *skb, __u16 encap_type)
|
|||
|
||||
xfrm_vec[xfrm_nr++] = x;
|
||||
|
||||
iph = skb->nh.iph;
|
||||
if (x->mode->input(x, skb))
|
||||
goto drop;
|
||||
|
||||
if (x->props.mode) {
|
||||
if (iph->protocol != IPPROTO_IPIP)
|
||||
goto drop;
|
||||
if (!pskb_may_pull(skb, sizeof(struct iphdr)))
|
||||
goto drop;
|
||||
if (skb_cloned(skb) &&
|
||||
pskb_expand_head(skb, 0, 0, GFP_ATOMIC))
|
||||
goto drop;
|
||||
if (x->props.flags & XFRM_STATE_DECAP_DSCP)
|
||||
ipv4_copy_dscp(iph, skb->h.ipiph);
|
||||
if (!(x->props.flags & XFRM_STATE_NOECN))
|
||||
ipip_ecn_decapsulate(skb);
|
||||
skb->mac.raw = memmove(skb->data - skb->mac_len,
|
||||
skb->mac.raw, skb->mac_len);
|
||||
skb->nh.raw = skb->data;
|
||||
memset(&(IPCB(skb)->opt), 0, sizeof(struct ip_options));
|
||||
decaps = 1;
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue