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>
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 )
{
if ( ipv4_config . no_pmtu_disc )
x - > props . flags | = XFRM_STATE_NOPMTUDISC ;
return 0 ;
}
2005-04-17 02:20:36 +04:00
static void
__xfrm4_init_tempsel ( struct xfrm_state * x , struct flowi * fl ,
struct xfrm_tmpl * tmpl ,
xfrm_address_t * daddr , xfrm_address_t * saddr )
{
x - > sel . daddr . a4 = fl - > fl4_dst ;
x - > sel . saddr . a4 = fl - > fl4_src ;
x - > sel . dport = xfrm_flowi_dport ( fl ) ;
2006-09-28 05:46:11 +04:00
x - > sel . dport_mask = htons ( 0xffff ) ;
2005-04-17 02:20:36 +04:00
x - > sel . sport = xfrm_flowi_sport ( fl ) ;
2006-09-28 05:46:11 +04:00
x - > sel . sport_mask = htons ( 0xffff ) ;
2008-11-05 01:49:19 +03:00
x - > sel . family = AF_INET ;
2005-04-17 02:20:36 +04:00
x - > sel . prefixlen_d = 32 ;
x - > sel . prefixlen_s = 32 ;
x - > sel . proto = fl - > proto ;
x - > sel . ifindex = fl - > oif ;
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 )
{
struct iphdr * iph = ip_hdr ( skb ) ;
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 ,
2007-02-07 01:24:56 +03:00
. output = xfrm4_output ,
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 ,
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