]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/contrib/ngatm/netnatm/msg/unistruct.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / contrib / ngatm / netnatm / msg / unistruct.h
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  */
51 struct 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  */
62 enum {
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
76 enum 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 };
84 enum 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 };
91 enum 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 };
105 enum 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 };
110 enum 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 };
115 enum 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
122 struct 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  */
177 enum 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 };
185 enum 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 };
192 enum uni_subaddr_type {
193         UNI_SUBADDR_NSAP        = 0x0,
194         UNI_SUBADDR_ATME        = 0x1,
195         UNI_SUBADDR_USER        = 0x2,  /* not sup */
196 };
197 enum uni_addr_pres {
198         UNI_ADDR_PRES           = 0x0,
199         UNI_ADDR_RESTRICT       = 0x1,
200         UNI_ADDR_NONUMBER       = 0x2,
201 };
202 enum 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 */
210 struct uni_addr {
211         uint8_t                 type;
212         uint8_t                 plan;
213         uint8_t                 len;
214         u_char                  addr[UNI_ADDR_MAXLEN];
215 };
216 struct uni_subaddr {
217         enum uni_subaddr_type   type;
218         u_int                   len;
219         u_char                  addr[UNI_SUBADDR_MAXLEN];
220 };
221
222 struct uni_ie_called {
223         struct uni_iehdr        h;
224         struct uni_addr addr;
225 };
226
227 struct uni_ie_calledsub {
228         struct uni_iehdr        h;
229         struct uni_subaddr      addr;
230 };
231
232 struct 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
241 struct uni_ie_callingsub {
242         struct uni_iehdr        h;
243         struct uni_subaddr      addr;
244 };
245
246 struct 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
255 struct 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  */
266 enum 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
273 enum 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
290 enum uni_bearer_clip {
291         UNI_BEARER_NOCLIP       = 0x0,
292         UNI_BEARER_CLIP         = 0x1,
293 };
294
295 enum uni_bearer_cfg {
296         UNI_BEARER_P2P          = 0x0,
297         UNI_BEARER_MP           = 0x1,
298 };
299
300 struct 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  */
314 enum 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
320 struct 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  */
331 enum {
332         UNI_BLLI_L1_ID          = 0x1,
333         UNI_BLLI_L2_ID          = 0x2,
334         UNI_BLLI_L3_ID          = 0x3,
335 };
336
337 enum 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
353 enum uni_blli_l2_mode {
354         UNI_BLLI_L2NORM         = 0x1,
355         UNI_BLLI_L2EXT          = 0x2,
356 };
357
358 enum 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
370 enum uni_blli_l3_mode {
371         UNI_BLLI_L3NSEQ         = 0x1,  /* normal sequence numbering */
372         UNI_BLLI_L3ESEQ         = 0x2,  /* extended sequence numbering */
373 };
374
375 enum 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
387 enum 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
393 enum 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
402 enum 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: */
410 enum {
411         UNI_BLLI_L3_SNAP        = 0x80, /* IEEE 802.1 SNAP */
412 };
413
414 struct 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  */
457 struct 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  */
467 enum 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
522 struct uni_ie_callstate {
523         struct uni_iehdr        h;
524         enum uni_callstate      state;
525 };
526
527 /*************************************************************************
528  *
529  * Cause information element
530  */
531 enum 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 \
543 D(UNALL_NUM,    0x01 /*  1*/, COND,     Q.850,  "Unallocated (unassigned) number") \
544 D(NOROUTE_NET,  0x02 /*  2*/, TNS,      Q.850,  "No route to specified transit network") \
545 D(NOROUTE,      0x03 /*  3*/, COND,     Q.850,  "No route to destination") \
546 D(SPTONE,       0x04 /*  4*/, NONE,     Q.850,  "Send special information tone") \
547 D(BADTRUNK,     0x05 /*  5*/, NONE,     Q.850,  "Misdialled trunk prefix") \
548 D(BADCHAN,      0x06 /*  6*/, NONE,     Q.850,  "Channel unacceptable") \
549 D(CALLAWARDED,  0x07 /*  7*/, NONE,     Q.850,  "Call awarded and being delivered in an established channel") \
550 D(PREEMPT,      0x08 /*  8*/, NONE,     Q.850,  "Preemption") \
551 D(PREEMPT_RES,  0x09 /*  9*/, NONE,     Q.850,  "Preemption - circuit reserved for reuse") \
552 D(CLEARING,     0x10 /* 16*/, COND,     Q.850,  "Normal call clearing") \
553 D(BUSY,         0x11 /* 17*/, CCBS,     Q.850,  "User busy") \
554 D(NO_RESPONSE,  0x12 /* 18*/, NONE,     Q.850,  "No user responding") \
555 D(NO_RESP_ALERT,0x13 /* 19*/, NONE,     Q.850,  "No answer from user (user alerted)") \
556 D(ABSENT,       0x14 /* 20*/, NONE,     Q.850,  "Subscriber absent") \
557 D(REJECTED,     0x15 /* 21*/, REJ,      Q.850,  "Call rejected") \
558 D(NUMCHG,       0x16 /* 22*/, NUMBER,   Q.850,  "Number changed") \
559 D(REDIR,        0x17 /* 23*/, NONE,     Q.850,  "Redirection to new destination") \
560 N(CLIR_REJECTED,0x17 /* 23*/, NONE,     UNI4.0, "User rejects call with calling line identification restriction (CLIR)") \
561 D(EXCHG_ERR,    0x19 /* 25*/, NONE,     Q.850,  "Exchange routing error") \
562 D(NOSEL_CLEAR,  0x1a /* 26*/, NONE,     Q.850,  "Non-selected user clearing") \
563 D(DST_OOO,      0x1b /* 27*/, NONE,     Q.850,  "Destination out of order") \
564 D(INV_ADDR,     0x1c /* 28*/, NONE,     Q.850,  "Invalid number format (address incomplete)") \
565 D(FAC_REJ,      0x1d /* 29*/, FAC,      Q.850,  "Facility rejected") \
566 D(STATUS,       0x1e /* 30*/, NONE,     Q.850,  "Response to STATUS ENQUIRY") \
567 D(UNSPEC,       0x1f /* 31*/, NONE,     Q.850,  "Normal, unspecified") \
568 D(TMY_PARTY,    0x20 /* 32*/, NONE,     Q.2971, "Too many pending add party requests") \
569 D(NOCHAN,       0x22 /* 34*/, CCBS,     Q.850,  "No circuit/channel available") \
570 N(SOFT_NAVL,    0x22 /* 34*/, NONE,     PNNI1.0,"Requested called party soft PVPC or PVCC not available")\
571 D(VPCI_NAVL,    0x23 /* 35*/, NONE,     Q.2610, "Requested VPCI/VCI not available") \
572 D(VPCI_FAIL,    0x24 /* 36*/, NONE,     Q.2610, "VPCI/VPI assignment failure") \
573 D(CRATE_NAVL,   0x25 /* 37*/, CRATE,    Q.2610, "User cell rate not available") \
574 D(NET_OOO,      0x26 /* 38*/, NONE,     Q.850,  "Network out of order") \
575 D(FRAME_OOS,    0x27 /* 39*/, NONE,     Q.850,  "Permanent frame mode connection out of service") \
576 D(FRAME_OP,     0x28 /* 40*/, NONE,     Q.850,  "Permanent frame mode connection operational") \
577 D(TEMP,         0x29 /* 41*/, NONE,     Q.850,  "Temporary failure") \
578 D(CONG,         0x2a /* 42*/, NONE,     Q.850,  "Switching equipment congestion") \
579 D(ACC_DISC,     0x2b /* 43*/, IE,       Q.850,  "Access information discarded") \
580 D(REQNOCHAN,    0x2c /* 44*/, NONE,     Q.850,  "Requested circuit/channel not available") \
581 D(NOVPCI,       0x2d /* 45*/, NONE,     Q.2610, "No VPCI/VCI available") \
582 D(PREC_BLOCK,   0x2e /* 46*/, NONE,     Q.850,  "Precedence call blocked") \
583 D(RESRC_NAVL,   0x2f /* 47*/, NONE,     Q.850,  "Resource unavailable, unspecified") \
584 D(QOS_NAVL,     0x31 /* 49*/, COND,     Q.850,  "Quality of service not available") \
585 D(FAC_NOTSUB,   0x32 /* 50*/, FAC,      Q.850,  "Requested facility not subscribed") \
586 D(OUT_CUG,      0x35 /* 53*/, NONE,     Q.850,  "Outgoing calls barred within CUG") \
587 N(PGL_CHG,      0x35 /* 53*/, NONE,     PNNI1.0,"Call cleared due to change in PGL") \
588 D(IN_CUG,       0x37 /* 55*/, NONE,     Q.850,  "Incoming call barred within CUG") \
589 D(BEARER_NAUTH, 0x39 /* 57*/, ATTR,     Q.850,  "Bearer capability not authorized") \
590 D(BEARER_NAVL,  0x3a /* 58*/, ATTR,     Q.850,  "Bearer capability not presently available") \
591 D(INCONS,       0x3e /* 62*/, NONE,     Q.850,  "Inconsistency in designated outgoing access information and subscriber class") \
592 D(OPT_NAVL,     0x3f /* 63*/, NONE,     Q.850,  "Service or option not available, unspecified") \
593 D(BEARER_NIMPL, 0x41 /* 65*/, ATTR,     Q.850,  "Bearer capability not implemented") \
594 D(CHANNEL_NIMPL,0x42 /* 66*/, CHANNEL,  Q.850,  "Channel type not implemented") \
595 D(FAC_NIMPL,    0x45 /* 69*/, FAC,      Q.850,  "Requested facility not implemented") \
596 D(RESTR_DIG,    0x46 /* 70*/, NONE,     Q.850,  "Only restricted digital information bearer capability is available") \
597 D(TRAFFIC_UNSUP,0x49 /* 73*/, NONE,     Q.2971, "Unsupported combination of traffic parameters") \
598 N(AAL_UNSUP,    0x4c /* 78*/, NONE,     UNI3.1, "AAL parameters cannot be supported") \
599 D(CREF_INV,     0x51 /* 81*/, NONE,     Q.850,  "Invalid call reference value") \
600 D(CHANNEL_NEX,  0x52 /* 82*/, CHANID,   Q.850,  "Identified channel does not exist") \
601 D(SUSPENDED,    0x53 /* 83*/, NONE,     Q.850,  "A suspended call exists, but this call identity does not") \
602 D(CID_INUSE,    0x54 /* 84*/, NONE,     Q.850,  "Call identity in use") \
603 D(NOTSUSP,      0x55 /* 85*/, NONE,     Q.850,  "No call suspended") \
604 D(CLEARED,      0x56 /* 86*/, CAUSE,    Q.850,  "Call having requested call identity has been cleared") \
605 D(NOT_MEMBER,   0x57 /* 87*/, NONE,     Q.850,  "User not member of CUG") \
606 D(INCOMP,       0x58 /* 88*/, PARAM,    Q.850,  "Incompatible destination") \
607 D(ENDP_INV,     0x59 /* 89*/, IE,       UNI3.1, "Invalid endpoint reference") \
608 D(NEX_CUG,      0x5a /* 90*/, NONE,     Q.850,  "Non-existend CUG") \
609 D(TRANSIT_INV,  0x5b /* 91*/, NONE,     Q.850,  "Invalid transit network selection") \
610 D(AALNOTSUPP,   0x5d /* 93*/, NONE,     Q.2610, "AAL parameters cannot be supported") \
611 D(INVMSG,       0x5f /* 95*/, NONE,     Q.850,  "Invalid message, unspecified") \
612 D(MANDAT,       0x60 /* 96*/, IE,       Q.850,  "Mandatory information element is missing") \
613 D(MTYPE_NIMPL,  0x61 /* 97*/, MTYPE,    Q.850,  "Message type non-existent or not implemented") \
614 D(MSG_NOTCOMP,  0x62 /* 98*/, MTYPE,    Q.850,  "Message not compatible with call state or message type non-existent or not implemented") \
615 D(IE_NIMPL,     0x63 /* 99*/, IE,       Q.850,  "Information element/parameter non-existent or not implemented") \
616 D(IE_INV,       0x64 /*100*/, IE,       Q.850,  "Invalid information element contents") \
617 D(MSG_INCOMP,   0x65 /*101*/, MTYPE,    Q.850,  "Message not compatible with call state") \
618 D(RECOVER,      0x66 /*102*/, TIMER,    Q.850,  "Recovery on timer expiry") \
619 D(PARAM_NEX,    0x67 /*103*/, PARAM,    Q.850,  "Parameter non-existent or not implemented, passed on") \
620 N(BAD_LENGTH,   0x68 /*104*/, NONE,     UNI3.1, "Incorrect message length") \
621 D(PARAM_UNREC,  0x6e /*110*/, PARAM,    Q.850,  "Message with unrecognized parameter, discarded") \
622 D(PROTO,        0x6f /*111*/, NONE,     Q.850,  "Protocol error, unspecified") \
623 D(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
628 enum uni_cause {
629 UNI_DECLARE_CAUSE_VALUES
630 };
631
632 #undef D
633 #undef N
634
635 enum 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 };
645 enum uni_cause_pu {
646         UNI_CAUSE_PU_PROVIDER   = 0,
647         UNI_CAUSE_PU_USER       = 1,
648 };
649 enum uni_cause_na {
650         UNI_CAUSE_NA_NORMAL     = 0,
651         UNI_CAUSE_NA_ABNORMAL   = 1,
652 };
653 enum uni_cause_cond {
654         UNI_CAUSE_COND_UNKNOWN  = 0,
655         UNI_CAUSE_COND_PERM     = 1,
656         UNI_CAUSE_COND_TRANS    = 2,
657 };
658 enum uni_cause_reason {
659         UNI_CAUSE_REASON_USER   = 0x00,
660         UNI_CAUSE_REASON_IEMISS = 0x01,
661         UNI_CAUSE_REASON_IESUFF = 0x02,
662 };
663
664 enum 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
685 enum {
686         UNI_CAUSE_TRAFFIC_N     = 34-6,
687         UNI_CAUSE_IE_N          = 34-6,
688         UNI_CAUSE_ATTR_N        = (34-6)/3,
689 };
690
691 struct 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 };
745 enum 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) */
748 const char *uni_ie_cause2str(enum uni_coding, u_int);
749
750 /*************************************************************************
751  *
752  * Connection identifier information element
753  */
754 enum uni_connid_type {
755         UNI_CONNID_VCI          = 0,
756         UNI_CONNID_ANYVCI       = 1,
757         UNI_CONNID_NOVCI        = 4,
758 };
759 enum uni_connid_assoc {
760         UNI_CONNID_ASSOC        = 0,
761         UNI_CONNID_NONASSOC     = 1,
762 };
763 struct 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  */
775 struct 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  */
785 enum 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
796 struct uni_ie_epstate {
797         struct uni_iehdr h;
798         enum uni_epstate state;
799 };
800
801 /*************************************************************************
802  *
803  * Q.2932 Facility IE
804  */
805 enum {
806         UNI_FACILITY_ROSE       = 0x11,
807
808         UNI_FACILITY_MAXAPDU    = 128,
809 };
810
811 struct 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  */
823 enum {
824         UNI_NOTIFY_MAXLEN       = 128,  /* maximum info length */
825 };
826 struct 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  */
836 enum 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
844 struct 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  */
854 enum uni_repeat_type {
855         UNI_REPEAT_PRIDESC      = 0x02,
856         UNI_REPEAT_STACK        = 0x0a,         /* PNNI */
857 };
858
859 struct uni_ie_repeat {
860         struct uni_iehdr h;
861         enum uni_repeat_type type;
862 };
863
864 /*************************************************************************
865  *
866  * Restart indicator information element
867  */
868 enum uni_restart_type {
869         UNI_RESTART_CHANNEL     = 0x0,
870         UNI_RESTART_PATH        = 0x1,
871         UNI_RESTART_ALL         = 0x2,
872 };
873
874 struct 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  */
883 struct uni_ie_scompl {
884         struct uni_iehdr h;
885 };
886
887 /*************************************************************************
888  *
889  * ATM traffic descriptor information element
890  */
891 enum {
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
943 struct 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
955 struct uni_ie_traffic {
956         struct uni_iehdr h;
957         struct uni_xtraffic t;
958 };
959 struct uni_ie_atraffic {
960         struct uni_iehdr h;
961         struct uni_xtraffic t;
962 };
963
964 /*
965  * Q.2961 minimum traffic descriptor
966  */
967 struct 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  */
984 struct 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  */
994 struct 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  */
1004 enum uni_git_std {
1005         UNI_GIT_STD_DSMCC       = 0x01, /* DSM-CC */
1006         UNI_GIT_STD_H245        = 0x02, /* H.245 */
1007 };
1008 enum uni_git_type {
1009         UNI_GIT_TYPE_SESS       = 0x01, /* session id */
1010         UNI_GIT_TYPE_RES        = 0x02, /* resource id */
1011 };
1012
1013 enum {
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
1021 struct 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  */
1037 enum {
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
1048 struct 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  */
1066 enum uni_lij_idtype {
1067         UNI_LIJ_IDTYPE_ROOT     = 0x0,  /* root created */
1068 };
1069
1070 struct 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  */
1080 enum uni_lij_screen {
1081         UNI_LIJ_SCREEN_NETJOIN  = 0x0,  /* without root notification */
1082 };
1083
1084 struct uni_ie_lij_param {
1085         struct uni_iehdr        h;
1086
1087         enum uni_lij_screen     screen;
1088 };
1089
1090 /*
1091  * LIJ sequence number
1092  */
1093 struct 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  */
1103 struct uni_ie_lshift {
1104         struct uni_iehdr h;
1105         u_int           set:3;
1106 };
1107
1108 struct uni_ie_nlshift {
1109         struct uni_iehdr h;
1110         u_int           set:3;
1111 };
1112
1113 /*************************************************************************
1114  *
1115  * Externded QoS information element
1116  */
1117 enum {
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
1126 enum uni_exqos_origin {
1127         UNI_EXQOS_USER  = 0,
1128         UNI_EXQOS_NET   = 1,
1129 };
1130
1131 enum {
1132         UNI_EXQOS_ANY_CDV       = 0xffffff,
1133         UNI_EXQOS_ANY_CLR       = 0xff,
1134 };
1135
1136 struct 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  */
1159 enum {
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
1173 struct 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
1185 struct uni_ie_abradd {
1186         struct uni_iehdr        h;
1187         struct uni_abr_rec      fwd, bwd;
1188 };
1189
1190 struct 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  */
1213 enum uni_cscope {
1214         UNI_CSCOPE_ORG  = 0x01,
1215 };
1216
1217 enum {
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
1235 struct 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  */
1245 enum 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
1253 struct 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  */
1262 enum {
1263         UNI_DTL_LOGNP   = 0x01,
1264         UNI_DTL_LOGNP_SIZE = 27,
1265 };
1266
1267 struct 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  */
1282 enum uni_crankback {
1283         UNI_CRANKBACK_IF        = 0x02,
1284         UNI_CRANKBACK_NODE      = 0x03,
1285         UNI_CRANKBACK_LINK      = 0x04,
1286 };
1287
1288 enum {
1289         UNI_CAUSE_NXNODE_UNREACH = 128,
1290         UNI_CAUSE_DTL_NOT_MY_ID = 160,
1291 };
1292
1293 struct 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  */
1335 enum uni_soft_sel {
1336         UNI_SOFT_SEL_ANY        = 0x00,
1337         UNI_SOFT_SEL_REQ        = 0x02,
1338         UNI_SOFT_SEL_ASS        = 0x04,
1339 };
1340
1341 struct 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 };
1347 struct 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
1361 struct uni_all {
1362         enum uni_msgtype        mtype;
1363         union uni_msgall        u;
1364 };
1365
1366 struct uni_ie {
1367         enum uni_ietype         ietype;
1368         union uni_ieall         u;
1369 };
1370
1371 #endif