diff options
Diffstat (limited to 'sys/netatm/atm_sys.h')
-rw-r--r-- | sys/netatm/atm_sys.h | 275 |
1 files changed, 275 insertions, 0 deletions
diff --git a/sys/netatm/atm_sys.h b/sys/netatm/atm_sys.h new file mode 100644 index 0000000..4cfb031 --- /dev/null +++ b/sys/netatm/atm_sys.h @@ -0,0 +1,275 @@ +/* + * + * =================================== + * HARP | Host ATM Research Platform + * =================================== + * + * + * This Host ATM Research Platform ("HARP") file (the "Software") is + * made available by Network Computing Services, Inc. ("NetworkCS") + * "AS IS". NetworkCS does not provide maintenance, improvements or + * support of any kind. + * + * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED, + * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE + * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE. + * In no event shall NetworkCS be responsible for any damages, including + * but not limited to consequential damages, arising from or relating to + * any use of the Software or related support. + * + * Copyright 1994-1998 Network Computing Services, Inc. + * + * Copies of this Software may be made, however, the above copyright + * notice must be reproduced on all copies. + * + * @(#) $Id: atm_sys.h,v 1.12 1998/05/18 19:05:57 mks Exp $ + * + */ + +/* + * Core ATM Services + * ----------------- + * + * General system definitions + * + */ + +#ifndef _NETATM_ATM_SYS_H +#define _NETATM_ATM_SYS_H + +/* + * Software Version + */ +#define ATM_VERSION 0x00030000 /* Version 3.0 */ +#define ATM_VERS_MAJ(v) ((v) >> 16) +#define ATM_VERS_MIN(v) ((v) & 0xffff) + + +/* + * Misc system defines + */ +#define ATM_CALLQ_MAX 100 /* Maximum length of call queue */ +#define ATM_INTRQ_MAX 1000 /* Maximum length of interrupt queue */ + + +/* + * ATM address manipulation macros + */ +#define ATM_ADDR_EQUAL(a1, a2) \ + (((a1)->address_format == (a2)->address_format) && \ + ((a1)->address_length == (a2)->address_length) && \ + (bcmp((caddr_t)(a1)->address, (caddr_t)(a2)->address, \ + (a1)->address_length) == 0)) + +#define ATM_ADDR_SEL_EQUAL(a1, s1, a2) \ + (((a1)->address_format == (a2)->address_format) && \ + ((a1)->address_length == (a2)->address_length) && \ + (((((a1)->address_format == T_ATM_ENDSYS_ADDR) || \ + ((a1)->address_format == T_ATM_NSAP_ADDR)) && \ + (bcmp((caddr_t)(a1)->address, (caddr_t)(a2)->address, \ + (a1)->address_length - 1) == 0) && \ + ((s1) == ((struct atm_addr_nsap *)(a2)->address)->aan_sel)) || \ + (((a1)->address_format != T_ATM_ENDSYS_ADDR) && \ + ((a1)->address_format != T_ATM_NSAP_ADDR) && \ + (bcmp((caddr_t)(a1)->address, (caddr_t)(a2)->address, \ + (a1)->address_length) == 0)))) + +#define ATM_ADDR_COPY(a1, a2) \ +{ \ + (a2)->address_format = (a1)->address_format; \ + (a2)->address_length = (a1)->address_length; \ + XM_COPY((caddr_t)(a1)->address, (caddr_t)(a2)->address, \ + (a1)->address_length); \ +} + +#define ATM_ADDR_SEL_COPY(a1, s1, a2) \ +{ \ + (a2)->address_format = (a1)->address_format; \ + (a2)->address_length = (a1)->address_length; \ + if (((a1)->address_format == T_ATM_ENDSYS_ADDR) || \ + ((a1)->address_format == T_ATM_NSAP_ADDR)) { \ + XM_COPY((caddr_t)(a1)->address, (caddr_t)(a2)->address, \ + (a1)->address_length - 1); \ + ((struct atm_addr_nsap *)(a2)->address)->aan_sel = (s1);\ + } else { \ + XM_COPY((caddr_t)(a1)->address, (caddr_t)(a2)->address, \ + (a1)->address_length); \ + } \ +} + + +/* + * ATM Cell Header definitions + */ + +/* + * These macros assume that the cell header (minus the HEC) + * is contained in the least-significant 32-bits of a word + */ +#define ATM_HDR_SET_VPI(vpi) (((vpi) & 0xff) << 20) +#define ATM_HDR_SET_VCI(vci) (((vci) & 0xffff) << 4) +#define ATM_HDR_SET_PT(pt) (((pt) & 0x7) << 1) +#define ATM_HDR_SET_CLP(clp) ((clp) & 0x1) +#define ATM_HDR_SET(vpi,vci,pt,clp) (ATM_HDR_SET_VPI(vpi) | \ + ATM_HDR_SET_VCI(vci) | \ + ATM_HDR_SET_PT(pt) | \ + ATM_HDR_SET_CLP(clp)) +#define ATM_HDR_GET_VPI(hdr) (((hdr) >> 20) & 0xff) +#define ATM_HDR_GET_VCI(hdr) (((hdr) >> 4) & 0xffff) +#define ATM_HDR_GET_PT(hdr) (((hdr) >> 1) & 0x7) +#define ATM_HDR_GET_CLP(hdr) ((hdr) & 0x1) + +/* + * Payload Type Identifier (3 bits) + */ +#define ATM_PT_USER_SDU0 0x0 /* User, no congestion, sdu type 0 */ +#define ATM_PT_USER_SDU1 0x1 /* User, no congestion, sdu type 1 */ +#define ATM_PT_USER_CONG_SDU0 0x2 /* User, congestion, sdu type 0 */ +#define ATM_PT_USER_CONG_SDU1 0x3 /* User, congestion, sdu type 1 */ +#define ATM_PT_NONUSER 0x4 /* User/non-user differentiator */ +#define ATM_PT_OAMF5_SEG 0x4 /* OAM F5 segment flow */ +#define ATM_PT_OAMF5_E2E 0x5 /* OAM F5 end-to-end flow */ + + +/* + * AAL (ATM Adaptation Layer) codes + */ +typedef u_char Aal_t; +#define ATM_AAL0 0 /* AAL0 - Cell service */ +#define ATM_AAL1 1 /* AAL1 */ +#define ATM_AAL2 2 /* AAL2 */ +#define ATM_AAL3_4 3 /* AAL3/4 */ +#define ATM_AAL5 5 /* AAL5 */ + + +/* + * VCC Encapsulation codes + */ +typedef u_char Encaps_t; +#define ATM_ENC_NULL 1 /* Null encapsulation */ +#define ATM_ENC_LLC 2 /* LLC encapsulation */ + + +#ifdef ATM_KERNEL +/* + * ATM timer control block. Used to schedule a timeout via atm_timeout(). + * This control block will typically be embedded in a processing-specific + * control block. + */ +struct atm_time { + u_short ti_ticks; /* Delta of ticks until timeout */ + u_char ti_flag; /* Timer flag bits (see below) */ + void (*ti_func) /* Call at timeout expiration */ + __P((struct atm_time *)); + struct atm_time *ti_next; /* Next on queue */ +}; + +/* + * Timer Flags + */ +#define TIF_QUEUED 0x01 /* Control block on timer queue */ + +#define ATM_HZ 2 /* Time ticks per second */ + + +/* + * To avoid heavy use of kmem_alloc, memory for protocol control blocks may + * be allocated from storage pools. Each control block type will have + * its own pool. Each storage pool will consist of individually allocated + * memory chunks, which will then be sub-divided into the separate control + * blocks. Each chunk will contain a header (sp_chunk) and 'n' blocks of the + * same type, plus a link field for each block. Each chunk will also contain + * a list of all free control blocks in the chunk. + * + * Each protocol must define an sp_info structure for each of its storage + * pools. This structure serves as the "root" for its particular pool. + * Protocols must not modify this structure after its first use. + */ +struct sp_info { + /* Values supplied by pool owner */ + char *si_name; /* Name of pool */ + size_t si_blksiz; /* Size of each block */ + int si_blkcnt; /* Blocks per chunk */ + int si_maxallow; /* Maximum allowable chunks */ + + /* Used by allocate/free functions - do not touch */ + struct sp_info *si_next; /* Next active storage pool */ + struct sp_chunk *si_poolh; /* Storage pool chunk head */ + struct sp_chunk *si_poolt; /* Storage pool chunk tail */ + size_t si_chunksiz; /* Size of chunk */ + int si_chunks; /* Current allocated chunks */ + int si_total; /* Total number of blocks */ + int si_free; /* Free blocks */ + int si_maxused; /* Maximum allocated chunks */ + int si_allocs; /* Total allocate calls */ + int si_fails; /* Allocate failures */ +}; + +struct sp_chunk { + struct sp_chunk *sc_next; /* Next chunk in pool */ + struct sp_info *sc_info; /* Storage pool info */ + u_int sc_magic; /* Chunk magic number */ + int sc_used; /* Allocated blocks in chunk */ + struct sp_link *sc_freeh; /* Head of free blocks in chunk */ + struct sp_link *sc_freet; /* Tail of free blocks in chunk */ +}; + +struct sp_link { + union { + struct sp_link *slu_next; /* Next block in free list */ + struct sp_chunk *slu_chunk; /* Link back to our chunk */ + } sl_u; +}; + +#define SPOOL_MAGIC 0x73d4b69c /* Storage pool magic number */ +#define SPOOL_MIN_CHUNK 2 /* Minimum number of chunks */ +#define SPOOL_ROUNDUP 16 /* Roundup for allocated chunks */ +#define SPOOL_COMPACT (300 * ATM_HZ) /* Compaction timeout value */ + +/* + * Debugging + */ +#ifdef DIAGNOSTIC +#define ATM_TIME \ + struct timeval now, delta; \ + KT_TIME(now); \ + delta.tv_sec = now.tv_sec - atm_debugtime.tv_sec; \ + delta.tv_usec = now.tv_usec - atm_debugtime.tv_usec; \ + atm_debugtime = now; \ + if (delta.tv_usec < 0) { \ + delta.tv_sec--; \ + delta.tv_usec += 1000000; \ + } \ + printf("%3d.%6d: ", delta.tv_sec, delta.tv_usec); + +#define ATM_DEBUG0(f) if (atm_debug) {ATM_TIME; printf(f);} +#define ATM_DEBUGN0(f) if (atm_debug) {printf(f);} +#define ATM_DEBUG1(f,a1) if (atm_debug) {ATM_TIME; printf(f, a1);} +#define ATM_DEBUGN1(f,a1) if (atm_debug) {printf(f, a1);} +#define ATM_DEBUG2(f,a1,a2) if (atm_debug) {ATM_TIME; printf(f, a1, a2);} +#define ATM_DEBUGN2(f,a1,a2) if (atm_debug) {printf(f, a1, a2);} +#define ATM_DEBUG3(f,a1,a2,a3) if (atm_debug) {ATM_TIME; printf(f, a1, a2, a3);} +#define ATM_DEBUGN3(f,a1,a2,a3) if (atm_debug) {printf(f, a1, a2, a3);} +#define ATM_DEBUG4(f,a1,a2,a3,a4) if (atm_debug) {ATM_TIME; printf(f, a1, a2, a3, a4);} +#define ATM_DEBUGN4(f,a1,a2,a3,a4) if (atm_debug) {printf(f, a1, a2, a3, a4);} +#define ATM_DEBUG5(f,a1,a2,a3,a4,a5) if (atm_debug) {ATM_TIME; printf(f, a1, a2, a3, a4, a5);} +#define ATM_DEBUGN5(f,a1,a2,a3,a4,a5) if (atm_debug) {printf(f, a1, a2, a3, a4, a5);} +#else +#define ATM_DEBUG0(f) +#define ATM_DEBUGN0(f) +#define ATM_DEBUG1(f,a1) +#define ATM_DEBUGN1(f,a1) +#define ATM_DEBUG2(f,a1,a2) +#define ATM_DEBUGN2(f,a1,a2) +#define ATM_DEBUG3(f,a1,a2,a3) +#define ATM_DEBUGN3(f,a1,a2,a3) +#define ATM_DEBUG4(f,a1,a2,a3,a4) +#define ATM_DEBUGN4(f,a1,a2,a3,a4) +#define ATM_DEBUG5(f,a1,a2,a3,a4,a5) +#define ATM_DEBUGN5(f,a1,a2,a3,a4,a5) +#endif + +#endif /* ATM_KERNEL */ + +#endif /* _NETATM_ATM_SYS_H */ |