Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 19 Dec 2012 17:28:18 +0000 (UTC)
From:      "Andrey V. Elsukov" <ae@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r244441 - head/sys/netinet6
Message-ID:  <201212191728.qBJHSIKe047466@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ae
Date: Wed Dec 19 17:28:17 2012
New Revision: 244441
URL: http://svnweb.freebsd.org/changeset/base/244441

Log:
  When we have some address to forward (e.g. it was specified with ipfw fwd),
  we should pass it as first argument into in6_selectroute_fib function to
  initiate new route lookup.
  
  MFC after:	1 week

Modified:
  head/sys/netinet6/ip6_output.c

Modified: head/sys/netinet6/ip6_output.c
==============================================================================
--- head/sys/netinet6/ip6_output.c	Wed Dec 19 17:08:49 2012	(r244440)
+++ head/sys/netinet6/ip6_output.c	Wed Dec 19 17:28:17 2012	(r244441)
@@ -257,7 +257,7 @@ ip6_output(struct mbuf *m0, struct ip6_p
 	int segleft_org = 0;
 	struct secpolicy *sp = NULL;
 #endif /* IPSEC */
-	struct m_tag *fwd_tag;
+	struct m_tag *fwd_tag = NULL;
 
 	ip6 = mtod(m, struct ip6_hdr *);
 	if (ip6 == NULL) {
@@ -636,14 +636,16 @@ again:
 	/* adjust pointer */
 	ip6 = mtod(m, struct ip6_hdr *);
 
-	if (ro->ro_rt) {
+	if (ro->ro_rt && fwd_tag == NULL) {
 		rt = ro->ro_rt;
 		ifp = ro->ro_rt->rt_ifp;
 	} else {
-		bzero(&dst_sa, sizeof(dst_sa));
-		dst_sa.sin6_family = AF_INET6;
-		dst_sa.sin6_len = sizeof(dst_sa);
-		dst_sa.sin6_addr = ip6->ip6_dst;
+		if (fwd_tag == NULL) {
+			bzero(&dst_sa, sizeof(dst_sa));
+			dst_sa.sin6_family = AF_INET6;
+			dst_sa.sin6_len = sizeof(dst_sa);
+			dst_sa.sin6_addr = ip6->ip6_dst;
+		}
 		error = in6_selectroute_fib(&dst_sa, opt, im6o, ro, &ifp,
 		    &rt, inp ? inp->inp_inc.inc_fibnum : M_GETFIB(m));
 		if (error != 0) {
@@ -928,7 +930,7 @@ again:
 	if ((m->m_flags & M_IP6_NEXTHOP) &&
 	    (fwd_tag = m_tag_find(m, PACKET_TAG_IPFORWARD, NULL)) != NULL) {
 		dst = (struct sockaddr_in6 *)&ro->ro_dst;
-		bcopy((fwd_tag+1), dst, sizeof(struct sockaddr_in6));
+		bcopy((fwd_tag+1), &dst_sa, sizeof(struct sockaddr_in6));
 		m->m_flags |= M_SKIP_FIREWALL;
 		m->m_flags &= ~M_IP6_NEXTHOP;
 		m_tag_delete(m, fwd_tag);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201212191728.qBJHSIKe047466>