[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