xref: /openbmc/linux/net/ipv4/xfrm4_state.c (revision cdca7265)
11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds  * xfrm4_state.c
31da177e4SLinus Torvalds  *
41da177e4SLinus Torvalds  * Changes:
51da177e4SLinus Torvalds  * 	YOSHIFUJI Hideaki @USAGI
61da177e4SLinus Torvalds  * 		Split up af-specific portion
71da177e4SLinus Torvalds  *
81da177e4SLinus Torvalds  */
91da177e4SLinus Torvalds 
10dd87147eSHerbert Xu #include <net/ip.h>
111da177e4SLinus Torvalds #include <net/xfrm.h>
121da177e4SLinus Torvalds #include <linux/pfkeyv2.h>
131da177e4SLinus Torvalds #include <linux/ipsec.h>
141da177e4SLinus Torvalds 
151da177e4SLinus Torvalds static struct xfrm_state_afinfo xfrm4_state_afinfo;
161da177e4SLinus Torvalds 
17dd87147eSHerbert Xu static int xfrm4_init_flags(struct xfrm_state *x)
18dd87147eSHerbert Xu {
19dd87147eSHerbert Xu 	if (ipv4_config.no_pmtu_disc)
20dd87147eSHerbert Xu 		x->props.flags |= XFRM_STATE_NOPMTUDISC;
21dd87147eSHerbert Xu 	return 0;
22dd87147eSHerbert Xu }
23dd87147eSHerbert Xu 
241da177e4SLinus Torvalds static void
251da177e4SLinus Torvalds __xfrm4_init_tempsel(struct xfrm_state *x, struct flowi *fl,
261da177e4SLinus Torvalds 		     struct xfrm_tmpl *tmpl,
271da177e4SLinus Torvalds 		     xfrm_address_t *daddr, xfrm_address_t *saddr)
281da177e4SLinus Torvalds {
291da177e4SLinus Torvalds 	x->sel.daddr.a4 = fl->fl4_dst;
301da177e4SLinus Torvalds 	x->sel.saddr.a4 = fl->fl4_src;
311da177e4SLinus Torvalds 	x->sel.dport = xfrm_flowi_dport(fl);
328f83f23eSAl Viro 	x->sel.dport_mask = htons(0xffff);
331da177e4SLinus Torvalds 	x->sel.sport = xfrm_flowi_sport(fl);
348f83f23eSAl Viro 	x->sel.sport_mask = htons(0xffff);
351da177e4SLinus Torvalds 	x->sel.prefixlen_d = 32;
361da177e4SLinus Torvalds 	x->sel.prefixlen_s = 32;
371da177e4SLinus Torvalds 	x->sel.proto = fl->proto;
381da177e4SLinus Torvalds 	x->sel.ifindex = fl->oif;
391da177e4SLinus Torvalds 	x->id = tmpl->id;
401da177e4SLinus Torvalds 	if (x->id.daddr.a4 == 0)
411da177e4SLinus Torvalds 		x->id.daddr.a4 = daddr->a4;
421da177e4SLinus Torvalds 	x->props.saddr = tmpl->saddr;
431da177e4SLinus Torvalds 	if (x->props.saddr.a4 == 0)
441da177e4SLinus Torvalds 		x->props.saddr.a4 = saddr->a4;
451da177e4SLinus Torvalds 	x->props.mode = tmpl->mode;
461da177e4SLinus Torvalds 	x->props.reqid = tmpl->reqid;
471da177e4SLinus Torvalds 	x->props.family = AF_INET;
481da177e4SLinus Torvalds }
491da177e4SLinus Torvalds 
501da177e4SLinus Torvalds static struct xfrm_state_afinfo xfrm4_state_afinfo = {
511da177e4SLinus Torvalds 	.family			= AF_INET,
52dd87147eSHerbert Xu 	.init_flags		= xfrm4_init_flags,
531da177e4SLinus Torvalds 	.init_tempsel		= __xfrm4_init_tempsel,
54cdca7265SMiika Komu 	.output			= xfrm4_output,
551da177e4SLinus Torvalds };
561da177e4SLinus Torvalds 
571da177e4SLinus Torvalds void __init xfrm4_state_init(void)
581da177e4SLinus Torvalds {
591da177e4SLinus Torvalds 	xfrm_state_register_afinfo(&xfrm4_state_afinfo);
601da177e4SLinus Torvalds }
611da177e4SLinus Torvalds 
620742fd53SAdrian Bunk #if 0
631da177e4SLinus Torvalds void __exit xfrm4_state_fini(void)
641da177e4SLinus Torvalds {
651da177e4SLinus Torvalds 	xfrm_state_unregister_afinfo(&xfrm4_state_afinfo);
661da177e4SLinus Torvalds }
670742fd53SAdrian Bunk #endif  /*  0  */
681da177e4SLinus Torvalds 
69