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, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef	_INET_NCADOORHDR_H
28 #define	_INET_NCADOORHDR_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 #ifdef	__cplusplus
33 extern "C" {
34 #endif
35 
36 #ifndef _KERNEL
37 #include <stddef.h>
38 #endif /* _KERNEL */
39 
40 #include <sys/types.h>
41 #include <sys/socket.h>
42 #include <netinet/in.h>
43 
44 #define	ONE_KB				(1024)
45 #define	NCA_IO_MAX_SIZE			(256 * ONE_KB)
46 #define	NCA_IO_OFFSET			(sizeof (nca_io2_t))
47 
48 #define	NCA_IO_TRUE			1
49 #define	NCA_IO_FALSE			0
50 
51 /*
52  * Defines the data structures used by NCA and Webservers.
53  */
54 
55 typedef enum {
56 	/*
57 	 * NCA-to-HTTP-server protocol operation values:
58 	 */
59 	http_op		= 100,	/* NCA<>HTTP normal request/response */
60 	error_op	= 101,	/* NCA<-HTTP server error */
61 	error_retry_op	= 102,	/* NCA<-HTTP server transient error */
62 	resource_op	= 120,	/* NCA->HTTP server release resources */
63 	timeout_op	= 150,	/* NCA<-HTTP server timed out */
64 	door_attach_op	= 160,	/* NCA->HTTP NCA supports door fattach */
65 	/*
66 	 * NCA-to-Logging-server protocol operation values:
67 	 */
68 	log_op		= 10000,	/* NCA->Logger normal request */
69 	log_ok_op	= 10001,	/* NCA<-Logger request ok */
70 	log_error_op	= 10002,	/* NCA<-Logger request error */
71 	log_op_fiov	= 10003		/* NCA<>Logger file i/o vector */
72 } nca_op_t;
73 
74 typedef enum {
75 	NCA_HTTP_VERSION1 = 1001,	/* NCA-to-HTTP-server protocol */
76 	NCA_HTTP_VERSION2 = 1002,	/* NCA-to-HTTP-server protocol V2 */
77 	NCA_LOG_VERSION1 = 5001,	/* NCA-to-Logging-server protocol */
78 	NCA_LOG_VERSION2 = 5002		/* with in-kernel logging support */
79 	/*
80 	 * Note: Other version values are reserved for other client-to-server
81 	 * Solaris door base protocols and as these protocols may or may not
82 	 * be for use with NCA a new datatype (door_version_t ?) will be
83 	 * defined.
84 	 *
85 	 * Note: NCA_HTTP_VERSION1 has been deprecated, NCA_HTTP_VERSION2 must
86 	 * be used instead and is functionally a superset of (however, requires
87 	 * porting as some member names and symantics have changed).
88 	 */
89 } nca_version_t;
90 
91 #define	HTTP_ERR	(-1)
92 #define	HTTP_0_0	0x00000
93 #define	HTTP_0_9	0x00009
94 #define	HTTP_1_0	0x10000
95 #define	HTTP_1_1	0x10001
96 
97 typedef uint32_t	nca_tag_t;	/* Request id */
98 typedef uint32_t	nca_offset_t;	/* Offset */
99 
100 /*
101  * Use pack(4) to make sizeof(struct nca_direct_cd_s) the same
102  * on x86 and amd64.
103  */
104 
105 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
106 #pragma pack(4)
107 #endif
108 
109 typedef struct nca_direct_cd_s {	/* Direct i/o connection descriptor */
110 	uint64_t	cid;		/* The connection id */
111 	nca_tag_t	tag;		/* The connect tag */
112 } nca_direct_cd_t;
113 
114 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
115 #pragma pack()
116 #endif
117 
118 /*
119  * nca_io2_t.advisory values:
120  *
121  *    NCA_IO_ADVISE - on cache miss upcall/return or preempted downcall
122  *	advise that on susequent cache hit an advise upcall is required.
123  *
124  *    NCA_IO_ADVISE_REPLACE - on advisory upcall/return or unsolicited
125  *	downcall (for a ctag'ed object) replace the object data with
126  *	returned object data.
127  *
128  *    NCA_IO_ADVISE_FLUSH - on advisory upcall/return or unsolicited downcall
129  *	(for a ctag'ed object) flush the object from the cache.
130  *
131  *    NCA_IO_ADVISE_TEMP - on advisory upcall/return use the returned object
132  *	data instead of the cached object data, the cached object is unaltered.
133  *
134  *    NCA_IO_ADVISE_NONE - on cache miss upcall/return or preempted downcall
135  *	no advise is needed and on advisory upcall/return no advise was needed.
136  */
137 #define	NCA_IO_ADVISE		0x01
138 #define	NCA_IO_ADVISE_REPLACE	0x02
139 #define	NCA_IO_ADVISE_FLUSH	0x04
140 #define	NCA_IO_ADVISE_TEMP	0x08
141 #define	NCA_IO_ADVISE_NONE	0x00
142 
143 
144 /*
145  * nca_io2_t.direct_type values:
146  *
147  *  For upcall or downcall/return:
148  *
149  *    NCA_IO_DIRECT_NONE - none, any data is delivered via the optional
150  *	meta data specifiers data/data_len and/or trailer/trailer_len.
151  *
152  *    NCA_IO_DIRECT_FILENAME - file name, Invalid.
153  *
154  *    NCA_IO_DIRECT_SHMSEG - shared memory segment, Invalid.
155  *
156  *    NCA_IO_DIRECT_FILEDESC - file descriptor, Invalid.
157  *
158  *    NCA_IO_DIRECT_CTAG - cache tag(s), like NCA_IO_DIRECT_NONE any data
159  *	is delivered via the meta data specifiers data/data_len, in addition
160  *	the meta data specifiers direct/direct_len point to an array of ctag
161  *	uint64_t value(s) of previously returned ctag'ed response(s) for URI
162  *	relative pathnamed variant(s).
163  *
164  *    NCA_IO_DIRECT_SPLICE - splice of a connection is complete, on last
165  *	transaction for a connection (i.e. when both the call and return
166  *	nca_io2_t.more values are set to zero) indicates splice to the
167  *	previously named preempted connection is complete.
168  *
169  *    NCA_IO_DIRECT_TEE - tee of a connection is complete, on last
170  *	transaction for a connection (i.e. when both the call and return
171  *	nca_io2_t.more values are set to zero) indicates tee to the
172  *	previously named connection is complete.
173  *
174  *  For upcall/return or downcall:
175  *
176  *    NCA_IO_DIRECT_NONE - none, any data is delivered via the optional
177  *	meta data specifiers data/data_len and/or trailer/trailer_len.
178  *
179  *    NCA_IO_DIRECT_FILENAME - file name, data is read from the named file,
180  *	the meta data specifiers direct/direct_len point to a zero byte
181  *	terminated string containing the path to the named file.
182  *
183  *    NCA_IO_DIRECT_SHMSEG - shared memory segment, not implemented.
184  *
185  *    NCA_IO_DIRECT_FILEDESC - file descriptor, not implemented.
186  *
187  *    NCA_IO_DIRECT_CTAG - cache tag, data is to be gotten from the named
188  *	ctag value (a previously returned ctag'ed response).
189  *
190  *    NCA_IO_DIRECT_SPLICE - splice a connection, response data from the
191  *	current connection is output to the named connection (previously
192  *	preempted connection), the meta data specifiers direct/direct_len
193  *	point to a nca_direct_cd_t (a cid/tag pair connection descriptor)
194  *	used to specify the named connection. Note, no repsonse data is
195  * 	delivered to the current connection.
196  *
197  *    NCA_IO_DIRECT_TEE - tee a connection, response data from the current
198  *	connection is output to the named connection (previously preempted
199  *	connection), the meta data specifiers direct/direct_len	point to a
200  *	nca_direct_cd_t (a cid/tag pair connection descriptor) used to
201  *	specify the named connection. Note, response data is delivered to
202  *	the current connection as normal.
203  */
204 #define	NCA_IO_DIRECT_NONE	0
205 #define	NCA_IO_DIRECT_FILENAME	1
206 #define	NCA_IO_DIRECT_SHMSEG	2
207 #define	NCA_IO_DIRECT_FILEDESC	3
208 #define	NCA_IO_DIRECT_CTAG	4
209 #define	NCA_IO_DIRECT_SPLICE	5
210 #define	NCA_IO_DIRECT_TEE	6
211 #define	NCA_IO_DIRECT_FILE_FD	7
212 
213 /*
214  * NCA_HTTP_VERSION2 nca_io definition:
215  */
216 typedef struct nca_io2_s {
217 
218 	nca_version_t	version;	/* version number */
219 	nca_op_t	op;		/* type of operation */
220 	nca_tag_t	tag;		/* connect tag */
221 
222 	uint32_t	sid;		/* server instance id */
223 	uint64_t	ctag;		/* user cache tag */
224 
225 	uint64_t	tid;		/* caller's thread id */
226 	uint64_t	cid;		/* connection id */
227 
228 	uint8_t		more;		/* more chunks to follow */
229 	uint8_t		first;		/* first chunk for tag */
230 
231 	uint8_t		advisory;	/* ask before using cache */
232 	uint8_t		nocache;	/* don't cache */
233 
234 	uint8_t		preempt;	/* preempt subsequent upcall */
235 	uint8_t		direct_type;	/* direct specifier type */
236 
237 	uint8_t		shadow;		/* flag used by kernel when copyin */
238 	uint8_t		pad2;		/* padd to 32 bit align */
239 
240 	uint32_t	peer_len;	/* sockaddr of client */
241 	nca_offset_t	peer;		/* offset into meta data area */
242 
243 	uint32_t	local_len;	/* sockaddr of NCA server */
244 	nca_offset_t	local;		/* offset into meta data area */
245 
246 	uint32_t	data_len;	/* request/response data */
247 	nca_offset_t	data;		/* offset into meta data area */
248 
249 	uint32_t	direct_len;	/* direct data specifier */
250 	nca_offset_t	direct;		/* offset into meta data area */
251 
252 	uint32_t	trailer_len;	/* request/response trailer data */
253 	nca_offset_t	trailer;	/* offset into meta data area */
254 
255 	/*
256 	 * Following this structure is optional meta data, peer and local
257 	 * sockaddr, (header) data, direct data, and trailer data.
258 	 *
259 	 * All nca_offset_t's above are byte offsets from the begining of
260 	 * this structure. A meta data length specifier of zero indicates
261 	 * no meta data.
262 	 *
263 	 * Request (i.e. in-bound) data is specified by the data_len/data
264 	 * members only.
265 	 *
266 	 * Response (i.e. out-bound) data is specified by the data_len/data,
267 	 * direct_type/direct_len/direct, trailer_len/trailer members and is
268 	 * processed in-order.
269 	 *
270 	 * Note: sockaddr meta data are IPv4 addresses, future revisions
271 	 * of the NCA-to-HTTP-server protocol will support IPv6.  So, the
272 	 * length of the sockaddr meta data must be honored as it will be
273 	 * increased for future IPv6 support.
274 	 */
275 
276 } nca_io2_t;
277 
278 #define	DOWNCALLINFO_MAGIC	0x19121969
279 
280 typedef struct downcallinfo_s {
281 	uint32_t	dci_magic;
282 	nca_io2_t	*dci_iop;
283 	uio_t		*dci_uiop;
284 } downcallinfo_t;
285 
286 typedef enum {
287 	NCA_UNKNOWN,
288 	NCA_OPTIONS,
289 	NCA_GET,
290 	NCA_HEAD,
291 	NCA_POST,
292 	NCA_PUT,
293 	NCA_DELETE,
294 	NCA_TRACE,
295 
296 	NCA_RAW		/* Special case for active connections */
297 } nca_http_method_t;
298 
299 typedef enum {
300 	HS_OK = 200,
301 	HS_CREATED = 201,
302 	HS_ACCEPTED = 202,
303 	HS_PARTIAL_CONTENT = 206,
304 	HS_MOVED_PERMANENT = 301,
305 	HS_MOVED = 302,
306 	HS_NOT_MODIFIED = 304,
307 	HS_BAD_REQUEST = 400,
308 	HS_AUTH_REQUIRED = 401,
309 	HS_FORBIDDEN = 403,
310 	HS_NOT_FOUND = 404,
311 	HS_PRECONDITION_FAILED = 412,
312 	HS_SERVER_ERROR = 500,
313 	HS_NOT_IMPLEMENTED = 501,
314 	HS_SERVICE_UNAVAILABLE = 503,
315 	HS_CONNECTION_CLOSED = 1000
316 } nca_http_status_code;
317 
318 /* httpd (miss user space daemon) is attached to this door */
319 #define	MISS_DOOR_FILE	"/var/run/nca_httpd_1.door"
320 
321 /* httpd downcall door server name */
322 #define	DOWNCALL_DOOR_FILE	"/var/run/nca_httpd_1.down_door"
323 
324 #ifdef	__cplusplus
325 }
326 #endif
327 
328 #endif	/* _INET_NCADOORHDR_H */
329