xref: /illumos-gate/usr/src/uts/common/fs/smbsrv/smb_trans2_dfs.c (revision dc25fd745d311a1cf9d98d7b7897caa0877adff0)
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 2009 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #include <smbsrv/smb_kproto.h>
27 
28 
29 /*
30  * trans2_get_dfs_referral
31  *
32  * The client sends this request to ask the server to convert
33  * RequestFilename into an alternate name for this file.  This request can
34  * be sent to the server if the server response to the NEGOTIATE SMB
35  * included the CAP_DFS capability.  The TID of the request must be IPC$.
36  * Bit15 of Flags2 in the SMB header must be set, indicating this is a
37  * UNICODE request.
38  *
39  * Client Request              Description
40  * ==========================  =========================================
41  * WordCount                   15
42  * TotalDataCount              0
43  * SetupCount                  1
44  * Setup[0]                    TRANS2_GET_DFS_REFERRAL
45  *
46  * Parameter Block Encoding    Description
47  * ==========================  =========================================
48  * USHORT MaxReferralLevel     Latest referral version number understood
49  * WCHAR RequestFileName;      DFS name of file for which referral is
50  *                             sought
51  *
52  * Response Data Block         Description
53  * ==========================  =========================================
54  * USHORT PathConsumed;        Number of RequestFilename bytes client
55  * USHORT NumberOfReferrals;   Number of referrals contained in this
56  *                             response
57  * USHORT Flags;               bit0 - The servers in Referrals are
58  *                             capable of fielding
59  *                             TRANS2_GET_DFS_REFERRAL.
60  *                             bit1 - The servers in Referrals should
61  *                             hold the storage for the requested file.
62  * REFERRAL_LIST Referrals[]   Set of referrals for this file
63  * UNICODESTRINGE Strings      Used to hold the strings pointed to by
64  *                             Version 2 Referrals in REFERRALS.
65  *
66  * The server response is a list of Referrals which inform the client where
67  * it should resubmit the request to obtain access to the file.
68  * PathConsumed in the response indicates to the client how many characters
69  * of  RequestFilename have been consumed by the server.  When the client
70  * chooses one of the referrals to use for file access, the client may need
71  * to strip the leading PathConsumed characters from the front of
72  * RequestFileName before submitting the name to the target server.
73  * Whether or not the pathname should be trimmed is indicated by the
74  * individual referral as detailed below.
75  *
76  * Flags indicates how this referral should be treated.  If bit0 is clear,
77  * any entity in the Referrals list holds the storage for RequestFileName.
78  * If bit0 is set, any entity in the Referrals list has further referral
79  * information for RequestFilename � a TRANS2_GET_DFS_REFERRAL request
80  * should be sent to an entity in the Referrals list for further
81  * resolution.
82  *
83  * The format of an individual referral contains version and  length
84  * information allowing the client to skip referrals it does not
85  * understand.  MaxReferralLevel indicates to the server the latest version
86  * of referral which the client can digest.  Since each referral has a
87  * uniform element, MaxReferralLevel is advisory only. Each element in
88  * Referrals has this envelope:
89  *
90  * REFERRAL_LIST element
91  * ======================================================================
92  *
93  * USHORT VersionNumber        Version of this referral element
94  *
95  * USHORT ReferralSize         Size of this referral element
96  *
97  * The following referral element versions are defined:
98  *
99  * Version 1 Referral Element Format
100  * ======================================================================
101  *
102  * USHORT ServerType           Type of Node handling referral:
103  *                             0 - Don't know
104  *                             1 - SMB Server
105  *                             2 - Netware Server
106  *                             3 - Domain
107  *
108  * USHORT ReferralFlags        Flags which describe this referral:
109  *                             01 - Strip off PathConsumed characters
110  *                             before submitting RequestFileName to Node
111  *
112  * UNICODESTRING Node          Name of entity to visit next
113  *
114  * Version 2 Referral Element Format
115  * ======================================================================
116  *
117  * USHORT ServerType              Type of Node handling referral:
118  *                                 0 - Don't know
119  *                                 1 - SMB Server
120  *                                 2 - Netware Server
121  *                                 3 - Domain
122  *
123  * USHORT ReferralFlags           Flags which describe this referral:
124  *                                 01 - Strip off PathConsumed characters
125  *                                 before submitting RequestFileName to
126  *                                 Node
127  *
128  * ULONG Proximity                A hint describing the proximity of this
129  *                                 server to the client. 0 indicates the
130  *                                 closest, higher numbers indicate
131  *                                 increasingly "distant" servers. The
132  *                                 number is only relevant within the
133  *                                 context of the servers listed in this
134  *                                 particular SMB.
135  *
136  * ULONG TimeToLive               Number of seconds for which the client
137  *                                 can cache this referral.
138  *
139  * USHORT DfsPathOffset           Offset, in bytes from the beginning of
140  *                                 this referral, of  the DFS Path that
141  *                                 matched PathConsumed bytes of the
142  *                                 RequestFileName.
143  *
144  * USHORT DfsAlternatePathOffset  Offset, in bytes from the beginning of
145  *                                 this referral, of an alternate name
146  *                                 (8.3 format) of the DFS Path that
147  *                                 matched PathConsumed bytes of the
148  *                                 RequestFileName.
149  *
150  * USHORT NetworkAddressOffset    Offset, in bytes from the beginning of
151  *                                 this referral, of the entity to visit
152  *                                 next.
153  *
154  * The CIFS protocol imposes no referral selection policy.
155  */
156 int /*ARGSUSED*/
157 smb_com_trans2_get_dfs_referral(struct smb_request *sr)
158 {
159 	return (SDRC_NOT_IMPLEMENTED);
160 }
161 
162 
163 /*
164  * SMB: trans2_report_dfs_inconsistency
165  *
166  * As part of the Distributed Name Resolution algorithm, a DFS client may
167  * discover a  knowledge inconsistency between the referral server (i.e.,
168  * the server that handed out a referral), and the storage server (i.e.,
169  * the server to which the client was redirected to by the referral
170  * server). When such an inconsistency is discovered, the DFS client
171  * optionally sends this SMB to the referral server, allowing the referral
172  * server to take corrective action.
173  *
174  * Client Request                     Description
175  * ================================== ==================================
176  * WordCount                          15
177  * MaxParameterCount                  0
178  * SetupCount                         1
179  * Setup[0]                           TRANS2_REPORT_DFS_INCONSISTENCY
180  *
181  * Parameter Block Encoding           Description
182  * ================================== ==================================
183  *
184  * UNICODESTRING RequestFileName;     DFS Name of file for which
185  *                                     referral was sought
186  *
187  * The data part of this request contains the referral element (Version 1
188  * format only) believed to be in error.  These are encoded as described in
189  * the TRANS2_GET_DFS_REFERRAL response.  If the server returns success,
190  * the client can resubmit the TRANS2_GET_DFS_REFERRAL request to this
191  * server to get a new referral.  It is not mandatory for the DFS knowledge
192  * to be automatically repaired � the client must be prepared to receive
193  * further errant referrals and must not wind up looping between this
194  * request and the TRANS2_GET_DFS_REFERRAL request.
195  *
196  * Bit15 of Flags2 in the SMB header must be set, indicating this is a
197  * UNICODE request.
198  */
199 int /*ARGSUSED*/
200 smb_com_trans2_report_dfs_inconsistency(struct smb_request *sr)
201 {
202 	return (SDRC_NOT_IMPLEMENTED);
203 }
204