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