diff options
author | Garrett D'Amore <garrett@damore.org> | 2022-07-12 02:03:44 -0400 |
---|---|---|
committer | Garrett D'Amore <garrett@damore.org> | 2022-07-12 11:16:04 -0400 |
commit | d5ba932774e3e5d63ba25284cae7bb0e8a0b5d1d (patch) | |
tree | 4a7e9293bcb0ba5401736d4802bc3aed16bee3d3 | |
parent | df6bbf77738915d14e10da5a075ed017edd1f8be (diff) | |
download | illumos-joyent-d5ba932774e3e5d63ba25284cae7bb0e8a0b5d1d.tar.gz |
14808 removal of nca (14768) missed the headers
Reviewed by: Peter Tribble <peter.tribble@gmail.com>
Reviewed by: Andy Fiddaman <andy@omnios.org>
Reviewed by: Dale Ghent <daleg@omniti.com>
Approved by: Dan McDonald <danmcd@mnx.io>
-rw-r--r-- | usr/src/uts/common/inet/nca/Makefile | 53 | ||||
-rw-r--r-- | usr/src/uts/common/inet/nca/nca.conf | 28 | ||||
-rw-r--r-- | usr/src/uts/common/inet/nca/nca.h | 2147 | ||||
-rw-r--r-- | usr/src/uts/common/inet/nca/ncaconf.h | 59 | ||||
-rw-r--r-- | usr/src/uts/common/inet/nca/ncadoorhdr.h | 328 | ||||
-rw-r--r-- | usr/src/uts/common/inet/nca/ncaio.h | 61 | ||||
-rw-r--r-- | usr/src/uts/common/inet/nca/ncakmem.h | 56 | ||||
-rw-r--r-- | usr/src/uts/common/inet/nca/ncalogd.h | 190 | ||||
-rw-r--r-- | usr/src/uts/common/inet/nca/ncandd.h | 61 |
9 files changed, 0 insertions, 2983 deletions
diff --git a/usr/src/uts/common/inet/nca/Makefile b/usr/src/uts/common/inet/nca/Makefile deleted file mode 100644 index d7a74af9d5..0000000000 --- a/usr/src/uts/common/inet/nca/Makefile +++ /dev/null @@ -1,53 +0,0 @@ -# -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License, Version 1.0 only -# (the "License"). You may not use this file except in compliance -# with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# -# -#ident "%Z%%M% %I% %E% SMI" -# -# Copyright 2005 Sun Microsystems, Inc. All rights reserved. -# Use is subject to license terms. -# -# uts/common/inet/nca/Makefile -# -# include global definitions -include ../../../../Makefile.master - -HDRS= nca.h ncadoorhdr.h ncakmem.h ncalogd.h ncandd.h ncaio.h - -ROOTDIRS= $(ROOT)/usr/include/inet/nca - -ROOTHDRS= $(HDRS:%=$(ROOT)/usr/include/inet/nca/%) - -CHECKHDRS= $(HDRS:%.h=%.check) - -$(ROOTDIRS)/%: % - $(INS.file) - -.KEEP_STATE: - -.PARALLEL: $(CHECKHDRS) - -install_h: $(ROOTDIRS) $(ROOTHDRS) - -$(ROOTDIRS): - $(INS.dir) - -check: $(CHECKHDRS) diff --git a/usr/src/uts/common/inet/nca/nca.conf b/usr/src/uts/common/inet/nca/nca.conf deleted file mode 100644 index 46e38eb2c6..0000000000 --- a/usr/src/uts/common/inet/nca/nca.conf +++ /dev/null @@ -1,28 +0,0 @@ -# -# CDDL HEADER START -# -# The contents of this file are subject to the terms of the -# Common Development and Distribution License, Version 1.0 only -# (the "License"). You may not use this file except in compliance -# with the License. -# -# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE -# or http://www.opensolaris.org/os/licensing. -# See the License for the specific language governing permissions -# and limitations under the License. -# -# When distributing Covered Code, include this CDDL HEADER in each -# file and include the License file at usr/src/OPENSOLARIS.LICENSE. -# If applicable, add the following below this CDDL HEADER, with the -# fields enclosed by brackets "[]" replaced with your own identifying -# information: Portions Copyright [yyyy] [name of copyright owner] -# -# CDDL HEADER END -# -# -# Copyright (c) 1999 by Sun Microsystems, Inc. -# All rights reserved. -# -#ident "%Z%%M% %I% %E% SMI" - -name="nca" parent="pseudo" instance=0; diff --git a/usr/src/uts/common/inet/nca/nca.h b/usr/src/uts/common/inet/nca/nca.h deleted file mode 100644 index ec93cf5deb..0000000000 --- a/usr/src/uts/common/inet/nca/nca.h +++ /dev/null @@ -1,2147 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2009 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _INET_NCA_H -#define _INET_NCA_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include <sys/thread.h> -#include <sys/door.h> -#include <sys/disp.h> -#include <sys/systm.h> -#include <sys/processor.h> -#include <sys/socket.h> -#include <inet/common.h> -#include <inet/ip.h> -#include <inet/tcp.h> -#include <inet/nca/ncadoorhdr.h> - -/* - * The NCA debugging facilities provided via ADB and MDB depend on a - * number of NCA implementation details. In particular, note that: - * - * * ADB macros *must* be revised whenever members are added or - * removed from the following structures: - * - * nca_conn_t connf_t nca_cpu_t dcb_t hcb_t nca_if_t nca_io2_t - * node_t nodef_t sqfan_t nca_squeue_t tb_t te_t ti_t tw_t - * - * * ADB macros should be added when new core data structures are - * added to NCA. Generally, if you had to put it in here, you - * need to write a macro for it. - * - * * MDB has many dependencies on the way core data structures - * are connected. In general, if you break these dependencies, - * the MDB NCA module will fail to build. However, breakage - * may go undetected (for instance, changing a linked list - * into a circularly linked list). If you have any doubts, - * inspect the NCA module source before committing your changes. - * - * * MDB depends on the following variables (and their current - * semantics) in order to function correctly: - * - * nca_conn_fanout nca_conn_fanout_size nca_gv nca_lru - * urihash filehash - * - * If you change the names or *semantics* of these variables, - * you must modify the MDB module accordingly. - * - * In addition, you should consider whether the changes you've - * made should be reflected in the MDB dcmds themselves. - */ - -/* The queue to make upcall on for NCAfs */ -extern queue_t *ncaupcallq; -extern kmutex_t ncaupcallq_lock; - -extern int nca_logging_on; -extern int nca_conn_fanout_size; -extern boolean_t nca_deferred_oq_if; -extern boolean_t nca_fanout_iq_if; - -/* Checksum pointer for no checksum */ - -#define NO_CKSUM (void *)-1 - -/* undef any tcp.h:tcp_t members overloaded by the Solaris 8 tcp.h */ - -#undef tcp_last_rcv_lbolt -#undef tcp_state -#undef tcp_rto -#undef tcp_snd_ts_ok -#undef tcp_snd_ws_ok -#undef tcp_snxt -#undef tcp_swnd -#undef tcp_mss -#undef tcp_iss -#undef tcp_rnxt -#undef tcp_rwnd -#undef tcp_lport -#undef tcp_fport -#undef tcp_ports - -/* the iph_t is no longer defined in ip.h for Solaris 8 ? */ - -/* Unaligned IP header */ -typedef struct iph_s { - uchar_t iph_version_and_hdr_length; - uchar_t iph_type_of_service; - uchar_t iph_length[2]; - uchar_t iph_ident[2]; - uchar_t iph_fragment_offset_and_flags[2]; - uchar_t iph_ttl; - uchar_t iph_protocol; - uchar_t iph_hdr_checksum[2]; - uchar_t iph_src[4]; - uchar_t iph_dst[4]; -} iph_t; - - -#define true B_TRUE /* used with type boolean_t */ -#define false B_FALSE /* used with type boolean_t */ - -/* - * Power of 2^N Primes useful for hashing for N of 0-28, - * these primes are the nearest prime <= 2^N - 2^(N-2). - */ - -#define P2Ps() {0, 0, 0, 5, 11, 23, 47, 89, 191, 383, 761, 1531, 3067, \ - 6143, 12281, 24571, 49139, 98299, 196597, 393209, \ - 786431, 1572853, 3145721, 6291449, 12582893, 25165813, \ - 50331599, 100663291, 201326557, 0} - -/* - * Serialization queue type (move to strsubr.h (stream.h?) as a general - * purpose lightweight mechanism for mblk_t serialization ?). - */ -typedef struct nca_squeue_s { - uint16_t sq_state; /* state flags */ - uint16_t sq_count; /* message count */ - uint32_t sq_type; /* type flags */ - processorid_t sq_bind; /* processor to bind to */ - ddi_softintr_t sq_softid; /* softintr() id */ - void (*sq_init)(); /* initialize function */ - void *sq_init_arg; /* initialize argument */ - void (*sq_proc)(); /* process function */ - mblk_t *sq_first; /* first mblk chain or NULL */ - mblk_t *sq_last; /* last mblk chain or NULL */ - clock_t sq_wait; /* lbolts to wait after a fill() */ - clock_t sq_iwait; /* lbolt after nointr() */ - clock_t sq_pwait; /* lbolt after pause() */ - int sq_isintr; /* is being or was serviced by */ - timeout_id_t sq_tid; /* timer id of pending timeout() */ - kcondvar_t sq_async; /* async thread blocks on */ - kmutex_t sq_lock; /* lock before using any member */ - clock_t sq_awaken; /* time async thread was awakened */ - void *sq_priv; /* user defined private */ - kt_did_t sq_ktid; /* kernel thread id */ -} nca_squeue_t; - -/* - * State flags and message count (i.e. properties that change) - * Note: The MDB NCA module depends on the values of these flags. - */ - -#define SQS_CNT_TOOMANY 0x8000 /* message count toomany */ - -/* nca_squeue_t state flags now only 16 bits */ - -#define SQS_PROC 0x0001 /* being processed */ -#define SQS_WORKER 0x0002 /* worker thread */ -#define SQS_ENTER 0x0004 /* enter thread */ -#define SQS_FAST 0x0008 /* enter-fast thread */ -#define SQS_PROXY 0x0010 /* proxy thread */ -#define SQS_SOFTINTR 0x0020 /* softint thread */ - /* 0x00C0 bits not used */ - -#define SQS_NOINTR 0x0100 /* no interrupt processing */ -#define SQS_PAUSE 0x0200 /* paused */ -#define SQS_INTRWAIT 0x0400 /* interrupt waiting */ -#define SQS_NOPROC 0x0800 /* no processing */ - /* 0x7000 bits not used */ -#define SQS_EXIT 0x8000 /* worker(s) exit */ - -/* - * Type flags (i.e. properties that don't change). - * Note: The MDB NCA module depends on the values of these flags. - */ - -#define SQT_BIND_MASK 0xFF000000 /* bind flags mask */ - -#define SQT_KMEM 0x00000001 /* was kmem_alloc()ed */ -#define SQT_DEFERRED 0x00000002 /* deferred processing */ -#define SQT_SOFTINTR 0x00000004 /* use softintr() */ - -#define SQT_BIND_ANY 0x01000000 /* bind worker thread to any CPU */ -#define SQT_BIND_TO 0x02000000 /* bind worker thread to speced CPU */ - -#define SQ_STATE_IS(sqp, flags) ((sqp)->sq_state & (flags)) -#define SQ_TYPE_IS(sqp, flags) ((sqp)->sq_type & (flags)) - - -typedef struct sqfan_s { - uint32_t flg; /* flags only */ - uint32_t cnt; /* vector count */ - uint32_t ix; /* next sqv[] to process */ - uint32_t drain; /* max mblk(s) draind per */ - nca_squeue_t **sqv; /* pointer to nca_squeue_t pointer vector */ -} sqfan_t; - -#define SQF_DIST_CNT 0x0001 /* sqfan_t dist by queue count */ -#define SQF_DIST_IPv4 0x0002 /* sqfan_t dist by IPv4 src addr */ - -/* - * A multiphase timer is implemented using the te_t, tb_t, and ti_t structs. - * - * The multiple phases of timer entry execution are: - * - * 1) resource, execution is done from resource reclaim when the timer event - * is the freeing of the timed resource. - * - * 2) process, execution is done from process thread yield (idle/return). - * - * 3) time, execution is done from a timeout callback thread. - * - * Each of the phases have a seperate timer fire time represented by the - * the ti_t members lbolt1, lbolt2, and lbolt3. Each lbolt is an absolute - * lbolt value with lbolt1 <= lbolt2 <= lbolt3. - */ - -/* - * te_t - timer entry. - */ - -typedef struct te_s { - struct te_s *prev; /* prev te_t */ - struct te_s *next; /* next te_t */ - struct tb_s *tbp; /* pointer to timer bucket */ - void *ep; /* pointer to encapsulating struct */ -} te_t; - -/* - * tb_t - timer bucket. - */ - -typedef struct tb_s { - struct tb_s *next; /* next tb_t in ascending time order */ - clock_t exec; /* te_t lbolt exec value for bucket */ - te_t *head; /* head of te_t list (first timer) */ - te_t *tail; /* tail of te_t list (last timer) */ -} tb_t; - -/* - * ti_t - timer state. - */ - -typedef struct ti_s { - clock_t exec; /* next te_t exec value (0 = NONE) */ - clock_t lbolt1; /* phase1 lbolt1 (0 = NONE) */ - clock_t lbolt2; /* phase2 lbolt2 (0 = NONE) */ - clock_t lbolt3; /* phase3 lbolt3 (0 = NONE) */ - tb_t *head; /* head of tb_t list (first timer bucket) */ - tb_t *tail; /* tail of tb_t list (last timer bucket) */ - timeout_id_t tid; /* timer id of pending timeout() (0 = NONE) */ - void *ep; /* pointer to encapsulating struct */ -} ti_t; - -#define NCA_TI_INPROC -1 /* Processing going on */ -#define NCA_TI_NONE 0 /* no lbolt */ - -/* - * TIME_WAIT grounded doubly linked list of nca_conn_t's awaiting TIME_WAIT - * expiration for. This list is used for reclaim, reap, and timer based - * processing. - * - * A multiphase timer is used: - * - * phase 1) reclaim of connections during connection allocation - * - * phase 2) reaping of connections during nca_squeue_t inq thread unwind - * - * phase 3) timeout of connections as a result of a timeout(). - * - * Each of the phases have a seperate timer fire lbolt represented by the - * the members lbolt1, lbolt2, and lbolt3, each is an absolute lbolt value - * with lbolt1 <= lbolt2 <= lbolt3. - */ - -typedef struct tw_s { - clock_t lbolt1; /* phase1 lbolt value (0 = NONE) */ - clock_t lbolt2; /* phase2 lbolt value */ - clock_t lbolt3; /* phase3 lbolt value */ - struct nca_conn_s *head; /* Head of nca_conn_t list */ - struct nca_conn_s *tail; /* Tail of nca_conn_t list */ - timeout_id_t tid; /* Timer id of pending timeout() (0 = NONE) */ - void *ep; /* pointer to encapsulating struct */ -} tw_t; - -#define NCA_TW_NONE 0 /* no lbolt */ - -#define NCA_TW_MS 1000 - -#define NCA_TW_LBOLT MSEC_TO_TICK(NCA_TW_MS) - -#define NCA_TW_LBOLTS(twp, future) { \ - clock_t _lbolt = (future); \ - clock_t _mod = _lbolt % NCA_TW_LBOLT; \ - \ - if (_mod) { \ - /* Roundup to next TIME_WAIT bucket */ \ - _lbolt += NCA_TW_LBOLT - _mod; \ - } \ - if ((twp)->lbolt1 != _lbolt) { \ - (twp)->lbolt1 = _lbolt; \ - _lbolt += NCA_TW_LBOLT; \ - (twp)->lbolt2 = _lbolt; \ - _lbolt += NCA_TW_LBOLT; \ - (twp)->lbolt3 = _lbolt; \ - if ((twp)->tid != 0) { \ - (void) untimeout((twp)->tid); \ - (twp)->tid = 0; \ - } \ - if ((_lbolt) != NCA_TW_NONE) { \ - (twp)->tid = timeout((pfv_t)nca_tw_fire, (twp), \ - (twp)->lbolt3 - ddi_get_lbolt()); \ - } \ - } \ -} - -/* - * The Node Fanout structure. - * - * The hash tables and their linkage (hashnext) are protected by the - * per-bucket lock. Each node_t inserted in the list points back at - * the nodef_t that heads the bucket (hashfanout). - */ - -typedef struct nodef_s { - struct node_s *head; - kmutex_t lock; -} nodef_t; - -/* - * A node_t is used to represent a cached byte-stream object. A node_t is - * in one of four active states: - * - * 1) path != NULL, member of a node_t hash list with an object description - * (hashnext, size, path, pathsz members valid). - * - * 2) pp != NULL, 1) + phys pages allocated (pp, plrupn, plrunn members valid). - * - * 3) data != NULL, 2) + virt mapping allocated (data, datasz, vlrupn, vlrunn - * members valid). - * - * 4) cksum != NULL 3) + checksum mapping allocated - */ - -typedef struct node_s { - uint32_t ref; /* ref (see below) state */ - uint32_t cnt; /* ref count */ - int32_t size; /* object size (-1 = UNKNOWN) */ - uint32_t mss; /* mblk(s) in size mss */ - uint64_t ctag; /* usr defined cache tag, 0 => no tag */ - ipaddr_t laddr; /* local IP, for virtual hosting */ - uint16_t lport; /* local port, for virtual hosting */ - - struct node_s *plrunn; /* Phys LRU list next node_t */ - struct node_s *plrupn; /* Phys LRU list previous node_t */ - struct node_s *vlrunn; /* Virt LRU list next node_t */ - struct node_s *vlrupn; /* Virt LRU list previous node_t */ - - nodef_t *hashfanout; /* hash bucket we're part of */ - nodef_t *ctaghashfanout; /* ctaghash bucket we're part off */ - struct node_s *hashnext; /* hash list next node_t */ - struct node_s *ctaghashnext; /* ctaghash list next node_t */ - struct nca_conn_s *connhead; /* head of list of conn(s) in miss */ - struct nca_conn_s *conntail; /* tail of list of conn(s) in miss */ - struct node_s *next; /* needed if data is in chunks */ - struct node_s *back; /* needed if data is in chunks */ - - clock_t expire; /* lbolt node_t expires (0 = NOW, -1 = NEVER) */ - time_t lastmod; /* HTTP "Last-Modified:" value */ - - mblk_t *req; /* whole HTTP request (including headers) */ - int reqsz; /* size of above */ - int reqcontl; /* HTTP "Content-Length:" value */ - uint32_t rcv_cnt; /* rcv_list byte count */ - mblk_t *rcv_head; /* rcv_list head */ - mblk_t *rcv_tail; /* rcv_list tail */ - mblk_t *rcv_ptr; /* rcv_list pointer */ - - nca_squeue_t *sqp; /* squeue node_t is being processed from */ - char *path; /* URI path component */ - int pathsz; /* size of above */ - uint_t method; /* HTTP request method */ - uint_t version; /* HTTP request version */ - char *reqhdr; /* HTTP request header(s) */ - int reqhdrsz; /* size of above */ - char *reqhost; /* HTTP "Host:" string */ - int reqhostsz; /* size of above */ - char *reqaccept; /* HTTP "Accept:" string */ - int reqacceptsz; /* size of above */ - char *reqacceptl; /* HTTP "Accept-Language:" string */ - int reqacceptlsz; /* size of above */ - - page_t **pp; /* page pointer vector for data */ - char *data; /* data buffer */ - int datasz; /* size of above */ - uint16_t *cksum; /* cksum() vector for data by mss */ - size_t cksumlen; /* length of memory block for above vector */ - uint_t resbody; /* HTTP response body at &data[resbody] */ - - int hlen; /* data buffer split header len */ - int fileoff; /* file include offset */ - int filelen; /* length of file */ - struct node_s *fileback; /* head node_t of a file list (-1 for death) */ - struct node_s *filenext; /* next node_t of a file list */ - struct node_s *ctagback; /* head node_t of a ctag list */ - struct node_s *ctagnext; /* next node_t of a ctag list */ - vnode_t *filevp; /* vnode for the file */ - - kmutex_t lock; /* serializes access to node_t */ - frtn_t frtn; /* STREAMS free routine; always node_freeb() */ - boolean_t headchunk; /* true if this node is the head chunk */ - - /* - * The following 4 fields are used to record node states when - * upcalls are preempted. When preempted upcalls are not relevant, - * these fields should have default value 0. - */ - uint8_t advise; /* an interpreted advise from http */ - boolean_t last_advisory; /* preempted upcall state -- advisory bit */ - boolean_t advisory; /* need advisory from httpd before use */ - boolean_t first_upcall; /* node in first upcall, a internal state */ - - kcondvar_t cv; /* sync upcall/downcall process on a node */ - int onqueue; /* == 1 if on miss_queue, debug aid */ -} node_t; - -/* Note: The MDB NCA module depends on the values of these flags. */ - -#define REF_URI 0x80000000 /* & ref = node_t URI hashed */ -#define REF_PHYS 0x40000000 /* & ref = phys mapping in-use */ -#define REF_VIRT 0x20000000 /* & ref = virt mapping in-use */ -#define REF_CKSUM 0x10000000 /* & ref = checksum mapping in-use */ -#define REF_KMEM 0x08000000 /* & ref = kmem mapped (PHYS|VIRT) */ -#define REF_DONE 0x04000000 /* & ref = node_t fill is done */ -#define REF_SAFED 0x02000000 /* & ref = node_t not safe for use */ -#define REF_FILE 0x01000000 /* & ref = node_t filename hashed */ -#define REF_RESP 0x00800000 /* & ref = node_t response header parsed */ -#define REF_NOLRU 0x00400000 /* & ref = node_t not safe for lru reclaim */ -#define REF_MISS 0x00200000 /* & ref = node_t is/will missed() proc */ -#define REF_ONPLRU 0x00100000 /* & ref = node_t is on Phys LRU */ -#define REF_ONVLRU 0x00080000 /* & ref = node_t is on Virt LRU */ -#define REF_PREEMPT 0x00040000 /* & ref = node_t processing preempted */ -#define REF_CTAG 0x00020000 /* & ref = node_t CTAG hashed */ -#define REF_UPCALL 0x00010000 /* & ref = node_t upcall not yet complete */ -#define REF_OWNED 0x00008000 /* & ref = node_t owned (won't be freed) */ -#define REF_ERROR 0x00004000 /* & ref = node_t errored */ -#define REF_VNODE 0x00002000 /* & ref = node_t vnode hashed */ -#define REF_NCAFS 0x00001000 /* & ref = node_t is NCAfs required */ -#define REF_SEGMAP 0x00000800 /* & ref = segmapped (PHYS|VIRT) */ -#define REF_UNUSED 0x000007FF /* & ref = UNUSED */ -/* - * Mappings where no seperate PHYS and VIRT, i.e. single mapping with a - * virtual address e.g. REF_KMEM and REF_SEGMAP. - */ -#define REF_NOVIRT (REF_KMEM | REF_SEGMAP) - -/* Is this node safe for reclaim ? */ -#define REF_RECLAIM (REF_SAFED | REF_NOLRU | REF_MISS) - -/* - * NCA node_t reference counting is more complicated than nca_conn_t reference - * counting because we pass parts of node_t's (masquerading as dblk - * buffers) into the STREAMS subsystem which eventually get freed by - * network drivers just like regular dblk buffers. Also, unlike nca_conn_t's, - * we may wish to keep a node_t around even after there are no outstanding - * references, since it's possible that it will be requested again. - * - * Thus, the node_t reference count reflects the number of active codepaths - * in Solaris making use of a given node_t -- each codepath that requires - * that the node_t stick around once it drops the node_t lock must acquire - * a reference via NODE_REFHOLD and drop that reference via NODE_REFRELE - * when done. Note that following a NODE_REFRELE the node that was - * released may no longer exist and thus it should not be referenced unless - * the codepath has another outstanding reference. When a node_t is passed - * into the STREAMS subsystem via desballoc() and related interfaces, a - * NODE_REFHOLD should be placed on the node_t and the free routine should - * be set to node_freeb(), which will in turn call NODE_REFRELE. - * - * The concept of node ownership allows NCA to express that it would like - * this node to hang around, even if there are no "explicit" references to - * it (the ownership counts as an implicit reference). All "headchunk" - * hashed nodes are owned when they are created. If they subsequently - * become disowned (currently via nca_node_del() or nca_reclaim_vlru()), - * they may have some or all their resources freed (via node_fr()) as soon - * as the last reference to them is removed. Note that it's possible that - * a disowned node may become of interest again before some or all of its - * resources were reclaimed -- in this case, it must be reowned via - * NODE_OWN. Note that an unhashed node should never be owned, though it - * of course may be held and released; this is because there is no sense - * in owning a node which is merely temporary (i.e., not hashed somewhere). - * Note that the corollary of this statement is not true -- that is, just - * because a node is hashed does not mean it is owned (it may have been - * disowned via nca_reclaim_vlru()) -- this is why code must always reown - * hashed nodes if it's desirable to have them stick around. - * - * All four macros *must* be called with the node lock held. However, - * NODE_DISOWN and NODE_REFRELE return with the lock unlocked (if there is - * still a lock at all), because the operation may have just removed the - * final reference to a node and it may no longer exist. - * - * A version of NODE_REFRELE is provided which doesn't unlock the lock but - * can only be used when the caller can gaurantee that it's not the last ref - * (e.g. the caller has another outstanding reference) as if it's the last - * ref the node_t may no longer exist. The new macro is NODE_REFRELE_LOCKED. - */ - -#define NODE_DISOWN(np) { \ - \ - NODE_T_TRACE((np), NODE_T_TRACE_DISOWN); \ - ASSERT(mutex_owned(&(np)->lock)); \ - \ - if ((np)->ref & REF_OWNED) { \ - if ((np)->cnt == 0) { \ - panic("nca NODE_DISOWN: %p has no references", \ - (void *)(np)); \ - } \ - (np)->ref &= ~REF_OWNED; \ - NODE_REFRELE(np); \ - } else { \ - mutex_exit(&(np)->lock); \ - } \ -} - -#define NODE_OWN(np) { \ - \ - NODE_T_TRACE((np), NODE_T_TRACE_OWN); \ - ASSERT(mutex_owned(&(np)->lock)); \ - \ - if (!((np)->ref & REF_OWNED)) { \ - if ((np)->cnt == UINT_MAX) \ - panic( \ - "nca NODE_OWN: %p has too many references", \ - (void *)(np)); \ - (np)->ref |= REF_OWNED; \ - (np)->cnt++; \ - } \ -} - -#define NODE_REFHOLD(np) { \ - \ - NODE_T_TRACE((np), NODE_T_TRACE_REFHOLD | ((np)->cnt + 1)); \ - ASSERT(mutex_owned(&(np)->lock)); \ - \ - if ((np)->cnt == UINT_MAX) \ - panic("nca NODE_REFHOLD: %p has too many references", \ - (void *)(np)); \ - (np)->cnt++; \ -} - -#define NODE_REFRELE(np) { \ - \ - NODE_T_TRACE((np), NODE_T_TRACE_REFRELE | ((np)->cnt - 1)); \ - ASSERT(mutex_owned(&(np)->lock)); \ - \ - if (((np)->ref & REF_OWNED) && (np)->cnt == 1) \ - panic( \ - "nca NODE_REFRELE: %p has only OWNED reference", \ - (void *)(np)); \ - if ((np)->cnt == 0) \ - panic("nca NODE_REFRELE: %p has no references", \ - (void *)(np)); \ - (np)->cnt--; \ - if ((np)->cnt == 0) { \ - ASSERT(((np)->ref & REF_OWNED) == 0); \ - node_fr(np); /* node_fr unlocks the lock */ \ - } else { \ - mutex_exit(&(np)->lock); \ - } \ -} - -#define NODE_REFRELE_LOCKED(np) { \ - uint_t _cnt = (np)->cnt; \ - \ - NODE_T_TRACE((np), NODE_T_TRACE_REFRELE | (_cnt - 1)); \ - ASSERT(mutex_owned(&(np)->lock)); \ - \ - if ((np)->ref & REF_OWNED) \ - _cnt--; \ - if (((np)->ref & REF_OWNED) && _cnt == 0) \ - panic("nca NODE_REFRELE_LOCKED: " \ - "%p has only OWNED reference", (void *)(np)); \ - if (_cnt == 0) \ - panic("nca NODE_REFRELEL_LOCKED: " \ - "%p has no references", (void *)(np)); \ - if (_cnt == 1) \ - panic("nca NODE_REFRELEL_LOCKED: " \ - "%p has only one reference", (void *)(np)); \ - (np)->cnt--; \ -} - - -/* - * NODE_T_TRACE - trace node_t events. - * - * adb: - * 32 bit - * *node_tp,0t8192-(((*node_tp)-node_tv)%0t48)/PXXDDnPnPnPnPnPnPnPnn - * node_tv,((*node_tp)-node_tv)%0t48/PXXDDnPnPnPnPnPnPnPnn - * - * 64 bit - * *node_tp,0t8192-(((*node_tp)-node_tv)%0t56)/PXXDDnXnXnXnXnXnXnXnn - * node_tv,((*node_tp)-node_tv)%0t56/PXXDDnXnXnXnXnXnXnXnn - * - * For incremental node tracing, note the value of node_tp (node_tp/X) after - * a run, then replace that in the 2nd line for node_tv. - */ - -#define NODE_T_STK_DEPTH 6 - -struct node_ts { - node_t *node; - unsigned action; - unsigned ref; - unsigned cnt; - int cpu; - pc_t stk[NODE_T_STK_DEPTH + 1]; -}; - -#undef NODE_T_TRACE_ON - -#ifdef NODE_T_TRACE_ON - -#define NODE_T_TRACE_ALLOC 0xFF000000 /* kmem_alloc() of */ -#define NODE_T_TRACE_ADD 0xFE000000 /* node_add() */ - -#define NODE_T_TRACE_OWN 0xEF000000 /* node has been owned */ -#define NODE_T_TRACE_DISOWN 0xEE000000 /* node has been disowned */ -#define NODE_T_TRACE_DESBALLOC 0xED000000 /* desballoc() */ -#define NODE_T_TRACE_REFRELE 0xEC000000 /* refrele */ -#define NODE_T_TRACE_REFHOLD 0xEB000000 /* refhold */ -#define NODE_T_TRACE_NODE_FR 0xEA000000 /* node_fr() */ - -#define NODE_T_TRACE_TEMPNODE 0xDF000000 /* node_temp() */ -#define NODE_T_TRACE_REPLACE 0xDE000000 /* node_replace() */ -#define NODE_T_TRACE_FLUSH 0xDD000000 /* node_flush() */ -#define NODE_T_TRACE_DOWNCALL 0xDC000000 /* downcall_service() */ -#define NODE_T_TRACE_DOWNCALL_2 0xDB000000 /* dcall_service->httpd_data */ - -#define NODE_T_TRACE_DATA 0xCF000000 /* httpd_data() */ - -#define NODE_T_TRACE_LRU 0xAF000000 /* nca_lru insert */ -#define NODE_T_TRACE_HTTPD 0xAE000000 /* call nca_httpd() */ -#define NODE_T_TRACE_MISS 0xAD000000 /* http_miss() */ -#define NODE_T_TRACE_TEMP 0xAC000000 /* np != *npp */ -#define NODE_T_TRACE_XMIT 0xAB000000 /* tcp_xmit() */ -#define NODE_T_TRACE_MISSED 0xAA000000 /* nca_missed() */ - -#define NODE_T_TRACE_DEL 0x00000000 /* node_del() */ - -#if defined(__i386) || defined(__amd64) -#define NODE_T_TRACE_STK() { \ - _ix = getpcstack(&_p->stk[0], NODE_T_STK_DEPTH + 1); \ - if (_ix < NODE_T_STK_DEPTH + 1) { \ - _p->stk[_ix + 1] = 0; \ - } \ -} -#else -#define NODE_T_TRACE_STK() { \ - _p->stk[0] = (pc_t)callee(); \ - _ix = getpcstack(&_p->stk[1], NODE_T_STK_DEPTH); \ - if (_ix < NODE_T_STK_DEPTH) { \ - _p->stk[_ix + 1] = 0; \ - } \ -} -#endif - -#define NODE_TV_SZ 8192 - -extern struct node_ts node_tv[NODE_TV_SZ]; -extern struct node_ts *node_tp; - -#define NODE_T_TRACE(p, a) { \ - struct node_ts *_p; \ - struct node_ts *_np; \ - int _ix; \ - \ - do { \ - _p = node_tp; \ - if ((_np = _p + 1) == &node_tv[NODE_TV_SZ]) \ - _np = node_tv; \ - } while (atomic_cas_ptr(&node_tp, _p, _np) != _p); \ - _p->node = (p); \ - _p->action = (a); \ - _p->ref = (p) ? (p)->ref : 0; \ - _p->cnt = (p) ? (p)->cnt : 0; \ - _p->cpu = CPU->cpu_seqid; \ - NODE_T_TRACE_STK(); \ -} - -#else /* NODE_T_TRACE_ON */ - -#define NODE_T_TRACE(p, a) - -#endif /* NODE_T_TRACE_ON */ - -/* - * DOOR_TRACE - trace door node_t events. - * - * adb: - * 32 bit - * *door_tp,0t8192-(((*door_tp)-door_tv)%0t112)/5XnPnPnPnPnPnPnPn64cnn - * door_tv,((*door_tp)-door_tv)%0t112/5XnPnPnPnPnPnPnPn64cnn - * 64 bit - * *door_tp,0t8192-(((*door_tp)-door_tv)%0t128)/PXPXXnXnXnXnXnXnXnXn64cnn - * door_tv,((*door_tp)-door_tv)%0t128/PXPXXnXnXnXnXnXnXnXn64cnn - */ - -#define DOOR_STK_DEPTH 6 - -struct door_ts { - struct nca_conn_s *cp; - unsigned action; - node_t *np; - int ref; - unsigned state; - pc_t stk[DOOR_STK_DEPTH + 1]; - char data[64]; -}; - -#undef DOOR_TRACE_ON - -#ifdef DOOR_TRACE_ON - -#define DOOR_TRACE_UPCALL 0xF0000000 /* upcall() */ -#define DOOR_TRACE_UPCALL_RAW 0xF1000000 /* upcall() RAW ? */ -#define DOOR_TRACE_UPCALL_RET 0xFF000000 /* upcall() return */ - -#define DOOR_TRACE_DOWNCALL 0xE0000000 /* downcall() */ -#define DOOR_TRACE_CONNECT 0xE1000000 /* connect() */ -#define DOOR_TRACE_CONNECT_DATA 0xE2000000 /* connect() */ -#define DOOR_TRACE_DIRECTFROM 0xE3000000 /* tee_splice() from */ -#define DOOR_TRACE_DIRECTTO 0xE4000000 /* tee_splice() to */ -#define DOOR_TRACE_DOWNCALL_RET 0xEF000000 /* downcall() return */ - -#define DOOR_TRACE_INIT 0x80000000 /* doorcall_init() */ -#define DOOR_TRACE_INIT_RET 0x88000000 /* doorcall_init() return */ - -#if defined(__i386) || defined(__amd64) -#define DOOR_TRACE_STK() { \ - _ix = getpcstack(&_p->stk[0], DOOR_STK_DEPTH + 1); \ - if (_ix < DOOR_STK_DEPTH + 1) { \ - _p->stk[_ix] = 0; \ - } \ -} -#else -#define DOOR_TRACE_STK() { \ - _p->stk[0] = (pc_t)callee(); \ - _ix = getpcstack(&_p->stk[1], DOOR_STK_DEPTH); \ - if (_ix < DOOR_STK_DEPTH) { \ - _p->stk[_ix + 1] = 0; \ - } \ -} -#endif - -#define DOOR_TV_SZ 8192 - -extern struct door_ts door_tv[DOOR_TV_SZ]; -extern struct door_ts *door_tp; - -#define DOOR_TRACE(io, d, d_sz, a) { \ - nca_conn_t *_cp = (io) ? (nca_conn_t *)(io)->cid : (nca_conn_t *)NULL; \ - node_t *_req_np = _cp ? _cp->req_np : (node_t *)NULL; \ - struct door_ts *_p; \ - struct door_ts *_np; \ - int _ix; \ - \ - do { \ - _p = door_tp; \ - if ((_np = _p + 1) == &door_tv[DOOR_TV_SZ]) \ - _np = door_tv; \ - } while (atomic_cas_ptr(&door_tp, _p, _np) != _p); \ - _p->cp = _cp; \ - _p->np = _req_np; \ - _p->action = (a); \ - _p->ref = _req_np ? _req_np->ref : 0; \ - if ((io)) { \ - _p->state = ((io)->op == http_op ? 0x80000000 : 0) | \ - ((io)->more ? 0x40000000 : 0) | \ - ((io)->first ? 0x20000000 : 0) | \ - ((io)->advisory ? 0x10000000 : 0) | \ - ((io)->nocache ? 0x08000000 : 0) | \ - ((io)->preempt ? 0x04000000 : 0) | \ - ((io)->peer_len ? 0x02000000 : 0) | \ - ((io)->local_len ? 0x01000000 : 0) | \ - ((io)->data_len ? 0x00800000 : 0) | \ - (((io)->direct_type << 20) & 0x00700000) | \ - ((io)->direct_len ? 0x00080000 : 0) | \ - ((io)->trailer_len ? 0x00040000 : 0) | \ - (((io)->peer_len + (io)->local_len + \ - (io)->data_len + (io)->direct_len + \ - (io)->trailer_len) & 0x3FFFF); \ - } else { \ - _p->state = 0; \ - } \ - if ((d_sz)) { \ - int _n = MIN((d_sz), 63); \ - \ - bcopy((d), _p->data, _n); \ - bzero(&_p->data[_n], 64 - _n); \ - } else { \ - bzero(_p->data, 64); \ - } \ - DOOR_TRACE_STK(); \ -} - -#else /* DOOR_TRACE_ON */ - -#define DOOR_TRACE(io, d, d_sz, a) - -#endif /* DOOR_TRACE_ON */ - -/* - * NCA node LRU cache. Defined here so that the NCA mdb module can use it. - */ -typedef struct lru_s { - node_t *phead; /* Phys LRU list head (MRU) */ - node_t *ptail; /* Phys LRU list tail (LRU) */ - node_t *vhead; /* Virt LRU list head (MRU) */ - node_t *vtail; /* Virt LRU list tail (LRU) */ - - uint32_t pcount; /* Phys count of node_t members */ - uint32_t vcount; /* Virt count of node_t members */ - - kmutex_t lock; /* Guarantee atomic access of above */ -} lru_t; - -/* - * Per CPU instance structure. - * - * 32-bit adb: XXXnnDnnXXnnXXnnXDnnXXnn228+na - * 64-bit adb: PPPnnD4+nnPPnnPPnnJDnnJ180+na - */ - -typedef struct nca_cpu_s { - - node_t *persist_hdr_none; - node_t *persist_hdr_close; - node_t *persist_hdr_ka; - - uint32_t dcb_readers; /* count of dcb_list readers for this CPU */ - - nca_squeue_t *if_inq; /* if_t input nca_squeue_t */ - nca_squeue_t *if_ouq; /* if_t output nca_squeue_t */ - - ti_t *tcp_ti; /* TCP TIMER list */ - tw_t *tcp_tw; /* TCP TIME_WAIT list */ - - ddi_softintr_t soft_id; /* soft interrupt id for if_inq worker */ - int if_inq_cnt; /* count of if_t.inq references */ - - char pad[256 - sizeof (node_t *) - sizeof (node_t *) - - sizeof (node_t *) - sizeof (uint32_t) - - sizeof (nca_squeue_t *) - sizeof (nca_squeue_t *) - - sizeof (ti_t *) - sizeof (tw_t *) - - sizeof (ddi_softintr_t) - sizeof (int)]; -} nca_cpu_t; - -extern nca_cpu_t *nca_gv; /* global per CPU state indexed by cpu_seqid */ - -/* - * hcb_t - host control block. - * - * Used early on in packet switching to select packets to be serviced by NCA - * and optionally later on by the HTTP protocol layer to further select HTTP - * request to be serviced. - * - * dcb_t - door control block. - * - * Used to associate one or more hcb_t(s) with a given httpd door instance. - * - * dcb_list - dcb_t global list, a singly linked grounded list of dcb_t's. - * - * Used to search for a hcb_t match, currently a singly linked grounded list - * of dcb_t's with a linear walk of the list. While this is adequate for the - * current httpd support (i.e. a single door) a move to either a hash or tree - * will be required for multiple httpd instance support (i.e. multiple doors). - * - * The dcb_list is protected by a custom reader/writer lock, the motivation - * for using a custom lock instead of a krwlock_t is that this lock is the - * single hot spot in NCA (i.e. all in-bound packets must acquire this lock) - * and a nonlocking atomic readers count scheme is used in the common case - * (i.e. reader lock) with a fall-back to a conventional kmutex_t for writer - * (i.e. ndd list add/delete). - */ - -typedef struct hcb_s { - struct hcb_s *next; /* Next hcb_t (none: NULL) */ - ipaddr_t addr; /* IP address (any: INADDR_ANY or 0) */ - uint16_t port; /* TCP port number */ - char *host; /* Host: name (any: NULL) */ - ssize_t hostsz; /* Size of above */ - char *root; /* Document root ("/": NULL) */ - ssize_t rootsz; /* Size of above */ -} hcb_t; - -typedef struct dcb_s { - struct dcb_s *next; /* Next dcb_t (none: NULL) */ - char *door; /* Door file (default: NULL) */ - ssize_t doorsz; /* Size of above */ - door_handle_t hand; /* Door handle (default: NULL) */ - hcb_t list; /* Head of a hcb_t list (any: NULL) */ -} dcb_t; - -extern dcb_t dcb_list; -extern kmutex_t nca_dcb_lock; -extern kcondvar_t nca_dcb_wait; -extern kmutex_t nca_dcb_readers; - -#define NOHANDLE ((door_handle_t)-1) - -#define DCB_COUNT_USELOCK 0x80000000 -#define DCB_COUNT_MASK 0x3FFFFFFF - -#define DCB_RD_ENTER(cpu) { \ - uint32_t *rp; \ - \ - cpu = CPU->cpu_seqid; \ - rp = &nca_gv[cpu].dcb_readers; \ - while (atomic_add_32_nv(rp, 1) & DCB_COUNT_USELOCK) { \ - /* Need to use the lock, so do the dance */ \ - mutex_enter(&nca_dcb_lock); \ - if (atomic_add_32_nv(rp, -1) == DCB_COUNT_USELOCK && \ - CV_HAS_WAITERS(&nca_dcb_wait)) { \ - /* May be the last reader for this CPU */ \ - cv_signal(&nca_dcb_wait); \ - } \ - mutex_exit(&nca_dcb_lock); \ - mutex_enter(&nca_dcb_readers); \ - /* \ - * We block above waiting for the writer to exit the \ - * readers lock, if we didn't block then while we were \ - * away in the nca_dcb_lock enter the writer exited, \ - * we could optimize for this case by checking USELOCK \ - * after the decrement, but as this is an exceptional \ - * case not in the fast-path we'll just take the hit \ - * of a needless readers enter/exit. \ - */ \ - mutex_exit(&nca_dcb_readers); \ - } \ -} - -#define DCB_RD_EXIT(cpu) { \ - uint32_t *rp = &nca_gv[cpu].dcb_readers; \ - \ - if (atomic_dec_32_nv(rp) == DCB_COUNT_USELOCK) { \ - mutex_enter(&nca_dcb_lock); \ - if (CV_HAS_WAITERS(&nca_dcb_wait)) { \ - /* May be the last reader for this CPU */ \ - cv_signal(&nca_dcb_wait); \ - } \ - mutex_exit(&nca_dcb_lock); \ - } \ -} - -#define DCB_WR_ENTER() { \ - int cpu; \ - int readers; \ - \ - mutex_enter(&nca_dcb_readers); \ - mutex_enter(&nca_dcb_lock); \ - for (;;) { \ - readers = 0; \ - for (cpu = 0; cpu < max_ncpus; cpu++) { \ - int new; \ - uint32_t *rp = &nca_gv[cpu].dcb_readers; \ - int old = *rp; \ - \ - if (old & DCB_COUNT_USELOCK) { \ - readers += old & DCB_COUNT_MASK; \ - continue; \ - } \ - new = old | DCB_COUNT_USELOCK; \ - while (atomic_cas_32(rp, old, new) != old) { \ - old = *rp; \ - new = old | DCB_COUNT_USELOCK; \ - } \ - readers += (new & DCB_COUNT_MASK); \ - } \ - if (readers == 0) \ - break; \ - cv_wait(&nca_dcb_wait, &nca_dcb_lock); \ - } \ - mutex_exit(&nca_dcb_lock); \ -} - -#define DCB_WR_EXIT() { \ - int cpu; \ - \ - mutex_enter(&nca_dcb_lock); \ - for (cpu = 0; cpu < max_ncpus; cpu++) { \ - int new; \ - uint32_t *rp = &nca_gv[cpu].dcb_readers; \ - int old = *rp; \ - \ - new = old & ~DCB_COUNT_USELOCK; \ - while (atomic_cas_32(rp, old, new) != old) { \ - old = *rp; \ - new = old & ~DCB_COUNT_USELOCK; \ - } \ - } \ - mutex_exit(&nca_dcb_lock); \ - mutex_exit(&nca_dcb_readers); \ -} - -typedef struct nca_door_s { - door_handle_t handle; /* The door handle */ - char *name; /* The door name */ - kmutex_t lock; /* The door lock */ - kcondvar_t cv_writer; /* condvar for thread waiting */ - /* to do door_init */ - kcondvar_t cv_reader; /* condvar for thread waiting */ - /* for a door_init to finish */ - uint32_t upcalls; /* Number of upcalls in progress */ - boolean_t init_waiting; /* door_init thread wanting to */ - /* be exclusive */ -} nca_door_t; - -/* - * if_t - interface per instance data. - */ - -typedef struct if_s { - - boolean_t dev; /* is a device instance */ - - queue_t *rqp; /* our read-side STREAMS queue */ - queue_t *wqp; /* our write-side STREAMS queue */ - - /* DLPI M_DATA IP fastpath template */ - size_t mac_length; - mblk_t *mac_mp; - int32_t mac_mtu; - int32_t mac_addr_len; - - uint32_t ip_ident; /* our IP ident value */ - - boolean_t hwcksum; /* underlying NIC supports checksum offload */ - - nca_squeue_t *inq; /* in-bound nca_squeue_t */ - nca_squeue_t *ouq; /* out-bound nca_squeue_t */ - - /* - * All if_t are associated with a CPU and have a default - * router on link are chained in a circular linked list. - */ - struct if_s *next_if; - struct if_s *prev_if; - ipaddr_t local_addr; /* This interface's IP address. */ - uchar_t router_ether_addr[6]; - - uint_t hdr_ioc_id; /* id of DL_IOC_HDR_INFO M_IOCTL sent down */ - boolean_t info_req_pending; - - int32_t capab_state; /* Capability probe state */ - - /* Bound local address of a NCAfs instance. */ - struct sockaddr_in bound_addr; -} if_t; - -/* - * connf_t - connection fanout data. - * - * The hash tables and their linkage (hashnextp, hashprevp) are protected - * by the per-bucket lock. Each nca_conn_t inserted in the list points back at - * the connf_t that heads the bucket. - */ - -typedef struct connf_s { - uint32_t max; - struct nca_conn_s *head; - kmutex_t lock; -} connf_t; - -#ifdef CONNP_T_TRACE_ON - -#define CONNP_TV_SZ 32 - -/* - * Per nca_conn_t packet tracing. - */ -typedef struct connp_s { - clock_t lbolt; - clock_t tcp_ti; - int32_t len : 16, - dir : 1, - state : 4, - flags : 6, - xmit_np : 1, - xmit_head : 1, - unsent : 1, - tail_unsent : 1, - direct : 1; - uint32_t state1; - uint32_t state2; - uint32_t seq; - uint32_t ack; - uint32_t snxt; - uint32_t swnd; -} connp_t; - -#endif /* CONNP_T_TRACE_ON */ - -/* - * nca_conn_t - connection per instance data. - * - * Note: hashlock is used to provide atomic access to all nca_conn_t members - * above it. All other members are protected by the per CPU inq nca_squeue_t - * which is used to serialize access to all nca_conn_t's per interface. - * - * Note: the nca_conn_t can have up to 3 NODE_REFHOLDs: - * - * 1) if req_np != NULL then a NODE_REFHOLD(req_np) was done: - * - * 1.1) if http_refed then a NODE_REFHOLD(req_np) was done - * - * 1.2) if http_frefed then a NODE_REFHOLD(req_np->fileback) was done - * - * - * TODO: reorder elements in fast-path code access order. - * - * Dnn4XnXXDnnDnnXXXnnXXXnnUXnnXXXnnXXnnDDXXXDXDXDXnnDnnXXDDnXXXDDnnXXXDDnn - * XXXDDnnXXXDDnnXXXDDnnXXnnDXXnn - * b+++DDnAnDDDDDnnDnnUnnUUDXDUnnDnn20xnnXnnddnnUUUnnXXUnXXnnUUUnn - * DDDDDDnnUUnnXXUXUnn4UD4Unn4UnUUnn - * 64-bit: Xnn4+4pnnppEnEnn3pnn3pnnEJnnXXnnuunn4+ppnnXX3pD4+pD4+pD4+pnnEnnppnnD - */ - -#define TCP_XMIT_MAX_IX 5 /* Max xmit descriptors */ - -typedef struct nca_conn_s { - - int32_t ref; /* Reference counter */ - - te_t tcp_ti; /* TCP TIMER timer entry */ - - struct nca_conn_s *twnext; /* TIME_WAIT next */ - struct nca_conn_s *twprev; /* TIME_WAIT prev */ - clock_t twlbolt; /* TIME_WAIT lbolt */ - - clock_t create; /* Create lbolt time */ - - connf_t *hashfanout; /* Hash bucket we're part of */ - struct nca_conn_s *hashnext; /* Hash chain next */ - struct nca_conn_s *hashprev; /* Hash chain prev */ - - struct nca_conn_s *bindnext; /* Next conn_s in bind list. */ - struct nca_conn_s *bindprev; /* Prev conn_s in bind list. */ - void *tbf; /* Pointer to bind hash list struct. */ - /* - * Note: atomic access of memebers above is guaranteed by the - * hashfanout->lock of the hash bucket that the nca_conn_t is in. - */ - - size_t mac_length; /* MAC prepend length */ - mblk_t *mac_mp; /* MAC prepend data */ - - ipaddr_t laddr; /* Local address */ - ipaddr_t faddr; /* Remote address. 0 => not connected */ - - union { - struct { - uint16_t u_fport; /* Remote port */ - uint16_t u_lport; /* Local port */ - } u_ports1; - uint32_t u_ports2; /* Rem port, local port */ - /* Used for TCP_MATCH performance */ - } u_port; -#define conn_lport u_port.u_ports1.u_lport -#define conn_fport u_port.u_ports1.u_fport -#define conn_ports u_port.u_ports2 - - if_t *ifp; /* Interface for this connection */ - nca_squeue_t *inq; /* Per CPU inq for this connection */ - - uint32_t req_tag; /* nca_io_t request tag (0 == NONE) */ - int req_parse; /* HTTP request parse state */ - node_t *req_np; /* HTTP request node_t */ - mblk_t *req_mp; /* HTTP request mblk_t */ - char *reqpath; /* HTTP request URI path component */ - int reqpathsz; /* size of above */ - char *reqrefer; /* HTTP "Referer:" string */ - int reqrefersz; /* size of above */ - char *requagent; /* HTTP "User-Agent:" string */ - int requagentsz; /* size of above */ - struct nca_conn_s *nodenext; /* Node_t nca_conn_t list */ - - clock_t http_count; /* HTTP Keep-Alive request count */ - - /* - * req_np xmit state used accross calls to tcp_xmit(). A reference - * to the req_np and to any inderect node_t (i.e. file/ctag) ... - */ - node_t *xmit_refed; /* have a ref to the uri node_t */ - node_t *xmit_cur; /* current node to transmit */ - - int xmit_ix; /* current xmit[] index */ - int xmit_pix; /* past end xmit[] index */ - - struct { - node_t *np; /* node_t pointer for ref */ - char *dp; /* data pointer */ - uint16_t *cp; /* cksum array */ - int sz; /* remaining data to xmit */ - int iso; /* initial segment offset (if any) */ - node_t *refed; /* have a ref to the node_t */ - int dsz; /* remaining data for current segment */ - caddr_t *dvp; /* data segment virtual pointer */ - } xmit[TCP_XMIT_MAX_IX]; - - /* - * Connection NCA_IO_DIRECT_SPLICE & NCA_IO_DIRECT_TEE reference, - * see direct_splice and direct_tee below for type of send too. - */ - struct nca_conn_s *direct; /* nca_conn_t to send recv data too */ - mblk_t *direct_mp; /* mblk_t to use for tcp_close() */ - - /* - * nca_conn_t state. - */ - - int32_t tcp_state; - - uint32_t - tcp_urp_last_valid : 1, /* Is tcp_urp_last valid? */ - tcp_hard_binding : 1, /* If we've started a full bind */ - tcp_hard_bound : 1, /* If we've done a full bind with IP */ - tcp_fin_acked : 1, /* Has our FIN been acked? */ - - tcp_fin_rcvd : 1, /* Have we seen a FIN? */ - tcp_fin_sent : 1, /* Have we sent our FIN yet? */ - tcp_ordrel_done : 1, /* Have we sent the ord_rel upstream? */ - tcp_flow_stopped : 1, /* Have we flow controlled xmitter? */ - - tcp_debug : 1, /* SO_DEBUG "socket" option. */ - tcp_dontroute : 1, /* SO_DONTROUTE "socket" option. */ - tcp_broadcast : 1, /* SO_BROADCAST "socket" option. */ - tcp_useloopback : 1, /* SO_USELOOPBACK "socket" option. */ - - tcp_oobinline : 1, /* SO_OOBINLINE "socket" option. */ - tcp_dgram_errind : 1, /* SO_DGRAM_ERRIND option */ - tcp_detached : 1, /* If we're detached from a stream */ - tcp_bind_pending : 1, /* Client is waiting for bind ack */ - - tcp_unbind_pending : 1, /* Client sent T_UNBIND_REQ */ - tcp_deferred_clean_death : 1, - /* defer tcp endpoint cleanup etc. */ - tcp_co_wakeq_done : 1, /* A strwakeq() has been done */ - tcp_co_wakeq_force : 1, /* A strwakeq() must be done */ - - tcp_co_norm : 1, /* In normal mode, putnext() done */ - tcp_co_wakeq_need : 1, /* A strwakeq() needs to be done */ - tcp_snd_ws_ok : 1, /* Received WSCALE from peer */ - tcp_snd_ts_ok : 1, /* Received TSTAMP from peer */ - - tcp_linger : 1, /* SO_LINGER turned on */ - tcp_zero_win_probe: 1, /* Zero win probing is in progress */ - tcp_loopback: 1, /* src and dst are the same machine */ - tcp_localnet: 1, /* src and dst are on the same subnet */ - - tcp_syn_defense: 1, /* For defense against SYN attack */ -#define tcp_dontdrop tcp_syn_defense - tcp_set_timer : 1, - tcp_1_junk_fill_thru_bit_31 : 2; - - uint32_t - tcp_active_open: 1, /* This is a active open */ - tcp_timeout : 1, /* qbufcall failed, qtimeout pending */ - tcp_rexmit : 1, /* TCP is retransmitting */ - tcp_snd_sack_ok : 1, /* Can use SACK for this connection */ - - tcp_bind_proxy_addr : 1, /* proxy addr is being used */ - tcp_recvdstaddr : 1, /* return T_EXTCONN_IND with dst addr */ - tcp_refed : 1, /* nca_conn_t refed by TCP */ - tcp_time_wait_comp : 1, /* TIME_WAIT compressed nca_conn_t */ - - tcp_close : 1, /* nca_conn_t close */ - http_persist : 3, /* HTTP persistent connection state */ - - deferred_xmit_end : 1, /* xmit_end() deferred to xmit() */ - http_direct_splice : 1, /* have a connection to splice too */ - http_direct_tee : 1, /* have a connection to tee too */ - - tcp_2_junk_fill_thru_bit_31 : 17; -/* - * Note: all nca_conn_t members to be accessed by a tcp_time_wait_comp - * nca_conn_t must be above this point !!! - */ - - uchar_t tcp_timer_backoff; /* Backoff shift count. */ - clock_t tcp_last_recv_time; /* Last time we receive a segment. */ - clock_t tcp_dack_set_time; /* When delayed ACK timer is set. */ - - int tcp_ip_hdr_len; /* Byte len of our current IP header */ - clock_t tcp_first_timer_threshold; /* When to prod IP */ - clock_t tcp_second_timer_threshold; /* When to give up completely */ - clock_t tcp_first_ctimer_threshold; /* 1st threshold while connecting */ - clock_t tcp_second_ctimer_threshold; /* 2nd ... while connecting */ - - clock_t tcp_last_rcv_lbolt; /* lbolt on last packet, used for PAWS */ - - - uint32_t tcp_obsegs; /* Outbound segments on this stream */ - - uint32_t tcp_mss; /* Max segment size */ - uint32_t tcp_naglim; /* Tunable nagle limit */ - int32_t tcp_hdr_len; /* Byte len of combined TCP/IP hdr */ - tcph_t *tcp_tcph; /* tcp header within combined hdr */ - int32_t tcp_tcp_hdr_len; /* tcp header len within combined */ - uint32_t tcp_valid_bits; -#define TCP_ISS_VALID 0x1 /* Is the tcp_iss seq num active? */ -#define TCP_FSS_VALID 0x2 /* Is the tcp_fss seq num active? */ -#define TCP_URG_VALID 0x4 /* If the tcp_urg seq num active? */ - - int32_t tcp_xmit_hiwater; /* Send buffer high water mark. */ - - union { /* template ip header */ - ipha_t tcp_u_ipha; - char tcp_u_buf[IP_SIMPLE_HDR_LENGTH+TCP_MIN_HEADER_LENGTH]; - double tcp_u_aligner; - } tcp_u; -#define tcp_ipha tcp_u.tcp_u_ipha -#define tcp_iphc tcp_u.tcp_u_buf - - uint32_t tcp_sum; /* checksum to compensate for source */ - /* routed packets. Host byte order */ - - uint16_t tcp_last_sent_len; /* Record length for nagle */ - uint16_t tcp_dupack_cnt; /* # of consequtive duplicate acks */ - - uint32_t tcp_rnxt; /* Seq we expect to recv next */ - uint32_t tcp_rwnd; /* Current receive window */ - uint32_t tcp_rwnd_max; /* Maximum receive window */ - - mblk_t *tcp_rcv_head; /* Queued until push, urgent data or */ - mblk_t *tcp_rcv_tail; /* the count exceeds */ - uint32_t tcp_rcv_cnt; /* tcp_rcv_push_wait. */ - - mblk_t *tcp_reass_head; /* Out of order reassembly list head */ - mblk_t *tcp_reass_tail; /* Out of order reassembly list tail */ - - uint32_t tcp_cwnd_ssthresh; /* Congestion window */ - uint32_t tcp_cwnd_max; - uint32_t tcp_csuna; /* Clear (no rexmits in window) suna */ - - int tcp_rttv_updates; - clock_t tcp_rto; /* Round trip timeout */ - clock_t tcp_rtt_sa; /* Round trip smoothed average */ - clock_t tcp_rtt_sd; /* Round trip smoothed deviation */ - clock_t tcp_rtt_update; /* Round trip update(s) */ - clock_t tcp_ms_we_have_waited; /* Total retrans time */ - - uint32_t tcp_swl1; /* These help us avoid using stale */ - uint32_t tcp_swl2; /* packets to update state */ - - mblk_t *tcp_xmit_head; /* Head of rexmit list */ - mblk_t *tcp_xmit_last; /* last valid data seen by tcp_wput */ - uint32_t tcp_unsent; /* # of bytes in hand that are unsent */ - mblk_t *tcp_xmit_tail; /* Last rexmit data sent */ - uint32_t tcp_xmit_tail_unsent; /* # of unsent bytes in xmit_tail */ - - uint32_t tcp_snxt; /* Senders next seq num */ - uint32_t tcp_suna; /* Sender unacknowledged */ - uint32_t tcp_rexmit_nxt; /* Next rexmit seq num */ - uint32_t tcp_rexmit_max; /* Max retran seq num */ - int32_t tcp_snd_burst; /* Send burst factor */ - uint32_t tcp_swnd; /* Senders window (relative to suna) */ - uint32_t tcp_cwnd; /* Congestion window */ - int32_t tcp_cwnd_cnt; /* cwnd cnt in congestion avoidance */ - uint32_t tcp_ackonly; /* Senders last ack seq num */ - - uint32_t tcp_irs; /* Initial recv seq num */ - uint32_t tcp_iss; /* Initial send seq num */ - uint32_t tcp_fss; /* Final/fin send seq num */ - uint32_t tcp_urg; /* Urgent data seq num */ - - uint32_t tcp_rack; /* Seq # we have acked */ - uint32_t tcp_rack_cnt; /* # of bytes we have deferred ack */ - - uint32_t tcp_max_swnd; /* Maximum swnd we have seen */ - int64_t tcp_rexmit_fire_time; - int64_t tcp_dack_fire_time; - int64_t tcp_ka_fire_time; - int64_t tcp_http_ka_fire_time; - - int32_t tcp_keepalive_intrvl; /* Zero means don't bother */ - int32_t tcp_ka_probe_sent; - int32_t tcp_ka_last_intrvl; - -#define TCP_DACK_TIMER 0x1 -#define TCP_REXMIT_TIMER 0x2 -#define TCP_KA_TIMER 0x4 -#define TCP_HTTP_KA_TIMER 0x8 - int16_t tcp_running_timer; - int16_t tcp_pending_timer; - -#ifdef CONNP_T_TRACE_ON - connp_t *pkt_tp; /* Packet tracing pointer */ - connp_t pkt_tv[CONNP_TV_SZ]; /* Packet tracing vector */ -#endif /* CONNP_T_TRACE_ON */ - -} nca_conn_t; - -/* - * Active stack support parameters to control what ports NCA can use. - * They are declared in ncaproto.c - */ -extern struct nca_tbf_s *nca_tcp_port; -extern in_port_t tcp_lo_port; -extern in_port_t tcp_hi_port; - -/* - * nca_conn_t.http_persist values and corresponding HTTP header strings are - * used to determine the connection persistent state of a connection and - * any HTTP header which needs to be sent. - */ - -#define PERSIST_NONE 0 /* Not persistent */ - -#define PERSIST_CLOSE 1 /* Was persistent, send close header */ -#define PERSIST_TRUE 2 /* Connection is HTTP persistent */ -#define PERSIST_KA 3 /* Persistent, send Keep-Alive header */ -#define PERSIST_UPCALL 4 /* Insert "Connection: close" on */ - /* upcall and clear flag */ - -#define PERSIST_HDR_NONE "\r\n" -#define PERSIST_HDR_CLOSE "Connection: close\r\n\r\n" -#define PERSIST_HDR_KA "Connection: Keep-Alive\r\n\r\n" - -/* - * nca_conn_t nca_squeue_ctl() flag values: - */ - -#define CONN_MISS_DONE 0x0001 /* The conn miss processing is done */ -#define IF_TIME_WAIT 0x0002 /* A TIME_WAIT has fired */ -#define IF_TCP_TIMER 0x0003 /* A TCP TIMER has fired */ -#define NCA_CONN_TCP_TIMER 0x0004 /* A TCP TIMER needs to be execed */ -#define IF_TCP_CONNECT 0x0005 /* TCP connection request */ -#define IF_TCP_SEND 0x0006 /* A new send request. */ - -#define IF_TCP_DIRECT_TO 0x0010 /* A TCP direct i/o, step 1 */ -#define IF_TCP_DIRECT_FROM 0x0012 /* A TCP direct i/o, step 2 */ -#define IF_TCP_DIRECT_TEE 0x0001 /* If a tee else a splice */ -#define IF_TCP_DIRECT_CLOSE 0x001F /* A TCP direct i/o close */ - -#define NCA_CONN_T_STK_DEPTH 7 /* max stack backtrace depth */ - -struct conn_ts { - nca_conn_t *conn; - unsigned action; - int ref; - int cpu; - pc_t stk[NCA_CONN_T_STK_DEPTH + 1]; -}; - -#undef NCA_CONN_T_TRACE_ON - -#ifdef NCA_CONN_T_TRACE_ON - -/* - * adb: - * 32 bit - * *conn_tp,0t4096-(((*conn_tp)-con_tv)%0t48)/PXDDnPnPnPnPnPnPnPnPnn - * con_tv,((*conn_tp)-con_tv)%0t48/PXDDnPnPnPnPnPnPnPnPnn - * 64 bit - * *conn_tp,0t4096-(((*conn_tp)-con_tv)%0t56)/PXDDnXnXnXnXnXnXnXnXnn - * con_tv,((*conn_tp)-con_tv)%0t56/PXDDnXnXnXnXnXnXnXnXnn - */ - -#define NCA_CONN_T_REFINIT 0x10000000 /* CONN_REF init() |ref value */ -#define NCA_CONN_T_REFINIT1 0x11000000 /* CONN_REF init() |ref value */ -#define NCA_CONN_T_REFINIT2 0x12000000 /* CONN_REF init() |ref value */ -#define NCA_CONN_T_REFNOTCP 0x13000000 /* CONN_REF no longer tcp_refed */ -#define NCA_CONN_T_REFHOLD 0x1A000000 /* CONN_REFHOLD() | ref value */ -#define NCA_CONN_T_REFRELE 0x1F000000 /* CONN_REFRELE() | ref value */ - -#define NCA_CONN_T_HTTPCALL 0x20000000 /* call http() | rbytes */ -#define NCA_CONN_T_HTTPRET1 0x21000000 /* return http() */ -#define NCA_CONN_T_HTTPRET2 0x22000000 /* return ! http() */ - -#define NCA_CONN_T_MISSDONE 0x30000000 /* CONN_MISS_DONE */ -#define NCA_CONN_T_TCPTIMER 0x31000000 /* NCA_CONN_TCP_TIMER */ -#define NCA_CONN_T_XMIT_END 0x32000000 /* xmit_end() | tcp_unsent */ -#define NCA_CONN_T_XMIT_BAD 0x33000000 /* xmit_end() bad state |tcp_state */ -#define NCA_CONN_T_XMIT_DEF 0x34000000 /* xmit_end() deferred */ -#define NCA_CONN_T_TIME_WAIT 0x35000000 /* done: tcp_state == TCPS_TIME_WAIT */ -#define NCA_CONN_T_PKT_IN 0x36000000 /* tcp_input() | flags */ -#define NCA_CONN_T_PKT_OUT 0x37000000 /* tcp_input() | flags */ - -#define NCA_CONN_T_DIRECT 0x40000000 /* tcp_direct() from conn_t */ -#define NCA_CONN_T_DIRECT1 0x41000000 /* tcp_direct() to conn_t */ -#define NCA_CONN_T_DIRECT2 0x42000000 /* IF_TCP_DIRECT_TO | TEE */ -#define NCA_CONN_T_DIRECT3 0x43000000 /* IF_TCP_DIRECT_FROM | TEE */ -#define NCA_CONN_T_DIRECT4 0x44000000 /* tcp_close() */ -#define NCA_CONN_T_DIRECT5 0x45000000 /* IF_TCP_DIRECT_CLOSE */ - /* from|tcp_state */ -#define NCA_CONN_T_DIRECT6 0x46000000 /* IF_TCP_DIRECT_CLOSE to */ - -#if defined(__i386) || defined(__amd64) -#define NCA_CONN_T_TRACE_STK() { \ - _ix = getpcstack(&_p->stk[0], NCA_CONN_T_STK_DEPTH + 1); \ - if (_ix < NCA_CONN_T_STK_DEPTH + 1) { \ - _p->stk[_ix + 1] = 0; \ - } \ -} -#else -#define NCA_CONN_T_TRACE_STK() { \ - _p->stk[0] = (pc_t)callee(); \ - _ix = getpcstack(&_p->stk[1], NCA_CONN_T_STK_DEPTH); \ - if (_ix < NCA_CONN_T_STK_DEPTH) { \ - _p->stk[_ix + 1] = 0; \ - } \ -} -#endif - -#define CON_TV_SZ 4096 - -extern struct conn_ts con_tv[CON_TV_SZ]; -extern struct conn_ts *conn_tp; - -#define NCA_CONN_T_TRACE(p, a) { \ - struct conn_ts *_p; \ - struct conn_ts *_np; \ - int _ix; \ - \ - do { \ - _p = conn_tp; \ - if ((_np = _p + 1) == &con_tv[CON_TV_SZ]) \ - _np = con_tv; \ - } while (atomic_cas_ptr(&conn_tp, _p, _np) != _p); \ - _p->conn = (p); \ - _p->action = (a); \ - _p->ref = (p)->ref; \ - _p->cpu = CPU->cpu_seqid; \ - NCA_CONN_T_TRACE_STK(); \ -} - -#else /* NCA_CONN_T_TRACE_ON */ - -#define NCA_CONN_T_TRACE(p, a) - -#endif /* NCA_CONN_T_TRACE_ON */ - - -#define CONN_REFHOLD(connp) { \ - \ - NCA_CONN_T_TRACE((connp), NCA_CONN_T_REFHOLD | ((connp)->ref + 1)); \ - \ - if ((connp)->ref <= 0) \ - panic("nca CONN_REFHOLD: %p has no references", \ - (void *)(connp)); \ - (connp)->ref++; \ -} - -#define CONN_REFRELE(connp) { \ - \ - NCA_CONN_T_TRACE((connp), NCA_CONN_T_REFRELE | ((connp)->ref - 1)); \ - \ - if ((connp)->tcp_refed) { \ - if ((connp)->ref == 1) \ - panic("nca CONN_REFRELE: %p " \ - "has only tcp_refed reference", \ - (void *)(connp)); \ - if ((connp)->ref < 1) \ - panic("nca CONN_REFRELE: %p has no references", \ - (void *)(connp)); \ - } else { \ - if ((connp)->ref <= 0) \ - panic("nca CONN_REFRELE: %p has no references", \ - (void *)(connp)); \ - } \ - (connp)->ref--; \ - if ((connp)->ref == 0) { \ - /* Last ref of a nca_conn_t, so free it */ \ - kmutex_t *lock = &(connp)->hashfanout->lock; \ - mutex_enter(lock); \ - nca_conn_free(connp); \ - /* Note: nca_conn_free exits lock */ \ - } \ -} - -/* - * The nca_io2_shadow_t is used by the kernel to contian a copy of a user- - * land nca_io2_t and the the user-land nca_io2_t address and size. - */ - -typedef struct nca_io2_shadow_s { - nca_io2_t io; /* copy of user-land nca_io2_t */ - void *data_ptr; /* copy of door_arg_t.data_ptr */ - size_t data_size; /* copy of door_arg_t.data_size */ -} nca_io2_shadow_t; - -#define SHADOW_NONE 0x00 /* nca_io2_t.shadow NONE */ -#define SHADOW_DOORSRV 0x01 /* nca_io2_t.shadow door_srv() */ -#define SHADOW_NCAFS 0x02 /* nca_io2_t.shadow NCAfs */ - - -/* - * Given a ptr to a nca_io2_t, a field and the field_length, write data - * into buffer (Note: word aligned offsets). - */ -#define NCA_IO_WDATA(val, vsize, p, n_used, len, off) \ - /*CONSTCOND*/ \ - if ((val) == NULL) { \ - (p)->len = vsize; \ - (p)->off = 0; \ - } else { \ - (p)->len = (vsize); \ - (p)->off = ((n_used) + sizeof (uint32_t) - 1) & \ - (~(sizeof (uint32_t) - 1)); \ - bcopy((char *)(val), \ - ((char *)(p) + (p)->off), (vsize)); \ - (n_used) = (p)->off + (p)->len; \ - } - -/* - * Given a ptr to an nca_io2_t, a field length member name, append data to - * it in the buffer. Note: must be the last field a WDATA() was done for. - * - * Note: a NULL NCA_IO_WDATA() can be followed by a NCA_IO_ADATA() only if - * vsize was == -1. - * - */ -#define NCA_IO_ADATA(val, vsize, p, n_used, len, off) \ - if ((p)->len == -1) { \ - (p)->len = 0; \ - (p)->off = ((n_used) + sizeof (uint32_t) - 1) & \ - (~(sizeof (uint32_t) - 1)); \ - } \ - bcopy((char *)(val), ((char *)(p) + \ - (p)->off + (p)->len), (vsize)); \ - (p)->len += (vsize); \ - (n_used) += (vsize); - -/* - * Given a ptr to a nca_io2_t and a field construct a pointer. - */ -#define NCA_IO_PDATA(p, off) ((char *)(p) + (p)->off) - - -#ifndef isdigit -#define isdigit(c) ((c) >= '0' && (c) <= '9') -#endif - -#ifndef tolower -#define tolower(c) ((c) >= 'A' && (c) <= 'Z' ? (c) | 0x20 : (c)) -#endif - -#ifndef isalpha -#define isalpha(c) (((c) >= 'A' && (c) <= 'Z') || ((c) >= 'a' && (c) <= 'z')) -#endif - -#ifndef isspace -#define isspace(c) ((c) == ' ' || (c) == '\t' || (c) == '\n' || \ - (c) == '\r' || (c) == '\f' || (c) == '\013') -#endif - -extern char *strnchr(const char *, int, size_t); -extern char *strnstr(const char *, const char *, size_t); -extern char *strncasestr(const char *, const char *, size_t); -extern char *strrncasestr(const char *, const char *, size_t); -extern int atoin(const char *, size_t); -extern int digits(int); - -extern void nca_conn_free(nca_conn_t *); -extern void nca_logit_off(void); -extern void node_fr(node_t *); - -extern nca_squeue_t *nca_squeue_init(nca_squeue_t *, uint32_t, - processorid_t, void (*)(), void *, void (*)(), clock_t, pri_t); -extern void nca_squeue_fini(nca_squeue_t *); -extern void nca_squeue_enter(nca_squeue_t *, mblk_t *, void *); -extern void nca_squeue_fill(nca_squeue_t *, mblk_t *, void *); -extern mblk_t *nca_squeue_remove(nca_squeue_t *); -extern void nca_squeue_worker(nca_squeue_t *); -extern mblk_t *nca_squeue_ctl(mblk_t *, void *, unsigned short); -extern void nca_squeue_signal(nca_squeue_t *); -extern void nca_squeue_exit(nca_squeue_t *); -extern void sqfan_init(sqfan_t *, uint32_t, uint32_t, uint32_t); -extern nca_squeue_t *sqfan_ixinit(sqfan_t *, uint32_t, nca_squeue_t *, uint32_t, - processorid_t, void (*)(), void *, void (*)(), clock_t, pri_t); -extern void sqfan_fini(sqfan_t *); -extern void sqfan_fill(sqfan_t *, mblk_t *, void *); -extern mblk_t *sqfan_remove(sqfan_t *); -extern void nca_squeue_nointr(nca_squeue_t *, mblk_t *, void *, int); -extern void nca_squeue_pause(nca_squeue_t *, mblk_t *, void *, int, boolean_t); -extern void nca_squeue_willproxy(nca_squeue_t *); -extern void nca_squeue_proxy(nca_squeue_t *, nca_squeue_t *); -extern void nca_squeue_bind(nca_squeue_t *, uint32_t, processorid_t); - -extern int nca_tcp_clean_death(nca_conn_t *, int); -extern nca_conn_t *nca_tcp_connect(ipaddr_t, in_port_t, boolean_t); -extern void nca_tcp_send(nca_conn_t *, mblk_t *); -extern void nca_tcp_direct(nca_conn_t *, nca_conn_t *, uint32_t); - -/* Functions prototypes from ncadoorsrv.c */ -extern node_t *nca_node_flush(node_t *); -extern void nca_downcall_service(void *, door_arg_t *, void (**)(void *, - void *), void **, int *); -extern node_t *ctag_lookup(uint64_t, unsigned *); -extern node_t *node_replace(node_t *, nca_conn_t *); -extern node_t *node_temp(node_t *, nca_conn_t *); -extern void find_ctags(node_t *, nca_io2_t *, int *); -extern void nca_ncafs_srv(nca_io2_t *, struct uio *, queue_t *); -extern boolean_t nca_reclaim_vlru(void); -extern boolean_t nca_reclaim_plru(boolean_t, boolean_t); - -/* - * NCA_COUNTER() is used to add a signed long value to a unsigned long - * counter, in general these counters are used to maintain NCA state. - * - * NCA_DEBUG_COUNTER() is used like NCA_COUNTER() but for counters used - * to maintain additional debug state, by default these counters aren't - * updated unless the global value nca_debug_counter is set to a value - * other then zero. - * - * Also, if NCA_COUNTER_TRACE is defined a time ordered wrapping trace - * buffer is maintained with hrtime_t stamps, counter address, value to - * add, and new value entries for all NCA_COUNTER() and NCA_DEBUG_COUNTER() - * use. - */ - -#undef NCA_COUNTER_TRACE - -#ifdef NCA_COUNTER_TRACE - -#define NCA_COUNTER_TRACE_SZ 1024 - -typedef struct nca_counter_s { - hrtime_t t; - unsigned long *p; - unsigned long v; - unsigned long nv; -} nca_counter_t; - -extern nca_counter_t nca_counter_tv[]; -extern nca_counter_t *nca_counter_tp; - -#define NCA_COUNTER(_p, _v) { \ - unsigned long *p = _p; \ - long v = _v; \ - unsigned long _nv; \ - nca_counter_t *_otp; \ - nca_counter_t *_ntp; \ - \ - _nv = atomic_add_long_nv(p, v); \ - do { \ - _otp = nca_counter_tp; \ - _ntp = _otp + 1; \ - if (_ntp == &nca_counter_tv[NCA_COUNTER_TRACE_SZ]) \ - _ntp = nca_counter_tv; \ - } while (atomic_cas_ptr((void *)&nca_counter_tp, (void *)_otp, \ - (void *)_ntp) != (void *)_otp); \ - _ntp->t = gethrtime(); \ - _ntp->p = p; \ - _ntp->v = v; \ - _ntp->nv = _nv; \ -} - -#else /* NCA_COUNTER_TRACE */ - -#define NCA_COUNTER(p, v) atomic_add_long((p), (v)) - -#endif /* NCA_COUNTER_TRACE */ - - -/* - * This is the buf used in upcall to httpd. - */ -typedef struct { - uintptr_t tid; - char *buf; -} http_buf_table_t; - -/* - * URI and filename hash, a simple static hash bucket array of singly - * linked grounded lists is used with a hashing algorithm which has - * proven to have good distribution properities for strings of ... - * - * Note: NCA_HASH_SZ must be a prime number. - */ - -#define NCA_HASH_SZ 8053 -#define NCA_HASH_MASK 0xFFFFFF -#define HASH_IX(s, l, hix, hsz) { \ - char *cp = (s); \ - int len = (l); \ - \ - (hix) = 0; \ - while (len-- > 0) { \ - (hix) = (hix) * 33 + *cp++; \ - (hix) &= NCA_HASH_MASK; \ - } \ - (hix) %= (hsz); \ -} - -/* - * CTAG hash. - */ -#define NCA_CTAGHASH_SZ 4096 -#define CTAGHASH_IX(t, ix) ((ix) = (t) % NCA_CTAGHASH_SZ) - -/* - * VNODE hash. - * - * Note: NCA_VNODEHASH_SZ must be a P2Ps() value. - */ -#define NCA_VNODEHASH_SZ 12281 -#define VNODEHASH_IX(p, ix) ((ix) = (((uintptr_t)p >> 27) ^ \ - ((uintptr_t)p >> 17) ^ ((uintptr_t)p >> 11) ^ (uintptr_t)p) % \ - ncavnodehash_sz) - -extern pgcnt_t nca_ppmax; -extern pgcnt_t nca_vpmax; -extern pgcnt_t nca_pplim; -extern pgcnt_t nca_vplim; -extern pgcnt_t nca_ppmem; -extern pgcnt_t nca_vpmem; -extern ssize_t nca_kbmem; -extern ssize_t nca_spmem; -extern ssize_t nca_ckmem; -extern ssize_t nca_mbmem; -extern ssize_t nca_cbmem; -extern ssize_t nca_lbmem; -extern size_t nca_maxkmem; -extern uint32_t nca_use_segmap; - -extern ulong_t nca_hits; -extern ulong_t nca_file; -extern ulong_t nca_ctag; -extern ulong_t nca_miss; - -extern ulong_t nca_hit304; -extern ulong_t nca_hitnoV; -extern ulong_t nca_hitnoVfast; -extern ulong_t nca_hitnoVtemp; - -extern ulong_t nca_filehits; -extern ulong_t nca_filenoV; -extern ulong_t nca_filenoVfast; -extern ulong_t nca_filemiss; - -extern ulong_t nca_missURI; -extern ulong_t nca_missQ; -extern ulong_t nca_missSAFE; -extern ulong_t nca_missnoV; -extern ulong_t nca_missnotcp; -extern ulong_t nca_missfail; -extern ulong_t nca_misstemp; -extern ulong_t nca_missnohash; -extern ulong_t nca_missclean; -extern ulong_t nca_missadvisory; -extern ulong_t nca_missadvNoA; -extern ulong_t nca_missERROR; - -extern ulong_t nca_ERROR; -extern ulong_t nca_flushnode; -extern ulong_t nca_replacenode; -extern ulong_t nca_tempnode; - -extern ulong_t nca_fail304; - -extern ulong_t nca_nocache1; -extern ulong_t nca_nocache2; -extern ulong_t nca_nocache3; -extern ulong_t nca_nocache4; -extern ulong_t nca_nocache5; -extern ulong_t nca_nocache6; -extern ulong_t nca_nocache6nomp; -extern ulong_t nca_nocache7; -extern ulong_t nca_nocache8; -extern ulong_t nca_nocache9; -extern ulong_t nca_nocache10; -extern ulong_t nca_nocache11; -extern ulong_t nca_nocache12; -extern ulong_t nca_nocache13; -extern ulong_t nca_nocache14; -extern ulong_t nca_nocache15; -extern ulong_t nca_nodes; -extern ulong_t nca_desballoc; - -extern ulong_t nca_plrucnt; -extern ulong_t nca_vlrucnt; -extern ulong_t nca_rpcall; -extern ulong_t nca_rvcall; -extern ulong_t nca_rpbusy; -extern ulong_t nca_rvbusy; -extern ulong_t nca_rpfail; -extern ulong_t nca_rpempty; -extern ulong_t nca_rvempty; -extern ulong_t nca_rpdone; -extern ulong_t nca_rvdone; -extern ulong_t nca_rmdone; -extern ulong_t nca_rkdone; -extern ulong_t nca_rsdone; -extern ulong_t nca_rndone; -extern ulong_t nca_rpnone; -extern ulong_t nca_rvnone; -extern ulong_t nca_rmnone; -extern ulong_t nca_rknone; -extern ulong_t nca_rsnone; -extern ulong_t nca_rnh; -extern ulong_t nca_ref[]; -extern ulong_t nca_vmap_rpcall; - -extern ulong_t nca_node_kmem_fail1; -extern ulong_t nca_node_kmem_fail2; - -extern ulong_t doorsrv_nopreempt; -extern ulong_t doorsrv_badconnect; -extern ulong_t doorsrv_invaladvise; -extern ulong_t doorsrv_notupcall; -extern ulong_t doorsrv_badadvise; -extern ulong_t doorsrv_cksum; -extern ulong_t doorsrv_error; -extern ulong_t doorsrv_op; -extern ulong_t doorsrv_badtee; -extern ulong_t doorsrv_badio; -extern ulong_t doorsrv_sz; - -extern ulong_t nca_allocfail; -extern ulong_t nca_mapinfail; -extern ulong_t nca_mapinfail1; -extern ulong_t nca_mapinfail2; -extern ulong_t nca_mapinfail3; - -extern ulong_t nca_httpd_http; -extern ulong_t nca_httpd_badsz; -extern ulong_t nca_httpd_nosz; -extern ulong_t nca_httpd_filename; -extern ulong_t nca_httpd_filename1; -extern ulong_t nca_httpd_filename2; -extern ulong_t nca_httpd_trailer; -extern ulong_t nca_httpd_preempt; -extern ulong_t nca_httpd_downcall; -extern ulong_t nca_early_downcall; -extern ulong_t nca_httpd_more; - -ulong_t nca_logit_noupcall; - -ulong_t nca_logit; -ulong_t nca_logit_nomp; -ulong_t nca_logit_no; -ulong_t nca_logit_NULL; -ulong_t nca_logit_fail; - -ulong_t nca_logit_flush_NULL1; -ulong_t nca_logit_flush_NULL2; - -ulong_t nca_logger_NULL1; -ulong_t nca_logger_NULL2; - -ulong_t nca_log_buf_alloc_NULL; -ulong_t nca_log_buf_alloc_fail; -ulong_t nca_log_buf_alloc_part; - -ulong_t nca_log_buf_dup; - -extern ulong_t nca_upcalls; -extern ulong_t nca_ncafs_upcalls; - -extern ulong_t nca_conn_count; -extern ulong_t nca_conn_kmem; -extern ulong_t nca_conn_kmem_fail; -extern ulong_t nca_conn_allocb_fail; -extern ulong_t nca_conn_tw; -extern ulong_t nca_conn_tw1; -extern ulong_t nca_conn_tw2; -extern ulong_t nca_conn_reinit_cnt; -extern ulong_t nca_conn_NULL1; -extern ulong_t nca_conn_Q0; -extern ulong_t nca_conn_FLAGS; - -extern ulong_t tcpwronginq; -extern ulong_t ipsendup; -extern ulong_t ipwrongcpu; -extern ulong_t iponcpu; - -extern ulong_t nca_tcp_xmit_null; -extern ulong_t nca_tcp_xmit_null1; - -extern ulong_t tw_on; -extern ulong_t tw_fire; -extern ulong_t tw_fire1; -extern ulong_t tw_fire2; -extern ulong_t tw_fire3; -extern ulong_t tw_add; -extern ulong_t tw_add1; -extern ulong_t tw_delete; -extern ulong_t tw_reclaim; -extern ulong_t tw_reap; -extern ulong_t tw_reap1; -extern ulong_t tw_reap2; -extern ulong_t tw_reap3; -extern ulong_t tw_reap4; -extern ulong_t tw_reap5; -extern ulong_t tw_timer; -extern ulong_t tw_timer1; -extern ulong_t tw_timer2; -extern ulong_t tw_timer3; -extern ulong_t tw_timer4; -extern ulong_t tw_timer5; - -extern ulong_t ti_on; -extern ulong_t ti_fire; -extern ulong_t ti_fire1; -extern ulong_t ti_fire2; -extern ulong_t ti_fire3; -extern ulong_t ti_fire4; -extern ulong_t ti_add; -extern ulong_t ti_add1; -extern ulong_t ti_add2; -extern ulong_t ti_add3; -extern ulong_t ti_add4; -extern ulong_t ti_add5; -extern ulong_t ti_add_reuse; -extern ulong_t ti_delete; -extern ulong_t ti_delete1; -extern ulong_t ti_delete2; -extern ulong_t ti_reap; -extern ulong_t ti_reap1; -extern ulong_t ti_reap2; -extern ulong_t ti_reap3; -extern ulong_t ti_reap4; -extern ulong_t ti_reap5; -extern ulong_t ti_timer; -extern ulong_t ti_timer1; -extern ulong_t ti_timer2; -extern ulong_t ti_timer3; -extern ulong_t ti_timer4; -extern ulong_t ti_timer5; -extern ulong_t ti_timer6; - -extern uint32_t nca_conn_q; -extern uint32_t nca_conn_q0; -extern uint32_t nca_conn_req_max_q; -extern uint32_t nca_conn_req_max_q0; - -extern char nca_resp_500[]; -extern ssize_t nca_resp_500_sz; - -extern uint32_t ncaurihash_sz; -extern uint32_t ncafilehash_sz; -extern uint32_t ncactaghash_sz; -extern uint32_t ncavnodehash_sz; -extern nodef_t *ncaurihash; -extern nodef_t *ncafilehash; -extern nodef_t *ncavnodehash; -extern nodef_t *ncactaghash; -extern char nca_httpd_door_path[]; -extern char nca_httpd_downdoor_path[]; -extern door_handle_t nca_downcall_door_hand; -extern uint32_t n_http_buf_size; -extern door_handle_t nca_httpd_door_hand; -extern sqfan_t nca_miss_fanout1; -extern sqfan_t nca_miss_fanout2; -extern nca_door_t nca_httpd_door; -extern int nca_downdoor_created; -extern int n_http_buf_table; -extern http_buf_table_t *g_http_buf_table; -extern struct kmem_cache *node_cache; -#ifdef DEBUG -extern node_t *nca_http_response(nca_conn_t *, const char *, int, char *, int, - uint_t, const char *); -extern node_t *nca_http_response_node(nca_conn_t *, const char *, int, node_t *, - const char *); -#else -extern node_t *nca_http_response(nca_conn_t *, const char *, int, char *, int, - uint_t); -extern node_t *nca_http_response_node(nca_conn_t *, const char *, int, - node_t *); -#endif -extern void nca_node_del(node_t *); -extern void nca_node_uncache(node_t *); -extern node_t *nca_node_add(char *, int, nodef_t *, int); -extern node_t *node_create(int, boolean_t, char *, int); -extern void nca_reclaim_phys(node_t *, boolean_t, boolean_t); -extern boolean_t nca_http_pmap(node_t *); -extern boolean_t nca_http_vmap(node_t *, int); -extern time_t nca_http_date(char *); -extern node_t *nca_httpd_data(node_t *, nca_conn_t *, nca_io2_t *, int); -extern void nca_missed(node_t *, mblk_t *, nca_squeue_t *); -extern void nca_miss_conn_mv(node_t *, nca_conn_t *); -extern void nca_miss_conn_fr(node_t *, nca_conn_t *); -extern void nca_http_logit(nca_conn_t *); -extern void nca_http_error(nca_conn_t *); -extern void nca_node_xmit(node_t *, nca_conn_t *); - -/* - * It contains data for forwarding data to application programs. - * For door case, doorhandle is the upcall door handle and listenerq - * is NULL; for ncafs, listenerq is the upcall listener queue and - * doorhandle is NULL. listenning is always B_TRUE for door and it is - * B_TRUE for ncafs only after the listen system call has been issued. - */ -typedef struct nca_listener_s { - boolean_t listenning; /* is ready for accepting connection */ - door_handle_t doorhandle; /* door handle or NULL for ncafs */ - queue_t *listenerq; /* upcall queue or NULL for door */ -} nca_listener_t; - -/* - * Returned values of nca_isnca_data. - * NOT_NCA_DATA: not NCA data. - * NCA_DATA_ANY_ADDR: NCA data, matches INADDR_ANY. - * NCA_DATA_ADDR: NCA data, match an IP address. - */ -#define NOT_NCA_DATA 0 -#define NCA_DATA_ANY_ADDR 1 -#define NCA_DATA_ADDR 2 - -extern uint32_t ipportrehashcount1; -extern uint32_t ipportrehashcount2; -extern uint32_t ipportbucketcnt; -extern uint32_t ipporttablesize; -extern uint32_t ncafscount; -extern uint32_t doorcount; -extern int ip_virtual_hosting; - -extern nca_listener_t *nca_listener_find(ipaddr_t, uint16_t); -extern nca_listener_t *nca_listener_find2(ipaddr_t, uint16_t); -extern int nca_isnca_data(ipaddr_t, uint16_t); -extern int nca_listener_add(ipaddr_t, uint16_t, void *, boolean_t); -extern int nca_listener_del(ipaddr_t, uint16_t); -extern void nca_listener_report(mblk_t *); - -#ifdef __cplusplus -} -#endif - -#endif /* _INET_NCA_H */ diff --git a/usr/src/uts/common/inet/nca/ncaconf.h b/usr/src/uts/common/inet/nca/ncaconf.h deleted file mode 100644 index 87e230e0c8..0000000000 --- a/usr/src/uts/common/inet/nca/ncaconf.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright (c) 2000 by Sun Microsystems, Inc. - * All rights reserved. - */ - -#ifndef _INET_NCACONF_H -#define _INET_NCACONF_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Private interface to NCA. - */ -#define NCA_IOCTL_BASE ('C' << 8) -#define NCA_SET_IF (NCA_IOCTL_BASE|1) - -#ifndef ETHERADDRL -#define ETHERADDRL 6 -#endif - -#define ADD_DEF_ROUTE 1 -#define DEL_DEF_ROUTE 2 - -struct nca_set_ioctl { - ipaddr_t local_addr; - uchar_t router_ether_addr[ETHERADDRL]; - uchar_t action; -}; - -#ifdef __cplusplus -} -#endif - -#endif /* _INET_NCACONF_H */ diff --git a/usr/src/uts/common/inet/nca/ncadoorhdr.h b/usr/src/uts/common/inet/nca/ncadoorhdr.h deleted file mode 100644 index bf4fd62781..0000000000 --- a/usr/src/uts/common/inet/nca/ncadoorhdr.h +++ /dev/null @@ -1,328 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2004 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _INET_NCADOORHDR_H -#define _INET_NCADOORHDR_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _KERNEL -#include <stddef.h> -#endif /* _KERNEL */ - -#include <sys/types.h> -#include <sys/socket.h> -#include <netinet/in.h> - -#define ONE_KB (1024) -#define NCA_IO_MAX_SIZE (256 * ONE_KB) -#define NCA_IO_OFFSET (sizeof (nca_io2_t)) - -#define NCA_IO_TRUE 1 -#define NCA_IO_FALSE 0 - -/* - * Defines the data structures used by NCA and Webservers. - */ - -typedef enum { - /* - * NCA-to-HTTP-server protocol operation values: - */ - http_op = 100, /* NCA<>HTTP normal request/response */ - error_op = 101, /* NCA<-HTTP server error */ - error_retry_op = 102, /* NCA<-HTTP server transient error */ - resource_op = 120, /* NCA->HTTP server release resources */ - timeout_op = 150, /* NCA<-HTTP server timed out */ - door_attach_op = 160, /* NCA->HTTP NCA supports door fattach */ - /* - * NCA-to-Logging-server protocol operation values: - */ - log_op = 10000, /* NCA->Logger normal request */ - log_ok_op = 10001, /* NCA<-Logger request ok */ - log_error_op = 10002, /* NCA<-Logger request error */ - log_op_fiov = 10003 /* NCA<>Logger file i/o vector */ -} nca_op_t; - -typedef enum { - NCA_HTTP_VERSION1 = 1001, /* NCA-to-HTTP-server protocol */ - NCA_HTTP_VERSION2 = 1002, /* NCA-to-HTTP-server protocol V2 */ - NCA_LOG_VERSION1 = 5001, /* NCA-to-Logging-server protocol */ - NCA_LOG_VERSION2 = 5002 /* with in-kernel logging support */ - /* - * Note: Other version values are reserved for other client-to-server - * Solaris door base protocols and as these protocols may or may not - * be for use with NCA a new datatype (door_version_t ?) will be - * defined. - * - * Note: NCA_HTTP_VERSION1 has been deprecated, NCA_HTTP_VERSION2 must - * be used instead and is functionally a superset of (however, requires - * porting as some member names and symantics have changed). - */ -} nca_version_t; - -#define HTTP_ERR (-1) -#define HTTP_0_0 0x00000 -#define HTTP_0_9 0x00009 -#define HTTP_1_0 0x10000 -#define HTTP_1_1 0x10001 - -typedef uint32_t nca_tag_t; /* Request id */ -typedef uint32_t nca_offset_t; /* Offset */ - -/* - * Use pack(4) to make sizeof(struct nca_direct_cd_s) the same - * on x86 and amd64. - */ - -#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 -#pragma pack(4) -#endif - -typedef struct nca_direct_cd_s { /* Direct i/o connection descriptor */ - uint64_t cid; /* The connection id */ - nca_tag_t tag; /* The connect tag */ -} nca_direct_cd_t; - -#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 -#pragma pack() -#endif - -/* - * nca_io2_t.advisory values: - * - * NCA_IO_ADVISE - on cache miss upcall/return or preempted downcall - * advise that on susequent cache hit an advise upcall is required. - * - * NCA_IO_ADVISE_REPLACE - on advisory upcall/return or unsolicited - * downcall (for a ctag'ed object) replace the object data with - * returned object data. - * - * NCA_IO_ADVISE_FLUSH - on advisory upcall/return or unsolicited downcall - * (for a ctag'ed object) flush the object from the cache. - * - * NCA_IO_ADVISE_TEMP - on advisory upcall/return use the returned object - * data instead of the cached object data, the cached object is unaltered. - * - * NCA_IO_ADVISE_NONE - on cache miss upcall/return or preempted downcall - * no advise is needed and on advisory upcall/return no advise was needed. - */ -#define NCA_IO_ADVISE 0x01 -#define NCA_IO_ADVISE_REPLACE 0x02 -#define NCA_IO_ADVISE_FLUSH 0x04 -#define NCA_IO_ADVISE_TEMP 0x08 -#define NCA_IO_ADVISE_NONE 0x00 - - -/* - * nca_io2_t.direct_type values: - * - * For upcall or downcall/return: - * - * NCA_IO_DIRECT_NONE - none, any data is delivered via the optional - * meta data specifiers data/data_len and/or trailer/trailer_len. - * - * NCA_IO_DIRECT_FILENAME - file name, Invalid. - * - * NCA_IO_DIRECT_SHMSEG - shared memory segment, Invalid. - * - * NCA_IO_DIRECT_FILEDESC - file descriptor, Invalid. - * - * NCA_IO_DIRECT_CTAG - cache tag(s), like NCA_IO_DIRECT_NONE any data - * is delivered via the meta data specifiers data/data_len, in addition - * the meta data specifiers direct/direct_len point to an array of ctag - * uint64_t value(s) of previously returned ctag'ed response(s) for URI - * relative pathnamed variant(s). - * - * NCA_IO_DIRECT_SPLICE - splice of a connection is complete, on last - * transaction for a connection (i.e. when both the call and return - * nca_io2_t.more values are set to zero) indicates splice to the - * previously named preempted connection is complete. - * - * NCA_IO_DIRECT_TEE - tee of a connection is complete, on last - * transaction for a connection (i.e. when both the call and return - * nca_io2_t.more values are set to zero) indicates tee to the - * previously named connection is complete. - * - * For upcall/return or downcall: - * - * NCA_IO_DIRECT_NONE - none, any data is delivered via the optional - * meta data specifiers data/data_len and/or trailer/trailer_len. - * - * NCA_IO_DIRECT_FILENAME - file name, data is read from the named file, - * the meta data specifiers direct/direct_len point to a zero byte - * terminated string containing the path to the named file. - * - * NCA_IO_DIRECT_SHMSEG - shared memory segment, not implemented. - * - * NCA_IO_DIRECT_FILEDESC - file descriptor, not implemented. - * - * NCA_IO_DIRECT_CTAG - cache tag, data is to be gotten from the named - * ctag value (a previously returned ctag'ed response). - * - * NCA_IO_DIRECT_SPLICE - splice a connection, response data from the - * current connection is output to the named connection (previously - * preempted connection), the meta data specifiers direct/direct_len - * point to a nca_direct_cd_t (a cid/tag pair connection descriptor) - * used to specify the named connection. Note, no repsonse data is - * delivered to the current connection. - * - * NCA_IO_DIRECT_TEE - tee a connection, response data from the current - * connection is output to the named connection (previously preempted - * connection), the meta data specifiers direct/direct_len point to a - * nca_direct_cd_t (a cid/tag pair connection descriptor) used to - * specify the named connection. Note, response data is delivered to - * the current connection as normal. - */ -#define NCA_IO_DIRECT_NONE 0 -#define NCA_IO_DIRECT_FILENAME 1 -#define NCA_IO_DIRECT_SHMSEG 2 -#define NCA_IO_DIRECT_FILEDESC 3 -#define NCA_IO_DIRECT_CTAG 4 -#define NCA_IO_DIRECT_SPLICE 5 -#define NCA_IO_DIRECT_TEE 6 -#define NCA_IO_DIRECT_FILE_FD 7 - -/* - * NCA_HTTP_VERSION2 nca_io definition: - */ -typedef struct nca_io2_s { - - nca_version_t version; /* version number */ - nca_op_t op; /* type of operation */ - nca_tag_t tag; /* connect tag */ - - uint32_t sid; /* server instance id */ - uint64_t ctag; /* user cache tag */ - - uint64_t tid; /* caller's thread id */ - uint64_t cid; /* connection id */ - - uint8_t more; /* more chunks to follow */ - uint8_t first; /* first chunk for tag */ - - uint8_t advisory; /* ask before using cache */ - uint8_t nocache; /* don't cache */ - - uint8_t preempt; /* preempt subsequent upcall */ - uint8_t direct_type; /* direct specifier type */ - - uint8_t shadow; /* flag used by kernel when copyin */ - uint8_t pad2; /* padd to 32 bit align */ - - uint32_t peer_len; /* sockaddr of client */ - nca_offset_t peer; /* offset into meta data area */ - - uint32_t local_len; /* sockaddr of NCA server */ - nca_offset_t local; /* offset into meta data area */ - - uint32_t data_len; /* request/response data */ - nca_offset_t data; /* offset into meta data area */ - - uint32_t direct_len; /* direct data specifier */ - nca_offset_t direct; /* offset into meta data area */ - - uint32_t trailer_len; /* request/response trailer data */ - nca_offset_t trailer; /* offset into meta data area */ - - /* - * Following this structure is optional meta data, peer and local - * sockaddr, (header) data, direct data, and trailer data. - * - * All nca_offset_t's above are byte offsets from the begining of - * this structure. A meta data length specifier of zero indicates - * no meta data. - * - * Request (i.e. in-bound) data is specified by the data_len/data - * members only. - * - * Response (i.e. out-bound) data is specified by the data_len/data, - * direct_type/direct_len/direct, trailer_len/trailer members and is - * processed in-order. - * - * Note: sockaddr meta data are IPv4 addresses, future revisions - * of the NCA-to-HTTP-server protocol will support IPv6. So, the - * length of the sockaddr meta data must be honored as it will be - * increased for future IPv6 support. - */ - -} nca_io2_t; - -#define DOWNCALLINFO_MAGIC 0x19121969 - -typedef struct downcallinfo_s { - uint32_t dci_magic; - nca_io2_t *dci_iop; - uio_t *dci_uiop; -} downcallinfo_t; - -typedef enum { - NCA_UNKNOWN, - NCA_OPTIONS, - NCA_GET, - NCA_HEAD, - NCA_POST, - NCA_PUT, - NCA_DELETE, - NCA_TRACE, - - NCA_RAW /* Special case for active connections */ -} nca_http_method_t; - -typedef enum { - HS_OK = 200, - HS_CREATED = 201, - HS_ACCEPTED = 202, - HS_PARTIAL_CONTENT = 206, - HS_MOVED_PERMANENT = 301, - HS_MOVED = 302, - HS_NOT_MODIFIED = 304, - HS_BAD_REQUEST = 400, - HS_AUTH_REQUIRED = 401, - HS_FORBIDDEN = 403, - HS_NOT_FOUND = 404, - HS_PRECONDITION_FAILED = 412, - HS_SERVER_ERROR = 500, - HS_NOT_IMPLEMENTED = 501, - HS_SERVICE_UNAVAILABLE = 503, - HS_CONNECTION_CLOSED = 1000 -} nca_http_status_code; - -/* httpd (miss user space daemon) is attached to this door */ -#define MISS_DOOR_FILE "/var/run/nca_httpd_1.door" - -/* httpd downcall door server name */ -#define DOWNCALL_DOOR_FILE "/var/run/nca_httpd_1.down_door" - -#ifdef __cplusplus -} -#endif - -#endif /* _INET_NCADOORHDR_H */ diff --git a/usr/src/uts/common/inet/nca/ncaio.h b/usr/src/uts/common/inet/nca/ncaio.h deleted file mode 100644 index f6262e4a57..0000000000 --- a/usr/src/uts/common/inet/nca/ncaio.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2004 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _INET_NCAIO_H -#define _INET_NCAIO_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#ifdef __cplusplus -extern "C" { -#endif - -#include <sys/types.h> -#include <sys/sendfile.h> - -/* - * These request types are used with I_STR from ncafs to NCA. - */ -#define NCA_BIND 0x00000001 /* to bind an address */ -#define NCA_LISTEN 0x00000002 /* ready to accept connections */ -#define NCA_READY 0x00000004 /* is NCA ready */ - -/* Data structs for nca_sendfilev to send sendfilevec to NCA */ -#define NCA_IO_SENDVEC 8 - -typedef struct nca_sendvec_s { - int sfv_fd; - uint_t sfv_flag; - off_t sfv_off; - size_t sfv_len; - vnode_t *sfv_vp; -} nca_sendvec_t; - -#ifdef __cplusplus -} -#endif - -#endif /* _INET_NCAIO_H */ diff --git a/usr/src/uts/common/inet/nca/ncakmem.h b/usr/src/uts/common/inet/nca/ncakmem.h deleted file mode 100644 index d223f00b7b..0000000000 --- a/usr/src/uts/common/inet/nca/ncakmem.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright (c) 1999-2000 by Sun Microsystems, Inc. - * All rights reserved. - */ - -#ifndef _NCAKMEM_H -#define _NCAKMEM_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#include <sys/types.h> -#include <sys/vmem.h> -#include <vm/page.h> - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _KERNEL - -extern void nca_vmem_init(void); -extern void nca_vmem_fini(void); - -extern page_t **kmem_phys_alloc(size_t, int, char **); -extern void kmem_phys_free(page_t **); -extern void *kmem_phys_mapin(page_t **, void *, int); -extern void kmem_phys_mapout(page_t **, void *); - -#endif /* _KERNEL */ - -#ifdef __cplusplus -} -#endif - -#endif /* _NCAKMEM_H */ diff --git a/usr/src/uts/common/inet/nca/ncalogd.h b/usr/src/uts/common/inet/nca/ncalogd.h deleted file mode 100644 index 793371a9b1..0000000000 --- a/usr/src/uts/common/inet/nca/ncalogd.h +++ /dev/null @@ -1,190 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2007 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _INET_NCALOGD_H -#define _INET_NCALOGD_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#ifdef __cplusplus -extern "C" { -#endif - -#define MAX_URL_LEN (8192) - -#define NCA_DEFAULT_LOG_BUF_SIZE (65536) - -typedef struct log_buf { - int8_t buffer[NCA_DEFAULT_LOG_BUF_SIZE]; - uint32_t size; - uint32_t cur_pos; - struct log_buf *next; -#ifndef _KERNEL - mutex_t log_lock; /* threads-critical section */ -#else - kmutex_t log_lock; /* threads-critical section */ - frtn_t ft; /* free_func() for desballoc */ - void *pad1; /* padding so kernel and user-space */ - void *pad2; /* are the same size */ -#endif /* _KERNEL */ -} log_buf_t; - -/* - * Defines the data structures used by NCA and Webservers/log daemons. - */ - - -typedef struct { - ipaddr_t remote_host; /* IP address of the remote host */ - - /* size in bytes of nca_remote_user field */ - uint32_t remote_user_len; - - nca_offset_t remote_user; - - uint32_t auth_user_len; - nca_offset_t auth_user; -#ifndef _KERNEL - /* presumption: user space time_t is 32 bit long */ - time_t start_process_time; - time_t end_process_time; -#else - time32_t start_process_time; - time32_t end_process_time; -#endif /* _KERNEL */ - /* length in bytes of first line of HTTP request */ - uint32_t request_url_len; - - nca_offset_t request_url; - uint32_t response_status; /* cast to/from nca_http_status_code */ - uint32_t response_len; - - /* need for extended common log format */ - uint32_t referer_len; - nca_offset_t referer; - uint32_t useragent_len; - nca_offset_t useragent; - - /* Need for ELF */ - uint32_t method; /* must be cast to nca_http_method_t */ - uint32_t version; /* request HTTP version */ - - /* - * This structure is optionally followed by null terminated strings - * that contain "remote_user","auth_user", etc. - */ -} nca_request_log_t; - -typedef struct { - nca_version_t nca_version; - nca_op_t nca_op; -} nca_ver_op_t; - -typedef struct { - uint32_t n_log_size; /* size in bytes of log buf used */ - uint32_t n_log_recs; /* number of log recs in buffer */ - uint32_t n_log_upcall; /* NCA log buffer number */ -} nca_log_stat_t; - -typedef struct { - nca_ver_op_t nca_loghdr; - nca_log_stat_t nca_logstats; -} nca_log_buf_hdr_t; - -/* - * log_op_fiov ... - */ - -#include <sys/door.h> - -#ifdef _KERNEL -#define NCA_FIOV_SZ 16 - -typedef struct { - struct { - int ix; /* Current log file [ix] */ - int cnt; /* Count of valid log file [ix]s */ - } hdr; - struct { - vnode_t *vp; /* The vnode pointer for the file */ - off64_t size; /* Configured maximum bytes to write */ - off64_t offset; /* Offset in fd for next write */ - int file; /* Index of file (for reference only) */ - caddr_t name; /* The name of file */ - } iov[NCA_FIOV_SZ]; /* The iov's for each desc[] */ - vnode_t *dvp; /* vnode of dir where symlink lives */ -} nca_fio_t; - -#define nca_fio_vp(fiop) (fiop)->iov[(fiop)->hdr.ix].vp -#define nca_fio_name(fiop) (fiop)->iov[(fiop)->hdr.ix].name -#define nca_fio_size(fiop) (fiop)->iov[(fiop)->hdr.ix].size -#define nca_fio_offset(fiop) (fiop)->iov[(fiop)->hdr.ix].offset -#define nca_fio_file(fiop) (fiop)->iov[(fiop)->hdr.ix].file -#define nca_fio_ix(fiop) (fiop)->hdr.ix -#define nca_fio_cnt(fiop) (fiop)->hdr.cnt -#define nca_fio_dvp(fiop) (fiop)->dvp -#endif /* _KERNEL */ - -/* - * Macro to get size of a log record - */ -#define NCA_LOG_REC_SIZE(p) (sizeof (nca_request_log_t) + \ - p->remote_user_len + \ - p->auth_user_len + \ - p->request_url_len + \ - p->referer_len + p->useragent_len) - -/* - * Used to align start of log record on a uint32_t boundary . - */ -#define NCA_LOG_ALIGN(p) (char *)(((size_t)p+(sizeof (uint32_t)-1)) & \ - ~(sizeof (uint32_t)-1)) - -/* - * Macros to get at char string data given a pointer to a - * nca_request_log_t structure. - */ -#define NCA_REQLOG_RDATA(p, name) ((char *)p + sizeof (nca_request_log_t) + \ - (p->name)) - -/* write data as offsets at end of nca_request_log_t buf */ -#define NCA_REQLOG_WDATA(val, p, n_used, len, off) { \ - if (!(val)) { \ - p->len = 0; \ - p->off = 0; \ - } else { \ - p->len = strlen(val) + 1; \ - bcopy(val, ((char *)p + sizeof (nca_request_log_t) \ - + n_used), (p->len)); \ - p->off = n_used; \ - n_used += (p->len); \ - } \ -} - -#ifdef __cplusplus -} -#endif - -#endif /* _INET_NCALOGD_H */ diff --git a/usr/src/uts/common/inet/nca/ncandd.h b/usr/src/uts/common/inet/nca/ncandd.h deleted file mode 100644 index 5de710e37d..0000000000 --- a/usr/src/uts/common/inet/nca/ncandd.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ -/* - * Copyright 2005 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -#ifndef _SYS_NCANDD_H -#define _SYS_NCANDD_H - -#pragma ident "%Z%%M% %I% %E% SMI" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Named Dispatch Parameter Management Structure */ -typedef struct ncaparam_s { - ulong_t param_min; - ulong_t param_max; - ulong_t param_val; - char *param_name; -} ncaparam_t; - -extern ncaparam_t nca_param_arr[]; - -#define nca_log_cycle (uint32_t)nca_param_arr[0].param_val -#define no_caching (uint32_t)nca_param_arr[1].param_val -#define nca_log_size (uint64_t)nca_param_arr[2].param_val -#define nca_max_cache_size (uint32_t)nca_param_arr[3].param_val -#define nca_http_timeout (uint32_t)nca_param_arr[4].param_val -#define nca_http_keep_alive_timeout (uint32_t)nca_param_arr[5].param_val -#define nca_http_keep_alive_max (uint32_t)nca_param_arr[6].param_val -#define nca_inq_nointr (uint32_t)nca_param_arr[7].param_val -#define nca_use_hwcksum (uint32_t)nca_param_arr[8].param_val -#define nca_segmap_min_size (uint32_t)nca_param_arr[9].param_val - -#ifdef __cplusplus -} -#endif - -#endif /* _SYS_NCANDD_H */ |