smbrdr_session.c revision 7f667e74610492ddbce8ce60f52ece95d2401949
1N/A * The contents of this file are subject to the terms of the 1N/A * Common Development and Distribution License (the "License"). 1N/A * You may not use this file except in compliance with the License. 1N/A * See the License for the specific language governing permissions 1N/A * and limitations under the License. 1N/A * When distributing Covered Code, include this CDDL HEADER in each 1N/A * If applicable, add the following below this CDDL HEADER, with the 1N/A * fields enclosed by brackets "[]" replaced with your own identifying 1N/A * information: Portions Copyright [yyyy] [name of copyright owner] 1N/A * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 1N/A * Use is subject to license terms. 1N/A * This module provides the netbios and SMB negotiation, connect and 1N/A * disconnect interface. 1N/A * Entry pointy for smbrdr initialization. 1N/A * Disconnects the session with given server. 1N/A * Negotiate a session with a domain controller in the specified domain. 1N/A * The domain must be one of values from the smbinfo that indicates the 1N/A * resource domain or the account domain. 1N/A * If a session already exists, we can use that one. Otherwise we create 1N/A * a new one. This sets up the session key and session security info that 1N/A * we'll need later to authenticate the user. The session security info 1N/A * is returned to support the SMB client pass-through authentication 1N/A * Returns 0 on success, otherwise -1. 1N/A * The mutex is to make session lookup and create atomic 1N/A * so we don't end up with two sessions with the same 1N/A /* session is good, use it */ 1N/A * smbrdr_session_connect 1N/A * This is the entry point for establishing an SMB connection to a 1N/A * domain controller. A session structure is allocated, a netbios 1N/A * session is set up and the SMB protocol is negotiated. If this is 1N/A * successful, the returned session structure can be used to logon 1N/A * to the the domain. A null pointer is returned if the connect fails. 1N/A * smbrdr_session_init() will lock the session so that it wouldn't 1N/A * be accessible until it's established otherwise another thread 1N/A * might get access to a session which is not fully established. * Set up the TCP/IP and NETBIOS protocols for a session. This is just * standard socket sutff. The paranoia check for socket descriptor 0 * is because we had a problem with this value and the console telnet * interface will lock up if we use and/or close stdin (0). * Return 0 on success. Otherwise return (-1) to indicate a problem. * If we are using NetBIOS, we need to set up a NETBIOS session. * This typically implies that we will be using port 139. * Otherwise, we're doing NetBIOS-less SMB, i.e. SMB over TCP, * which is typically on port 445. "smbrdr: NBT session request to %s failed %d",
* Negotiate the protocol we are going to use as described in CIFS * section 4.1.1. The only protocol we support is NT LM 0.12, so we * really expect to see dialect 0 in the response. The only other * data gathered is the session key. * Negotiate using ASCII strings. * Return 0 on success. Otherwise return a -ve error code. "1.(dialect)w(mode)b12.(key)l(cap)l10.(keylen)b2.",
* Allocate an available slot in session table for the specified domain * IMPORTANT! the returned session will be locked caller has to unlock * it by calling smbrdr_session_unlock() after it's done with * Note that by sending vc=0 server will shutdown all * the other connections with NAS if there is any. * smbrdr_session_disconnect * This is the entry point for disconnecting an SMB connection. Ensure * that all logons and shares associated with this session are * terminated and then free the session. * if 'cleanup' is 1 it means that only sessions that are not active * should be cleaned up. if 'cleanup' is 0 disconnect the session in any * if session is in stale state it means the connection * is lost so no logoff, tdcon, or close can actually * be sent, thus only cleanup our side. * Unlock given session structure. * Lookup the session associated with the specified domain controller. * If a match is found, we return a pointer to the session, Otherwise * we return null. Only sessions in "negotiated" state are checked. * This mechanism is very simple and implies that we * should only ever have one session open to any domain controller. * IMPORTANT! the returned session will be locked caller has to unlock * it by calling smbrdr_session_unlock() after it's done with * Return session information related to the specified "smbrdr_session_info: unknown file (%d)",
fid);
* Debug function to dump the session table. * This request can be used to test the connection to the server. The * server should echo the data sent. The server should ignore the tid * in the header, so this request when there are no tree connections. * See CIFS/1.0 section 4.1.7. * Return 0 on success. Otherwise return a -ve error code.