5 * YOSHIFUJI Hideaki @USAGI
6 * Split up af-specific portion
10 #include <linux/slab.h>
11 #include <linux/module.h>
15 static kmem_cache_t
*secpath_cachep
;
17 void __secpath_destroy(struct sec_path
*sp
)
20 for (i
= 0; i
< sp
->len
; i
++)
21 xfrm_state_put(sp
->x
[i
].xvec
);
22 kmem_cache_free(secpath_cachep
, sp
);
24 EXPORT_SYMBOL(__secpath_destroy
);
26 struct sec_path
*secpath_dup(struct sec_path
*src
)
30 sp
= kmem_cache_alloc(secpath_cachep
, SLAB_ATOMIC
);
38 memcpy(sp
, src
, sizeof(*sp
));
39 for (i
= 0; i
< sp
->len
; i
++)
40 xfrm_state_hold(sp
->x
[i
].xvec
);
42 atomic_set(&sp
->refcnt
, 1);
45 EXPORT_SYMBOL(secpath_dup
);
47 /* Fetch spi and seq from ipsec header */
49 int xfrm_parse_spi(struct sk_buff
*skb
, u8 nexthdr
, u32
*spi
, u32
*seq
)
51 int offset
, offset_seq
;
55 offset
= offsetof(struct ip_auth_hdr
, spi
);
56 offset_seq
= offsetof(struct ip_auth_hdr
, seq_no
);
59 offset
= offsetof(struct ip_esp_hdr
, spi
);
60 offset_seq
= offsetof(struct ip_esp_hdr
, seq_no
);
63 if (!pskb_may_pull(skb
, sizeof(struct ip_comp_hdr
)))
65 *spi
= ntohl(ntohs(*(u16
*)(skb
->h
.raw
+ 2)));
72 if (!pskb_may_pull(skb
, 16))
75 *spi
= *(u32
*)(skb
->h
.raw
+ offset
);
76 *seq
= *(u32
*)(skb
->h
.raw
+ offset_seq
);
79 EXPORT_SYMBOL(xfrm_parse_spi
);
81 void __init
xfrm_input_init(void)
83 secpath_cachep
= kmem_cache_create("secpath_cache",
84 sizeof(struct sec_path
),
85 0, SLAB_HWCACHE_ALIGN
,
88 panic("XFRM: failed to allocate secpath_cache\n");