1/*
2 * Copyright (c) 1996-2003
3 *	Fraunhofer Institute for Open Communication Systems (FhG Fokus).
4 * 	All rights reserved.
5 *
6 * Author: Hartmut Brandt <harti@freebsd.org>
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * $Begemot: libunimsg/netnatm/msg/unistruct.h,v 1.7 2004/07/16 18:42:22 brandt Exp $
30 *
31 * This file defines all structures that are used by
32 * API users.
33 */
34#ifndef _NETNATM_MSG_UNISTRUCT_H_
35#define _NETNATM_MSG_UNISTRUCT_H_
36
37#include <netnatm/msg/uni_config.h>
38
39/*
40 * define IE and MSG header
41 */
42#include <netnatm/msg/uni_hdr.h>
43
44/*
45 * define all IE's
46 */
47/*************************************************************************
48 *
49 * Free FORM IE
50 */
51struct uni_ie_unrec {
52	struct uni_iehdr h;
53	uint8_t id;		/* ID of this IE */
54	u_int len;		/* data length */
55	u_char data[128];	/* arbitrary maximum length */
56};
57
58/*************************************************************************
59 *
60 * ATM adaptation layer parameters information element
61 */
62enum {
63	UNI_AAL_SUB_ID		= 0x85,
64	UNI_AAL_CBR_ID		= 0x86,
65	UNI_AAL_MULT_ID		= 0x87,
66	UNI_AAL_SCREC_ID	= 0x88,
67	UNI_AAL_ECM_ID		= 0x89,
68	UNI_AAL_BSIZE_ID	= 0x8a,
69	UNI_AAL_PART_ID		= 0x8b,
70	UNI_AAL_FWDCPCS_ID	= 0x8c,
71	UNI_AAL_BWDCPCS_ID	= 0x81,
72	UNI_AAL_MID_ID		= 0x82,
73	UNI_AAL_SSCS_ID		= 0x84,
74};
75
76enum uni_aal {
77	UNI_AAL_0	= 0x00,	/* voice */
78	UNI_AAL_1	= 0x01,
79	UNI_AAL_2	= 0x02,
80	UNI_AAL_4	= 0x03,	/* same as AAL 3 */
81	UNI_AAL_5	= 0x05,
82	UNI_AAL_USER	= 0x10,
83};
84enum uni_aal1_subtype {
85	UNI_AAL1_SUB_NULL	= 0x00,
86	UNI_AAL1_SUB_VOICE	= 0x01,
87	UNI_AAL1_SUB_CIRCUIT	= 0x02,
88	UNI_AAL1_SUB_HQAUDIO	= 0x04,
89	UNI_AAL1_SUB_VIDEO	= 0x05,
90};
91enum uni_aal1_cbr {
92	UNI_AAL1_CBR_64		= 0x01,
93	UNI_AAL1_CBR_1544	= 0x04,
94	UNI_AAL1_CBR_6312	= 0x05,
95	UNI_AAL1_CBR_32064	= 0x06,
96	UNI_AAL1_CBR_44736	= 0x07,
97	UNI_AAL1_CBR_97728	= 0x08,
98	UNI_AAL1_CBR_2048	= 0x10,
99	UNI_AAL1_CBR_8448	= 0x11,
100	UNI_AAL1_CBR_34368	= 0x12,
101	UNI_AAL1_CBR_139264	= 0x13,
102	UNI_AAL1_CBR_N64	= 0x40,
103	UNI_AAL1_CBR_N8		= 0x41,
104};
105enum uni_aal1_screc {
106	UNI_AAL1_SCREC_NULL	= 0x00,	/* synchr. circuit transport */
107	UNI_AAL1_SCREC_SRTS	= 0x01,	/* synchr. residual timestamp */
108	UNI_AAL1_SCREC_ACLK	= 0x02,	/* adaptive clock */
109};
110enum uni_aal1_ecm {
111	UNI_AAL1_ECM_NULL	= 0x00,	/* no error correction */
112	UNI_AAL1_ECM_LOSS	= 0x01,	/* for loss sensitive signals */
113	UNI_AAL1_ECM_DELAY	= 0x02,	/* for delay sensitive signals */
114};
115enum uni_aal_sscs {
116	UNI_AAL_SSCS_NULL	= 0x00,	/* Null */
117	UNI_AAL_SSCS_SSCOPA	= 0x01,	/* assured SSCOP */
118	UNI_AAL_SSCS_SSCOPU	= 0x02,	/* unassured SSCOP */
119	UNI_AAL_SSCS_FRAME	= 0x04,	/* frame relay */
120};
121
122struct uni_ie_aal {
123	struct uni_iehdr h;
124	enum uni_aal	type;		/* aal type */
125
126	union {
127#define UNI_AAL1_MULT_P	0x01
128#define UNI_AAL1_SCREC_P	0x02
129#define UNI_AAL1_ECM_P		0x04
130#define UNI_AAL1_BSIZE_P	0x08
131#define UNI_AAL1_PART_P	0x10
132	    struct {
133		enum uni_aal1_subtype subtype;	/* AAL1 subtype */
134		enum uni_aal1_cbr cbr_rate;	/* AAL1 CBR rate */
135		u_int		mult;		/* AAL1 CBR mutliplier */
136		enum uni_aal1_screc screc;	/* AAL1 source clock recovery */
137		enum uni_aal1_ecm ecm;		/* AAL1 error correction */
138		u_int	bsize;			/* AAL1 SDT blocksize */
139		u_int	part;			/* AAL1 partial cell fill */
140	    } aal1;
141
142#define UNI_AAL4_CPCS_P	0x01
143#define UNI_AAL4_MID_P		0x02
144#define UNI_AAL4_SSCS_P	0x04
145	    struct {
146		u_int	fwd_cpcs;	/* max fwd cpcs blocksize */
147		u_int	bwd_cpcs;	/* max bkw cpcs blocksize */
148		u_int	mid_low;	/* MID low range */
149		u_int	mid_high;	/* MID high range */
150		enum uni_aal_sscs sscs;	/* sscs type */
151	     } aal4;
152
153#define UNI_AAL5_CPCS_P	0x01
154#define UNI_AAL5_SSCS_P	0x02
155	    struct {
156		u_int	fwd_cpcs;	/* max fwd cpcs blocksize */
157		u_int	bwd_cpcs;	/* max bkw cpcs blocksize */
158		enum uni_aal_sscs sscs;	/* sscs type */
159	     } aal5;
160
161	    struct {
162		u_int	len;		/* number of bytes */
163		u_char	user[4];	/* user data */
164	    } aalu;
165	} u;
166};
167
168/*************************************************************************
169 *
170 * Called party number information element
171 * Called party subaddress information element
172 * Calling party number information element
173 * Calling party subaddress information element
174 * Q.2951/UNI4.0 Connected number information element
175 * Q.2951/UNI4.0 Connected subaddress information element
176 */
177enum uni_addr_type {
178	UNI_ADDR_UNKNOWN	= 0x0,
179	UNI_ADDR_INTERNATIONAL	= 0x1,
180	UNI_ADDR_NATIONAL	= 0x2,	/* not sup */
181	UNI_ADDR_NETWORK	= 0x3,	/* not sup */
182	UNI_ADDR_SUBSCR		= 0x4,	/* not sup */
183	UNI_ADDR_ABBR		= 0x6,	/* not sup */
184};
185enum uni_addr_plan {
186	/* UNI_ADDR_UNKNOWN	= 0x0, */	/* not sup */
187	UNI_ADDR_E164		= 0x1,
188	UNI_ADDR_ATME		= 0x2,
189	UNI_ADDR_DATA		= 0x3,	/* not sup */
190	UNI_ADDR_PRIVATE	= 0x9,	/* not sup */
191};
192enum uni_subaddr_type {
193	UNI_SUBADDR_NSAP	= 0x0,
194	UNI_SUBADDR_ATME	= 0x1,
195	UNI_SUBADDR_USER	= 0x2,	/* not sup */
196};
197enum uni_addr_pres {
198	UNI_ADDR_PRES		= 0x0,
199	UNI_ADDR_RESTRICT	= 0x1,
200	UNI_ADDR_NONUMBER	= 0x2,
201};
202enum uni_addr_screen {
203	UNI_ADDR_SCREEN_NOT	= 0x0,
204	UNI_ADDR_SCREEN_PASSED	= 0x1,
205	UNI_ADDR_SCREEN_FAILED	= 0x2,
206	UNI_ADDR_SCREEN_NET	= 0x3,
207};
208
209/* don't use bitfields to get a defined structure layout */
210struct uni_addr {
211	uint8_t			type;
212	uint8_t			plan;
213	uint8_t			len;
214	u_char			addr[UNI_ADDR_MAXLEN];
215};
216struct uni_subaddr {
217	enum uni_subaddr_type	type;
218	u_int			len;
219	u_char			addr[UNI_SUBADDR_MAXLEN];
220};
221
222struct uni_ie_called {
223	struct uni_iehdr	h;
224	struct uni_addr	addr;
225};
226
227struct uni_ie_calledsub {
228	struct uni_iehdr	h;
229	struct uni_subaddr	addr;
230};
231
232struct uni_ie_calling {
233	struct uni_iehdr	h;
234#define UNI_CALLING_SCREEN_P 0x0001
235
236	struct uni_addr		addr;
237	enum uni_addr_pres	pres;
238	enum uni_addr_screen	screen;
239};
240
241struct uni_ie_callingsub {
242	struct uni_iehdr	h;
243	struct uni_subaddr	addr;
244};
245
246struct uni_ie_conned {
247	struct uni_iehdr	h;
248#define UNI_CONNED_SCREEN_P 0x0001
249
250	struct uni_addr		addr;
251	enum uni_addr_pres	pres;
252	enum uni_addr_screen	screen;
253};
254
255struct uni_ie_connedsub {
256	struct uni_iehdr	h;
257	struct uni_subaddr	addr;
258};
259
260/*************************************************************************
261 *
262 * Broadband bearer capability descriptor
263 * On reception of an old bearer descriptor, it is automatically
264 * converted to a new, legal one.
265 */
266enum uni_bearer_class {
267	UNI_BEARER_A		= 0x01,
268	UNI_BEARER_C		= 0x03,
269	UNI_BEARER_X		= 0x10,
270	UNI_BEARER_TVP		= 0x30,
271};
272
273enum uni_bearer_atc {
274	UNI_BEARER_ATC_CBR	= 0x05,
275	UNI_BEARER_ATC_CBR1	= 0x07,
276	UNI_BEARER_ATC_VBR	= 0x09,
277	UNI_BEARER_ATC_VBR1	= 0x13,
278	UNI_BEARER_ATC_NVBR	= 0x0a,
279	UNI_BEARER_ATC_NVBR1	= 0x0b,
280	UNI_BEARER_ATC_ABR	= 0x0c,
281
282	UNI_BEARER_ATCX_0	= 0x00,
283	UNI_BEARER_ATCX_1	= 0x01,
284	UNI_BEARER_ATCX_2	= 0x02,
285	UNI_BEARER_ATCX_4	= 0x04,
286	UNI_BEARER_ATCX_6	= 0x06,
287	UNI_BEARER_ATCX_8	= 0x08,
288};
289
290enum uni_bearer_clip {
291	UNI_BEARER_NOCLIP	= 0x0,
292	UNI_BEARER_CLIP		= 0x1,
293};
294
295enum uni_bearer_cfg {
296	UNI_BEARER_P2P		= 0x0,
297	UNI_BEARER_MP		= 0x1,
298};
299
300struct uni_ie_bearer {
301	struct uni_iehdr	h;
302#define UNI_BEARER_ATC_P	0x02
303
304	enum uni_bearer_class	bclass;		/* bearer class */
305	enum uni_bearer_atc	atc;		/* ATM transfer capability */
306	enum uni_bearer_clip	clip;		/* suspectibility to clipping */
307	enum uni_bearer_cfg	cfg;		/* u-plane configuration */
308};
309
310/*************************************************************************
311 *
312 * Broadband higher layer information element
313 */
314enum uni_bhli {
315	UNI_BHLI_ISO	= 0x00,	/* IDO defined */
316	UNI_BHLI_USER	= 0x01,	/* user specific */
317	UNI_BHLI_VENDOR	= 0x03,	/* vendor specific */
318};
319
320struct uni_ie_bhli {
321	struct uni_iehdr	h;
322	enum uni_bhli		type;
323	u_char			info[8];
324	u_int			len;
325};
326
327/*************************************************************************
328 *
329 * Boradband lower layer information element
330 */
331enum {
332	UNI_BLLI_L1_ID		= 0x1,
333	UNI_BLLI_L2_ID		= 0x2,
334	UNI_BLLI_L3_ID		= 0x3,
335};
336
337enum uni_blli_l2 {
338	UNI_BLLI_L2_BASIC	= 0x01,
339	UNI_BLLI_L2_Q921	= 0x02,
340	UNI_BLLI_L2_X25LL	= 0x06,
341	UNI_BLLI_L2_X25ML	= 0x07,
342	UNI_BLLI_L2_LABP	= 0x08,
343	UNI_BLLI_L2_HDLC_ARM	= 0x09,
344	UNI_BLLI_L2_HDLC_NRM	= 0x0a,
345	UNI_BLLI_L2_HDLC_ABM	= 0x0b,
346	UNI_BLLI_L2_LAN		= 0x0c,
347	UNI_BLLI_L2_X75		= 0x0d,
348	UNI_BLLI_L2_Q922	= 0x0e,
349	UNI_BLLI_L2_USER	= 0x10,
350	UNI_BLLI_L2_ISO7776	= 0x11,
351};
352
353enum uni_blli_l2_mode {
354	UNI_BLLI_L2NORM		= 0x1,
355	UNI_BLLI_L2EXT		= 0x2,
356};
357
358enum uni_blli_l3 {
359	UNI_BLLI_L3_X25		= 0x06,
360	UNI_BLLI_L3_ISO8208	= 0x07,
361	UNI_BLLI_L3_X223	= 0x08,
362	UNI_BLLI_L3_CLMP	= 0x09,
363	UNI_BLLI_L3_T70		= 0x0a,
364	UNI_BLLI_L3_TR9577	= 0x0b,
365	UNI_BLLI_L3_H310	= 0x0c,
366	UNI_BLLI_L3_H321	= 0x0d,
367	UNI_BLLI_L3_USER	= 0x10,
368};
369
370enum uni_blli_l3_mode {
371	UNI_BLLI_L3NSEQ		= 0x1,	/* normal sequence numbering */
372	UNI_BLLI_L3ESEQ		= 0x2,	/* extended sequence numbering */
373};
374
375enum uni_blli_l3_psiz {
376	UNI_BLLI_L3_16		= 0x4,	/* 16 byte packets */
377	UNI_BLLI_L3_32		= 0x5,	/* 32 byte packets */
378	UNI_BLLI_L3_64		= 0x6,	/* 64 byte packets */
379	UNI_BLLI_L3_128		= 0x7,	/* 128 byte packets */
380	UNI_BLLI_L3_256		= 0x8,	/* 256 byte packets */
381	UNI_BLLI_L3_512		= 0x9,	/* 512 byte packets */
382	UNI_BLLI_L3_1024	= 0xa,	/* 1024 byte packets */
383	UNI_BLLI_L3_2048	= 0xb,	/* 2048 byte packets */
384	UNI_BLLI_L3_4096	= 0xc,	/* 4096 byte packets */
385};
386
387enum uni_blli_l3_ttype {
388	UNI_BLLI_L3_TTYPE_RECV	= 0x1,	/* receive only */
389	UNI_BLLI_L3_TTYPE_SEND	= 0x2,	/* send only */
390	UNI_BLLI_L3_TTYPE_BOTH	= 0x3,	/* both */
391};
392
393enum uni_blli_l3_mux {
394	UNI_BLLI_L3_MUX_NOMUX	= 0,	/* no multiplexing */
395	UNI_BLLI_L3_MUX_TS	= 1,	/* transport stream */
396	UNI_BLLI_L3_MUX_TSFEC	= 2,	/* transport stream with FEC */
397	UNI_BLLI_L3_MUX_PS	= 3,	/* program stream */
398	UNI_BLLI_L3_MUX_PSFEC	= 4,	/* program stream with FEC */
399	UNI_BLLI_L3_MUX_H221	= 5,	/* H.221 */
400};
401
402enum uni_blli_l3_tcap {
403	UNI_BLLI_L3_TCAP_NOIND	= 0,	/* no indication */
404	UNI_BLLI_L3_TCAP_AAL1	= 1,	/* only AAL1 */
405	UNI_BLLI_L3_TCAP_AAL5	= 2,	/* only AAL5 */
406	UNI_BLLI_L3_TCAP_AAL15	= 3,	/* AAL1 and AAL5 */
407};
408
409/* Value for l3_ipi: */
410enum {
411	UNI_BLLI_L3_SNAP	= 0x80,	/* IEEE 802.1 SNAP */
412};
413
414struct uni_ie_blli {
415	struct uni_iehdr	h;
416#define UNI_BLLI_L1_P		0x0001
417#define UNI_BLLI_L2_P		0x0002
418#define UNI_BLLI_L2_Q933_P	0x0004
419#define UNI_BLLI_L2_WSIZ_P	0x0008
420#define UNI_BLLI_L2_USER_P	0x0010
421#define UNI_BLLI_L3_P		0x0020
422#define UNI_BLLI_L3_MODE_P	0x0040
423#define UNI_BLLI_L3_PSIZ_P	0x0080
424#define UNI_BLLI_L3_WSIZ_P	0x0100
425#define UNI_BLLI_L3_USER_P	0x0200
426#define UNI_BLLI_L3_IPI_P	0x0400
427#define UNI_BLLI_L3_SNAP_P	0x0800
428#define UNI_BLLI_L3_TTYPE_P	0x1000
429#define UNI_BLLI_L3_MUX_P	0x2000
430
431	u_int			l1:5;		/* layer 1 info */
432
433	enum uni_blli_l2	l2;		/* layer 2 info */
434	u_int			l2_q933:2;	/* layer 2 Q.933 use */
435	enum uni_blli_l2_mode	l2_mode;	/* layer 2 HDLC mode */
436	u_char			l2_user;	/* layer 2 user info */
437	u_char			l2_wsiz;	/* layer 2 window size */
438
439	enum uni_blli_l3	l3;		/* layer 3 info */
440	enum uni_blli_l3_mode	l3_mode;	/* layer 3 mode */
441	enum uni_blli_l3_psiz	l3_psiz;	/* layer 3 default packet size */
442	u_char			l3_wsiz;	/* layer 3 window size */
443	u_char			l3_user;	/* layer 3 user info */
444	u_char			l3_ipi;		/* IPI byte */
445	u_int			oui;		/* OUI bytes */
446	u_int			pid;		/* PID bytes */
447	enum uni_blli_l3_ttype	l3_ttype;	/* terminal bytes */
448	enum uni_blli_l3_tcap	l3_tcap;	/* terminal capability */
449	enum uni_blli_l3_mux	l3_fmux;	/* forward muxing */
450	enum uni_blli_l3_mux	l3_bmux;	/* forward muxing */
451};
452
453/*************************************************************************
454 *
455 * Transit network selection IE
456 */
457struct uni_ie_tns {
458	struct uni_iehdr h;
459	u_char		net[UNI_TNS_MAXLEN];
460	u_int		len;
461};
462
463/*************************************************************************
464 *
465 * Call state information element
466 */
467enum uni_callstate {
468	UNI_CALLSTATE_U0	= 0x00,
469	UNI_CALLSTATE_N0	= 0x00,
470	UNI_CALLSTATE_NN0	= 0x00,
471
472	UNI_CALLSTATE_U1	= 0x01,
473	UNI_CALLSTATE_N1	= 0x01,
474	UNI_CALLSTATE_NN1	= 0x01,
475
476	UNI_CALLSTATE_U3	= 0x03,
477	UNI_CALLSTATE_N3	= 0x03,
478	UNI_CALLSTATE_NN3	= 0x03,
479
480	UNI_CALLSTATE_U4	= 0x04,
481	UNI_CALLSTATE_N4	= 0x04,
482	UNI_CALLSTATE_NN4	= 0x04,
483
484	UNI_CALLSTATE_U6	= 0x06,
485	UNI_CALLSTATE_N6	= 0x06,
486	UNI_CALLSTATE_NN6	= 0x06,
487
488	UNI_CALLSTATE_U7	= 0x07,
489	UNI_CALLSTATE_N7	= 0x07,
490	UNI_CALLSTATE_NN7	= 0x07,
491
492	UNI_CALLSTATE_U8	= 0x08,
493	UNI_CALLSTATE_N8	= 0x08,
494
495	UNI_CALLSTATE_U9	= 0x09,
496	UNI_CALLSTATE_N9	= 0x09,
497	UNI_CALLSTATE_NN9	= 0x09,
498
499	UNI_CALLSTATE_U10	= 0x0a,
500	UNI_CALLSTATE_N10	= 0x0a,
501	UNI_CALLSTATE_NN10	= 0x0a,
502
503	UNI_CALLSTATE_U11	= 0x0b,
504	UNI_CALLSTATE_N11	= 0x0b,
505	UNI_CALLSTATE_NN11	= 0x0b,
506
507	UNI_CALLSTATE_U12	= 0x0c,
508	UNI_CALLSTATE_N12	= 0x0c,
509	UNI_CALLSTATE_NN12	= 0x0c,
510
511	UNI_CALLSTATE_REST0	= 0x00,
512	UNI_CALLSTATE_REST1	= 0x3d,
513	UNI_CALLSTATE_REST2	= 0x3e,
514
515	UNI_CALLSTATE_U13	= 0x0d,
516	UNI_CALLSTATE_N13	= 0x0d,
517
518	UNI_CALLSTATE_U14	= 0x0e,
519	UNI_CALLSTATE_N14	= 0x0e,
520};
521
522struct uni_ie_callstate {
523	struct uni_iehdr	h;
524	enum uni_callstate	state;
525};
526
527/*************************************************************************
528 *
529 * Cause information element
530 */
531enum uni_cause_loc {
532	UNI_CAUSE_LOC_USER	= 0x0,
533	UNI_CAUSE_LOC_PRIVLOC	= 0x1,
534	UNI_CAUSE_LOC_PUBLOC	= 0x2,
535	UNI_CAUSE_LOC_TRANSIT	= 0x3,
536	UNI_CAUSE_LOC_PUBREM	= 0x4,
537	UNI_CAUSE_LOC_PRIVREM	= 0x5,
538	UNI_CAUSE_LOC_INTERNAT	= 0x6,
539	UNI_CAUSE_LOC_BEYOND	= 0x7,
540};
541
542#define UNI_DECLARE_CAUSE_VALUES \
543D(UNALL_NUM,	0x01 /*  1*/, COND,	Q.850,	"Unallocated (unassigned) number") \
544D(NOROUTE_NET,	0x02 /*  2*/, TNS,	Q.850,	"No route to specified transit network") \
545D(NOROUTE,	0x03 /*  3*/, COND,	Q.850,	"No route to destination") \
546D(SPTONE,	0x04 /*  4*/, NONE,	Q.850,	"Send special information tone") \
547D(BADTRUNK,	0x05 /*  5*/, NONE,	Q.850,	"Misdialled trunk prefix") \
548D(BADCHAN,	0x06 /*  6*/, NONE,	Q.850,	"Channel unacceptable") \
549D(CALLAWARDED,	0x07 /*  7*/, NONE,	Q.850,	"Call awarded and being delivered in an established channel") \
550D(PREEMPT,	0x08 /*  8*/, NONE,	Q.850,	"Preemption") \
551D(PREEMPT_RES,	0x09 /*  9*/, NONE,	Q.850,	"Preemption - circuit reserved for reuse") \
552D(CLEARING,	0x10 /* 16*/, COND,	Q.850,	"Normal call clearing") \
553D(BUSY,		0x11 /* 17*/, CCBS,	Q.850,	"User busy") \
554D(NO_RESPONSE,	0x12 /* 18*/, NONE,	Q.850,	"No user responding") \
555D(NO_RESP_ALERT,0x13 /* 19*/, NONE,	Q.850,	"No answer from user (user alerted)") \
556D(ABSENT,	0x14 /* 20*/, NONE,	Q.850,	"Subscriber absent") \
557D(REJECTED,	0x15 /* 21*/, REJ,	Q.850,	"Call rejected") \
558D(NUMCHG,	0x16 /* 22*/, NUMBER,	Q.850,	"Number changed") \
559D(REDIR,	0x17 /* 23*/, NONE,	Q.850,	"Redirection to new destination") \
560N(CLIR_REJECTED,0x17 /* 23*/, NONE,	UNI4.0,	"User rejects call with calling line identification restriction (CLIR)") \
561D(EXCHG_ERR,	0x19 /* 25*/, NONE,	Q.850,	"Exchange routing error") \
562D(NOSEL_CLEAR,	0x1a /* 26*/, NONE,	Q.850,	"Non-selected user clearing") \
563D(DST_OOO,	0x1b /* 27*/, NONE,	Q.850,	"Destination out of order") \
564D(INV_ADDR,	0x1c /* 28*/, NONE,	Q.850,	"Invalid number format (address incomplete)") \
565D(FAC_REJ,	0x1d /* 29*/, FAC,	Q.850,	"Facility rejected") \
566D(STATUS,	0x1e /* 30*/, NONE,	Q.850,	"Response to STATUS ENQUIRY") \
567D(UNSPEC,	0x1f /* 31*/, NONE,	Q.850,	"Normal, unspecified") \
568D(TMY_PARTY,	0x20 /* 32*/, NONE,	Q.2971,	"Too many pending add party requests") \
569D(NOCHAN,	0x22 /* 34*/, CCBS,	Q.850,	"No circuit/channel available") \
570N(SOFT_NAVL,	0x22 /* 34*/, NONE,	PNNI1.0,"Requested called party soft PVPC or PVCC not available")\
571D(VPCI_NAVL,	0x23 /* 35*/, NONE,	Q.2610,	"Requested VPCI/VCI not available") \
572D(VPCI_FAIL,	0x24 /* 36*/, NONE,	Q.2610,	"VPCI/VPI assignment failure") \
573D(CRATE_NAVL,	0x25 /* 37*/, CRATE,	Q.2610,	"User cell rate not available") \
574D(NET_OOO,	0x26 /* 38*/, NONE,	Q.850,	"Network out of order") \
575D(FRAME_OOS,	0x27 /* 39*/, NONE,	Q.850,	"Permanent frame mode connection out of service") \
576D(FRAME_OP,	0x28 /* 40*/, NONE,	Q.850,	"Permanent frame mode connection operational") \
577D(TEMP,		0x29 /* 41*/, NONE,	Q.850,	"Temporary failure") \
578D(CONG,		0x2a /* 42*/, NONE,	Q.850,	"Switching equipment congestion") \
579D(ACC_DISC,	0x2b /* 43*/, IE,	Q.850,	"Access information discarded") \
580D(REQNOCHAN,	0x2c /* 44*/, NONE,	Q.850,	"Requested circuit/channel not available") \
581D(NOVPCI,	0x2d /* 45*/, NONE,	Q.2610,	"No VPCI/VCI available") \
582D(PREC_BLOCK,	0x2e /* 46*/, NONE,	Q.850,	"Precedence call blocked") \
583D(RESRC_NAVL,	0x2f /* 47*/, NONE,	Q.850,	"Resource unavailable, unspecified") \
584D(QOS_NAVL,	0x31 /* 49*/, COND,	Q.850,	"Quality of service not available") \
585D(FAC_NOTSUB,	0x32 /* 50*/, FAC,	Q.850,	"Requested facility not subscribed") \
586D(OUT_CUG,	0x35 /* 53*/, NONE,	Q.850,	"Outgoing calls barred within CUG") \
587N(PGL_CHG,	0x35 /* 53*/, NONE,	PNNI1.0,"Call cleared due to change in PGL") \
588D(IN_CUG,	0x37 /* 55*/, NONE,	Q.850,	"Incoming call barred within CUG") \
589D(BEARER_NAUTH,	0x39 /* 57*/, ATTR,	Q.850,	"Bearer capability not authorized") \
590D(BEARER_NAVL,	0x3a /* 58*/, ATTR,	Q.850,	"Bearer capability not presently available") \
591D(INCONS,	0x3e /* 62*/, NONE,	Q.850,	"Inconsistency in designated outgoing access information and subscriber class") \
592D(OPT_NAVL,	0x3f /* 63*/, NONE,	Q.850,	"Service or option not available, unspecified") \
593D(BEARER_NIMPL,	0x41 /* 65*/, ATTR,	Q.850,	"Bearer capability not implemented") \
594D(CHANNEL_NIMPL,0x42 /* 66*/, CHANNEL,	Q.850,	"Channel type not implemented") \
595D(FAC_NIMPL,	0x45 /* 69*/, FAC,	Q.850,	"Requested facility not implemented") \
596D(RESTR_DIG,	0x46 /* 70*/, NONE,	Q.850,	"Only restricted digital information bearer capability is available") \
597D(TRAFFIC_UNSUP,0x49 /* 73*/, NONE,	Q.2971,	"Unsupported combination of traffic parameters") \
598N(AAL_UNSUP,	0x4c /* 78*/, NONE,	UNI3.1,	"AAL parameters cannot be supported") \
599D(CREF_INV,	0x51 /* 81*/, NONE,	Q.850,	"Invalid call reference value") \
600D(CHANNEL_NEX,	0x52 /* 82*/, CHANID,	Q.850,	"Identified channel does not exist") \
601D(SUSPENDED,	0x53 /* 83*/, NONE,	Q.850,	"A suspended call exists, but this call identity does not") \
602D(CID_INUSE,	0x54 /* 84*/, NONE,	Q.850,	"Call identity in use") \
603D(NOTSUSP,	0x55 /* 85*/, NONE,	Q.850,	"No call suspended") \
604D(CLEARED,	0x56 /* 86*/, CAUSE,	Q.850,	"Call having requested call identity has been cleared") \
605D(NOT_MEMBER,	0x57 /* 87*/, NONE,	Q.850,	"User not member of CUG") \
606D(INCOMP,	0x58 /* 88*/, PARAM,	Q.850,	"Incompatible destination") \
607D(ENDP_INV,	0x59 /* 89*/, IE,	UNI3.1,	"Invalid endpoint reference") \
608D(NEX_CUG,	0x5a /* 90*/, NONE,	Q.850,	"Non-existend CUG") \
609D(TRANSIT_INV,	0x5b /* 91*/, NONE,	Q.850,	"Invalid transit network selection") \
610D(AALNOTSUPP,	0x5d /* 93*/, NONE,	Q.2610,	"AAL parameters cannot be supported") \
611D(INVMSG,	0x5f /* 95*/, NONE,	Q.850,	"Invalid message, unspecified") \
612D(MANDAT,	0x60 /* 96*/, IE,	Q.850,	"Mandatory information element is missing") \
613D(MTYPE_NIMPL,	0x61 /* 97*/, MTYPE,	Q.850,	"Message type non-existent or not implemented") \
614D(MSG_NOTCOMP,	0x62 /* 98*/, MTYPE,	Q.850,	"Message not compatible with call state or message type non-existent or not implemented") \
615D(IE_NIMPL,	0x63 /* 99*/, IE,	Q.850,	"Information element/parameter non-existent or not implemented") \
616D(IE_INV,	0x64 /*100*/, IE,	Q.850,	"Invalid information element contents") \
617D(MSG_INCOMP,	0x65 /*101*/, MTYPE,	Q.850,	"Message not compatible with call state") \
618D(RECOVER,	0x66 /*102*/, TIMER,	Q.850,	"Recovery on timer expiry") \
619D(PARAM_NEX,	0x67 /*103*/, PARAM,	Q.850,	"Parameter non-existent or not implemented, passed on") \
620N(BAD_LENGTH,	0x68 /*104*/, NONE,	UNI3.1,	"Incorrect message length") \
621D(PARAM_UNREC,	0x6e /*110*/, PARAM,	Q.850,	"Message with unrecognized parameter, discarded") \
622D(PROTO,	0x6f /*111*/, NONE,	Q.850,	"Protocol error, unspecified") \
623D(INTERWORKING,	0x7f /*127*/, NONE,	Q.850,	"Interworking, unspecified")
624
625#define D(NAME,VAL,DIAG,STD,STR) UNI_CAUSE_##NAME = VAL,
626#define N(NAME,VAL,DIAG,STD,STR) UNI_CAUSE_##NAME = VAL,
627
628enum uni_cause {
629UNI_DECLARE_CAUSE_VALUES
630};
631
632#undef D
633#undef N
634
635enum uni_cause_class {
636	UNI_CAUSE_CLASS_NORM	= 0x0,
637	UNI_CAUSE_CLASS_NORM1	= 0x1,
638	UNI_CAUSE_CLASS_RES	= 0x2,
639	UNI_CAUSE_CLASS_NAVL	= 0x3,
640	UNI_CAUSE_CLASS_NIMPL	= 0x4,
641	UNI_CAUSE_CLASS_INV	= 0x5,
642	UNI_CAUSE_CLASS_PROTO	= 0x6,
643	UNI_CAUSE_CLASS_INTER	= 0x7,
644};
645enum uni_cause_pu {
646	UNI_CAUSE_PU_PROVIDER	= 0,
647	UNI_CAUSE_PU_USER	= 1,
648};
649enum uni_cause_na {
650	UNI_CAUSE_NA_NORMAL	= 0,
651	UNI_CAUSE_NA_ABNORMAL	= 1,
652};
653enum uni_cause_cond {
654	UNI_CAUSE_COND_UNKNOWN	= 0,
655	UNI_CAUSE_COND_PERM	= 1,
656	UNI_CAUSE_COND_TRANS	= 2,
657};
658enum uni_cause_reason {
659	UNI_CAUSE_REASON_USER	= 0x00,
660	UNI_CAUSE_REASON_IEMISS	= 0x01,
661	UNI_CAUSE_REASON_IESUFF	= 0x02,
662};
663
664enum uni_diag {
665	UNI_DIAG_NONE,		/* no diagnostics */
666
667	UNI_DIAG_COND,		/* Condition */
668	UNI_DIAG_TNS,		/* Transit Network Selector */
669	UNI_DIAG_REJ,		/* Call Rejected */
670	UNI_DIAG_NUMBER,	/* New Destination */
671	UNI_DIAG_CRATE,		/* Traffic descriptor subfield */
672	UNI_DIAG_ATTR,		/* Attribute idendity */
673	UNI_DIAG_PARAM,		/* Parameter, same as one IE */
674	UNI_DIAG_TIMER,		/* timer in ASCII */
675	UNI_DIAG_MTYPE,		/* Message type */
676	UNI_DIAG_IE,		/* Information element */
677	UNI_DIAG_CHANID,	/* VPCI/VCI */
678
679	UNI_DIAG_CAUSE = UNI_DIAG_NONE,		/* Not specified */
680	UNI_DIAG_CHANNEL = UNI_DIAG_NONE,	/* For N-ISDN */
681	UNI_DIAG_CCBS = UNI_DIAG_NONE,		/* Not used in Q.931 */
682	UNI_DIAG_FAC = UNI_DIAG_NONE,		/* Not specified */
683};
684
685enum {
686	UNI_CAUSE_TRAFFIC_N	= 34-6,
687	UNI_CAUSE_IE_N		= 34-6,
688	UNI_CAUSE_ATTR_N	= (34-6)/3,
689};
690
691struct uni_ie_cause {
692	struct uni_iehdr	h;
693#define UNI_CAUSE_COND_P	0x0001
694#define UNI_CAUSE_REJ_P		0x0002
695#define UNI_CAUSE_REJ_USER_P	0x0004
696#define UNI_CAUSE_REJ_IE_P	0x0008
697#define UNI_CAUSE_IE_P		0x0010
698#define UNI_CAUSE_TRAFFIC_P	0x0020
699#define UNI_CAUSE_VPCI_P	0x0040
700#define UNI_CAUSE_MTYPE_P	0x0080
701#define UNI_CAUSE_TIMER_P	0x0100
702#define UNI_CAUSE_TNS_P		0x0200
703#define UNI_CAUSE_NUMBER_P	0x0400
704#define UNI_CAUSE_ATTR_P	0x0800
705#define UNI_CAUSE_PARAM_P	0x1000
706
707	enum uni_cause_loc	loc;
708	enum uni_cause		cause;
709
710	union {
711	    struct {
712		enum uni_cause_pu	pu;
713		enum uni_cause_na	na;
714		enum uni_cause_cond	cond;
715	    } cond;
716	    struct {
717		enum uni_cause_reason	reason;
718		enum uni_cause_cond	cond;
719		u_int			user;
720		uint8_t			ie;
721	    } rej;
722	    struct {
723		uint8_t			ie[UNI_CAUSE_IE_N];
724		u_int			len;
725	    } ie;
726	    struct {
727		uint8_t			traffic[UNI_CAUSE_TRAFFIC_N];
728		u_int			len;
729	    } traffic;
730	    struct {
731		uint16_t		vpci;
732		uint16_t		vci;
733	    } vpci;
734	    uint8_t			mtype;
735	    u_char			timer[3];
736	    struct uni_ie_tns		tns;
737	    struct uni_ie_called	number;		/* TNS does not fit */
738	    uint8_t			param;
739	    struct {
740		u_int			nattr;
741	        u_char			attr[UNI_CAUSE_ATTR_N][3];
742	    }				attr;
743	} u;
744};
745enum uni_diag uni_diag(enum uni_cause, enum uni_coding);
746
747/* return a string for the cause (NULL if the coding/cause are illegal) */
748const char *uni_ie_cause2str(enum uni_coding, u_int);
749
750/*************************************************************************
751 *
752 * Connection identifier information element
753 */
754enum uni_connid_type {
755	UNI_CONNID_VCI		= 0,
756	UNI_CONNID_ANYVCI	= 1,
757	UNI_CONNID_NOVCI	= 4,
758};
759enum uni_connid_assoc {
760	UNI_CONNID_ASSOC	= 0,
761	UNI_CONNID_NONASSOC	= 1,
762};
763struct uni_ie_connid {
764	struct uni_iehdr	h;
765	enum uni_connid_assoc	assoc;
766	enum uni_connid_type	type;
767	u_int			vpci : 16;
768	u_int			vci : 16;
769};
770
771/*************************************************************************
772 *
773 * End point reference IE
774 */
775struct uni_ie_epref {
776	struct uni_iehdr	h;
777	u_int			flag : 1;
778	u_int			epref : 15;
779};
780
781/*************************************************************************
782 *
783 * End point state IE
784 */
785enum uni_epstate {
786	UNI_EPSTATE_NULL	= 0x00,
787	UNI_EPSTATE_ADD_INIT	= 0x01,
788	UNI_EPSTATE_ALERT_DLVD	= 0x04,
789	UNI_EPSTATE_ADD_RCVD	= 0x06,
790	UNI_EPSTATE_ALERT_RCVD	= 0x07,
791	UNI_EPSTATE_ACTIVE	= 0x0a,
792	UNI_EPSTATE_DROP_INIT	= 0x0b,
793	UNI_EPSTATE_DROP_RCVD	= 0x0c,
794};
795
796struct uni_ie_epstate {
797	struct uni_iehdr h;
798	enum uni_epstate state;
799};
800
801/*************************************************************************
802 *
803 * Q.2932 Facility IE
804 */
805enum {
806	UNI_FACILITY_ROSE	= 0x11,
807
808	UNI_FACILITY_MAXAPDU	= 128,
809};
810
811struct uni_ie_facility {
812	struct uni_iehdr h;
813
814	u_char		proto;
815	u_char		apdu[UNI_FACILITY_MAXAPDU];
816	u_int		len;
817};
818
819/*************************************************************************
820 *
821 * Notification indicator
822 */
823enum {
824	UNI_NOTIFY_MAXLEN	= 128,	/* maximum info length */
825};
826struct uni_ie_notify {
827	struct uni_iehdr h;
828	u_int		len;
829	u_char		notify[UNI_NOTIFY_MAXLEN];
830};
831
832/*************************************************************************
833 *
834 * QoS information element
835 */
836enum uni_qos {
837	UNI_QOS_CLASS0	= 0x00,
838	UNI_QOS_CLASS1	= 0x01,
839	UNI_QOS_CLASS2	= 0x02,
840	UNI_QOS_CLASS3	= 0x03,
841	UNI_QOS_CLASS4	= 0x04,
842};
843
844struct uni_ie_qos {
845	struct uni_iehdr h;
846	enum uni_qos	fwd;
847	enum uni_qos	bwd;
848};
849
850/*************************************************************************
851 *
852 * Broadband repeat indicator information element
853 */
854enum uni_repeat_type {
855	UNI_REPEAT_PRIDESC	= 0x02,
856	UNI_REPEAT_STACK	= 0x0a,		/* PNNI */
857};
858
859struct uni_ie_repeat {
860	struct uni_iehdr h;
861	enum uni_repeat_type type;
862};
863
864/*************************************************************************
865 *
866 * Restart indicator information element
867 */
868enum uni_restart_type {
869	UNI_RESTART_CHANNEL	= 0x0,
870	UNI_RESTART_PATH	= 0x1,
871	UNI_RESTART_ALL		= 0x2,
872};
873
874struct uni_ie_restart {
875	struct uni_iehdr h;
876	enum uni_restart_type rclass;
877};
878
879/*************************************************************************
880 *
881 * Broadband sending complete indicator information element
882 */
883struct uni_ie_scompl {
884	struct uni_iehdr h;
885};
886
887/*************************************************************************
888 *
889 * ATM traffic descriptor information element
890 */
891enum {
892	UNI_TRAFFIC_FMDCR_ID	= 0x00,
893	UNI_TRAFFIC_BMDCR_ID	= 0x02,
894	UNI_TRAFFIC_FPCR0_ID	= 0x82,
895	UNI_TRAFFIC_BPCR0_ID	= 0x83,
896	UNI_TRAFFIC_FPCR1_ID	= 0x84,
897	UNI_TRAFFIC_BPCR1_ID	= 0x85,
898	UNI_TRAFFIC_FSCR0_ID	= 0x88,
899	UNI_TRAFFIC_BSCR0_ID	= 0x89,
900	UNI_TRAFFIC_FSCR1_ID	= 0x90,
901	UNI_TRAFFIC_BSCR1_ID	= 0x91,
902	UNI_TRAFFIC_FABR1_ID	= 0x92,
903	UNI_TRAFFIC_BABR1_ID	= 0x93,
904	UNI_TRAFFIC_FMBS0_ID	= 0xa0,
905	UNI_TRAFFIC_BMBS0_ID	= 0xa1,
906	UNI_TRAFFIC_FMBS1_ID	= 0xb0,
907	UNI_TRAFFIC_BMBS1_ID	= 0xb1,
908	UNI_TRAFFIC_BEST_ID	= 0xbe,
909	UNI_TRAFFIC_MOPT_ID	= 0xbf,
910
911	UNI_TRAFFIC_FTAG	= 0x01,
912	UNI_TRAFFIC_BTAG	= 0x02,
913	UNI_TRAFFIC_FDISC	= 0x80,
914	UNI_TRAFFIC_BDISC	= 0x40,
915
916	UNI_MINTRAFFIC_FPCR0_ID	= 0x82,
917	UNI_MINTRAFFIC_BPCR0_ID	= 0x83,
918	UNI_MINTRAFFIC_FPCR1_ID	= 0x84,
919	UNI_MINTRAFFIC_BPCR1_ID	= 0x85,
920	UNI_MINTRAFFIC_FABR1_ID	= 0x92,
921	UNI_MINTRAFFIC_BABR1_ID	= 0x93,
922
923	UNI_MDCR_ORIGIN_USER	= 0x00,
924	UNI_MDCR_ORIGIN_NET	= 0x01,
925};
926
927#define UNI_TRAFFIC_FPCR0_P	0x0001
928#define UNI_TRAFFIC_BPCR0_P	0x0002
929#define UNI_TRAFFIC_FPCR1_P	0x0004
930#define UNI_TRAFFIC_BPCR1_P	0x0008
931#define UNI_TRAFFIC_FSCR0_P	0x0010
932#define UNI_TRAFFIC_BSCR0_P	0x0020
933#define UNI_TRAFFIC_FSCR1_P	0x0040
934#define UNI_TRAFFIC_BSCR1_P	0x0080
935#define UNI_TRAFFIC_FMBS0_P	0x0100
936#define UNI_TRAFFIC_BMBS0_P	0x0200
937#define UNI_TRAFFIC_FMBS1_P	0x0400
938#define UNI_TRAFFIC_BMBS1_P	0x0800
939#define UNI_TRAFFIC_BEST_P	0x1000
940#define UNI_TRAFFIC_MOPT_P	0x2000
941#define UNI_TRAFFIC_FABR1_P	0x4000
942#define UNI_TRAFFIC_BABR1_P	0x8000
943struct uni_xtraffic {
944	u_int	fpcr0, bpcr0;
945	u_int	fpcr1, bpcr1;
946	u_int	fscr0, bscr0;
947	u_int	fscr1, bscr1;
948	u_int	fmbs0, bmbs0;
949	u_int	fmbs1, bmbs1;
950	u_int	fabr1, babr1;
951	u_int	ftag, btag;
952	u_int	fdisc, bdisc;
953};
954
955struct uni_ie_traffic {
956	struct uni_iehdr h;
957	struct uni_xtraffic t;
958};
959struct uni_ie_atraffic {
960	struct uni_iehdr h;
961	struct uni_xtraffic t;
962};
963
964/*
965 * Q.2961 minimum traffic descriptor
966 */
967struct uni_ie_mintraffic {
968	struct uni_iehdr h;
969#define UNI_MINTRAFFIC_FPCR0_P	0x0001
970#define UNI_MINTRAFFIC_BPCR0_P	0x0002
971#define UNI_MINTRAFFIC_FPCR1_P	0x0004
972#define UNI_MINTRAFFIC_BPCR1_P	0x0008
973#define UNI_MINTRAFFIC_FABR1_P	0x0010
974#define UNI_MINTRAFFIC_BABR1_P	0x0020
975
976	u_int	fpcr0, bpcr0;
977	u_int	fpcr1, bpcr1;
978	u_int	fabr1, babr1;
979};
980
981/*
982 * UNI4.0+ (af-cs-0147.000) Minimum Desired Cell Rate
983 */
984struct uni_ie_mdcr {
985	struct uni_iehdr h;
986	u_int	origin;
987	u_int	fmdcr, bmdcr;
988};
989
990/*************************************************************************
991 *
992 * User-user information information element
993 */
994struct uni_ie_uu {
995	struct uni_iehdr h;
996	u_int		len;
997	u_char		uu[UNI_UU_MAXLEN];
998};
999
1000/*************************************************************************
1001 *
1002 * Generic identifier transport
1003 */
1004enum uni_git_std {
1005	UNI_GIT_STD_DSMCC	= 0x01,	/* DSM-CC */
1006	UNI_GIT_STD_H245	= 0x02,	/* H.245 */
1007};
1008enum uni_git_type {
1009	UNI_GIT_TYPE_SESS	= 0x01,	/* session id */
1010	UNI_GIT_TYPE_RES	= 0x02,	/* resource id */
1011};
1012
1013enum {
1014	UNI_GIT_MAXSESS		= 20,	/* max session value length */
1015	UNI_GIT_MAXRES		= 4,	/* max resource value length */
1016
1017	UNI_GIT_MAXVAL		= 20,	/* the maximum of the above */
1018	UNI_GIT_MAXSUB		= 2,	/* maximum number of og. 6 */
1019};
1020
1021struct uni_ie_git {
1022	struct uni_iehdr	h;
1023
1024	enum uni_git_std	std;	/* identifier related standard/application */
1025	u_int			numsub;
1026	struct {
1027		enum uni_git_type type;
1028		u_int		len;
1029		u_char		val[UNI_GIT_MAXVAL];
1030	}			sub[UNI_GIT_MAXSUB];
1031};
1032
1033/*************************************************************************
1034 *
1035 * End-to-end transit delay
1036 */
1037enum {
1038	UNI_EETD_CTD_ID		= 0x01,	/* cumulative transit delay */
1039	UNI_EETD_MTD_ID		= 0x03,	/* maximum transit delay */
1040	UNI_EETD_NET_ID		= 0x0a,	/* network generated */
1041	UNI_EETD_PMTD_ID	= 0x0b,	/* PNNI acceptable forward maximum ctd */
1042	UNI_EETD_PCTD_ID	= 0x11,	/* PNNI cumulative forward maximum ctd */
1043
1044	UNI_EETD_ANYMAX		= 0xffff,
1045	UNI_EETD_MAXVAL		= 0xffff,	/* maximum value */
1046};
1047
1048struct uni_ie_eetd {
1049	struct uni_iehdr	h;
1050#define UNI_EETD_CUM_P		0x0001
1051#define UNI_EETD_MAX_P		0x0002
1052#define UNI_EETD_NET_P		0x0004	/* UNI4.0 9.1.2.1 */
1053#define UNI_EETD_PMTD_P		0x0008	/* PNNI1.0 6.4.5.24 */
1054#define UNI_EETD_PCTD_P		0x0010	/* PNNI1.0 6.4.5.24 */
1055
1056	u_int	cumulative;
1057	u_int	maximum;
1058	u_int	pmtd;
1059	u_int	pctd;
1060};
1061
1062/*************************************************************************
1063 *
1064 * Leaf-initiated-join call identifier
1065 */
1066enum uni_lij_idtype {
1067	UNI_LIJ_IDTYPE_ROOT	= 0x0,	/* root created */
1068};
1069
1070struct uni_ie_lij_callid {
1071	struct uni_iehdr	h;
1072
1073	enum uni_lij_idtype	type;
1074	u_int			callid;
1075};
1076
1077/*
1078 * LIJ parameters
1079 */
1080enum uni_lij_screen {
1081	UNI_LIJ_SCREEN_NETJOIN	= 0x0,	/* without root notification */
1082};
1083
1084struct uni_ie_lij_param {
1085	struct uni_iehdr	h;
1086
1087	enum uni_lij_screen	screen;
1088};
1089
1090/*
1091 * LIJ sequence number
1092 */
1093struct uni_ie_lij_seqno {
1094	struct uni_iehdr	h;
1095
1096	u_int			seqno;
1097};
1098
1099/*************************************************************************
1100 *
1101 * Locking/Non-locking shift not supported
1102 */
1103struct uni_ie_lshift {
1104	struct uni_iehdr h;
1105	u_int		set:3;
1106};
1107
1108struct uni_ie_nlshift {
1109	struct uni_iehdr h;
1110	u_int		set:3;
1111};
1112
1113/*************************************************************************
1114 *
1115 * Externded QoS information element
1116 */
1117enum {
1118	UNI_EXQOS_FACC_ID	= 0x94,
1119	UNI_EXQOS_BACC_ID	= 0x95,
1120	UNI_EXQOS_FCUM_ID	= 0x96,
1121	UNI_EXQOS_BCUM_ID	= 0x97,
1122	UNI_EXQOS_FCLR_ID	= 0xa2,
1123	UNI_EXQOS_BCLR_ID	= 0xa3,
1124};
1125
1126enum uni_exqos_origin {
1127	UNI_EXQOS_USER	= 0,
1128	UNI_EXQOS_NET	= 1,
1129};
1130
1131enum {
1132	UNI_EXQOS_ANY_CDV	= 0xffffff,
1133	UNI_EXQOS_ANY_CLR	= 0xff,
1134};
1135
1136struct uni_ie_exqos {
1137	struct uni_iehdr	h;
1138#define UNI_EXQOS_FACC_P	0x0001
1139#define UNI_EXQOS_BACC_P	0x0002
1140#define UNI_EXQOS_FCUM_P	0x0004
1141#define UNI_EXQOS_BCUM_P	0x0008
1142#define UNI_EXQOS_FCLR_P	0x0010
1143#define UNI_EXQOS_BCLR_P	0x0020
1144
1145	enum uni_exqos_origin	origin;
1146	u_int			facc;
1147	u_int			bacc;
1148	u_int			fcum;
1149	u_int			bcum;
1150	u_int			fclr;
1151	u_int			bclr;
1152};
1153
1154/*************************************************************************
1155 *
1156 * Additional ABR parameters
1157 * ABR setup parameters
1158 */
1159enum {
1160	UNI_ABRADD_FADD_ID	= 0xc2,
1161	UNI_ABRADD_BADD_ID	= 0xc3,
1162	UNI_ABRSETUP_FICR_ID	= 0xc2,
1163	UNI_ABRSETUP_BICR_ID	= 0xc3,
1164	UNI_ABRSETUP_FTBE_ID	= 0xc4,
1165	UNI_ABRSETUP_BTBE_ID	= 0xc5,
1166	UNI_ABRSETUP_RMFRT_ID	= 0xc6,
1167	UNI_ABRSETUP_FRIF_ID	= 0xc8,
1168	UNI_ABRSETUP_BRIF_ID	= 0xc9,
1169	UNI_ABRSETUP_FRDF_ID	= 0xca,
1170	UNI_ABRSETUP_BRDF_ID	= 0xcb,
1171};
1172
1173struct uni_abr_rec {
1174	u_int			present;
1175#define UNI_ABR_REC_NRM_P	0x80000000
1176#define UNI_ABR_REC_TRM_P	0x40000000
1177#define UNI_ABR_REC_CDF_P	0x20000000
1178#define UNI_ABR_REC_ADTF_P	0x10000000
1179	u_int		nrm:3;
1180	u_int		trm:3;
1181	u_int		cdf:3;
1182	u_int		adtf:10;
1183};
1184
1185struct uni_ie_abradd {
1186	struct uni_iehdr	h;
1187	struct uni_abr_rec	fwd, bwd;
1188};
1189
1190struct uni_ie_abrsetup {
1191	struct uni_iehdr	h;
1192#define UNI_ABRSETUP_FICR_P	0x0001
1193#define UNI_ABRSETUP_BICR_P	0x0002
1194#define UNI_ABRSETUP_FTBE_P	0x0004
1195#define UNI_ABRSETUP_BTBE_P	0x0008
1196#define UNI_ABRSETUP_FRIF_P	0x0010
1197#define UNI_ABRSETUP_BRIF_P	0x0020
1198#define UNI_ABRSETUP_FRDF_P	0x0040
1199#define UNI_ABRSETUP_BRDF_P	0x0080
1200#define UNI_ABRSETUP_RMFRT_P	0x0100
1201
1202	u_int		ficr, bicr;
1203	u_int		ftbe, btbe;
1204	u_int		rmfrt;
1205	u_int		frif, brif;
1206	u_int		frdf, brdf;
1207};
1208
1209/*************************************************************************
1210 *
1211 * Connection scope information element
1212 */
1213enum uni_cscope {
1214	UNI_CSCOPE_ORG	= 0x01,
1215};
1216
1217enum {
1218	UNI_CSCOPE_ORG_LOC	= 0x01,
1219	UNI_CSCOPE_ORG_LOC_P1	= 0x02,
1220	UNI_CSCOPE_ORG_LOC_P2	= 0x03,
1221	UNI_CSCOPE_ORG_SITE_M1	= 0x04,
1222	UNI_CSCOPE_ORG_SITE	= 0x05,
1223	UNI_CSCOPE_ORG_SITE_P1	= 0x06,
1224	UNI_CSCOPE_ORG_ORG_M1	= 0x07,
1225	UNI_CSCOPE_ORG_ORG	= 0x08,
1226	UNI_CSCOPE_ORG_ORG_P1	= 0x09,
1227	UNI_CSCOPE_ORG_COMM_M1	= 0x0a,
1228	UNI_CSCOPE_ORG_COMM	= 0x0b,
1229	UNI_CSCOPE_ORG_COMM_P1	= 0x0c,
1230	UNI_CSCOPE_ORG_REG	= 0x0d,
1231	UNI_CSCOPE_ORG_INTER	= 0x0e,
1232	UNI_CSCOPE_ORG_GLOBAL	= 0x0f,
1233};
1234
1235struct uni_ie_cscope {
1236	struct uni_iehdr	h;
1237	enum uni_cscope		type;
1238	u_int			scope:8;
1239};
1240
1241/*************************************************************************
1242 *
1243 * Connection scope information element
1244 */
1245enum uni_report {
1246	UNI_REPORT_MODCONF	= 0x01,
1247	UNI_REPORT_CLOCK	= 0x02,
1248	UNI_REPORT_EEAVAIL	= 0x04,
1249	UNI_REPORT_EEREQ	= 0x05,
1250	UNI_REPORT_EECOMPL	= 0x06,
1251};
1252
1253struct uni_ie_report {
1254	struct uni_iehdr h;
1255	enum uni_report	report;
1256};
1257
1258/*************************************************************************
1259 *
1260 * PNNI Designated transit list information element
1261 */
1262enum {
1263	UNI_DTL_LOGNP	= 0x01,
1264	UNI_DTL_LOGNP_SIZE = 27,
1265};
1266
1267struct uni_ie_dtl {
1268	struct uni_iehdr	h;
1269	u_int			ptr:16;
1270	u_int			num;
1271	struct {
1272	  u_char		node_level;
1273	  u_char		node_id[21];
1274	  u_int			port_id;
1275	}			dtl[UNI_DTL_MAXNUM];
1276};
1277
1278/*************************************************************************
1279 *
1280 * PNNI Crankback information element
1281 */
1282enum uni_crankback {
1283	UNI_CRANKBACK_IF	= 0x02,
1284	UNI_CRANKBACK_NODE	= 0x03,
1285	UNI_CRANKBACK_LINK	= 0x04,
1286};
1287
1288enum {
1289	UNI_CAUSE_NXNODE_UNREACH = 128,
1290	UNI_CAUSE_DTL_NOT_MY_ID	= 160,
1291};
1292
1293struct uni_ie_crankback {
1294	struct uni_iehdr	h;
1295#define UNI_CRANKBACK_TOP_P	0x0001
1296#define UNI_CRANKBACK_TOPX_P	0x0002
1297#define UNI_CRANKBACK_QOS_P	0x0004
1298	u_int			level:8;
1299	enum uni_crankback	type;
1300	union {
1301	  struct {
1302	    u_char		level;
1303	    u_char		id[21];
1304	  }			node;
1305	  struct {
1306	    u_char		plevel;
1307	    u_char		pid[21];
1308	    u_int		port;
1309	    u_char		slevel;
1310	    u_char		sid[21];
1311	  }			link;
1312	}			id;
1313	u_int			cause:8;
1314	union {
1315	  struct {
1316	    u_int		dir:8;
1317	    u_int		port;
1318	    u_int		avcr;
1319	    u_int		crm;
1320	    u_int		vf;
1321	  }			top;
1322	  struct {
1323	    u_int		ctd:1;
1324	    u_int		cdv:1;
1325	    u_int		clr:1;
1326	    u_int		other:1;
1327	  }			qos;
1328	}			diag;
1329};
1330
1331/*************************************************************************
1332 *
1333 * PNNI Call_ing/called party soft PVPC/PVCC information element
1334 */
1335enum uni_soft_sel {
1336	UNI_SOFT_SEL_ANY	= 0x00,
1337	UNI_SOFT_SEL_REQ	= 0x02,
1338	UNI_SOFT_SEL_ASS	= 0x04,
1339};
1340
1341struct uni_ie_calling_soft {
1342	struct uni_iehdr h;
1343#define UNI_CALLING_SOFT_VCI_P	0x0001
1344	u_int		vpi:12;
1345	u_int		vci:16;
1346};
1347struct uni_ie_called_soft {
1348	struct uni_iehdr h;
1349#define UNI_CALLED_SOFT_VPI_P	0x0001
1350#define UNI_CALLED_SOFT_VCI_P	0x0002
1351	enum uni_soft_sel sel;
1352	u_int		vpi:12;
1353	u_int		vci:16;
1354};
1355
1356/*************************************************************************/
1357
1358#include <netnatm/msg/uni_ie.h>
1359#include <netnatm/msg/uni_msg.h>
1360
1361struct uni_all {
1362	enum uni_msgtype	mtype;
1363	union uni_msgall	u;
1364};
1365
1366struct uni_ie {
1367	enum uni_ietype		ietype;
1368	union uni_ieall		u;
1369};
1370
1371#endif
1372