xref: /illumos-gate/usr/src/uts/common/fs/smbclnt/netsmb/smb_tran.c (revision 07a48826732249fcd3aa8dd53c8389595e9f1fbc)
1 /*
2  * Copyright (c) 2000-2001 Boris Popov
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *    This product includes software developed by Boris Popov.
16  * 4. Neither the name of the author nor the names of any co-contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  *
32  * Selected code from smb_conn.c
33  */
34 
35 #pragma ident	"%Z%%M%	%I%	%E% SMI"
36 /*
37  * Helper functions for smb_trantcp.c
38  * (and maybe future transports)
39  */
40 
41 #include <sys/param.h>
42 #include <sys/systm.h>
43 #include <sys/kmem.h>
44 #include <sys/cmn_err.h>
45 
46 #include <netinet/in.h>
47 #include <netinet/tcp.h>
48 
49 /* Like smb_dev.h, this knows about all our sockaddr formats. */
50 #include <netsmb/netbios.h>
51 
52 #ifdef APPLE
53 #include <sys/smb_apple.h>
54 #else
55 #include <netsmb/smb_osdep.h>
56 #endif
57 
58 #include <netsmb/smb.h>
59 #include <netsmb/smb_conn.h>
60 #include <netsmb/smb_subr.h>
61 #include <netsmb/smb_tran.h>
62 
63 /*
64  * Return the length of a sockaddr structure.
65  * Only needs to handle the address formats
66  * used by smb_dup_sockaddr.
67  */
68 static size_t
69 SA_LEN(struct sockaddr *sa)
70 {
71 	size_t len;
72 
73 	switch (sa->sa_family) {
74 	case AF_INET:
75 		len = sizeof (struct sockaddr_in);
76 		break;
77 	case AF_INET6:
78 		len = sizeof (struct sockaddr_in6);
79 		break;
80 	case AF_NETBIOS:
81 		len = sizeof (struct sockaddr_nb);
82 		break;
83 	default:
84 		SMBSDEBUG("invalid address family %d\n", sa->sa_family);
85 		len = sizeof (struct sockaddr);
86 		break;
87 	}
88 
89 	return (len);
90 }
91 
92 /*
93  * Compare two sockaddr contents
94  * Return zero if identical.
95  */
96 int
97 smb_cmp_sockaddr(struct sockaddr *a1, struct sockaddr *a2)
98 {
99 	size_t l1, l2;
100 
101 	l1 = SA_LEN(a1);
102 	l2 = SA_LEN(a2);
103 
104 	if (l1 != l2)
105 		return (-1);
106 
107 	return (bcmp(a1, a2, l1));
108 }
109 
110 /*
111  * Copy a socket address of varying size.
112  */
113 struct sockaddr *
114 smb_dup_sockaddr(struct sockaddr *sa)
115 {
116 	struct sockaddr *sa2;
117 	size_t len;
118 
119 	/* Get the length (varies per family) */
120 	len = SA_LEN(sa);
121 
122 	sa2 = kmem_alloc(len, KM_SLEEP);
123 	if (sa2)
124 		bcopy(sa, sa2, len);
125 
126 	return (sa2);
127 }
128 
129 void
130 smb_free_sockaddr(struct sockaddr *sa)
131 {
132 	size_t len;
133 
134 	/* Get the length (varies per family) */
135 	len = SA_LEN(sa);
136 
137 	kmem_free(sa, len);
138 }
139