changeset 10520:1303da84e47a

6228975 Need IPv6 support for KSSL 6627569 need kssl_sid_cached kstat counter 6846333 ksslcfg no longer displays version 6668826 missing curly brackets in kssl_release_ent 6873066 cleanup unused code in ksslproto.h and ksslapi.h
author Krishna Yenduri <Bhargava.Yenduri@Sun.COM>
date Mon, 14 Sep 2009 11:09:53 -0700
parents 5d153c0fe8de
children 1eaab2a76b85
files usr/src/cmd/cmd-inet/usr.sbin/kssl/kssladm/Makefile usr/src/cmd/cmd-inet/usr.sbin/kssl/kssladm/kssladm.h usr/src/cmd/cmd-inet/usr.sbin/kssl/kssladm/kssladm_create.c usr/src/cmd/cmd-inet/usr.sbin/kssl/kssladm/kssladm_delete.c usr/src/cmd/cmd-inet/usr.sbin/kssl/ksslcfg/ksslcfg.c usr/src/uts/common/c2/audit.c usr/src/uts/common/inet/kssl/kssl.c usr/src/uts/common/inet/kssl/kssl.h usr/src/uts/common/inet/kssl/ksslapi.c usr/src/uts/common/inet/kssl/ksslapi.h usr/src/uts/common/inet/kssl/ksslimpl.h usr/src/uts/common/inet/kssl/ksslioctl.c usr/src/uts/common/inet/kssl/ksslproto.h usr/src/uts/common/inet/kssl/ksslrec.c usr/src/uts/common/inet/tcp/tcp_kssl.c
diffstat 15 files changed, 268 insertions(+), 293 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/cmd/cmd-inet/usr.sbin/kssl/kssladm/Makefile	Mon Sep 14 10:21:57 2009 -0700
+++ b/usr/src/cmd/cmd-inet/usr.sbin/kssl/kssladm/Makefile	Mon Sep 14 11:09:53 2009 -0700
@@ -19,11 +19,9 @@
 # CDDL HEADER END
 #
 #
-# Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
+# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 # Use is subject to license terms.
 # 
-# ident	"%Z%%M%	%I%	%E% SMI"
-#
 # cmd/cmd-inet/usr.sbin/kssl/kssladm/Makefile
 #
 
@@ -45,7 +43,7 @@
 
 CFLAGS +=	$(CCVERBOSE)
 
-LDLIBS += -lkmf -lpkcs11 -lcryptoutil -lnsl
+LDLIBS += -lkmf -lpkcs11 -lcryptoutil -lnsl -lsocket
 
 all: $(PROG)
 
--- a/usr/src/cmd/cmd-inet/usr.sbin/kssl/kssladm/kssladm.h	Mon Sep 14 10:21:57 2009 -0700
+++ b/usr/src/cmd/cmd-inet/usr.sbin/kssl/kssladm/kssladm.h	Mon Sep 14 11:09:53 2009 -0700
@@ -20,15 +20,13 @@
  */
 
 /*
- * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
 #ifndef _KSSLADM_H
 #define	_KSSLADM_H
 
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
 /*
  * Common routines and variables used by kssladm files.
  */
@@ -69,7 +67,8 @@
 
 extern int get_passphrase(const char *password_file, char *buf, int buf_size);
 extern int kssl_send_command(char *buf, int cmd);
-extern int parse_and_set_addr(char *arg1, char *arg2, struct sockaddr_in *addr);
+extern int parse_and_set_addr(char *arg1, char *arg2,
+    struct sockaddr_in6 *addr);
 
 #ifdef __cplusplus
 }
--- a/usr/src/cmd/cmd-inet/usr.sbin/kssl/kssladm/kssladm_create.c	Mon Sep 14 10:21:57 2009 -0700
+++ b/usr/src/cmd/cmd-inet/usr.sbin/kssl/kssladm/kssladm_create.c	Mon Sep 14 11:09:53 2009 -0700
@@ -20,12 +20,10 @@
  */
 
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
 #include <errno.h>
 #include <sys/sysmacros.h>
 #include <security/cryptoki.h>
@@ -311,7 +309,6 @@
 	static CK_BYTE aes_param[16];
 	static CK_OBJECT_CLASS privkey_class = CKO_PRIVATE_KEY;
 	static CK_KEY_TYPE privkey_type = CKK_RSA;
-	static CK_BBOOL true = TRUE;
 	static CK_BBOOL false = FALSE;
 	boolean_t kmftrue = B_TRUE;
 	boolean_t kmffalse = B_FALSE;
@@ -485,7 +482,7 @@
 	 * Create a label for the wrapped session key so we can find
 	 * it easier later.
 	 */
-	snprintf(wrapkey_label, sizeof (wrapkey_label), "ksslprikey_%d",
+	(void) snprintf(wrapkey_label, sizeof (wrapkey_label), "ksslprikey_%d",
 	    getpid());
 
 	unwrap_tmpl[5].pValue = wrapkey_label;
@@ -564,10 +561,10 @@
 		free(wrapped_privkey);
 
 	if (aes_key_obj != CK_INVALID_HANDLE)
-		C_DestroyObject(pk11session, aes_key_obj);
+		(void) C_DestroyObject(pk11session, aes_key_obj);
 
 	if (sess_privkey_obj != CK_INVALID_HANDLE)
-		C_DestroyObject(pk11session, sess_privkey_obj);
+		(void) C_DestroyObject(pk11session, sess_privkey_obj);
 
 	return (rv);
 }
