Index: openswan-2.6.23/linux/net/ipsec/ipsec_xmit.c
===================================================================
--- openswan-2.6.23.orig/linux/net/ipsec/ipsec_xmit.c	2009-09-09 02:42:54.000000000 +0200
+++ openswan-2.6.23/linux/net/ipsec/ipsec_xmit.c	2009-12-17 15:28:32.000000000 +0100
@@ -116,7 +116,7 @@
 #endif
 
 /* kernels > 2.4.2 */
-#if defined(IP_SELECT_IDENT) && defined(IP_SELECT_IDENT_NEW)
+#if defined(IP_SELECT_IDENT) && defined(IP_SELECT_IDENT_NEW) && LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 30)
 #define KLIPS_IP_SELECT_IDENT(iph, skb) ip_select_ident(iph, skb->dst, NULL)
 #endif
 
@@ -2037,8 +2037,14 @@
 		return IPSEC_XMIT_RECURSDETECT;
 	}
 
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 30)
 	dst_release(ixs->skb->dst);
 	ixs->skb->dst = &ixs->route->u.dst;
+#else
+	dst_release(skb_dst(ixs->skb));
+	skb_dst_set(ixs->skb, &ixs->route->u.dst);
+#endif
+
 	if(ixs->stats) {
 		ixs->stats->tx_bytes += ixs->skb->len;
 	}
Index: openswan-2.6.23/linux/net/ipsec/ipsec_rcv.c
===================================================================
--- openswan-2.6.23.orig/linux/net/ipsec/ipsec_rcv.c	2009-12-17 15:28:32.000000000 +0100
+++ openswan-2.6.23/linux/net/ipsec/ipsec_rcv.c	2009-12-17 15:28:32.000000000 +0100
@@ -1710,10 +1710,18 @@
 	/* release the dst that was attached, since we have likely
 	 * changed the actual destination of the packet.
 	 */
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 30)
 	if(skb->dst) {
 		dst_release(skb->dst);
 		skb->dst = NULL;
 	}
+#else
+	if(skb_dst(skb))
+	{
+		dst_release(skb_dst(skb));
+		skb_dst_set(skb, NULL);
+	}
+#endif
 	skb->pkt_type = PACKET_HOST;
 	if(irs->hard_header_len &&
 	   (skb_mac_header(skb) != (skb_network_header(skb) - irs->hard_header_len)) &&
Index: openswan-2.6.23/linux/include/openswan/ipsec_param.h
===================================================================
--- openswan-2.6.23.orig/linux/include/openswan/ipsec_param.h	2009-09-09 02:42:54.000000000 +0200
+++ openswan-2.6.23/linux/include/openswan/ipsec_param.h	2009-12-17 15:28:32.000000000 +0100
@@ -220,7 +220,12 @@
 
 /* kernels > 2.4.2 */
 #if defined(IP_SELECT_IDENT) && defined(IP_SELECT_IDENT_NEW)
+/* 2.6.31 changed skb_buff */
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 30)
 #define KLIPS_IP_SELECT_IDENT(iph, skb) ip_select_ident(iph, skb->dst, NULL)
+#else
+#define KLIPS_IP_SELECT_IDENT(iph, skb) ip_select_ident(iph, skb_dst(skb), NULL)
+#endif
 #endif
 
 #endif /* SUSE_LINUX_2_4_19_IS_STUPID */
Index: openswan-2.6.23/linux/net/ipsec/pfkey_v2.c
===================================================================
--- openswan-2.6.23.orig/linux/net/ipsec/pfkey_v2.c	2009-09-09 02:42:54.000000000 +0200
+++ openswan-2.6.23/linux/net/ipsec/pfkey_v2.c	2009-12-17 15:28:32.000000000 +0100
@@ -492,7 +492,11 @@
 			printk(" h:0p%p", skb_transport_header(skb));
 			printk(" nh:0p%p", skb_network_header(skb));
 			printk(" mac:0p%p", skb_mac_header(skb));
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 30)
 			printk(" dst:0p%p", skb->dst);
+#else
+			printk(" dst:0p%p", skb_dst(skb));
+#endif
 			if(sysctl_ipsec_debug_verbose) {
 				int i;
 				
Index: openswan-2.6.23/linux/net/ipsec/ipsec_mast.c
===================================================================
--- openswan-2.6.23.orig/linux/net/ipsec/ipsec_mast.c	2009-12-17 15:28:57.000000000 +0100
+++ openswan-2.6.23/linux/net/ipsec/ipsec_mast.c	2009-12-17 15:29:58.000000000 +0100
@@ -178,8 +178,13 @@
 			    ixs->dev->name);
 		return IPSEC_XMIT_RECURSDETECT;
 	}
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 30)
 	dst_release(ixs->skb->dst);
 	ixs->skb->dst = &ixs->route->u.dst;
+#else
+	dst_release(skb_dst(ixs->skb));
+	skb_dst_set(ixs->skb, &ixs->route->u.dst);
+#endif
 	ixs->stats->tx_bytes += ixs->skb->len;
 	if(ixs->skb->len < ixs->skb->nh.raw - ixs->skb->data) {
 		ixs->stats->tx_errors++;
