Module Name:    src
Committed By:   ozaki-r
Date:           Mon Nov  7 01:55:17 UTC 2016

Modified Files:
        src/sys/netinet6: ip6_output.c

Log Message:
Pull routing header handling out of ip6_output

No functional change.


To generate a diff of this commit:
cvs rdiff -u -r1.176 -r1.177 src/sys/netinet6/ip6_output.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/netinet6/ip6_output.c
diff -u src/sys/netinet6/ip6_output.c:1.176 src/sys/netinet6/ip6_output.c:1.177
--- src/sys/netinet6/ip6_output.c:1.176	Mon Nov  7 01:05:39 2016
+++ src/sys/netinet6/ip6_output.c	Mon Nov  7 01:55:17 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: ip6_output.c,v 1.176 2016/11/07 01:05:39 ozaki-r Exp $	*/
+/*	$NetBSD: ip6_output.c,v 1.177 2016/11/07 01:55:17 ozaki-r Exp $	*/
 /*	$KAME: ip6_output.c,v 1.172 2001/03/25 09:55:56 itojun Exp $	*/
 
 /*
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip6_output.c,v 1.176 2016/11/07 01:05:39 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip6_output.c,v 1.177 2016/11/07 01:55:17 ozaki-r Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -136,11 +136,50 @@ static int ip6_splithdr(struct mbuf *, s
 static int ip6_getpmtu(struct rtentry *, struct ifnet *, u_long *, int *);
 static int copypktopts(struct ip6_pktopts *, struct ip6_pktopts *, int);
 static int ip6_ifaddrvalid(const struct in6_addr *);
+static int ip6_handle_rthdr(struct ip6_rthdr *, struct ip6_hdr *);
 
 #ifdef RFC2292
 static int ip6_pcbopts(struct ip6_pktopts **, struct socket *, struct sockopt *);
 #endif
 
+static int
+ip6_handle_rthdr(struct ip6_rthdr *rh, struct ip6_hdr *ip6)
+{
+	struct ip6_rthdr0 *rh0;
+	struct in6_addr *addr;
+	struct sockaddr_in6 sa;
+	int error = 0;
+
+	switch (rh->ip6r_type) {
+	case IPV6_RTHDR_TYPE_0:
+		 rh0 = (struct ip6_rthdr0 *)rh;
+		 addr = (struct in6_addr *)(rh0 + 1);
+
+		 /*
+		  * construct a sockaddr_in6 form of the first hop.
+		  *
+		  * XXX we may not have enough information about its scope zone;
+		  * there is no standard API to pass the information from the
+		  * application.
+		  */
+		 sockaddr_in6_init(&sa, addr, 0, 0, 0);
+		 error = sa6_embedscope(&sa, ip6_use_defzone);
+		 if (error != 0)
+			 break;
+		 (void)memmove(&addr[0], &addr[1],
+		     sizeof(struct in6_addr) * (rh0->ip6r0_segleft - 1));
+		 addr[rh0->ip6r0_segleft - 1] = ip6->ip6_dst;
+		 ip6->ip6_dst = sa.sin6_addr;
+		 /* XXX */
+		 in6_clearscope(addr + rh0->ip6r0_segleft - 1);
+		 break;
+	default:	/* is it possible? */
+		 error = EINVAL;
+	}
+
+	return error;
+}
+
 /*
  * IP6 output. The packet in mbuf chain m contains a skeletal IP6
  * header (with pri, len, nxt, hlim, src, dst).
@@ -375,45 +414,14 @@ ip6_output(
 	 */
 	if (exthdrs.ip6e_rthdr) {
 		struct ip6_rthdr *rh;
-		struct ip6_rthdr0 *rh0;
-		struct in6_addr *addr;
-		struct sockaddr_in6 sa;
 
 		rh = (struct ip6_rthdr *)(mtod(exthdrs.ip6e_rthdr,
 		    struct ip6_rthdr *));
-		finaldst = ip6->ip6_dst;
-		switch (rh->ip6r_type) {
-		case IPV6_RTHDR_TYPE_0:
-			 rh0 = (struct ip6_rthdr0 *)rh;
-			 addr = (struct in6_addr *)(rh0 + 1);
+		finaldst = ip6->ip6_dst; /* need to save for pmtu */
 
-			 /*
-			  * construct a sockaddr_in6 form of
-			  * the first hop.
-			  *
-			  * XXX: we may not have enough
-			  * information about its scope zone;
-			  * there is no standard API to pass
-			  * the information from the
-			  * application.
-			  */
-			 sockaddr_in6_init(&sa, addr, 0, 0, 0);
-			 if ((error = sa6_embedscope(&sa,
-			     ip6_use_defzone)) != 0) {
-				 goto bad;
-			 }
-			 ip6->ip6_dst = sa.sin6_addr;
-			 (void)memmove(&addr[0], &addr[1],
-			     sizeof(struct in6_addr) *
-			     (rh0->ip6r0_segleft - 1));
-			 addr[rh0->ip6r0_segleft - 1] = finaldst;
-			 /* XXX */
-			 in6_clearscope(addr + rh0->ip6r0_segleft - 1);
-			 break;
-		default:	/* is it possible? */
-			 error = EINVAL;
-			 goto bad;
-		}
+		error = ip6_handle_rthdr(rh, ip6);
+		if (error != 0)
+			goto bad;
 	}
 
 	/* Source address validation */

Reply via email to