@@ -930,35 +927,33 @@
 
 int
 parse_and_set_addr(char *server_address, char *server_port,
-    struct sockaddr_in *addr)
+    struct sockaddr_in6 *addr)
 {
 	if (server_port == NULL) {
 		return (-1);
 	}
 
 	if (server_address == NULL) {
-		addr->sin_addr.s_addr = INADDR_ANY;
+		addr->sin6_addr = in6addr_any;
 	} else {
-		addr->sin_addr.s_addr = inet_addr(server_address);
-		if ((int)addr->sin_addr.s_addr == -1) {
-			struct hostent *hp;
+		struct hostent *hp;
+		int error_num;
 
-			if ((hp = gethostbyname(server_address)) == NULL) {
-				(void) fprintf(stderr,
-				    "Error: Unknown host: %s\n",
-				    server_address);
-				return (-1);
-			}
+		if ((hp = (getipnodebyname(server_address, AF_INET6,
+		    AI_DEFAULT, &error_num))) == NULL) {
+			(void) fprintf(stderr, "Error: Unknown host: %s\n",
+			    server_address);
+			return (-1);
+		}
 
-			(void) memcpy(&addr->sin_addr.s_addr,
-			    hp->h_addr_list[0],
-			    sizeof (addr->sin_addr.s_addr));
-		}
+		(void) memcpy((caddr_t)&addr->sin6_addr, hp->h_addr,
+		    hp->h_length);
+		freehostent(hp);
 	}
 
 	errno = 0;
-	addr->sin_port = strtol(server_port, NULL, 10);
-	if (addr->sin_port == 0 || errno != 0) {
+	addr->sin6_port = strtol(server_port, NULL, 10);
+	if (addr->sin6_port == 0 || errno != 0) {
 		(void) fprintf(stderr, "Error: Invalid Port value: %s\n",
 		    server_port);
 		return (-1);
@@ -1037,7 +1032,7 @@
 	uint32_t scache_size = DEFAULT_SID_CACHE_NENTRIES;
 	uint16_t kssl_suites[CIPHER_SUITE_COUNT - 1];
 	int proxy_port = -1;
-	struct sockaddr_in server_addr;
+	struct sockaddr_in6 server_addr;
 	char *format = NULL;
 	char *port, *addr;
 	char c;
@@ -1113,8 +1108,12 @@
 	}
 
 	if (verbose) {
-		(void) printf("addr=%s, port = %d\n",
-		    inet_ntoa(server_addr.sin_addr), server_addr.sin_port);
+		char buffer[128];
+
+		(void) inet_ntop(AF_INET6, &server_addr.sin6_addr, buffer,
+		    sizeof (buffer));
+		(void) printf("addr = %s, port = %d\n", buffer,
+		    server_addr.sin6_port);
 	}
 
 	if (format == NULL || proxy_port == -1) {
--- a/usr/src/cmd/cmd-inet/usr.sbin/kssl/kssladm/kssladm_delete.c	Mon Sep 14 10:21:57 2009 -0700
+++ b/usr/src/cmd/cmd-inet/usr.sbin/kssl/kssladm/kssladm_delete.c	Mon Sep 14 11:09:53 2009 -0700
@@ -2,9 +2,8 @@
  * CDDL HEADER START
  *
  * The contents of this file are subject to the terms of the
- * Common Development and Distribution License, Version 1.0 only
- * (the "License").  You may not use this file except in compliance
- * with the License.
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
  *
  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  * or http://www.opensolaris.org/os/licensing.
@@ -20,12 +19,10 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
 #include <netinet/in.h> /* struct sockaddr_in */
 #include <stdio.h>
 #include <stdlib.h>
@@ -47,7 +44,7 @@
 int
 do_delete(int argc, char *argv[])
 {
-	struct sockaddr_in server_addr;
+	struct sockaddr_in6 server_addr;
 	char c;
 	char *port, *addr;
 	int pcnt;
--- a/usr/src/cmd/cmd-inet/usr.sbin/kssl/ksslcfg/ksslcfg.c	Mon Sep 14 10:21:57 2009 -0700
+++ b/usr/src/cmd/cmd-inet/usr.sbin/kssl/ksslcfg/ksslcfg.c	Mon Sep 14 11:09:53 2009 -0700
@@ -19,12 +19,10 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
 #include <arpa/inet.h> /* inet_addr() */
 #include <ctype.h>
 #include <libscf.h>
@@ -46,7 +44,11 @@
  * It makes use of kssladm(1M) which does the grunt work.
  */
 
-#define	KSSLCFG_VERSION "v%I%"
+/*
+ * This version number is rather meaningless. In any case,
+ * version 2.0 adds support for IPv6 addresses.
+ */
+#define	KSSLCFG_VERSION "Version 2.0"
 
 boolean_t verbose = B_FALSE;
 const char *SERVICE_NAME = "network/ssl/proxy";
@@ -96,12 +98,12 @@
 	int len;
 	uint16_t port;
 	char *cname;
-	in_addr_t addr;
 	char *instance_name;
 	const char *prefix = "kssl-";
-	char *first_space = strchr(arg, ' ');
+	char *first_space;
 
-	if (first_space == NULL) {
+	first_space = strchr(arg, ' ');
+	if (first_space == NULL) {	/* No host name. Use INADDR_ANY. */
 		if (get_portnum(arg, &port) == 0) {
 			(void) fprintf(stderr,
 			    gettext("Error: Invalid port value -- %s\n"),
@@ -116,6 +118,9 @@
 		char *ptr;
 		struct hostent *hp;
 		boolean_t do_warn;
+		int error_num;
+		in_addr_t v4addr;
+		in6_addr_t v6addr;
 
 		if (get_portnum(first_space + 1, &port) == 0) {
 			(void) fprintf(stderr,
@@ -129,30 +134,35 @@
 			return (NULL);
 		*(strchr(temp_str, ' ')) = '\0';
 
-		if ((int)(addr = inet_addr(temp_str)) == -1) {
-			if ((hp = gethostbyname(temp_str)) == NULL) {
-				(void) fprintf(stderr,
-				    gettext("Error: Unknown host -- %s\n"),
-				    temp_str);
-				free(temp_str);
-				return (NULL);
-			}
+		if (inet_pton(AF_INET6, temp_str, &v6addr) == 1) {
+			/* Do a reverse lookup for the IPv6 address */
+			hp = getipnodebyaddr(&v6addr, sizeof (v6addr),
+			    AF_INET6, &error_num);
+		} else if (inet_pton(AF_INET, temp_str, &v4addr) == 1) {
+			/* Do a reverse lookup for the IPv4 address */
+			hp = getipnodebyaddr(&v4addr, sizeof (v4addr),
+			    AF_INET, &error_num);
 		} else {
-			/* This is an IP address. Do a reverse lookup. */
-			if ((hp = gethostbyaddr((char *)&addr, 4, AF_INET))
-			    == NULL) {
-				(void) fprintf(stderr,
-				    gettext("Error: Unknown host -- %s\n"),
-				    temp_str);
-				free(temp_str);
-				return (NULL);
-			}
+			/* Do a lookup for the host name */
+			hp = getipnodebyname(temp_str, AF_INET6, AI_DEFAULT,
+			    &error_num);
+		}
+
+		if (hp == NULL) {
+			(void) fprintf(stderr,
+			    gettext("Error: Unknown host -- %s\n"), temp_str);
+			free(temp_str);
+			return (NULL);
 		}
 
 		if ((ptr = cname = strdup(hp->h_name)) == NULL) {
+			freehostent(hp);
 			free(temp_str);
 			return (NULL);
 		}
+
+		freehostent(hp);
+
 		do_warn = B_TRUE;
 		/* "s/./-/g" */
 		while ((ptr = strchr(ptr, '.')) != NULL) {
--- a/usr/src/uts/common/c2/audit.c	Mon Sep 14 10:21:57 2009 -0700
+++ b/usr/src/uts/common/c2/audit.c	Mon Sep 14 11:09:53 2009 -0700
@@ -2258,12 +2258,13 @@
 	case KSSL_ADD_ENTRY: {
 		char buf[32];
 		kssl_params_t *kp = (kssl_params_t *)params;
-		struct sockaddr_in *saddr = &(kp->kssl_addr);
+		struct sockaddr_in6 *saddr = &kp->kssl_addr;
 
 		au_write((caddr_t *)&ad, au_to_text("op=KSSL_ADD_ENTRY"));
-		au_write((caddr_t *)&ad, au_to_in_addr(&(saddr->sin_addr)));
+		au_write((caddr_t *)&ad,
+		    au_to_in_addr_ex((int32_t *)&saddr->sin6_addr));
 		(void) snprintf(buf, sizeof (buf), "SSL port=%d",
-		    saddr->sin_port);
+		    saddr->sin6_port);
 		au_write((caddr_t *)&ad, au_to_text(buf));
 
 		(void) snprintf(buf, sizeof (buf), "proxy port=%d",
@@ -2274,12 +2275,13 @@
 
 	case KSSL_DELETE_ENTRY: {
 		char buf[32];
-		struct sockaddr_in *saddr = (struct sockaddr_in *)params;
+		struct sockaddr_in6 *saddr = (struct sockaddr_in6 *)params;
 
 		au_write((caddr_t *)&ad, au_to_text("op=KSSL_DELETE_ENTRY"));
-		au_write((caddr_t *)&ad, au_to_in_addr(&(saddr->sin_addr)));
+		au_write((caddr_t *)&ad,
+		    au_to_in_addr_ex((int32_t *)&saddr->sin6_addr));
 		(void) snprintf(buf, sizeof (buf), "SSL port=%d",
-		    saddr->sin_port);
+		    saddr->sin6_port);
 		au_write((caddr_t *)&ad, au_to_text(buf));
 		break;
 	}
--- a/usr/src/uts/common/inet/kssl/kssl.c	Mon Sep 14 10:21:57 2009 -0700
+++ b/usr/src/uts/common/inet/kssl/kssl.c	Mon Sep 14 11:09:53 2009 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -36,13 +36,11 @@
 #include <sys/sunddi.h>
 #include <sys/kmem.h>
 #include <sys/errno.h>
-#include <sys/ksynch.h>
 #include <sys/file.h>
 #include <sys/open.h>
 #include <sys/cred.h>
 #include <sys/proc.h>
 #include <sys/task.h>
-#include <sys/mkdev.h>
 #include <sys/model.h>
 #include <sys/sysmacros.h>
 #include <sys/policy.h>
@@ -146,7 +144,6 @@
 	{type_block, 16, 32, CRYPTO_MECH_INVALID},
 };
 
-int kssl_enabled = 1;
 struct kmem_cache *kssl_cache;
 
 static void kssl_global_init();
@@ -327,7 +324,7 @@
 		break;
 	}
 	case KSSL_DELETE_ENTRY: {
-		struct sockaddr_in server_addr;
+		struct sockaddr_in6 server_addr;
 
 		if (copyin(ARG, &server_addr, sizeof (server_addr)) != 0) {
 			return (EFAULT);
@@ -344,7 +341,7 @@
 }
 
 #define	NUM_MECHS	7
-mech_to_cipher_t mech_to_cipher_tab[NUM_MECHS] = {
+static mech_to_cipher_t mech_to_cipher_tab[NUM_MECHS] = {
 	{CRYPTO_MECH_INVALID, SUN_CKM_RSA_X_509,
 	    {SSL_RSA_WITH_RC4_128_MD5, SSL_RSA_WITH_RC4_128_SHA,
 	    SSL_RSA_WITH_DES_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA,
@@ -415,7 +412,7 @@
  * Callback function invoked by the crypto framework when a provider's
  * mechanism is available/unavailable. This callback updates entries in the
  * kssl_entry_tab[] to make changes to the cipher suites of an entry
- * which are affected by the mechansim.
+ * which are affected by the mechanism.
  */
 static void
 kssl_event_callback(uint32_t event, void *event_arg)
@@ -547,6 +544,8 @@
 		    "kssl_sid_cache_lookups", KSTAT_DATA_UINT64);
 		kstat_named_init(&kssl_statp->sid_cache_hits,
 		    "kssl_sid_cache_hits", KSTAT_DATA_UINT64);
+		kstat_named_init(&kssl_statp->sid_cached,
+		    "kssl_sid_cached", KSTAT_DATA_UINT64);
 		kstat_named_init(&kssl_statp->sid_uncached,
 		    "kssl_sid_uncached", KSTAT_DATA_UINT64);
 
--- a/usr/src/uts/common/inet/kssl/kssl.h	Mon Sep 14 10:21:57 2009 -0700
+++ b/usr/src/uts/common/inet/kssl/kssl.h	Mon Sep 14 11:09:53 2009 -0700
@@ -19,15 +19,13 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
 #ifndef	_INET_KSSL_KSSL_H
 #define	_INET_KSSL_KSSL_H
 
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
 #ifdef	__cplusplus
 extern "C" {
 #endif
@@ -80,7 +78,7 @@
 typedef struct kssl_params_s {
 	uint64_t		kssl_params_size; /* total params buf len */
 	/* address and port number */
-	struct sockaddr_in	kssl_addr;
+	struct sockaddr_in6	kssl_addr;
 	uint16_t		kssl_proxy_port;
 
 	uint32_t		kssl_session_cache_timeout;	/* In seconds */
@@ -110,7 +108,7 @@
 #ifdef	_KERNEL
 
 extern int kssl_add_entry(kssl_params_t *);
-extern int kssl_delete_entry(struct sockaddr_in *);
+extern int kssl_delete_entry(struct sockaddr_in6 *);
 
 #endif	/* _KERNEL */
 
--- a/usr/src/uts/common/inet/kssl/ksslapi.c	Mon Sep 14 10:21:57 2009 -0700
+++ b/usr/src/uts/common/inet/kssl/ksslapi.c	Mon Sep 14 11:09:53 2009 -0700
@@ -33,7 +33,6 @@
 
 #include <inet/common.h>
 #include <inet/ip.h>
-#include <inet/ip6.h>
 
 #include <sys/systm.h>
 #include <sys/param.h>
@@ -70,8 +69,7 @@
  *    lower modules' SSL hooks that handle the Handshake messages.
  *    The function returns KSSL_IS_PROXY.
  *
- * The function returns KSSL_NO_PROXY otherwise. We do not suppport
- * IPv6 addresses.
+ * The function returns KSSL_NO_PROXY otherwise.
  */
 
 kssl_endpt_type_t
@@ -83,38 +81,32 @@
 	sin_t *sin;
 	sin6_t *sin6;
 	struct T_bind_req *tbr;
-	ipaddr_t v4addr;
+	in6_addr_t mapped_v4addr;
+	in6_addr_t *v6addr;
 	in_port_t in_port;
 
-	if (kssl_enabled == 0) {
+	if (kssl_entry_tab_nentries == 0) {
 		return (KSSL_NO_PROXY);
 	}
 
-	tbr = (struct T_bind_req *)bindmp->b_rptr;
-
 	ret = KSSL_NO_PROXY;
 
+	tbr = (struct T_bind_req *)bindmp->b_rptr;
 	sin = (sin_t *)(bindmp->b_rptr + tbr->ADDR_offset);
 
 	switch (tbr->ADDR_length) {
 	case sizeof (sin_t):
 		in_port = ntohs(sin->sin_port);
-		v4addr = sin->sin_addr.s_addr;
+		IN6_IPADDR_TO_V4MAPPED(sin->sin_addr.s_addr, &mapped_v4addr);
+		v6addr = &mapped_v4addr;
 		break;
 
 	case sizeof (sin6_t):
-		/*
-		 * Handle any IPv4-mapped IPv6 address for now.
-		 * Support of IPv6 will be added later.
-		 */
 		sin6 = (sin6_t *)sin;
-		if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {
-			in_port = ntohs(sin6->sin6_port);
-			IN6_V4MAPPED_TO_IPADDR(&sin6->sin6_addr, v4addr);
-			break;
-		}
+		in_port = ntohs(sin6->sin6_port);
+		v6addr = &sin6->sin6_addr;
+		break;
 
-		/* fallthrough for normal IPv6 address */
 	default:
 		return (ret);
 	}
@@ -125,7 +117,8 @@
 		if ((ep = kssl_entry_tab[i]) == NULL)
 			continue;
 
-		if ((ep->ke_laddr == v4addr) || (ep->ke_laddr == INADDR_ANY)) {
+		if (IN6_ARE_ADDR_EQUAL(&ep->ke_laddr, v6addr) ||
+		    IN6_IS_ADDR_UNSPECIFIED(&ep->ke_laddr)) {
 
 			/* This is an SSL port to fallback to */
 			if (ep->ke_ssl_port == in_port) {
@@ -301,16 +294,18 @@
 	kssl_entry_t *kssl_entry = (kssl_entry_t *)ksslent;
 
 	if (cookie != NULL) {
-		if (endpt_type == KSSL_IS_PROXY)
+		if (endpt_type == KSSL_IS_PROXY) {
 			ASSERT(kssl_entry->ke_proxy_head != NULL);
 			kssl_dequeue(
 			    (kssl_chain_t **)&kssl_entry->ke_proxy_head,
 			    cookie);
-		if (endpt_type == KSSL_HAS_PROXY)
+		}
+		if (endpt_type == KSSL_HAS_PROXY) {
 			ASSERT(kssl_entry->ke_fallback_head != NULL);
 			kssl_dequeue(
 			    (kssl_chain_t **)&kssl_entry->ke_fallback_head,
 			    cookie);
+		}
 	}
 	KSSL_ENTRY_REFRELE(kssl_entry);
 }
@@ -574,7 +569,7 @@
 	SSL3ContentType content_type;
 	ssl_t *ssl;
 	KSSLCipherSpec *spec;
-	int error = 0, ret;
+	int error, ret;
 	kssl_cmd_t kssl_cmd = KSSL_CMD_DELIVER_PROXY;
 	boolean_t deliverit = B_FALSE;
 	crypto_data_t cipher_data;
@@ -606,7 +601,7 @@
 		if (DB_REF(mp) > 1) {
 			/*
 			 * Fortunately copyb() preserves the offset,
-			 * tail space and alignement so the copy is
+			 * tail space and alignment so the copy is
 			 * ready to be made an SSL record.
 			 */
 			if ((copybp = copyb(mp)) == NULL)
@@ -1098,7 +1093,6 @@
 				if (ssl->sid.cached == B_TRUE) {
 					kssl_uncache_sid(&ssl->sid,
 					    ssl->kssl_entry);
-					ssl->sid.cached = B_FALSE;
 				}
 				DTRACE_PROBE2(kssl_err__bad_content_alert,
 				    SSL3AlertLevel, level,
@@ -1187,12 +1181,11 @@
 
 /*
  * Initialize the context of an SSL connection, coming to the specified
- * address.
- * the ssl structure returned is held.
+ * address. The ssl structure is returned held.
  */
 kssl_status_t
-kssl_init_context(kssl_ent_t kssl_ent, ipaddr_t faddr, int mss,
-    kssl_ctx_t *kssl_ctxp)
+kssl_init_context(kssl_ent_t kssl_ent, void *addr, boolean_t is_v4,
+    int mss, kssl_ctx_t *kssl_ctxp)
 {
 	ssl_t *ssl = kmem_cache_alloc(kssl_cache, KM_NOSLEEP);
 
@@ -1207,7 +1200,11 @@
 	ssl->kssl_entry = (kssl_entry_t *)kssl_ent;
 	KSSL_ENTRY_REFHOLD(ssl->kssl_entry);
 
-	ssl->faddr = faddr;
+	if (is_v4) {
+		IN6_IPADDR_TO_V4MAPPED(*((ipaddr_t *)addr), &ssl->faddr);
+	} else {
+		ssl->faddr = *((in6_addr_t *)addr);	/* struct assignment */
+	}
 	ssl->tcp_mss = mss;
 	ssl->sendalert_level = alert_warning;
 	ssl->sendalert_desc = close_notify;
@@ -1220,7 +1217,7 @@
 
 /*
  * Builds SSL records out of the chain of mblks, and returns it.
- * Taked a copy of the message before encypting it if it has another
+ * Takes a copy of the message before encrypting it if it has another
  * reference.
  * In case of failure, NULL is returned, and the message will be
  * freed by the caller.
@@ -1239,7 +1236,7 @@
 		if (DB_REF(bp) > 1) {
 			/*
 			 * Fortunately copyb() preserves the offset,
-			 * tail space and alignement so the copy is
+			 * tail space and alignment so the copy is
 			 * ready to be made an SSL record.
 			 */
 			if ((copybp = copyb(bp)) == NULL)
@@ -1266,24 +1263,22 @@
 }
 
 /*
- * Builds a single SSL record
+ * Builds a single SSL record.
  * In-line encryption of the record.
  */
 static kssl_status_t
 kssl_build_single_record(ssl_t *ssl, mblk_t *mp)
 {
 	int len;
-	int reclen = 0;
+	int reclen;
 	uchar_t *recstart, *versionp;
 	KSSLCipherSpec *spec;
 	int mac_sz;
-	int pad_sz = 0;
-
+	int pad_sz;
 
 	spec = &ssl->spec[KSSL_WRITE];
 	mac_sz = spec->mac_hashsz;
 
-
 	ASSERT(DB_REF(mp) == 1);
 	ASSERT((mp->b_rptr - mp->b_datap->db_base >= SSL3_HDR_LEN) &&
 	    (mp->b_datap->db_lim - mp->b_wptr >= mac_sz + spec->cipher_bsize));
--- a/usr/src/uts/common/inet/kssl/ksslapi.h	Mon Sep 14 10:21:57 2009 -0700
+++ b/usr/src/uts/common/inet/kssl/ksslapi.h	Mon Sep 14 11:09:53 2009 -0700
@@ -19,15 +19,13 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
 #ifndef	_INET_KSSL_KSSLAPI_H
 #define	_INET_KSSL_KSSLAPI_H
 
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
 /*
  * The kernel SSL proxy interface
  */
@@ -64,10 +62,6 @@
 	KSSL_CMD_QUEUED		/* Queued, a call back will finish it */
 } kssl_cmd_t;
 
-typedef enum {
-	KSSL_EVENT_CLOSE	/* close this context */
-} kssl_event_t;
-
 /* Un opaque context of an SSL connection */
 typedef void *kssl_ctx_t;
 
@@ -82,7 +76,8 @@
 
 kssl_endpt_type_t kssl_check_proxy(mblk_t *, void *, kssl_ent_t *);
 
-kssl_status_t kssl_init_context(kssl_ent_t, uint32_t, int, kssl_ctx_t *);
+kssl_status_t kssl_init_context(kssl_ent_t, void *, boolean_t,
+    int, kssl_ctx_t *);
 
 void kssl_hold_ent(kssl_ent_t);
 void kssl_release_ent(kssl_ent_t, void *, kssl_endpt_type_t);
--- a/usr/src/uts/common/inet/kssl/ksslimpl.h	Mon Sep 14 10:21:57 2009 -0700
+++ b/usr/src/uts/common/inet/kssl/ksslimpl.h	Mon Sep 14 11:09:53 2009 -0700
@@ -19,15 +19,13 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
 #ifndef	_INET_KSSL_KSSLIMPL_H
 #define	_INET_KSSL_KSSLIMPL_H
 
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
 #ifdef	__cplusplus
 extern "C" {
 #endif
@@ -94,7 +92,7 @@
 	boolean_t		ke_no_freeall;
 	kmutex_t		ke_mutex;
 
-	ipaddr_t		ke_laddr;	/* Only IPv4 is supported */
+	in6_addr_t		ke_laddr;
 	in_port_t		ke_ssl_port;	/* SSL port */
 	in_port_t		ke_proxy_port;	/* SSL proxy port */
 
@@ -183,7 +181,6 @@
 extern crypto_call_flag_t kssl_call_flag;
 extern KSSLCipherDef cipher_defs[];
 
-extern int kssl_enabled;
 extern int kssl_cache_count;
 extern struct kmem_cache *kssl_cache;
 
@@ -196,6 +193,7 @@
 typedef struct kssl_stats {
 	kstat_named_t sid_cache_lookups;
 	kstat_named_t sid_cache_hits;
+	kstat_named_t sid_cached;
 	kstat_named_t sid_uncached;
 	kstat_named_t full_handshakes;
 	kstat_named_t resumed_sessions;
--- a/usr/src/uts/common/inet/kssl/ksslioctl.c	Mon Sep 14 10:21:57 2009 -0700
+++ b/usr/src/uts/common/inet/kssl/ksslioctl.c	Mon Sep 14 11:09:53 2009 -0700
@@ -19,12 +19,10 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
 /*
  * The kernel SSL module ioctls.
  */
@@ -32,18 +30,14 @@
 #include <sys/types.h>
 #include <sys/modctl.h>
 #include <sys/conf.h>
-#include <sys/stat.h>
 #include <sys/ddi.h>
 #include <sys/sunddi.h>
 #include <sys/kmem.h>
 #include <sys/errno.h>
-#include <sys/ksynch.h>
 #include <sys/file.h>
-#include <sys/open.h>
 #include <sys/cred.h>
 #include <sys/proc.h>
 #include <sys/task.h>
-#include <sys/mkdev.h>
 #include <sys/model.h>
 #include <sys/sysmacros.h>
 #include <sys/policy.h>
@@ -51,7 +45,6 @@
 #include <sys/crypto/api.h>
 #include <inet/common.h>
 #include <inet/ip.h>
-#include <inet/ip6.h>
 
 #include "ksslimpl.h"
 #include "kssl.h"
@@ -152,7 +145,7 @@
  * the address and port.  Returns -1 if no match is found.
  */
 static int
-kssl_find_entry(ipaddr_t laddr, in_port_t port, int type,
+kssl_find_entry(in6_addr_t laddr, in_port_t port, int type,
     boolean_t wild_card_match)
 {
 	int i;
@@ -169,8 +162,9 @@
 		    (type == IS_PROXY_PORT && ep->ke_proxy_port == port)))
 			continue;
 
-		if ((ep->ke_laddr == laddr) || (wild_card_match &&
-		    ((laddr == INADDR_ANY) || (ep->ke_laddr == INADDR_ANY))))
+		if (IN6_ARE_ADDR_EQUAL(&laddr, &ep->ke_laddr) ||
+		    (wild_card_match && (IN6_IS_ADDR_UNSPECIFIED(&laddr) ||
+		    IN6_IS_ADDR_UNSPECIFIED(&ep->ke_laddr))))
 			break;
 	}
 
@@ -286,7 +280,7 @@
 	char *end_pos;
 	int i, j, rv;
 	size_t attrs_size;
-	crypto_object_attribute_t *newattrs = NULL;
+	crypto_object_attribute_t *newattrs;
 	char *mp_attrs;
 	kssl_object_attribute_t att;
 	char *attval;
@@ -415,8 +409,8 @@
 
 	kssl_entry = kmem_zalloc(sizeof (kssl_entry_t), KM_SLEEP);
 
-	kssl_entry->ke_laddr = kssl_params->kssl_addr.sin_addr.s_addr;
-	kssl_entry->ke_ssl_port = kssl_params->kssl_addr.sin_port;
+	kssl_entry->ke_laddr = kssl_params->kssl_addr.sin6_addr;
+	kssl_entry->ke_ssl_port = kssl_params->kssl_addr.sin6_port;
 	kssl_entry->ke_proxy_port = kssl_params->kssl_proxy_port;
 	if (kssl_params->kssl_session_cache_timeout == 0)
 		kssl_entry->sid_cache_timeout = DEFAULT_SID_TIMEOUT;
@@ -533,7 +527,7 @@
 	Certificate_t *cert;
 	crypto_key_t *privkey;
 	kssl_entry_t *kssl_entry;
-	ipaddr_t laddr;
+	in6_addr_t laddr;
 
 	if ((rv = extract_certificate(kssl_params, &cert)) != 0) {
 		return (rv);
@@ -551,8 +545,7 @@
 		return (EINVAL);
 	}
 
-	/* Revisit here for IPv6 support */
-	laddr = kssl_params->kssl_addr.sin_addr.s_addr;
+	laddr = kssl_params->kssl_addr.sin6_addr;
 
 retry:
 	mutex_enter(&kssl_tab_mutex);
@@ -578,7 +571,7 @@
 	} else {
 		/* Check if a matching entry exists already */
 		index = kssl_find_entry(laddr,
-		    kssl_params->kssl_addr.sin_port, IS_SSL_PORT, B_TRUE);
+		    kssl_params->kssl_addr.sin6_port, IS_SSL_PORT, B_TRUE);
 
 		if (index == -1) {
 			/* Check if an entry with the same proxy port exists */
@@ -624,16 +617,20 @@
 			}
 			index = i;
 		} else {
+			kssl_entry_t *ep;
+
 			/*
 			 * We do not want an entry with a specific address and
 			 * an entry with IN_ADDR_ANY to coexist. We could
 			 * replace the existing entry. But, most likely this
 			 * is misconfiguration. Better bail out with an error.
 			 */
-			if ((laddr == INADDR_ANY &&
-			    (kssl_entry_tab[index]->ke_laddr != INADDR_ANY)) ||
-			    (laddr != INADDR_ANY &&
-			    (kssl_entry_tab[index]->ke_laddr == INADDR_ANY))) {
+			ep = kssl_entry_tab[index];
+
+			if ((IN6_IS_ADDR_UNSPECIFIED(&laddr) &&
+			    !IN6_IS_ADDR_UNSPECIFIED(&ep->ke_laddr)) ||
+			    (!IN6_IS_ADDR_UNSPECIFIED(&laddr) &&
+			    IN6_IS_ADDR_UNSPECIFIED(&ep->ke_laddr))) {
 				mutex_exit(&kssl_tab_mutex);
 				kssl_free_entry(kssl_entry);
 				return (EEXIST);
@@ -654,16 +651,15 @@
 }
 
 int
-kssl_delete_entry(struct sockaddr_in *kssl_addr)
+kssl_delete_entry(struct sockaddr_in6 *kssl_addr)
 {
-	ipaddr_t laddr;
+	in6_addr_t laddr;
 	int index;
 
-	/* Revisit here for IPv6 support */
-	laddr = kssl_addr->sin_addr.s_addr;
+	laddr = kssl_addr->sin6_addr;
 
 	mutex_enter(&kssl_tab_mutex);
-	index = kssl_find_entry(laddr, kssl_addr->sin_port,
+	index = kssl_find_entry(laddr, kssl_addr->sin6_port,
 	    IS_SSL_PORT, B_FALSE);
 
 	if (index == -1) {
--- a/usr/src/uts/common/inet/kssl/ksslproto.h	Mon Sep 14 10:21:57 2009 -0700
+++ b/usr/src/uts/common/inet/kssl/ksslproto.h	Mon Sep 14 11:09:53 2009 -0700
@@ -19,15 +19,13 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
 #ifndef	_INET_KSSL_KSSLPROTO_H
 #define	_INET_KSSL_KSSLPROTO_H
 
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
 #ifdef	__cplusplus
 extern "C" {
 #endif
@@ -104,57 +102,49 @@
 
 /* session state */
 typedef struct sslSessionIDStr {
-	uchar_t	session_id[SSL3_SESSIONID_BYTES];
-	uchar_t master_secret[SSL3_MASTER_SECRET_LEN];
-	clock_t time;
-	ipaddr_t client_addr;
-	boolean_t cached;
-	uint16_t cipher_suite;
+	uchar_t		session_id[SSL3_SESSIONID_BYTES];
+	uchar_t 	master_secret[SSL3_MASTER_SECRET_LEN];
+	clock_t 	time;
+	in6_addr_t 	client_addr;
+	boolean_t	cached;
+	uint16_t	cipher_suite;
 } sslSessionID;
 
 /* An element of the session cache */
 typedef struct kssl_sid_ent {
-	kmutex_t se_lock;
-	uint64_t se_used;	/* Counter to check hash distribution */
-	sslSessionID se_sid;
-	uchar_t  pad[2 * 64 - sizeof (kmutex_t) - sizeof (uint64_t) \
-	    - sizeof (sslSessionID)];
+	kmutex_t	se_lock;
+	uint64_t	se_used;	/* Counter to check hash distribution */
+	sslSessionID	se_sid;
 } kssl_sid_ent_t;
 
-typedef struct RC4ContextStr {
-	uchar_t i;
-	uchar_t j;
-	uchar_t S[256];
-} RC4Context;
-
 typedef enum {
-    content_change_cipher_spec	= 20,
-    content_alert		= 21,
-    content_handshake		= 22,
-    content_application_data	= 23,
-    content_handshake_v2	= 128
+	content_change_cipher_spec	= 20,
+	content_alert			= 21,
+	content_handshake		= 22,
+	content_application_data	= 23,
+	content_handshake_v2		= 128
 } SSL3ContentType;
 
 typedef enum {
-    hello_request	= 0,
-    client_hello	= 1,
-    server_hello	= 2,
-    certificate		= 11,
-    server_key_exchange	= 12,
-    certificate_request	= 13,
-    server_hello_done	= 14,
-    certificate_verify	= 15,
-    client_key_exchange	= 16,
-    finished		= 20
+	hello_request		= 0,
+	client_hello		= 1,
+	server_hello		= 2,
+	certificate		= 11,
+	server_key_exchange	= 12,
+	certificate_request	= 13,
+	server_hello_done	= 14,
+	certificate_verify	= 15,
+	client_key_exchange	= 16,
+	finished		= 20
 } SSL3HandshakeType;
 
 typedef struct SSL3HandshakeMsgStr {
-	int state;
-	SSL3HandshakeType type;
-	int msglen;
-	int msglen_bytes;
-	mblk_t *head;
-	mblk_t *tail;
+	int			state;
+	SSL3HandshakeType	type;
+	int			msglen;
+	int			msglen_bytes;
+	mblk_t			*head;
+	mblk_t			*tail;
 } SSL3HandshakeMsg;
 
 typedef struct KSSLJOBStr {
@@ -165,18 +155,6 @@
 	int		status;
 } KSSLJOB;
 
-typedef struct KSSLMACJOBStr {
-	struct ssl_s *ssl;
-	buf_t *in;
-	buf_t *out;
-	uchar_t *rstart;
-	int rlen;
-	uint64_t seq;
-	SSL3ContentType ct;
-	uchar_t *digest;
-	int dir;
-} KSSLMACJOB;
-
 
 typedef struct {
 	uchar_t md5[MD5_HASH_LEN];
@@ -224,23 +202,23 @@
 } SSL3WaitState;
 
 typedef enum {
-    sender_client = 0x434c4e54,
-    sender_server = 0x53525652
+	sender_client = 0x434c4e54,
+	sender_server = 0x53525652
 } SSL3Sender;
 
 typedef enum {
-    mac_md5	= 0,
-    mac_sha	= 1
+	mac_md5	= 0,
+	mac_sha	= 1
 } SSL3MACAlgorithm;
 
 /* The SSL bulk cipher definition */
 typedef enum {
-    cipher_null = 0,
-    cipher_rc4 = 1,
-    cipher_des = 2,
-    cipher_3des = 3,
-    cipher_aes128 = 4,
-    cipher_aes256 = 5,
+	cipher_null = 0,
+	cipher_rc4 = 1,
+	cipher_des = 2,
+	cipher_3des = 3,
+	cipher_aes128 = 4,
+	cipher_aes256 = 5,
 } SSL3BulkCipher;
 
 typedef enum { type_stream = 0, type_block = 1 } CipherType;
@@ -306,7 +284,7 @@
 	mblk_t			*rec_ass_head;
 	mblk_t			*rec_ass_tail;
 	uint_t			kssl_refcnt;
-	ipaddr_t		faddr;
+	in6_addr_t		faddr;
 	uint32_t		tcp_mss;
 	SSL3WaitState		hs_waitstate;
 	boolean_t		resumed;
@@ -322,8 +300,6 @@
 	mblk_t			*alert_sendbuf;
 	kssl_callback_t		cke_callback_func;
 	void			*cke_callback_arg;
-	uint32_t		macjobs_todo;
-	uint32_t		macjobs_done;
 	uint16_t		pending_cipher_suite;
 	SSL3MACAlgorithm	pending_malg;
 	SSL3BulkCipher		pending_calg;
--- a/usr/src/uts/common/inet/kssl/ksslrec.c	Mon Sep 14 10:21:57 2009 -0700
+++ b/usr/src/uts/common/inet/kssl/ksslrec.c	Mon Sep 14 11:09:53 2009 -0700
@@ -127,7 +127,7 @@
 static void kssl_get_hello_random(uchar_t *);
 static uchar_t *kssl_rsa_unwrap(uchar_t *, size_t *);
 static void kssl_cache_sid(sslSessionID *, kssl_entry_t *);
-static void kssl_lookup_sid(sslSessionID *, uchar_t *, ipaddr_t,
+static void kssl_lookup_sid(sslSessionID *, uchar_t *, in6_addr_t *,
     kssl_entry_t *);
 static int kssl_generate_tls_ms(ssl_t *, uchar_t *, size_t);
 static void kssl_generate_ssl_ms(ssl_t *, uchar_t *, size_t);
@@ -499,7 +499,7 @@
 	if (sidlen != SSL3_SESSIONID_BYTES) {
 		mp->b_rptr += sidlen;
 	} else {
-		kssl_lookup_sid(&ssl->sid, mp->b_rptr, ssl->faddr,
+		kssl_lookup_sid(&ssl->sid, mp->b_rptr, &ssl->faddr,
 		    ssl->kssl_entry);
 		mp->b_rptr += SSL3_SESSIONID_BYTES;
 	}
@@ -536,7 +536,6 @@
 			goto suite_found;
 		}
 		kssl_uncache_sid(&ssl->sid, ssl->kssl_entry);
-		ssl->sid.cached = B_FALSE;
 	}
 
 	/* Check if this server is capable of the cipher suite */
@@ -656,52 +655,93 @@
 	return (EBADMSG);
 }
 
+#define	SET_HASH_INDEX(index, s, clnt_addr) {				\
+	int addr;							\
+									\
+	IN6_V4MAPPED_TO_IPADDR(clnt_addr, addr);			\
+	index = addr ^ (((int)(s)[0] << 24) | ((int)(s)[1] << 16) |	\
+	    ((int)(s)[2] << 8) | (int)(s)[SSL3_SESSIONID_BYTES - 1]);	\
+}
+
+/*
+ * Creates a cache entry. Sets the sid->cached flag
+ * and sid->time fields. So, the caller should not set them.
+ */
 static void
 kssl_cache_sid(sslSessionID *sid, kssl_entry_t *kssl_entry)
 {
 	uint_t index;
 	uchar_t *s = sid->session_id;
-	int l = SSL3_SESSIONID_BYTES - 1;
 	kmutex_t *lock;
 
-	ASSERT(sid->cached == B_TRUE);
+	ASSERT(sid->cached == B_FALSE);
 
-	index = (int)sid->client_addr ^ (((int)s[0] << 24) | ((int)s[1] << 16) |
-	    ((int)s[2] << 8) | (int)s[l]);
+	/* set the values before creating the cache entry */
+	sid->cached = B_TRUE;
+	sid->time = lbolt;
 
+	SET_HASH_INDEX(index, s, &sid->client_addr);
 	index %= kssl_entry->sid_cache_nentries;
 
-	sid->time = lbolt;
-
 	lock = &(kssl_entry->sid_cache[index].se_lock);
 	mutex_enter(lock);
 	kssl_entry->sid_cache[index].se_used++;
 	bcopy(sid, &(kssl_entry->sid_cache[index].se_sid), sizeof (*sid));
 	mutex_exit(lock);
+
+	KSSL_COUNTER(sid_cached, 1);
 }
 
-static void
-kssl_lookup_sid(sslSessionID *sid, uchar_t *s, ipaddr_t faddr,
-    kssl_entry_t *kssl_entry)
+/*
+ * Invalidates the cache entry, if any. Clears the sid->cached flag
+ * as a side effect.
+ */
+void
+kssl_uncache_sid(sslSessionID *sid, kssl_entry_t *kssl_entry)
 {
 	uint_t index;
-	int l = SSL3_SESSIONID_BYTES - 1;
-	kmutex_t *lock;
+	uchar_t *s = sid->session_id;
 	sslSessionID *csid;
-
-	ASSERT(sid->cached == B_FALSE);
+	kmutex_t *lock;
 
-	KSSL_COUNTER(sid_cache_lookups, 1);
+	ASSERT(sid->cached == B_TRUE);
+	sid->cached = B_FALSE;
 
-	index = (int)faddr ^ (((int)s[0] << 24) | ((int)s[1] << 16) |
-	    ((int)s[2] << 8) | (int)s[l]);
-
+	SET_HASH_INDEX(index, s, &sid->client_addr);
 	index %= kssl_entry->sid_cache_nentries;
 
 	lock = &(kssl_entry->sid_cache[index].se_lock);
 	mutex_enter(lock);
 	csid = &(kssl_entry->sid_cache[index].se_sid);
-	if (csid->cached == B_FALSE || csid->client_addr != faddr ||
+	if (!(IN6_ARE_ADDR_EQUAL(&csid->client_addr, &sid->client_addr)) ||
+	    bcmp(csid->session_id, s, SSL3_SESSIONID_BYTES)) {
+		mutex_exit(lock);
+		return;
+	}
+	csid->cached = B_FALSE;
+	mutex_exit(lock);
+
+	KSSL_COUNTER(sid_uncached, 1);
+}
+
+static void
+kssl_lookup_sid(sslSessionID *sid, uchar_t *s, in6_addr_t *faddr,
+    kssl_entry_t *kssl_entry)
+{
+	uint_t index;
+	kmutex_t *lock;
+	sslSessionID *csid;
+
+	KSSL_COUNTER(sid_cache_lookups, 1);
+
+	SET_HASH_INDEX(index, s, faddr);
+	index %= kssl_entry->sid_cache_nentries;
+
+	lock = &(kssl_entry->sid_cache[index].se_lock);
+	mutex_enter(lock);
+	csid = &(kssl_entry->sid_cache[index].se_sid);
+	if (csid->cached == B_FALSE ||
+	    !IN6_ARE_ADDR_EQUAL(&csid->client_addr, faddr) ||
 	    bcmp(csid->session_id, s, SSL3_SESSIONID_BYTES)) {
 		mutex_exit(lock);
 		return;
@@ -744,36 +784,6 @@
 	return (buf + i);
 }
 
-void
-kssl_uncache_sid(sslSessionID *sid, kssl_entry_t *kssl_entry)
-{
-	uint_t index;
-	uchar_t *s = sid->session_id;
-	int l = SSL3_SESSIONID_BYTES - 1;
-	sslSessionID *csid;
-	kmutex_t *lock;
-
-	ASSERT(sid->cached == B_TRUE);
-
-	KSSL_COUNTER(sid_uncached, 1);
-
-	index = (int)sid->client_addr ^ (((int)s[0] << 24) | ((int)s[1] << 16) |
-	    ((int)s[2] << 8) | (int)s[l]);
-
-	index %= kssl_entry->sid_cache_nentries;
-
-	lock = &(kssl_entry->sid_cache[index].se_lock);
-	mutex_enter(lock);
-	csid = &(kssl_entry->sid_cache[index].se_sid);
-	if (csid->client_addr != sid->client_addr ||
-	    bcmp(csid->session_id, s, SSL3_SESSIONID_BYTES)) {
-		mutex_exit(lock);
-		return;
-	}
-	csid->cached = B_FALSE;
-	mutex_exit(lock);
-}
-
 
 #define	KSSL_SSL3_SH_RECLEN	(74)
 #define	KSSL_SSL3_FIN_MSGLEN	(36)
@@ -875,7 +885,7 @@
 	mac.cd_offset = 0;
 
 	/*
-	 * A(i) = HMAC_hash(secred, seed + A(i-1));
+	 * A(i) = HMAC_hash(secret, seed + A(i-1));
 	 * A(0) = seed;
 	 *
 	 * Compute A(1):
@@ -943,7 +953,7 @@
 	 *
 	 */
 
-	int rv = 0, i;
+	int rv, i;
 	uchar_t psha1[MAX_KEYBLOCK_LENGTH];
 	crypto_key_t S1, S2;
 
@@ -1411,7 +1421,7 @@
 	uchar_t *versionp;
 	SSL3Hashes ssl3hashes;
 	size_t finish_len;
-	int ret = 0;
+	int ret;
 
 	mp = ssl->handshake_sendbuf;
 	ASSERT(mp != NULL);
@@ -1562,7 +1572,6 @@
 		    SSL3AlertLevel, level, SSL3AlertDescription, desc);
 		if (ssl->sid.cached == B_TRUE) {
 			kssl_uncache_sid(&ssl->sid, ssl->kssl_entry);
-			ssl->sid.cached = B_FALSE;
 		}
 		ssl->fatal_alert = B_TRUE;
 		KSSL_COUNTER(fatal_alerts, 1);
@@ -1812,8 +1821,6 @@
 		return (err);
 	}
 
-	ASSERT(ssl->sid.cached == B_FALSE);
-	ssl->sid.cached = B_TRUE;
 	kssl_cache_sid(&ssl->sid, ssl->kssl_entry);
 	ssl->activeinput = B_FALSE;
 
--- a/usr/src/uts/common/inet/tcp/tcp_kssl.c	Mon Sep 14 10:21:57 2009 -0700
+++ b/usr/src/uts/common/inet/tcp/tcp_kssl.c	Mon Sep 14 11:09:53 2009 -0700
@@ -19,17 +19,14 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
 #include <sys/types.h>
 #include <sys/stream.h>
-#include <sys/strsun.h>
 #include <sys/strsubr.h>
 #include <sys/stropts.h>
-#include <sys/strlog.h>
-#include <sys/strsun.h>
 #include <sys/cmn_err.h>
 #include <sys/debug.h>
 #include <sys/vtrace.h>
@@ -37,7 +34,6 @@
 #include <sys/zone.h>
 #include <sys/tihdr.h>
 
-#include <sys/errno.h>
 #include <netinet/in.h>
 #include <netinet/tcp.h>
 
@@ -46,7 +42,6 @@
 #include <inet/ipclassifier.h>
 #include <inet/ip.h>
 #include <inet/ip6.h>
-#include <inet/mi.h>
 #include <inet/mib2.h>
 #include <inet/tcp.h>
 #include <inet/ipsec_impl.h>
@@ -80,12 +75,12 @@
  * A packet may carry multiple SSL records, so the function
  * calls kssl_input() in a loop, until all records are
  * handled.
- * As long as this conection is in handshake, that is until the first
+ * As long as this connection is in handshake, that is until the first
  * time kssl_input() returns a record to be delivered ustreams,
  * we maintain the tcp_kssl_inhandshake, and keep an extra reference on
  * the tcp/connp across the call to kssl_input(). The reason is, that
  * function may return KSSL_CMD_QUEUED after scheduling an asynchronous
- * request and cause tcp_kssl_callback() to be called on adifferent CPU,
+ * request and cause tcp_kssl_callback() to be called on a different CPU,
  * which could decrement the conn/tcp reference before we get to increment it.
  */
 void
@@ -99,13 +94,22 @@
 	struct		T_conn_ind *tci;
 	boolean_t	more = B_FALSE;
 	boolean_t	conn_held = B_FALSE;
+	boolean_t	is_v4;
+	void		*addr;
 
 	/* First time here, allocate the SSL context */
 	if (tcp->tcp_kssl_ctx == NULL) {
 		ASSERT(tcp->tcp_kssl_pending);
 
+		is_v4 = (tcp->tcp_ipversion == IPV4_VERSION);
+		if (is_v4) {
+			addr = &tcp->tcp_ipha->ipha_dst;
+		} else {
+			addr = &tcp->tcp_ip6h->ip6_dst;
+		}
+
 		if (kssl_init_context(tcp->tcp_kssl_ent,
-		    tcp->tcp_ipha->ipha_dst, tcp->tcp_mss,
+		    addr, is_v4, tcp->tcp_mss,
 		    &(tcp->tcp_kssl_ctx)) != KSSL_STS_OK) {
 			tcp->tcp_kssl_pending = B_FALSE;
 			kssl_release_ent(tcp->tcp_kssl_ent, NULL,
@@ -125,6 +129,7 @@
 		CONN_INC_REF(connp);
 		conn_held = B_TRUE;
 	}
+
 	do {
 		kssl_cmd = kssl_input(tcp->tcp_kssl_ctx, mp, &outmp,
 		    &more, tcp_kssl_input_callback, (void *)tcp);
@@ -308,6 +313,7 @@
 		}
 		mp = NULL;
 	} while (more);
+
 	if (conn_held) {
 		CONN_DEC_REF(connp);
 	}
@@ -316,7 +322,7 @@
 /*
  * Callback function for the cases kssl_input() had to submit an asynchronous
  * job and need to come back when done to carry on the input processing.
- * This routine follows the conentions of timeout and interrupt handlers.
+ * This routine follows the conventions of timeout and interrupt handlers.
  * (no blocking, ...)
  */
 static void