route.8: Remove NS remains.
[dragonfly.git] / sys / netproto / ncp / ncp_conn.h
1 /*
2  * Copyright (c) 1999, 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  * $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 $
34  */
35 #ifndef _NETNCP_NCP_CONN_H_
36 #define _NETNCP_NCP_CONN_H_
37
38 #ifdef INET
39 #ifndef _NETINET_IN_H_
40 #include <netinet/in.h>
41 #endif
42 #endif
43
44 #ifdef IPX
45 #ifndef _NETIPX_IPX_H_
46 #include <netproto/ipx/ipx.h>
47 #endif
48 #endif
49
50 #ifndef _SYS_SOCKET_H_
51 #include <sys/socket.h>
52 #endif
53
54 /* type of transport we use */
55 /*#define       NCP_ON_IPX      0
56 #define NCP_ON_TCP      1*/
57
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 */
69
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 */
74
75 #define NCP_DEFAULT_OWNER       ((uid_t)-1)
76 #define NCP_DEFAULT_GROUP       ((uid_t)-1)
77
78
79 /* args used to create connection */
80 #define ncp_conn_loginfo        ncp_conn_args
81 struct ncp_conn_args {
82         int             opt;
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];
91         char            *user;
92         char            *password;
93         u_int32_t       objtype;
94         union {
95                 struct sockaddr addr;
96 #ifdef IPX
97                 struct sockaddr_ipx ipxaddr;
98 #endif
99 #ifdef INET
100                 struct sockaddr_in inaddr;
101 #endif
102         } addr;
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 */
108 };
109
110 /* user side structure to issue ncp calls */
111 struct ncp_buf {
112         int     rqsize;                 /* request size without ncp header */
113         int     rpsize;                 /* reply size minus ncp header */
114         int     cc;                     /* completion code */
115         int     cs;                     /* connection state */
116         char    packet[NCP_MAX_PACKET_SIZE];/* Here we prepare requests and receive replies */
117 };
118
119 /*
120  * Connection status, returned via sysctl(vfs.nwfs.connstat)
121  */
122 struct ncp_conn_stat {
123         struct ncp_conn_args li;
124         int             connRef;
125         int             ref_cnt;
126         int             connid;
127         int             buffer_size;
128         int             flags;
129         int             sign_active;
130         uid_t           owner;
131         gid_t           group;
132         char            user[NCP_MAXUSERNAMELEN+1];
133 };
134
135 #ifdef _KERNEL
136
137 #ifndef LK_SHARED
138 #include <sys/lock.h>
139 #endif
140
141 struct socket;
142 struct u_cred;
143
144 SLIST_HEAD(ncp_conn_head,ncp_conn);
145
146 struct ncp_rq;
147 struct ncp_conn;
148
149 /*
150  * External and internal processes can reference connection only by handle.
151  * This gives us a freedom in maintance of underlying connections.
152  */
153 struct ncp_handle {
154         SLIST_ENTRY(ncp_handle) nh_next;
155         int             nh_id;          /* handle id */
156         struct ncp_conn*nh_conn;        /* which conn we are refernce */
157         struct thread * nh_td;          /* who owns the handle  */
158         int             nh_ref;         /* one process can asquire many handles, but we return the one */
159 };
160
161 /* 
162  * Describes any connection to server 
163  */
164 struct ncp_conn {
165         SLIST_ENTRY(ncp_conn) nc_next;
166         struct ncp_conn_args li;
167         struct ucred    *nc_owner;
168         gid_t           nc_group;
169         int             flags;
170         int             nc_id;
171         struct socket   *ncp_so;
172         struct socket   *wdg_so;
173         struct socket   *msg_so;
174         struct socket   *bc_so;
175         int             ref_cnt;                /* how many handles leased */
176         SLIST_HEAD(ncp_ref_hd,ncp_ref) ref_list;/* list of handles */
177         struct lock     nc_lock;                /* excl locks */
178         int             nc_lwant;               /* number of wanted locks */
179         struct thread   *td;                    /* thread currently operates */
180         struct ucred    *ucred;                 /* usr currently operates */
181         struct ncp_rq   *nc_rq;                 /* current request */
182         /* Fields used to process ncp requests */
183         int             connid;                 /* assigned by server */
184         u_int8_t        seq;
185         int             buffer_size;            /* Negotiated bufsize */
186         /* Fields used to make packet signatures */
187         u_int32_t       sign_root[2];
188         u_int32_t       sign_state[4];          /* md4 state */
189 #ifdef NCPBURST
190         /* Fields used for packet bursting */
191         u_long          bc_pktseq;              /* raw packet sequence */
192         u_short         bc_seq;                 /* burst sequence */
193         u_long          bc_locid;               /* local connection id */
194         u_long          bc_remid;               /* remote connection id */
195         u_long          bc_pktsize;             /* negotiated burst packet size */
196 #endif
197 };
198
199 #define ncp_conn_signwanted(conn)       ((conn)->flags & NCPFL_SIGNWANTED)
200 #define ncp_conn_valid(conn)            ((conn->flags & NCPFL_INVALID) == 0)
201 #define ncp_conn_invalidate(conn)       {conn->flags |= NCPFL_INVALID;}
202
203 int  ncp_conn_init(void);
204 int  ncp_conn_alloc(struct thread *td,struct ucred *cred, struct ncp_conn **connid);
205 int  ncp_conn_free(struct ncp_conn *conn);
206 int  ncp_conn_access(struct ncp_conn *conn,struct ucred *cred,mode_t mode);
207 int  ncp_conn_lock(struct ncp_conn *conn,struct thread *td,struct ucred *cred,int mode);
208 void ncp_conn_unlock(struct ncp_conn *conn,struct thread *td);
209 int  ncp_conn_assert_locked(struct ncp_conn *, const char *, struct thread *);
210 /*int  ncp_conn_ref(struct ncp_conn *conn, pid_t pid);
211 int  ncp_conn_rm_ref(struct ncp_conn *conn, pid_t pid, int force);
212 void ncp_conn_list_rm_ref(pid_t pid);*/
213 int  ncp_conn_getbyref(int connRef,struct thread *td,struct ucred *cred, int mode,
214         struct ncp_conn **connpp);
215 int  ncp_conn_getbyli(struct ncp_conn_loginfo *li,struct thread *td,struct ucred *cred, 
216         int mode, struct ncp_conn **connpp);
217 int  ncp_conn_setprimary(struct ncp_conn *conn, int on);
218 int  ncp_conn_locklist(int flags, struct thread *td);
219 void ncp_conn_unlocklist(struct thread *td);
220 int  ncp_conn_gethandle(struct ncp_conn *conn, struct thread *td, struct ncp_handle **handle);
221 int  ncp_conn_puthandle(struct ncp_handle *handle, struct thread *td, int force);
222 int  ncp_conn_findhandle(int connHandle, struct thread *td, struct ncp_handle **handle);
223 int  ncp_conn_getattached(struct ncp_conn_args *li,struct thread *td,struct ucred *cred,int mode, struct ncp_conn **connpp);
224 int  ncp_conn_putprochandles(struct thread *td);
225 int  ncp_conn_getinfo(struct ncp_conn *ncp, struct ncp_conn_stat *ncs);
226
227 extern struct ncp_conn_head conn_list;
228 extern int ncp_burst_enabled;
229
230 #ifdef MALLOC_DECLARE
231 MALLOC_DECLARE(M_NCPDATA);
232 #endif
233
234 #endif /* _KERNEL */
235 #endif /* _NCP_CONN_H_ */