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 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * $FreeBSD: stable/9/sys/netncp/ncp_conn.h 206361 2010-04-07 16:50:38Z joel $ 27 */ 28 #ifndef _NETNCP_NCP_CONN_H_ 29 #define _NETNCP_NCP_CONN_H_ 30 31 #ifndef _NETINET_IN_H_ 32 #include <netinet/in.h> 33 #endif 34 35 #ifndef _NETIPX_IPX_H_ 36 #include <netipx/ipx.h> 37 #endif 38 39 #ifndef _SYS_SOCKET_H_ 40 #include <sys/socket.h> 41 #endif 42 43 /* type of transport we use */ 44 /*#define NCP_ON_IPX 0 45 #define NCP_ON_TCP 1*/ 46 47 /* flags field in conn structure */ 48 #define NCPFL_SOCONN 0x0001 /* socket layer is up */ 49 #define NCPFL_ATTACHED 0x0002 /* ncp layer is up */ 50 #define NCPFL_LOGGED 0x0004 /* logged in to server */ 51 #define NCPFL_INVALID 0x0008 /* last request was not completed */ 52 #define NCPFL_INTR 0x0010 /* interrupted call */ 53 #define NCPFL_RESTORING 0x0020 /* trying to reconnect */ 54 #define NCPFL_PERMANENT 0x0040 /* no way to kill conn, when this set */ 55 #define NCPFL_PRIMARY 0x0080 /* have meaning only for owner */ 56 #define NCPFL_WASATTACHED 0x0100 /* there was at least one successfull connect */ 57 #define NCPFL_WASLOGGED 0x0200 /* there was at least one successfull login */ 58 #define NCPFL_SIGNACTIVE 0x1000 /* packet signing active */ 59 #define NCPFL_SIGNWANTED 0x2000 /* signing should start */ 60 61 /* access mode for connection */ 62 #define NCPM_READ 0400 /* able to fetch conn params */ 63 #define NCPM_WRITE 0200 /* modify/close */ 64 #define NCPM_EXECUTE 0100 /* run requests */ 65 66 #define NCP_DEFAULT_OWNER ((uid_t)-1) 67 #define NCP_DEFAULT_GROUP ((uid_t)-1) 68 69 70 /* args used to create connection */ 71 #define ncp_conn_loginfo ncp_conn_args 72 struct ncp_conn_args { 73 int opt; 74 #define NCP_OPT_WDOG 1 /* need watch dog socket */ 75 #define NCP_OPT_MSG 2 /* need message socket */ 76 #define NCP_OPT_SIGN 4 /* signatures wanted */ 77 #define NCP_OPT_BIND 8 /* force bindery login */ 78 #define NCP_OPT_PERMANENT 0x10 /* only for refernce, completly ignored */ 79 #define NCP_OPT_NOUPCASEPASS 0x20 /* leave password as is */ 80 int sig_level; /* wanted signature level */ 81 char server[NCP_BINDERY_NAME_LEN+1]; 82 char *user; 83 char *password; 84 u_int32_t objtype; 85 union { 86 struct sockaddr addr; 87 struct sockaddr_ipx ipxaddr; 88 struct sockaddr_in inaddr; 89 } addr; 90 int timeout; /* ncp rq timeout */ 91 int retry_count; /* counts to give an error */ 92 uid_t owner; /* proposed owner of connection */ 93 gid_t group; /* proposed group of connection */ 94 mode_t access_mode; /* R/W - can do rq's, X - can see the conn */ 95 }; 96 97 #define ipxaddr addr.ipxaddr 98 #define inaddr addr.inaddr 99 #define saddr addr.addr 100 101 /* user side structure to issue ncp calls */ 102 struct ncp_buf { 103 int rqsize; /* request size without ncp header */ 104 int rpsize; /* reply size minus ncp header */ 105 int cc; /* completion code */ 106 int cs; /* connection state */ 107 char packet[NCP_MAX_PACKET_SIZE];/* Here we prepare requests and receive replies */ 108 }; 109 110 /* 111 * Connection status, returned via sysctl(vfs.nwfs.connstat) 112 */ 113 struct ncp_conn_stat { 114 struct ncp_conn_args li; 115 int connRef; 116 int ref_cnt; 117 int connid; 118 int buffer_size; 119 int flags; 120 int sign_active; 121 uid_t owner; 122 gid_t group; 123 char user[NCP_MAXUSERNAMELEN+1]; 124 }; 125 126 #ifdef _KERNEL 127 128 #ifndef LK_SHARED 129 #include <sys/lock.h> 130 #include <sys/lockmgr.h> 131 #endif 132 133 struct socket; 134 struct u_cred; 135 136 SLIST_HEAD(ncp_conn_head,ncp_conn); 137 138 struct ncp_rq; 139 struct ncp_conn; 140 141 /* 142 * External and internal processes can reference connection only by handle. 143 * This gives us a freedom in maintance of underlying connections. 144 */ 145 struct ncp_handle { 146 SLIST_ENTRY(ncp_handle) nh_next; 147 int nh_id; /* handle id */ 148 struct ncp_conn*nh_conn; /* which conn we are refernce */ 149 struct thread * nh_td; /* who owns the handle */ 150 int nh_ref; /* one process can asquire many handles, but we return the one */ 151 }; 152 153 /* 154 * Describes any connection to server 155 */ 156 struct ncp_conn { 157 SLIST_ENTRY(ncp_conn) nc_next; 158 struct ncp_conn_args li; 159 struct ucred *nc_owner; 160 gid_t nc_group; 161 int flags; 162 int nc_id; 163 struct socket *ncp_so; 164 struct socket *wdg_so; 165 struct socket *msg_so; 166 struct socket *bc_so; 167 int ref_cnt; /* how many handles leased */ 168 SLIST_HEAD(ncp_ref_hd,ncp_ref) ref_list;/* list of handles */ 169 struct lock nc_lock; /* excl locks */ 170 int nc_lwant; /* number of wanted locks */ 171 struct thread *td; /* pid currently operates */ 172 struct ucred *ucred; /* usr currently operates */ 173 /* Fields used to process ncp requests */ 174 int connid; /* assigned by server */ 175 u_int8_t seq; 176 int buffer_size; /* Negotiated bufsize */ 177 /* Fields used to make packet signatures */ 178 u_int32_t sign_root[2]; 179 u_int32_t sign_state[4]; /* md4 state */ 180 #ifdef NCPBURST 181 /* Fields used for packet bursting */ 182 u_long bc_pktseq; /* raw packet sequence */ 183 u_short bc_seq; /* burst sequence */ 184 u_long bc_locid; /* local connection id */ 185 u_long bc_remid; /* remote connection id */ 186 u_long bc_pktsize; /* negotiated burst packet size */ 187 #endif 188 }; 189 190 int ncp_conn_init(void); 191 int ncp_conn_destroy(void); 192 int ncp_conn_alloc(struct ncp_conn_args *cap, 193 struct thread *td, struct ucred *cred, struct ncp_conn **connid); 194 int ncp_conn_free(struct ncp_conn *conn); 195 int ncp_conn_access(struct ncp_conn *conn,struct ucred *cred,mode_t mode); 196 int ncp_conn_lock(struct ncp_conn *conn,struct thread *td, struct ucred *cred,int mode); 197 void ncp_conn_unlock(struct ncp_conn *conn,struct thread *td); 198 int ncp_conn_assert_locked(struct ncp_conn *conn,const char *checker,struct thread *td); 199 void ncp_conn_invalidate(struct ncp_conn *ncp); 200 int ncp_conn_invalid(struct ncp_conn *ncp); 201 /*int ncp_conn_ref(struct ncp_conn *conn, pid_t pid); 202 int ncp_conn_rm_ref(struct ncp_conn *conn, pid_t pid, int force); 203 void ncp_conn_list_rm_ref(pid_t pid);*/ 204 int ncp_conn_getbyref(int connRef,struct thread *td, struct ucred *cred, int mode, 205 struct ncp_conn **connpp); 206 int ncp_conn_getbyli(struct ncp_conn_loginfo *li,struct thread *td, struct ucred *cred, 207 int mode, struct ncp_conn **connpp); 208 int ncp_conn_setprimary(struct ncp_conn *conn, int on); 209 int ncp_conn_locklist(int flags, struct thread *td); 210 void ncp_conn_unlocklist(struct thread *td); 211 int ncp_conn_gethandle(struct ncp_conn *conn, struct thread *td, struct ncp_handle **handle); 212 int ncp_conn_puthandle(struct ncp_handle *handle, struct thread *td, int force); 213 int ncp_conn_findhandle(int connHandle, struct thread *td, struct ncp_handle **handle); 214 int ncp_conn_getattached(struct ncp_conn_args *li,struct thread *td, struct ucred *cred,int mode, struct ncp_conn **connpp); 215 int ncp_conn_putprochandles(struct thread *td); 216 int ncp_conn_getinfo(struct ncp_conn *ncp, struct ncp_conn_stat *ncs); 217 218 int ncp_conn_reconnect(struct ncp_conn *ncp); 219 int ncp_conn_login(struct ncp_conn *conn, struct thread *td, struct ucred *cred); 220 221 extern struct ncp_conn_head conn_list; 222 extern int ncp_burst_enabled; 223 224 #ifdef MALLOC_DECLARE 225 MALLOC_DECLARE(M_NCPDATA); 226 #endif 227 228 #endif /* _KERNEL */ 229 #endif /* _NCP_CONN_H_ */ 230