[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openbsd-ipv6
Subject:    kernel
From:       Bob Beck <beck () cvs ! openbsd ! org>
Date:       2000-06-18 2:07:46
[Download RAW message or body]

Index: tcp_usrreq.c
===================================================================
RCS file: /cvs/src/sys/netinet/tcp_usrreq.c,v
retrieving revision 1.41
diff -u -r1.41 tcp_usrreq.c
--- tcp_usrreq.c	2000/06/18 02:02:01	1.41
+++ tcp_usrreq.c	2000/06/18 02:05:47
@@ -809,9 +809,11 @@
 	size_t newlen;
 {
 	int error = 0, s;
+	int is_ipv6 = 0;
 	struct tcp_ident_mapping tir;
 	struct inpcb *inp;
 	struct sockaddr_in *fin, *lin;
+	struct sockaddr_in6 *fin6, *lin6;
 
 	if (oldp == NULL || newp != NULL || newlen != 0)
 		return (EINVAL);
@@ -819,20 +821,39 @@
 		return (ENOMEM);
 	if ((error = copyin(oldp, &tir, sizeof (tir))) != 0 )
 		return (error);
-	if (tir.faddr.sa_len != sizeof (struct sockaddr) ||
-	    tir.faddr.sa_family != AF_INET)
-		return (EINVAL);
-	fin = (struct sockaddr_in *)&tir.faddr;
-	lin = (struct sockaddr_in *)&tir.laddr;
+	if (tir.faddr.ss_family == AF_INET6) {
+		is_ipv6 = 1;
+		fin6 = (struct sockaddr_in6 *)&tir.faddr;
+		lin6 = (struct sockaddr_in6 *)&tir.laddr;
+	}
+	else if (tir.faddr.ss_family == AF_INET) {
+	  	fin = (struct sockaddr_in *)&tir.faddr;
+		lin = (struct sockaddr_in *)&tir.laddr;
+	}
+	else {
+		return(EINVAL);
+	}
 
 	s = splsoftnet();
-	inp = in_pcbhashlookup(&tcbtable,  fin->sin_addr, fin->sin_port,
-	    lin->sin_addr, lin->sin_port);
+	if (is_ipv6)
+		inp = in6_pcbhashlookup(&tcbtable, &fin6->sin6_addr,
+		    fin6->sin6_port, &lin6->sin6_addr, lin6->sin6_port);
+	else 
+		inp = in_pcbhashlookup(&tcbtable,  fin->sin_addr, 
+		    fin->sin_port, lin->sin_addr, lin->sin_port);
+
 	if (inp == NULL) {
 		++tcpstat.tcps_pcbhashmiss;
-		inp = in_pcblookup(&tcbtable, &fin->sin_addr, fin->sin_port,
-		    &lin->sin_addr, lin->sin_port, 0);
-	}
+		if (is_ipv6)
+			inp = in_pcblookup(&tcbtable, &fin6->sin6_addr,
+			    fin6->sin6_port, &lin6->sin6_addr, lin6->sin6_port,
+			    INPLOOKUP_WILDCARD | INPLOOKUP_IPV6);
+		else
+			inp = in_pcblookup(&tcbtable, &fin->sin_addr,
+			    fin->sin_port, &lin->sin_addr, lin->sin_port, 
+			    INPLOOKUP_WILDCARD);
+	}	
+
 	if (inp != NULL && (inp->inp_socket->so_state & SS_CONNECTOUT)) {
 		tir.ruid = inp->inp_socket->so_ruid;
 		tir.euid = inp->inp_socket->so_euid;
Index: tcp_var.h
===================================================================
RCS file: /cvs/src/sys/netinet/tcp_var.h,v
retrieving revision 1.26
diff -u -r1.26 tcp_var.h
--- tcp_var.h	1999/12/21 17:49:28	1.26
+++ tcp_var.h	2000/06/18 02:05:48
@@ -300,13 +300,13 @@
 	{ "baddynamic", CTLTYPE_STRUCT }, \
 	{ "recvspace",	CTLTYPE_INT }, \
 	{ "sendspace",	CTLTYPE_INT }, \
-	{ "ident", CTLTYPE_STRUCT }, \
+	{ "ident", 	CTLTYPE_STRUCT }, \
 	{ "sack",	CTLTYPE_INT }, \
 	{ "mssdflt",	CTLTYPE_INT }, \
 }
 
 struct tcp_ident_mapping {
-	struct sockaddr faddr, laddr;
+	struct sockaddr_storage faddr, laddr;
 	int euid, ruid;
 };
 

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic