Home | History | Annotate | Download | only in smbsrv
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #ifndef _SMBSRV_NETBIOS_H
     27 #define	_SMBSRV_NETBIOS_H
     28 
     29 #pragma ident	"@(#)netbios.h	1.1	07/10/25 SMI"
     30 
     31 /*
     32  * NetBIOS over TCP/IP interface definitions. NetBIOS over TCP/IP is
     33  * documented in the following RFC documents:
     34  *
     35  * RFC 1001: Protocol Standard for a NetBIOS Service on a TCP/UDP
     36  *           Transport: Concepts and Methods
     37  *
     38  * RFC 1002: Protocol Standard for a NetBIOS Service on a TCP/UDP
     39  *           Transport: Detailed Specifications
     40  *
     41  * These documents reference RCF883.
     42  * RFC 883:  Domain Names - Implementation and Specification
     43  */
     44 
     45 #ifdef __cplusplus
     46 extern "C" {
     47 #endif
     48 
     49 
     50 /*
     51  * NetBIOS names in NetBIOS packets are valid domain names as defined in
     52  * RFC 883. Each label is limited to 63 bytes with an overall length of
     53  * 255 bytes as described in RFC 1002 section 4.1. This is known as
     54  * second-level encoding. In first-level encoding the label lengths are
     55  * represented as dots (.).
     56  *
     57  * RFC 1001 section 14.1 describes first-level encoding of the NetBIOS
     58  * name (hostname) and scope. The ASCII name is padded to 15 bytes using
     59  * spaces and a one byte type or suffix is written to the 16th byte.
     60  * This is then encoded as a 32 byte string.
     61  *
     62  * NetBIOS Name:  NetBIOS
     63  * NetBIOS Scope: PROCOM.COM
     64  * First Level:   EOGFHEECEJEPFDCACACACACACACACACA.PROCOM.COM
     65  * Second Level:  <32>EOGFHEECEJEPFDCACACACACACACACACA<6>PROCOM<3>COM<0>
     66  */
     67 #define	NETBIOS_NAME_SZ			16
     68 #define	NETBIOS_ENCODED_NAME_SZ		32
     69 #define	NETBIOS_LABEL_MAX		63
     70 #define	NETBIOS_DOMAIN_NAME_MAX		255
     71 #define	NETBIOS_DOMAIN_NAME_BUFLEN	(NETBIOS_DOMAIN_NAME_MAX + 1)
     72 #define	NETBIOS_SESSION_REQUEST_DATA_LENGTH \
     73 	((NETBIOS_ENCODED_NAME_SZ + 2) * 2)
     74 
     75 #define	NETBIOS_HDR_SZ			4	/* bytes */
     76 /*
     77  * Session Packet Types (RFC 1002 4.3.1).
     78  */
     79 #define	SESSION_MESSAGE			0x00
     80 #define	SESSION_REQUEST			0x81
     81 #define	POSITIVE_SESSION_RESPONSE	0x82
     82 #define	NEGATIVE_SESSION_RESPONSE	0x83
     83 #define	RETARGET_SESSION_RESPONSE	0x84
     84 #define	SESSION_KEEP_ALIVE		0x85
     85 
     86 /*
     87  * NEGATIVE SESSION RESPONSE packet error code values (RFC 1002 4.3.4).
     88  */
     89 #define	SESSION_NOT_LISTENING_ON_CALLED_NAME	0x80
     90 #define	SESSION_NOT_LISTENING_FOR_CALLING_NAME	0x81
     91 #define	SESSION_CALLED_NAME_NOT_PRESENT		0x82
     92 #define	SESSION_INSUFFICIENT_RESOURCES		0x83
     93 #define	SESSION_UNSPECIFIED_ERROR		0x8F
     94 
     95 /*
     96  * Time conversions
     97  */
     98 #define	MILLISECONDS	1
     99 #define	SECONDS		(1000 * MILLISECONDS)
    100 #define	MINUTES		(60 * SECONDS)
    101 #define	HOURS		(60 * MINUTES)
    102 #define	TO_SECONDS(x)		((x) / 1000)
    103 #define	TO_MILLISECONDS(x)	((x) * 1000)
    104 
    105 /*
    106  * DATAGRAM service definitions
    107  */
    108 #define	DATAGRAM_DESTINATION_NAME_NOT_PRESENT		0x82
    109 #define	DATAGRAM_INVALID_SOURCE_NAME_FORMAT		0x83
    110 #define	DATAGRAM_INVALID_DESTINATION_NAME_FORMAT	0x84
    111 
    112 #define	NAME_SERVICE_TCP_PORT	137
    113 #define	NAME_SERVICE_UDP_PORT	137
    114 #define	DGM_SRVC_UDP_PORT	138
    115 #define	SSN_SRVC_TCP_PORT	139
    116 #define	MAX_DATAGRAM_LENGTH	576
    117 #define	DATAGRAM_HEADER_LENGTH	14
    118 #define	MAX_NAME_LENGTH		256
    119 #define	BCAST_REQ_RETRY_COUNT	2
    120 #define	UCAST_REQ_RETRY_COUNT	2
    121 #define	BCAST_REQ_RETRY_TIMEOUT	(500 * MILLISECONDS)
    122 #define	UCAST_REQ_RETRY_TIMEOUT	(500 * MILLISECONDS)
    123 #define	CONFLICT_TIMER		(1 * SECONDS)
    124 #define	INFINITE_TTL		0
    125 #define	DEFAULT_TTL		(600 * SECONDS)
    126 #define	SSN_RETRY_COUNT		4
    127 #define	SSN_CLOSE_TIMEOUT	(30 * SECONDS)
    128 /*
    129  * K.L. The keep alive time out use to be default to
    130  * 900 seconds. It is not long enough for some applications
    131  * i.e. MS Access. Therefore, the timeout is increased to
    132  * 5400 seconds.
    133  */
    134 #define	SSN_KEEP_ALIVE_TIMEOUT	(90 * 60) /* seconds */
    135 #define	FRAGMENT_TIMEOUT	(2 * SECONDS)
    136 
    137 /* smb_netbios_util.c */
    138 extern int netbios_first_level_name_decode(char *in, char *name, char *scope);
    139 extern int netbios_first_level_name_encode(unsigned char *name,
    140     unsigned char *scope, unsigned char *out, int max_out);
    141 extern int netbios_name_isvalid(char *in, char *out);
    142 
    143 #ifdef __cplusplus
    144 }
    145 #endif
    146 
    147 #endif /* _SMBSRV_NETBIOS_H */
    148