Signed-off-by: Brian.Haley@hp.com --- linux-2.6.9.orig/include/linux/ipv6.h 2004-10-18 17:54:39.000000000 -0400 +++ linux-2.6.9.rt0/include/linux/ipv6.h 2004-10-22 17:15:52.000000000 -0400 @@ -68,7 +68,7 @@ struct rt0_hdr { struct ipv6_rt_hdr rt_hdr; - __u32 bitmap; /* strict/loose bit map */ + __u32 reserved; struct in6_addr addr[0]; #define rt0_type rt_hdr.type --- linux-2.6.9.orig/net/ipv6/netfilter/ip6t_rt.c 2004-10-22 16:09:32.000000000 -0400 +++ linux-2.6.9.rt0/net/ipv6/netfilter/ip6t_rt.c 2004-10-22 17:14:55.410800617 -0400 @@ -159,8 +159,8 @@ ((rtinfo->hdrlen == hdrlen) ^ !!(rtinfo->invflags & IP6T_RT_INV_LEN)))); DEBUGP("res %02X %02X %02X ", - (rtinfo->flags & IP6T_RT_RES), ((struct rt0_hdr *)route)->bitmap, - !((rtinfo->flags & IP6T_RT_RES) && (((struct rt0_hdr *)route)->bitmap))); + (rtinfo->flags & IP6T_RT_RES), ((struct rt0_hdr *)route)->reserved, + !((rtinfo->flags & IP6T_RT_RES) && (((struct rt0_hdr *)route)->reserved))); ret = (route != NULL) && @@ -176,7 +176,7 @@ ((rtinfo->rt_type == route->type) ^ !!(rtinfo->invflags & IP6T_RT_INV_TYP))) && - !((rtinfo->flags & IP6T_RT_RES) && (((struct rt0_hdr *)route)->bitmap)); + !((rtinfo->flags & IP6T_RT_RES) && (((struct rt0_hdr *)route)->reserved)); DEBUGP("#%d ",rtinfo->addrnr); temp = len = ptr = 0; --- linux-2.6.9.orig/net/ipv6/tcp_ipv6.c 2004-10-18 17:54:32.000000000 -0400 +++ linux-2.6.9.rt0/net/ipv6/tcp_ipv6.c 2004-10-22 17:13:43.386387437 -0400 @@ -1802,6 +1802,7 @@ struct ipv6_pinfo *np = inet6_sk(sk); struct flowi fl; struct dst_entry *dst; + struct in6_addr *final_p = NULL, final; memset(&fl, 0, sizeof(fl)); fl.proto = IPPROTO_TCP; @@ -1815,7 +1816,9 @@ if (np->opt && np->opt->srcrt) { struct rt0_hdr *rt0 = (struct rt0_hdr *) np->opt->srcrt; + ipv6_addr_copy(&final, &fl.fl6_dst); ipv6_addr_copy(&fl.fl6_dst, rt0->addr); + final_p = &final; } dst = __sk_dst_check(sk, np->dst_cookie); @@ -1828,6 +1831,9 @@ return err; } + if (final_p) + ipv6_addr_copy(&fl.fl6_dst, final_p); + if ((err = xfrm_lookup(&dst, &fl, sk, 0)) < 0) { sk->sk_route_caps = 0; dst_release(dst); --- linux-2.6.9.orig/net/ipv6/exthdrs.c 2004-10-18 17:53:07.000000000 -0400 +++ linux-2.6.9.rt0/net/ipv6/exthdrs.c 2004-10-22 17:14:12.413730831 -0400 @@ -404,8 +404,7 @@ memcpy(opt->srcrt, hdr, sizeof(*hdr)); irthdr = (struct rt0_hdr*)opt->srcrt; - /* Obsolete field, MBZ, when originated by us */ - irthdr->bitmap = 0; + irthdr->reserved = 0; opt->srcrt->segments_left = n; for (i=0; iaddr+i, rthdr->addr+(n-1-i), 16);