[XFRM] IPV6: Fix outbound RO transformation which is broken by IPsec tunnel patch.
authorMasahide NAKAMURA <nakam@linux-ipv6.org>
Sat, 10 Feb 2007 05:22:16 +0000 (21:22 -0800)
committerDavid S. Miller <davem@sunset.davemloft.net>
Sun, 11 Feb 2007 07:20:47 +0000 (23:20 -0800)
It seems to miss RO mode path by IPv6 over IPv4 IPsec tunnel patch
when it changed semantics to check the mode from
"xfrm[i]->props.mode != XFRM_MODE_TRANSPORT" to
"xfrm[i]->props.mode == XFRM_MODE_TUNNEL" before changing address.
It also makes two incline functions __xfrm6_bundle_addr_{remote,local}
are used by nobody.

This patch fixes it.

Signed-off-by: Masahide NAKAMURA <nakam@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/xfrm6_policy.c

index 55f650c4967853c5a6325f4e7cf09b362b9f6f27..b1133f27c8aed0ce5578d0417c0c704bc1650c9b 100644 (file)
@@ -178,7 +178,8 @@ __xfrm6_bundle_create(struct xfrm_policy *policy, struct xfrm_state **xfrm, int
                __xfrm6_bundle_len_inc(&header_len, &nfheader_len, xfrm[i]);
                trailer_len += xfrm[i]->props.trailer_len;
 
-               if (xfrm[i]->props.mode == XFRM_MODE_TUNNEL) {
+               if (xfrm[i]->props.mode == XFRM_MODE_TUNNEL ||
+                   xfrm[i]->props.mode == XFRM_MODE_ROUTEOPTIMIZATION) {
                        unsigned short encap_family = xfrm[i]->props.family;
                        switch(encap_family) {
                        case AF_INET:
@@ -186,8 +187,9 @@ __xfrm6_bundle_create(struct xfrm_policy *policy, struct xfrm_state **xfrm, int
                                fl_tunnel.fl4_src = xfrm[i]->props.saddr.a4;
                                break;
                        case AF_INET6:
-                               ipv6_addr_copy(&fl_tunnel.fl6_dst, (struct in6_addr*)&xfrm[i]->id.daddr.a6);
-                               ipv6_addr_copy(&fl_tunnel.fl6_src, (struct in6_addr*)&xfrm[i]->props.saddr.a6);
+                               ipv6_addr_copy(&fl_tunnel.fl6_dst, __xfrm6_bundle_addr_remote(xfrm[i], &fl->fl6_dst));
+
+                               ipv6_addr_copy(&fl_tunnel.fl6_src, __xfrm6_bundle_addr_remote(xfrm[i], &fl->fl6_src));
                                break;
                        default:
                                BUG_ON(1);