xfrm4_state.c revision 227620e295090629fcb2c46ad3828222ab65438d
11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * xfrm4_state.c
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Changes:
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 	YOSHIFUJI Hideaki @USAGI
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 		Split up af-specific portion
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10dd87147eed934eaff92869f3d158697c7239d1d2Herbert Xu#include <net/ip.h>
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <net/xfrm.h>
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pfkeyv2.h>
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/ipsec.h>
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct xfrm_state_afinfo xfrm4_state_afinfo;
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
17dd87147eed934eaff92869f3d158697c7239d1d2Herbert Xustatic int xfrm4_init_flags(struct xfrm_state *x)
18dd87147eed934eaff92869f3d158697c7239d1d2Herbert Xu{
19dd87147eed934eaff92869f3d158697c7239d1d2Herbert Xu	if (ipv4_config.no_pmtu_disc)
20dd87147eed934eaff92869f3d158697c7239d1d2Herbert Xu		x->props.flags |= XFRM_STATE_NOPMTUDISC;
21dd87147eed934eaff92869f3d158697c7239d1d2Herbert Xu	return 0;
22dd87147eed934eaff92869f3d158697c7239d1d2Herbert Xu}
23dd87147eed934eaff92869f3d158697c7239d1d2Herbert Xu
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds__xfrm4_init_tempsel(struct xfrm_state *x, struct flowi *fl,
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		     struct xfrm_tmpl *tmpl,
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		     xfrm_address_t *daddr, xfrm_address_t *saddr)
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	x->sel.daddr.a4 = fl->fl4_dst;
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	x->sel.saddr.a4 = fl->fl4_src;
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	x->sel.dport = xfrm_flowi_dport(fl);
328f83f23e6db8b9a9fe787d02f73489224668c4e2Al Viro	x->sel.dport_mask = htons(0xffff);
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	x->sel.sport = xfrm_flowi_sport(fl);
348f83f23e6db8b9a9fe787d02f73489224668c4e2Al Viro	x->sel.sport_mask = htons(0xffff);
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	x->sel.prefixlen_d = 32;
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	x->sel.prefixlen_s = 32;
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	x->sel.proto = fl->proto;
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	x->sel.ifindex = fl->oif;
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	x->id = tmpl->id;
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (x->id.daddr.a4 == 0)
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		x->id.daddr.a4 = daddr->a4;
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	x->props.saddr = tmpl->saddr;
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (x->props.saddr.a4 == 0)
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		x->props.saddr.a4 = saddr->a4;
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	x->props.mode = tmpl->mode;
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	x->props.reqid = tmpl->reqid;
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	x->props.family = AF_INET;
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5036cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xuint xfrm4_extract_header(struct sk_buff *skb)
5136cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu{
5236cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu	struct iphdr *iph = ip_hdr(skb);
5336cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu
5436cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu	XFRM_MODE_SKB_CB(skb)->id = iph->id;
5536cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu	XFRM_MODE_SKB_CB(skb)->frag_off = iph->frag_off;
5636cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu	XFRM_MODE_SKB_CB(skb)->tos = iph->tos;
5736cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu	XFRM_MODE_SKB_CB(skb)->ttl = iph->ttl;
5836cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu	XFRM_MODE_SKB_CB(skb)->protocol = iph->protocol;
5936cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu	memset(XFRM_MODE_SKB_CB(skb)->flow_lbl, 0,
6036cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu	       sizeof(XFRM_MODE_SKB_CB(skb)->flow_lbl));
6136cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu
6236cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu	return 0;
6336cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu}
6436cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct xfrm_state_afinfo xfrm4_state_afinfo = {
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.family			= AF_INET,
6736cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu	.proto			= IPPROTO_IPIP,
68227620e295090629fcb2c46ad3828222ab65438dHerbert Xu	.eth_proto		= htons(ETH_P_IP),
6917c2a42a24e1e8dd6aa7cea4f84e034ab1bfff31Herbert Xu	.owner			= THIS_MODULE,
70dd87147eed934eaff92869f3d158697c7239d1d2Herbert Xu	.init_flags		= xfrm4_init_flags,
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.init_tempsel		= __xfrm4_init_tempsel,
72cdca72652adf597f7fef821a27595fd0dd5eea19Miika Komu	.output			= xfrm4_output,
73227620e295090629fcb2c46ad3828222ab65438dHerbert Xu	.extract_input		= xfrm4_extract_input,
7436cf9acf93e8561d9faec24849e57688a81eb9c5Herbert Xu	.extract_output		= xfrm4_extract_output,
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid __init xfrm4_state_init(void)
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	xfrm_state_register_afinfo(&xfrm4_state_afinfo);
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
820742fd53a3774781255bd1e471e7aa2e4a82d5f7Adrian Bunk#if 0
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid __exit xfrm4_state_fini(void)
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	xfrm_state_unregister_afinfo(&xfrm4_state_afinfo);
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
870742fd53a3774781255bd1e471e7aa2e4a82d5f7Adrian Bunk#endif  /*  0  */
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
89