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 __read_mostly;
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");