2005-04-16 15:20:36 -07:00
/*
* xfrm4_state . c
*
* Changes :
* YOSHIFUJI Hideaki @ USAGI
* Split up af - specific portion
*
*/
2005-06-20 13:21:43 -07:00
# include <net/ip.h>
2005-04-16 15:20:36 -07:00
# include <net/xfrm.h>
# include <linux/pfkeyv2.h>
# include <linux/ipsec.h>
2007-11-13 21:43:11 -08:00
# include <linux/netfilter_ipv4.h>
2011-07-15 11:47:34 -04:00
# include <linux/export.h>
2005-04-16 15:20:36 -07:00
2005-06-20 13:21:43 -07:00
static int xfrm4_init_flags ( struct xfrm_state * x )
{
2013-12-14 05:13:38 +01:00
if ( xs_net ( x ) - > ipv4 . sysctl_ip_no_pmtu_disc )
2005-06-20 13:21:43 -07:00
x - > props . flags | = XFRM_STATE_NOPMTUDISC ;
return 0 ;
}
2005-04-16 15:20:36 -07:00
static void
2011-02-22 17:51:44 -08:00
__xfrm4_init_tempsel ( struct xfrm_selector * sel , const struct flowi * fl )
2010-09-20 11:11:38 -07:00
{
2011-03-12 02:42:11 -05:00
const struct flowi4 * fl4 = & fl - > u . ip4 ;
sel - > daddr . a4 = fl4 - > daddr ;
sel - > saddr . a4 = fl4 - > saddr ;
sel - > dport = xfrm_flowi_dport ( fl , & fl4 - > uli ) ;
2010-09-20 11:11:38 -07:00
sel - > dport_mask = htons ( 0xffff ) ;
2011-03-12 02:42:11 -05:00
sel - > sport = xfrm_flowi_sport ( fl , & fl4 - > uli ) ;
2010-09-20 11:11:38 -07:00
sel - > sport_mask = htons ( 0xffff ) ;
sel - > family = AF_INET ;
sel - > prefixlen_d = 32 ;
sel - > prefixlen_s = 32 ;
2011-03-12 02:42:11 -05:00
sel - > proto = fl4 - > flowi4_proto ;
sel - > ifindex = fl4 - > flowi4_oif ;
2010-09-20 11:11:38 -07:00
}
static void
2011-02-24 00:07:20 -05:00
xfrm4_init_temprop ( struct xfrm_state * x , const struct xfrm_tmpl * tmpl ,
const xfrm_address_t * daddr , const xfrm_address_t * saddr )
2005-04-16 15:20:36 -07:00
{
x - > id = tmpl - > id ;
if ( x - > id . daddr . a4 = = 0 )
x - > id . daddr . a4 = daddr - > a4 ;
x - > props . saddr = tmpl - > saddr ;
if ( x - > props . saddr . a4 = = 0 )
x - > props . saddr . a4 = saddr - > a4 ;
x - > props . mode = tmpl - > mode ;
x - > props . reqid = tmpl - > reqid ;
x - > props . family = AF_INET ;
}
2007-11-13 21:40:52 -08:00
int xfrm4_extract_header ( struct sk_buff * skb )
{
2011-04-22 04:53:02 +00:00
const struct iphdr * iph = ip_hdr ( skb ) ;
2007-11-13 21:40:52 -08:00
2008-03-26 16:51:09 -07:00
XFRM_MODE_SKB_CB ( skb ) - > ihl = sizeof ( * iph ) ;
2007-11-13 21:40:52 -08:00
XFRM_MODE_SKB_CB ( skb ) - > id = iph - > id ;
XFRM_MODE_SKB_CB ( skb ) - > frag_off = iph - > frag_off ;
XFRM_MODE_SKB_CB ( skb ) - > tos = iph - > tos ;
XFRM_MODE_SKB_CB ( skb ) - > ttl = iph - > ttl ;
2008-03-26 16:51:09 -07:00
XFRM_MODE_SKB_CB ( skb ) - > optlen = iph - > ihl * 4 - sizeof ( * iph ) ;
2007-11-13 21:40:52 -08:00
memset ( XFRM_MODE_SKB_CB ( skb ) - > flow_lbl , 0 ,
sizeof ( XFRM_MODE_SKB_CB ( skb ) - > flow_lbl ) ) ;
return 0 ;
}
2005-04-16 15:20:36 -07:00
static struct xfrm_state_afinfo xfrm4_state_afinfo = {
. family = AF_INET ,
2007-11-13 21:40:52 -08:00
. proto = IPPROTO_IPIP ,
2007-11-13 21:41:28 -08:00
. eth_proto = htons ( ETH_P_IP ) ,
2007-10-17 21:33:12 -07:00
. owner = THIS_MODULE ,
2005-06-20 13:21:43 -07:00
. init_flags = xfrm4_init_flags ,
2005-04-16 15:20:36 -07:00
. init_tempsel = __xfrm4_init_tempsel ,
2010-09-20 11:11:38 -07:00
. init_temprop = xfrm4_init_temprop ,
2007-02-06 14:24:56 -08:00
. output = xfrm4_output ,
2011-05-09 19:36:38 +00:00
. output_finish = xfrm4_output_finish ,
2007-11-13 21:41:28 -08:00
. extract_input = xfrm4_extract_input ,
2007-11-13 21:40:52 -08:00
. extract_output = xfrm4_extract_output ,
2007-11-13 21:44:23 -08:00
. transport_finish = xfrm4_transport_finish ,
2013-08-14 13:05:23 +02:00
. local_error = xfrm4_local_error ,
2005-04-16 15:20:36 -07:00
} ;
void __init xfrm4_state_init ( void )
{
xfrm_state_register_afinfo ( & xfrm4_state_afinfo ) ;
}
2005-08-09 19:35:47 -07:00
#if 0
2005-04-16 15:20:36 -07:00
void __exit xfrm4_state_fini ( void )
{
xfrm_state_unregister_afinfo ( & xfrm4_state_afinfo ) ;
}
2005-08-09 19:35:47 -07:00
# endif /* 0 */
2005-04-16 15:20:36 -07:00