2 * Copyright (c) 1999, Boris Popov
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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.
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
32 * $FreeBSD: src/sys/netncp/ncp_conn.h,v 1.3 1999/12/29 04:46:15 peter Exp $
33 * $DragonFly: src/sys/netproto/ncp/ncp_conn.h,v 1.5 2005/02/15 18:20:50 joerg Exp $
35 #ifndef _NETNCP_NCP_CONN_H_
36 #define _NETNCP_NCP_CONN_H_
39 #ifndef _NETINET_IN_H_
40 #include <netinet/in.h>
45 #ifndef _NETIPX_IPX_H_
46 #include <netproto/ipx/ipx.h>
50 #ifndef _SYS_SOCKET_H_
51 #include <sys/socket.h>
54 /* type of transport we use */
55 /*#define NCP_ON_IPX 0
56 #define NCP_ON_TCP 1*/
58 /* flags field in conn structure */
59 #define NCPFL_SOCONN 0x01 /* socket layer is up */
60 #define NCPFL_ATTACHED 0x02 /* ncp layer is up */
61 #define NCPFL_LOGGED 0x04 /* logged in to server */
62 #define NCPFL_INVALID 0x08 /* last request was not completed */
63 #define NCPFL_INTR 0x10 /* interrupted call */
64 #define NCPFL_RESTORING 0x20 /* trying to reconnect */
65 #define NCPFL_PERMANENT 0x40 /* no way to kill conn, when this set */
66 #define NCPFL_PRIMARY 0x80 /* have meaning only for owner */
67 #define NCPFL_SIGNACTIVE 0x1000 /* packet signing active */
68 #define NCPFL_SIGNWANTED 0x2000 /* signing should start */
70 /* access mode for connection */
71 #define NCPM_READ 0400 /* able to fetch conn params */
72 #define NCPM_WRITE 0200 /* modify/close */
73 #define NCPM_EXECUTE 0100 /* run requests */
75 #define NCP_DEFAULT_OWNER ((uid_t)-1)
76 #define NCP_DEFAULT_GROUP ((uid_t)-1)
79 /* args used to create connection */
80 #define ncp_conn_loginfo ncp_conn_args
81 struct ncp_conn_args
{
83 #define NCP_OPT_WDOG 1 /* need watch dog socket */
84 #define NCP_OPT_MSG 2 /* need message socket */
85 #define NCP_OPT_SIGN 4 /* signatures wanted */
86 #define NCP_OPT_BIND 8 /* force bindery login */
87 #define NCP_OPT_PERMANENT 0x10 /* only for refernce, completly ignored */
88 #define NCP_OPT_NOUPCASEPASS 0x20 /* leave password as is */
89 int sig_level
; /* wanted signature level */
90 char server
[NCP_BINDERY_NAME_LEN
+1];
97 struct sockaddr_ipx ipxaddr
;
100 struct sockaddr_in inaddr
;
103 int timeout
; /* ncp rq timeout */
104 int retry_count
; /* counts to give an error */
105 uid_t owner
; /* proposed owner of connection */
106 gid_t group
; /* proposed group of connection */
107 mode_t access_mode
; /* R/W - can do rq's, X - can see the conn */
110 #define ipxaddr addr.ipxaddr
111 #define inaddr addr.inaddr
112 #define saddr addr.addr
114 /* user side structure to issue ncp calls */
116 int rqsize
; /* request size without ncp header */
117 int rpsize
; /* reply size minus ncp header */
118 int cc
; /* completion code */
119 int cs
; /* connection state */
120 char packet
[NCP_MAX_PACKET_SIZE
];/* Here we prepare requests and receive replies */
124 * Connection status, returned via sysctl(vfs.nwfs.connstat)
126 struct ncp_conn_stat
{
127 struct ncp_conn_args li
;
136 char user
[NCP_MAXUSERNAMELEN
+1];
142 #include <sys/lock.h>
148 SLIST_HEAD(ncp_conn_head
,ncp_conn
);
154 * External and internal processes can reference connection only by handle.
155 * This gives us a freedom in maintance of underlying connections.
158 SLIST_ENTRY(ncp_handle
) nh_next
;
159 int nh_id
; /* handle id */
160 struct ncp_conn
*nh_conn
; /* which conn we are refernce */
161 struct thread
* nh_td
; /* who owns the handle */
162 int nh_ref
; /* one process can asquire many handles, but we return the one */
166 * Describes any connection to server
169 SLIST_ENTRY(ncp_conn
) nc_next
;
170 struct ncp_conn_args li
;
171 struct ucred
*nc_owner
;
175 struct socket
*ncp_so
;
176 struct socket
*wdg_so
;
177 struct socket
*msg_so
;
178 struct socket
*bc_so
;
179 int ref_cnt
; /* how many handles leased */
180 SLIST_HEAD(ncp_ref_hd
,ncp_ref
) ref_list
;/* list of handles */
181 struct lock nc_lock
; /* excl locks */
182 int nc_lwant
; /* number of wanted locks */
183 struct thread
*td
; /* thread currently operates */
184 struct ucred
*ucred
; /* usr currently operates */
185 struct ncp_rq
*nc_rq
; /* current request */
186 /* Fields used to process ncp requests */
187 int connid
; /* assigned by server */
189 int buffer_size
; /* Negotiated bufsize */
190 /* Fields used to make packet signatures */
191 u_int32_t sign_root
[2];
192 u_int32_t sign_state
[4]; /* md4 state */
194 /* Fields used for packet bursting */
195 u_long bc_pktseq
; /* raw packet sequence */
196 u_short bc_seq
; /* burst sequence */
197 u_long bc_locid
; /* local connection id */
198 u_long bc_remid
; /* remote connection id */
199 u_long bc_pktsize
; /* negotiated burst packet size */
203 #define ncp_conn_signwanted(conn) ((conn)->flags & NCPFL_SIGNWANTED)
204 #define ncp_conn_valid(conn) ((conn->flags & NCPFL_INVALID) == 0)
205 #define ncp_conn_invalidate(conn) {conn->flags |= NCPFL_INVALID;}
207 int ncp_conn_init(void);
208 int ncp_conn_alloc(struct thread
*td
,struct ucred
*cred
, struct ncp_conn
**connid
);
209 int ncp_conn_free(struct ncp_conn
*conn
);
210 int ncp_conn_access(struct ncp_conn
*conn
,struct ucred
*cred
,mode_t mode
);
211 int ncp_conn_lock(struct ncp_conn
*conn
,struct thread
*td
,struct ucred
*cred
,int mode
);
212 void ncp_conn_unlock(struct ncp_conn
*conn
,struct thread
*td
);
213 int ncp_conn_assert_locked(struct ncp_conn
*, const char *, struct thread
*);
214 /*int ncp_conn_ref(struct ncp_conn *conn, pid_t pid);
215 int ncp_conn_rm_ref(struct ncp_conn *conn, pid_t pid, int force);
216 void ncp_conn_list_rm_ref(pid_t pid);*/
217 int ncp_conn_getbyref(int connRef
,struct thread
*td
,struct ucred
*cred
, int mode
,
218 struct ncp_conn
**connpp
);
219 int ncp_conn_getbyli(struct ncp_conn_loginfo
*li
,struct thread
*td
,struct ucred
*cred
,
220 int mode
, struct ncp_conn
**connpp
);
221 int ncp_conn_setprimary(struct ncp_conn
*conn
, int on
);
222 int ncp_conn_locklist(int flags
, struct thread
*td
);
223 void ncp_conn_unlocklist(struct thread
*td
);
224 int ncp_conn_gethandle(struct ncp_conn
*conn
, struct thread
*td
, struct ncp_handle
**handle
);
225 int ncp_conn_puthandle(struct ncp_handle
*handle
, struct thread
*td
, int force
);
226 int ncp_conn_findhandle(int connHandle
, struct thread
*td
, struct ncp_handle
**handle
);
227 int ncp_conn_getattached(struct ncp_conn_args
*li
,struct thread
*td
,struct ucred
*cred
,int mode
, struct ncp_conn
**connpp
);
228 int ncp_conn_putprochandles(struct thread
*td
);
229 int ncp_conn_getinfo(struct ncp_conn
*ncp
, struct ncp_conn_stat
*ncs
);
231 extern struct ncp_conn_head conn_list
;
232 extern int ncp_burst_enabled
;
234 #ifdef MALLOC_DECLARE
235 MALLOC_DECLARE(M_NCPDATA
);
239 #endif /* _NCP_CONN_H_ */