if (exthdrs.ip6e_rthdr) {
rh = mtod(exthdrs.ip6e_rthdr, struct ip6_rthdr *);
if (exthdrs.ip6e_rthdr) {
rh = mtod(exthdrs.ip6e_rthdr, struct ip6_rthdr *);
- bzero(&state, sizeof(state));
- state.m = m;
- error = ipsec6_output_trans(&state, nexthdrp, mprev, sp, flags,
+ ipsec_state.m = m;
+ error = ipsec6_output_trans(&ipsec_state, nexthdrp, mprev, sp, flags,
- bzero(&state, sizeof(state));
- state.m = m;
- state.ro = (struct route *)ro;
- state.dst = (struct sockaddr *)dst;
+ ipsec_state.m = m;
+ route_copyout(&ipsec_state.ro, (struct route *)ro, sizeof(ipsec_state.ro));
+ ipsec_state.dst = (struct sockaddr *)dst;
/* Added a trace here so that we can see packets inside a tunnel */
DTRACE_IP6(send, struct mbuf *, m, struct inpcb *, NULL,
struct ip6_hdr *, ip6, struct ifnet *, trace_ifp,
struct ip *, NULL, struct ip6_hdr *, ip6);
/* Added a trace here so that we can see packets inside a tunnel */
DTRACE_IP6(send, struct mbuf *, m, struct inpcb *, NULL,
struct ip6_hdr *, ip6, struct ifnet *, trace_ifp,
struct ip *, NULL, struct ip6_hdr *, ip6);
- error = ipsec6_output_tunnel(&state, sp, flags, &tunneledv4);
- if (tunneledv4) /* tunneled in IPv4 - packet is gone */
+ error = ipsec6_output_tunnel(&ipsec_state, sp, flags);
+ if (ipsec_state.tunneled == 4) /* tunneled in IPv4 - packet is gone */
- m = state.m;
- ro = (struct route_in6 *)state.ro;
- dst = (struct sockaddr_in6 *)state.dst;
+ m = ipsec_state.m;
+ ipsec_saved_route = ro;
+ ro = (struct route_in6 *)&ipsec_state.ro;
+ dst = (struct sockaddr_in6 *)ipsec_state.dst;
if (ro == &ip6route && ro->ro_rt) { /* brace necessary for rtfree */
rtfree(ro->ro_rt);
} else if (ro_pmtu == &ip6route && ro_pmtu->ro_rt) {
if (ro == &ip6route && ro->ro_rt) { /* brace necessary for rtfree */
rtfree(ro->ro_rt);
} else if (ro_pmtu == &ip6route && ro_pmtu->ro_rt) {