aboutsummaryrefslogtreecommitdiff
path: root/sys/netatm/uni/unisig_msg.h
blob: 9ea3c4db924f0301969cb6d64a83d4b4285d4aa9 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
/*
 *
 * ===================================
 * HARP  |  Host ATM Research Platform
 * ===================================
 *
 *
 * This Host ATM Research Platform ("HARP") file (the "Software") is
 * made available by Network Computing Services, Inc. ("NetworkCS")
 * "AS IS".  NetworkCS does not provide maintenance, improvements or
 * support of any kind.
 *
 * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED,
 * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE
 * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE.
 * In no event shall NetworkCS be responsible for any damages, including
 * but not limited to consequential damages, arising from or relating to
 * any use of the Software or related support.
 *
 * Copyright 1994-1998 Network Computing Services, Inc.
 *
 * Copies of this Software may be made, however, the above copyright
 * notice must be reproduced on all copies.
 *
 *	@(#) $FreeBSD$
 *
 */

/*
 * ATM Forum UNI 3.0/3.1 Signalling Manager
 * ----------------------------------------
 *
 * Message formatting blocks
 *
 */

#ifndef _UNI_SIG_MSG_H
#define	_UNI_SIG_MSG_H

#define	UNI_MSG_DISC_Q93B	0x09
#define	UNI_MSG_MIN_LEN		9

/*
 * Values for Q.2931 message type.
 */
#define	UNI_MSG_CALP	0x02
#define	UNI_MSG_CONN	0x07
#define	UNI_MSG_CACK	0x0F
#define	UNI_MSG_SETU	0x05
#define	UNI_MSG_RLSE	0x4D
#define	UNI_MSG_RLSC	0x5A
#define	UNI_MSG_RSTR	0x46
#define	UNI_MSG_RSTA	0x4E
#define	UNI_MSG_STAT	0x7D
#define	UNI_MSG_SENQ	0x75
#define	UNI_MSG_ADDP	0x80
#define	UNI_MSG_ADPA	0x81
#define	UNI_MSG_ADPR	0x82
#define	UNI_MSG_DRPP	0x83
#define	UNI_MSG_DRPA	0x84


/*
 * Values for information element identifier.
 */
#define	UNI_IE_CAUS	0x08
#define	UNI_IE_CLST	0x14
#define	UNI_IE_EPRF	0x54
#define	UNI_IE_EPST	0x55
#define	UNI_IE_AALP	0x58
#define	UNI_IE_CLRT	0x59
#define	UNI_IE_CNID	0x5A
#define	UNI_IE_QOSP	0x5C
#define	UNI_IE_BHLI	0x5D
#define	UNI_IE_BBCP	0x5E
#define	UNI_IE_BLLI	0x5F
#define	UNI_IE_BLSH	0x60
#define	UNI_IE_BNSH	0x61
#define	UNI_IE_BSDC	0x62
#define	UNI_IE_BRPI	0x63
#define	UNI_IE_CGAD	0x6C
#define	UNI_IE_CGSA	0x6D
#define	UNI_IE_CDAD	0x70
#define	UNI_IE_CDSA	0x71
#define	UNI_IE_TRNT	0x78
#define	UNI_IE_RSTI	0x79

/*
 * Masks for information element extension in bit 8
 */
#define	UNI_IE_EXT_BIT	0x80
#define	UNI_IE_EXT_MASK	0x7F


/*
 * Signalling message in internal format.
 */
#define	UNI_MSG_IE_CNT		22

struct unisig_msg {
	u_int				msg_call_ref;
	u_char				msg_type;
	u_char				msg_type_flag;
	u_char				msg_type_action;
	int				msg_length;
	struct ie_generic		*msg_ie_vec[UNI_MSG_IE_CNT];
};

#define	UNI_MSG_CALL_REF_RMT	0x800000
#define	UNI_MSG_CALL_REF_MASK	0x7FFFFF
#define	UNI_MSG_CALL_REF_GLOBAL	0
#define	UNI_MSG_CALL_REF_DUMMY	0x7FFFFF

#define	EXTRACT_CREF(x)						\
	((x) & UNI_MSG_CALL_REF_RMT ? (x) & UNI_MSG_CALL_REF_MASK : (x) | UNI_MSG_CALL_REF_RMT)
#define GLOBAL_CREF(x)	(((x) & UNI_MSG_CALL_REF_MASK) == UNI_MSG_CALL_REF_GLOBAL)
#define DUMMY_CREF(x)	(((x) & UNI_MSG_CALL_REF_MASK) == UNI_MSG_CALL_REF_DUMMY)

#define	UNI_MSG_TYPE_FLAG_MASK	1
#define	UNI_MSG_TYPE_FLAG_SHIFT	4

#define	UNI_MSG_TYPE_ACT_CLEAR	0
#define	UNI_MSG_TYPE_ACT_DISC	1
#define	UNI_MSG_TYPE_ACT_RPRT	2
#define	UNI_MSG_TYPE_ACT_RSVD	3
#define	UNI_MSG_TYPE_ACT_MASK	3

#define	UNI_MSG_IE_AALP		0
#define	UNI_MSG_IE_CLRT		1
#define	UNI_MSG_IE_BBCP		2
#define	UNI_MSG_IE_BHLI		3
#define	UNI_MSG_IE_BLLI		4
#define	UNI_MSG_IE_CLST		5
#define	UNI_MSG_IE_CDAD		6
#define	UNI_MSG_IE_CDSA		7
#define	UNI_MSG_IE_CGAD		8
#define	UNI_MSG_IE_CGSA		9
#define	UNI_MSG_IE_CAUS		10
#define	UNI_MSG_IE_CNID		11
#define	UNI_MSG_IE_QOSP		12
#define	UNI_MSG_IE_BRPI		13
#define	UNI_MSG_IE_RSTI		14
#define	UNI_MSG_IE_BLSH		15
#define	UNI_MSG_IE_BNSH		16
#define	UNI_MSG_IE_BSDC		17
#define	UNI_MSG_IE_TRNT		18
#define	UNI_MSG_IE_EPRF		19
#define	UNI_MSG_IE_EPST		20
#define	UNI_MSG_IE_ERR		21

#define	msg_ie_aalp	msg_ie_vec[UNI_MSG_IE_AALP]
#define	msg_ie_clrt	msg_ie_vec[UNI_MSG_IE_CLRT]
#define	msg_ie_bbcp	msg_ie_vec[UNI_MSG_IE_BBCP]
#define	msg_ie_bhli	msg_ie_vec[UNI_MSG_IE_BHLI]
#define	msg_ie_blli	msg_ie_vec[UNI_MSG_IE_BLLI]
#define	msg_ie_clst	msg_ie_vec[UNI_MSG_IE_CLST]
#define	msg_ie_cdad	msg_ie_vec[UNI_MSG_IE_CDAD]
#define	msg_ie_cdsa	msg_ie_vec[UNI_MSG_IE_CDSA]
#define	msg_ie_cgad	msg_ie_vec[UNI_MSG_IE_CGAD]
#define	msg_ie_cgsa	msg_ie_vec[UNI_MSG_IE_CGSA]
#define	msg_ie_caus	msg_ie_vec[UNI_MSG_IE_CAUS]
#define	msg_ie_cnid	msg_ie_vec[UNI_MSG_IE_CNID]
#define	msg_ie_qosp	msg_ie_vec[UNI_MSG_IE_QOSP]
#define	msg_ie_brpi	msg_ie_vec[UNI_MSG_IE_BRPI]
#define	msg_ie_rsti	msg_ie_vec[UNI_MSG_IE_RSTI]
#define	msg_ie_blsh	msg_ie_vec[UNI_MSG_IE_BLSH]
#define	msg_ie_bnsh	msg_ie_vec[UNI_MSG_IE_BNSH]
#define	msg_ie_bsdc	msg_ie_vec[UNI_MSG_IE_BSDC]
#define	msg_ie_trnt	msg_ie_vec[UNI_MSG_IE_TRNT]
#define	msg_ie_eprf	msg_ie_vec[UNI_MSG_IE_EPRF]
#define	msg_ie_epst	msg_ie_vec[UNI_MSG_IE_EPST]
#define	msg_ie_err	msg_ie_vec[UNI_MSG_IE_ERR]


/*
 * Information element header.
 */
struct ie_hdr {
	u_char			ie_hdr_ident;
	u_char			ie_hdr_coding;
	u_char			ie_hdr_flag;
	u_char			ie_hdr_action;
	int			ie_hdr_length;
	int			ie_hdr_err_cause;
	struct ie_generic	*ie_hdr_next;
};

#define	UNI_IE_HDR_LEN		4

#define	UNI_IE_CODE_CCITT	0
#define	UNI_IE_CODE_STD		3
#define	UNI_IE_CODE_MASK	3
#define	UNI_IE_CODE_SHIFT	5

#define	UNI_IE_FLAG_MASK	1
#define	UNI_IE_FLAG_SHIFT	4

#define	UNI_IE_ACT_CLEAR	0
#define	UNI_IE_ACT_DIS		1
#define	UNI_IE_ACT_RPRT		2
#define	UNI_IE_ACT_DMSGIGN	5
#define	UNI_IE_ACT_DMSGRPRT	6
#define	UNI_IE_ACT_MASK		7


/*
 * ATM AAL parameters information element in internal format.
 */
struct ie_aalp {
	int8_t	ie_aal_type;
	union {
		struct aal_type_1_parm {
			u_char	subtype;
			u_char	cbr_rate;
			u_short	multiplier;
			u_char	clock_recovery;
			u_char	error_correction;
			u_char	struct_data_tran;
			u_char	partial_cells;
		} type_1;
		struct aal_type_4_parm {
			int32_t	fwd_max_sdu;
			int32_t	bkwd_max_sdu;
			int32_t	mid_range;
			u_char	mode;
			u_char	sscs_type;
		} type_4;
		struct aal_type_5_parm {
			int32_t	fwd_max_sdu;
			int32_t	bkwd_max_sdu;
			u_char	mode;
			u_char	sscs_type;
		} type_5;
		struct user_aal_type {
			u_char	aal_info[4];
		} type_user;
	} aal_u;
};

#define	UNI_IE_AALP_AT_AAL1	1
#define	UNI_IE_AALP_AT_AAL3	3
#define	UNI_IE_AALP_AT_AAL5	5
#define	UNI_IE_AALP_AT_AALU	16

#define	UNI_IE_AALP_A1_ST_NULL	0
#define	UNI_IE_AALP_A1_ST_VCE	1
#define	UNI_IE_AALP_A1_ST_SCE	2
#define	UNI_IE_AALP_A1_ST_ACE	3
#define	UNI_IE_AALP_A1_ST_HQA	4
#define	UNI_IE_AALP_A1_ST_VID	5

#define	UNI_IE_AALP_A1_CB_64	1
#define	UNI_IE_AALP_A1_CB_DS1	4
#define	UNI_IE_AALP_A1_CB_DS2	5
#define	UNI_IE_AALP_A1_CB_32064	6
#define	UNI_IE_AALP_A1_CB_DS3	7
#define	UNI_IE_AALP_A1_CB_97728	8
#define	UNI_IE_AALP_A1_CB_E1	16
#define	UNI_IE_AALP_A1_CB_E2	17
#define	UNI_IE_AALP_A1_CB_E3	18
#define	UNI_IE_AALP_A1_CB_139264	19
#define	UNI_IE_AALP_A1_CB_N64	64

#define	UNI_IE_AALP_A1_CR_NULL	0
#define	UNI_IE_AALP_A1_CR_SRTS	1
#define	UNI_IE_AALP_A1_CR_ACR	2

#define	UNI_IE_AALP_A1_EC_NULL	0
#define	UNI_IE_AALP_A1_EC_FEC	1

#define	UNI_IE_AALP_A1_SD_NULL	0
#define	UNI_IE_AALP_A1_SD_SDT	1

#define	UNI_IE_AALP_A3_R_MASK	1023
#define	UNI_IE_AALP_A3_R_SHIFT	16

#define	UNI_IE_AALP_A5_M_MSG	1
#define	UNI_IE_AALP_A5_M_STR	2

#define	UNI_IE_AALP_A5_ST_NULL	0
#define	UNI_IE_AALP_A5_ST_AO	1
#define	UNI_IE_AALP_A5_ST_NAO	2
#define	UNI_IE_AALP_A5_ST_FR	4


/*
 * ATM user cell rate information element in internal format.
 */
struct ie_clrt {
	int32_t		ie_fwd_peak;
	int32_t		ie_bkwd_peak;
	int32_t		ie_fwd_peak_01;
	int32_t		ie_bkwd_peak_01;
	int32_t		ie_fwd_sust;
	int32_t		ie_bkwd_sust;
	int32_t		ie_fwd_sust_01;
	int32_t		ie_bkwd_sust_01;
	int32_t		ie_fwd_burst;
	int32_t		ie_bkwd_burst;
	int32_t		ie_fwd_burst_01;
	int32_t		ie_bkwd_burst_01;
	int8_t		ie_best_effort;
	int8_t		ie_tm_options;
};

#define	UNI_IE_CLRT_FWD_PEAK_ID		130
#define	UNI_IE_CLRT_BKWD_PEAK_ID	131
#define	UNI_IE_CLRT_FWD_PEAK_01_ID	132
#define	UNI_IE_CLRT_BKWD_PEAK_01_ID	133
#define	UNI_IE_CLRT_FWD_SUST_ID		136
#define	UNI_IE_CLRT_BKWD_SUST_ID	137
#define	UNI_IE_CLRT_FWD_SUST_01_ID	144
#define	UNI_IE_CLRT_BKWD_SUST_01_ID	145
#define	UNI_IE_CLRT_FWD_BURST_ID	160
#define	UNI_IE_CLRT_BKWD_BURST_ID	161
#define	UNI_IE_CLRT_FWD_BURST_01_ID	176
#define	UNI_IE_CLRT_BKWD_BURST_01_ID	177
#define	UNI_IE_CLRT_BEST_EFFORT_ID	190
#define	UNI_IE_CLRT_TM_OPTIONS_ID	191

#define	UNI_IE_CLRT_TM_FWD_TAG		0x01
#define	UNI_IE_CLRT_TM_BKWD_TAG		0x02


/*
 * Broadband bearer capability information element in internal format.
 */
struct ie_bbcp {
	int8_t		ie_bearer_class;
	int8_t		ie_traffic_type;
	int8_t		ie_timing_req;
	int8_t		ie_clipping;
	int8_t		ie_conn_config;
};


#define	UNI_IE_BBCP_BC_BCOB_A	1
#define	UNI_IE_BBCP_BC_BCOB_C	3
#define	UNI_IE_BBCP_BC_BCOB_X	16
#define	UNI_IE_BBCP_BC_MASK	0x1F

#define	UNI_IE_BBCP_TT_NIND	0
#define	UNI_IE_BBCP_TT_CBR	1
#define	UNI_IE_BBCP_TT_VBR	2
#define	UNI_IE_BBCP_TT_MASK	3
#define	UNI_IE_BBCP_TT_SHIFT	2

#define	UNI_IE_BBCP_TR_NIND	0
#define	UNI_IE_BBCP_TR_EER	1
#define	UNI_IE_BBCP_TR_EENR	2
#define	UNI_IE_BBCP_TR_RSVD	3
#define	UNI_IE_BBCP_TR_MASK	3

#define	UNI_IE_BBCP_SC_NSUS	0
#define	UNI_IE_BBCP_SC_SUS	1
#define	UNI_IE_BBCP_SC_MASK	3
#define	UNI_IE_BBCP_SC_SHIFT	5

#define	UNI_IE_BBCP_CC_PP		0
#define	UNI_IE_BBCP_CC_PM		1
#define	UNI_IE_BBCP_CC_MASK	3


/*
 * Broadband high layer information information element in internal
 * format.
 */
struct ie_bhli {
	int8_t		ie_type;
	u_char		ie_info[8];
};

#define	UNI_IE_BHLI_TYPE_ISO	0
#define	UNI_IE_BHLI_TYPE_USER	1
#define	UNI_IE_BHLI_TYPE_HLP	2
#define	UNI_IE_BHLI_TYPE_VSA	3

#define	UNI_IE_BHLI_HLP_LEN	4
#define	UNI_IE_BHLI_VSA_LEN	7


/*
 * Broadband low-layer information information element in internal
 * format.
 */
struct ie_blli {
	int8_t		ie_l1_id;
	int8_t		ie_l2_id;
	int8_t		ie_l2_mode;
	int8_t		ie_l2_q933_use;
	int8_t		ie_l2_window;
	int8_t		ie_l2_user_proto;
	int8_t		ie_l3_id;
	int8_t		ie_l3_mode;
	int8_t		ie_l3_packet_size;
	int8_t		ie_l3_window;
	int8_t		ie_l3_user_proto;
	int16_t		ie_l3_ipi;
	int8_t		ie_l3_snap_id;
	u_char		ie_l3_oui[3];
	u_char		ie_l3_pid[2];
};

#define	UNI_IE_BLLI_L1_ID	1
#define	UNI_IE_BLLI_L2_ID	2
#define	UNI_IE_BLLI_L3_ID	3
#define	UNI_IE_BLLI_LID_MASK	3
#define	UNI_IE_BLLI_LID_SHIFT	5
#define	UNI_IE_BLLI_LP_MASK	31

#define	UNI_IE_BLLI_L2P_ISO1745	1
#define	UNI_IE_BLLI_L2P_Q921	2
#define	UNI_IE_BLLI_L2P_X25L	6
#define	UNI_IE_BLLI_L2P_X25M	7
#define	UNI_IE_BLLI_L2P_LAPB	8
#define	UNI_IE_BLLI_L2P_HDLC1	9
#define	UNI_IE_BLLI_L2P_HDLC2	10
#define	UNI_IE_BLLI_L2P_HDLC3	11
#define	UNI_IE_BLLI_L2P_LLC	12
#define	UNI_IE_BLLI_L2P_X75	13
#define	UNI_IE_BLLI_L2P_Q922	14
#define	UNI_IE_BLLI_L2P_USER	16
#define	UNI_IE_BLLI_L2P_ISO7776	17

#define	UNI_IE_BLLI_L2MODE_NORM		1
#define	UNI_IE_BLLI_L2MODE_EXT		2
#define	UNI_IE_BLLI_L2MODE_SHIFT	5
#define	UNI_IE_BLLI_L2MODE_MASK		3

#define	UNI_IE_BLLI_Q933_ALT	0

#define	UNI_IE_BLLI_L3P_X25	6
#define	UNI_IE_BLLI_L3P_ISO8208	7
#define	UNI_IE_BLLI_L3P_ISO8878	8
#define	UNI_IE_BLLI_L3P_ISO8473	9
#define	UNI_IE_BLLI_L3P_T70	10
#define	UNI_IE_BLLI_L3P_ISO9577	11
#define	UNI_IE_BLLI_L3P_USER	16

#define	UNI_IE_BLLI_L3MODE_NORM		1
#define	UNI_IE_BLLI_L3MODE_EXT		2
#define	UNI_IE_BLLI_L3MODE_SHIFT	5
#define	UNI_IE_BLLI_L3MODE_MASK		3

#define	UNI_IE_BLLI_L3PS_16	4
#define	UNI_IE_BLLI_L3PS_32	5
#define	UNI_IE_BLLI_L3PS_64	6
#define	UNI_IE_BLLI_L3PS_128	7
#define	UNI_IE_BLLI_L3PS_256	8
#define	UNI_IE_BLLI_L3PS_512	9
#define	UNI_IE_BLLI_L3PS_1024	10
#define	UNI_IE_BLLI_L3PS_2048	11
#define	UNI_IE_BLLI_L3PS_4096	12
#define	UNI_IE_BLLI_L3PS_MASK	15

#define	UNI_IE_BLLI_L3IPI_SHIFT	6
#define	UNI_IE_BLLI_L3IPI_SNAP	0x80


/*
 * Call state information element in internal format.
 */
struct ie_clst {
	int8_t		ie_state;
};

#define	UNI_IE_CLST_STATE_U0	0
#define	UNI_IE_CLST_STATE_U1	1
#define	UNI_IE_CLST_STATE_U3	3
#define	UNI_IE_CLST_STATE_U6	6
#define	UNI_IE_CLST_STATE_U8	8
#define	UNI_IE_CLST_STATE_U9	9
#define	UNI_IE_CLST_STATE_U10	10
#define	UNI_IE_CLST_STATE_U11	11
#define	UNI_IE_CLST_STATE_U12	12

#define	UNI_IE_CLST_STATE_N0	0
#define	UNI_IE_CLST_STATE_N1	1
#define	UNI_IE_CLST_STATE_N3	3
#define	UNI_IE_CLST_STATE_N6	6
#define	UNI_IE_CLST_STATE_N8	8
#define	UNI_IE_CLST_STATE_N9	9
#define	UNI_IE_CLST_STATE_N10	10
#define	UNI_IE_CLST_STATE_N11	11
#define	UNI_IE_CLST_STATE_N12	12

#define	UNI_IE_CLST_GLBL_REST0	0x00
#define	UNI_IE_CLST_GLBL_REST1	0x3d
#define	UNI_IE_CLST_GLBL_REST2	0x3e

#define	UNI_IE_CLST_STATE_MASK	0x3f


/*
 * Called party number information element in internal format.
 */
struct ie_cdad {
	int8_t		ie_type;
	int8_t		ie_plan;
	Atm_addr	ie_addr;
};

#define	UNI_IE_CDAD_TYPE_UNK	0
#define	UNI_IE_CDAD_TYPE_INTL	1
#define	UNI_IE_CDAD_TYPE_MASK	7
#define	UNI_IE_CDAD_TYPE_SHIFT	4

#define	UNI_IE_CDAD_PLAN_E164	1
#define	UNI_IE_CDAD_PLAN_NSAP	2
#define	UNI_IE_CDAD_PLAN_MASK	15


/*
 * Called party subaddress information element in internal format.
 */
struct ie_cdsa {
	Atm_addr	ie_addr;
};

#define	UNI_IE_CDSA_TYPE_NSAP	0
#define	UNI_IE_CDSA_TYPE_AESA	1
#define	UNI_IE_CDSA_TYPE_MASK	7
#define	UNI_IE_CDSA_TYPE_SHIFT	4


/*
 * Calling party number information element in internal format.
 */
struct ie_cgad {
	int8_t		ie_type;
	int8_t		ie_plan;
	int8_t		ie_pres_ind;
	int8_t		ie_screen_ind;
	Atm_addr	ie_addr;
};

#define	UNI_IE_CGAD_TYPE_UNK	0
#define	UNI_IE_CGAD_TYPE_INTL	1
#define	UNI_IE_CGAD_TYPE_MASK	7
#define	UNI_IE_CGAD_TYPE_SHIFT	4

#define	UNI_IE_CGAD_PLAN_E164	1
#define	UNI_IE_CGAD_PLAN_NSAP	2
#define	UNI_IE_CGAD_PLAN_MASK	15

#define	UNI_IE_CGAD_PRES_ALLOW	0
#define	UNI_IE_CGAD_PRES_RSTR	1
#define	UNI_IE_CGAD_PRES_NNA	2
#define	UNI_IE_CGAD_PRES_RSVD	3
#define	UNI_IE_CGAD_PRES_MASK	3
#define	UNI_IE_CGAD_PRES_SHIFT	5

#define	UNI_IE_CGAD_SCR_UNS	0
#define	UNI_IE_CGAD_SCR_UVP	1
#define	UNI_IE_CGAD_SCR_UVF	2
#define	UNI_IE_CGAD_SCR_NET	3
#define	UNI_IE_CGAD_SCR_MASK	3


/*
 * Calling party subaddress information element in internal format.
 */
struct ie_cgsa {
	Atm_addr	ie_addr;
};

#define	UNI_IE_CGSA_TYPE_NSAP	0
#define	UNI_IE_CGSA_TYPE_AESA	1
#define	UNI_IE_CGSA_TYPE_MASK	7
#define	UNI_IE_CGSA_TYPE_SHIFT	4


/*
 * Cause information element in internal format.
 */
#define	UNI_IE_CAUS_MAX_ID	24
#define	UNI_IE_CAUS_MAX_QOS_SUB	24
struct ie_caus {
	int8_t		ie_loc;
	int8_t		ie_cause;
	int8_t		ie_diag_len;
	u_int8_t	ie_diagnostic[24];
};

#define	UNI_IE_CAUS_LOC_USER	0
#define	UNI_IE_CAUS_LOC_PRI_LCL	1
#define	UNI_IE_CAUS_LOC_PUB_LCL	2
#define	UNI_IE_CAUS_LOC_TRANSIT	3
#define	UNI_IE_CAUS_LOC_PUB_RMT	4
#define	UNI_IE_CAUS_LOC_PRI_RMT	5
#define	UNI_IE_CAUS_LOC_INTL	7
#define	UNI_IE_CAUS_LOC_BEYOND	10
#define	UNI_IE_CAUS_LOC_MASK	15

#define	UNI_IE_CAUS_UN_NS_SHIFT	3
#define	UNI_IE_CAUS_UN_NS_MASK	1

#define	UNI_IE_CAUS_UN_NA_SHIFT	2
#define	UNI_IE_CAUS_UN_NA_MASK	1

#define	UNI_IE_CAUS_UN_CAU_MASK	3

#define	UNI_IE_CAUS_RR_USER	0
#define	UNI_IE_CAUS_RR_IE	1
#define	UNI_IE_CAUS_RR_INSUFF	2
#define UNI_IE_CAUS_RR_SHIFT	2
#define UNI_IE_CAUS_RR_MASK	31

#define	UNI_IE_CAUS_RC_UNK	0
#define	UNI_IE_CAUS_RC_PERM	1
#define	UNI_IE_CAUS_RC_TRANS	2
#define	UNI_IE_CAUS_RC_MASK	3

/*
 * Cause codes from UNI 3.0, section 5.4.5.15
 */
#define	UNI_IE_CAUS_UNO		1	/* Unallocated number */
#define	UNI_IE_CAUS_NOTROUTE	2	/* No route to transit net */
#define	UNI_IE_CAUS_NODROUTE	3	/* No route to destination */
#define	UNI_IE_CAUS_BAD_VCC	10	/* VPI/VCI unacceptable */
#define	UNI_IE_CAUS_NORM	16	/* Normal call clearing */
#define	UNI_IE_CAUS_BUSY	17	/* User busy */
#define	UNI_IE_CAUS_NORSP	18	/* No user responding */
#define	UNI_IE_CAUS_REJECT	21	/* Call rejected */
#define	UNI_IE_CAUS_CHANGED	22	/* Number changed */
#define	UNI_IE_CAUS_CLIR	23	/* User rejects CLIR */
#define	UNI_IE_CAUS_DORDER	27	/* Dest out of order */
#define	UNI_IE_CAUS_INVNO	28	/* Invalid number format */
#define	UNI_IE_CAUS_SENQ	30	/* Rsp to Status Enquiry */
#define	UNI_IE_CAUS_NORM_UNSP	31	/* Normal, unspecified */
#define	UNI_IE_CAUS_NA_VCC	35	/* VCC not available */
#define	UNI_IE_CAUS_ASSIGN_VCC	36	/* VPCI/VCI assignment failure */
#define	UNI_IE_CAUS_NORDER	38	/* Network out of order */
#define	UNI_IE_CAUS_TEMP	41	/* Temporary failure */
#define	UNI_IE_CAUS_DISCARD	43	/* Access info discarded */
#define	UNI_IE_CAUS_NO_VCC	45	/* No VPI/VCI available */
#define	UNI_IE_CAUS_UNAVAIL	47	/* Resource unavailable */
#define	UNI_IE_CAUS_NO_QOS	49	/* QoS unavailable */
#define	UNI_IE_CAUS_NO_CR	51	/* User cell rate not avail */
#define	UNI_IE_CAUS_NO_BC	57	/* Bearer capability not auth */
#define	UNI_IE_CAUS_NA_BC	58	/* Bearer capability n/a */
#define	UNI_IE_CAUS_SERVICE	63	/* Service or opt not avail */
#define	UNI_IE_CAUS_NI_BC	65	/* Bearer cap not implemented */
#define	UNI_IE_CAUS_COMB	73	/* Unsupported combination */
#define	UNI_IE_CAUS_CREF	81	/* Invalid call reference */
#define	UNI_IE_CAUS_CEXIST	82	/* Channel does not exist */
#define	UNI_IE_CAUS_IDEST	88	/* Incompatible destination */
#define	UNI_IE_CAUS_ENDPT	89	/* Invalid endpoint reference */
#define	UNI_IE_CAUS_TRNET	91	/* Invalid transit net */
#define	UNI_IE_CAUS_APPEND	92	/* Too many pending add party */
#define	UNI_IE_CAUS_UAAL	93	/* AAL parms can't be supp */
#define	UNI_IE_CAUS_MISSING	96	/* Mandatory IE missing */
#define	UNI_IE_CAUS_MTEXIST	97	/* Message type nonexistent */
#define	UNI_IE_CAUS_IEEXIST	99	/* IE type nonexistent */
#define	UNI_IE_CAUS_IECONTENT	100	/* IE content invalid */
#define	UNI_IE_CAUS_STATE	101	/* Message incomp with state */
#define	UNI_IE_CAUS_TIMER	102	/* Recovery on timer expire */
#define	UNI_IE_CAUS_LEN		104	/* Incorrect message length */
#define	UNI_IE_CAUS_PROTO	111	/* Protocol error */


/*
 * Connection identifier information element in internal format.
 */
struct ie_cnid {
	int8_t		ie_vp_sig;
	int8_t		ie_pref_excl;
	u_short		ie_vpci;
	u_short		ie_vci;
};

#define	UNI_IE_CNID_VPSIG_MASK	3
#define	UNI_IE_CNID_VPSIG_SHIFT	3
#define	UNI_IE_CNID_PREX_MASK	7

#define	UNI_IE_CNID_MIN_VCI	32


/*
 * Quality of service parameter information element in internal format.
 */
struct ie_qosp {
	int8_t		ie_fwd_class;
	int8_t		ie_bkwd_class;
};

#define	UNI_IE_QOSP_FWD_CLASS_0	0
#define	UNI_IE_QOSP_FWD_CLASS_1	1
#define	UNI_IE_QOSP_FWD_CLASS_2	2
#define	UNI_IE_QOSP_FWD_CLASS_3	3
#define	UNI_IE_QOSP_FWD_CLASS_4	4

#define	UNI_IE_QOSP_BKWD_CLASS_0	0
#define	UNI_IE_QOSP_BKWD_CLASS_1	1
#define	UNI_IE_QOSP_BKWD_CLASS_2	2
#define	UNI_IE_QOSP_BKWD_CLASS_3	3
#define	UNI_IE_QOSP_BKWD_CLASS_4	4


/*
 * Broadband repeat indicator information element in internal format.
 */
struct ie_brpi {
	int8_t		ie_ind;
};

#define	UNI_IE_BRPI_PRI_LIST	2
#define	UNI_IE_BRPI_IND_MASK	15


/*
 * Restart indicator information element in internal format.
 */
struct ie_rsti {
	int8_t		ie_class;
};

#define UNI_IE_RSTI_IND_VC	0
#define UNI_IE_RSTI_ALL_VC	2
#define UNI_IE_RSTI_CLASS_MASK	3


/*
 * Broadband locking shift information element in internal format.
 */
struct ie_blsh {
	int8_t		ie_dummy;
};


/*
 * Broadband non-locking shift information element in internal format.
 */
struct ie_bnsh {
	int8_t		ie_dummy;
};


/*
 * Broadband sending complete information element in internal format.
 */
struct ie_bsdc {
	int8_t		ie_ind;
};

#define	UNI_IE_BSDC_IND		0x21


/*
 * Transit net selection information element in internal format.
 */
struct ie_trnt {
	int8_t		ie_id_type;
	int8_t		ie_id_plan;
	u_char		ie_id_len;
	u_char		ie_id[4];
};

#define	UNI_IE_TRNT_IDT_MASK	7
#define	UNI_IE_TRNT_IDT_SHIFT	4
#define	UNI_IE_TRNT_IDP_MASK	15

#define	UNI_IE_TRNT_IDT_NATL	2
#define	UNI_IE_TRNT_IDP_CIC	1


/*
 * Endpoint reference information element in internal format.
 */
struct ie_eprf {
	int8_t		ie_type;
	int16_t		ie_id;
};

#define	UNI_IE_EPRF_LDI		0


/*
 * Endpoint state information element in internal format.
 */
struct ie_epst {
	int8_t		ie_state;
};

#define	UNI_IE_EPST_NULL	0
#define	UNI_IE_EPST_API		1
#define	UNI_IE_EPST_APR		6
#define	UNI_IE_EPST_DPI		11
#define	UNI_IE_EPST_DPR		12
#define	UNI_IE_EPST_ACTIVE	10
#define	UNI_IE_EPST_STATE_MASK	0x3F


/*
 * Generic information element
 */
struct ie_generic {
	struct ie_hdr		ie_hdr;
	union {
		struct ie_aalp		ie_aalp;
		struct ie_clrt		ie_clrt;
		struct ie_bbcp		ie_bbcp;
		struct ie_bhli		ie_bhli;
		struct ie_blli		ie_blli;
		struct ie_clst		ie_clst;
		struct ie_cdad		ie_cdad;
		struct ie_cdsa		ie_cdsa;
		struct ie_cgad		ie_cgad;
		struct ie_cgsa		ie_cgsa;
		struct ie_caus		ie_caus;
		struct ie_cnid		ie_cnid;
		struct ie_qosp		ie_qosp;
		struct ie_brpi		ie_brpi;
		struct ie_rsti		ie_rsti;
		struct ie_blsh		ie_blsh;
		struct ie_bnsh		ie_bnsh;
		struct ie_bsdc		ie_bsdc;
		struct ie_trnt		ie_trnt;
		struct ie_eprf		ie_eprf;
		struct ie_epst		ie_epst;
	} ie_u;
};

#define	ie_ident	ie_hdr.ie_hdr_ident
#define	ie_coding	ie_hdr.ie_hdr_coding
#define	ie_flag		ie_hdr.ie_hdr_flag
#define	ie_action	ie_hdr.ie_hdr_action
#define	ie_length	ie_hdr.ie_hdr_length
#define	ie_err_cause	ie_hdr.ie_hdr_err_cause
#define	ie_next		ie_hdr.ie_hdr_next

#define	ie_aalp_aal_type		ie_u.ie_aalp.ie_aal_type
#define	ie_aalp_1_subtype		ie_u.ie_aalp.aal_u.type_1.subtype
#define	ie_aalp_1_cbr_rate		ie_u.ie_aalp.aal_u.type_1.cbr_rate
#define	ie_aalp_1_multiplier		ie_u.ie_aalp.aal_u.type_1.multiplier
#define	ie_aalp_1_clock_recovery	ie_u.ie_aalp.aal_u.type_1.clock_recovery
#define	ie_aalp_1_error_correction	ie_u.ie_aalp.aal_u.type_1.error_correction
#define	ie_aalp_1_struct_data_tran	ie_u.ie_aalp.aal_u.type_1.struct_data_tran
#define	ie_aalp_1_partial_cells		ie_u.ie_aalp.aal_u.type_1.partial_cells

#define	ie_aalp_4_fwd_max_sdu		ie_u.ie_aalp.aal_u.type_4.fwd_max_sdu
#define	ie_aalp_4_bkwd_max_sdu		ie_u.ie_aalp.aal_u.type_4.bkwd_max_sdu
#define	ie_aalp_4_mid_range		ie_u.ie_aalp.aal_u.type_4.mid_range
#define	ie_aalp_4_mode			ie_u.ie_aalp.aal_u.type_4.mode
#define	ie_aalp_4_sscs_type		ie_u.ie_aalp.aal_u.type_4.sscs_type

#define	ie_aalp_5_fwd_max_sdu		ie_u.ie_aalp.aal_u.type_5.fwd_max_sdu
#define	ie_aalp_5_bkwd_max_sdu		ie_u.ie_aalp.aal_u.type_5.bkwd_max_sdu
#define	ie_aalp_5_mode			ie_u.ie_aalp.aal_u.type_5.mode
#define	ie_aalp_5_sscs_type		ie_u.ie_aalp.aal_u.type_5.sscs_type
#define	ie_aalp_user_info		ie_u.ie_aalp.aal_u.type_user.aal_info

#define	ie_clrt_fwd_peak	ie_u.ie_clrt.ie_fwd_peak
#define	ie_clrt_bkwd_peak	ie_u.ie_clrt.ie_bkwd_peak
#define	ie_clrt_fwd_peak_01	ie_u.ie_clrt.ie_fwd_peak_01
#define	ie_clrt_bkwd_peak_01	ie_u.ie_clrt.ie_bkwd_peak_01
#define	ie_clrt_fwd_sust	ie_u.ie_clrt.ie_fwd_sust
#define	ie_clrt_bkwd_sust	ie_u.ie_clrt.ie_bkwd_sust
#define	ie_clrt_fwd_sust_01	ie_u.ie_clrt.ie_fwd_sust_01
#define	ie_clrt_bkwd_sust_01	ie_u.ie_clrt.ie_bkwd_sust_01
#define	ie_clrt_fwd_burst	ie_u.ie_clrt.ie_fwd_burst
#define	ie_clrt_bkwd_burst	ie_u.ie_clrt.ie_bkwd_burst
#define	ie_clrt_fwd_burst_01	ie_u.ie_clrt.ie_fwd_burst_01
#define	ie_clrt_bkwd_burst_01	ie_u.ie_clrt.ie_bkwd_burst_01
#define	ie_clrt_best_effort	ie_u.ie_clrt.ie_best_effort
#define	ie_clrt_tm_options	ie_u.ie_clrt.ie_tm_options

#define	ie_bbcp_bearer_class	ie_u.ie_bbcp.ie_bearer_class
#define	ie_bbcp_traffic_type	ie_u.ie_bbcp.ie_traffic_type
#define	ie_bbcp_timing_req	ie_u.ie_bbcp.ie_timing_req
#define	ie_bbcp_clipping	ie_u.ie_bbcp.ie_clipping
#define	ie_bbcp_conn_config	ie_u.ie_bbcp.ie_conn_config

#define	ie_bhli_type		ie_u.ie_bhli.ie_type
#define	ie_bhli_info		ie_u.ie_bhli.ie_info

#define	ie_blli_l1_id		ie_u.ie_blli.ie_l1_id
#define	ie_blli_l2_id		ie_u.ie_blli.ie_l2_id
#define	ie_blli_l2_mode		ie_u.ie_blli.ie_l2_mode
#define	ie_blli_l2_q933_use	ie_u.ie_blli.ie_l2_q933_use
#define	ie_blli_l2_window	ie_u.ie_blli.ie_l2_window
#define	ie_blli_l2_user_proto	ie_u.ie_blli.ie_l2_user_proto
#define	ie_blli_l3_id		ie_u.ie_blli.ie_l3_id
#define	ie_blli_l3_mode		ie_u.ie_blli.ie_l3_mode
#define	ie_blli_l3_packet_size	ie_u.ie_blli.ie_l3_packet_size
#define	ie_blli_l3_window	ie_u.ie_blli.ie_l3_window
#define	ie_blli_l3_user_proto	ie_u.ie_blli.ie_l3_user_proto
#define	ie_blli_l3_ipi		ie_u.ie_blli.ie_l3_ipi
#define	ie_blli_l3_snap_id	ie_u.ie_blli.ie_l3_snap_id
#define	ie_blli_l3_oui		ie_u.ie_blli.ie_l3_oui
#define	ie_blli_l3_pid		ie_u.ie_blli.ie_l3_pid

#define	ie_clst_state		ie_u.ie_clst.ie_state

#define	ie_cdad_type		ie_u.ie_cdad.ie_type
#define	ie_cdad_plan		ie_u.ie_cdad.ie_plan
#define	ie_cdad_addr		ie_u.ie_cdad.ie_addr

#define	ie_cdsa_addr		ie_u.ie_cdsa.ie_addr

#define	ie_cgad_type		ie_u.ie_cgad.ie_type
#define	ie_cgad_plan		ie_u.ie_cgad.ie_plan
#define	ie_cgad_pres_ind	ie_u.ie_cgad.ie_pres_ind
#define	ie_cgad_screen_ind	ie_u.ie_cgad.ie_screen_ind
#define	ie_cgad_addr		ie_u.ie_cgad.ie_addr

#define	ie_cgsa_addr		ie_u.ie_cgsa.ie_addr

#define	ie_caus_loc		ie_u.ie_caus.ie_loc
#define	ie_caus_cause		ie_u.ie_caus.ie_cause
#define	ie_caus_diag_len	ie_u.ie_caus.ie_diag_len
#define	ie_caus_diagnostic	ie_u.ie_caus.ie_diagnostic

#define	ie_cnid_vp_sig		ie_u.ie_cnid.ie_vp_sig
#define	ie_cnid_pref_excl	ie_u.ie_cnid.ie_pref_excl
#define	ie_cnid_vpci		ie_u.ie_cnid.ie_vpci
#define	ie_cnid_vci		ie_u.ie_cnid.ie_vci

#define	ie_qosp_fwd_class	ie_u.ie_qosp.ie_fwd_class
#define	ie_qosp_bkwd_class	ie_u.ie_qosp.ie_bkwd_class

#define	ie_brpi_ind		ie_u.ie_brpi.ie_ind

#define	ie_rsti_class		ie_u.ie_rsti.ie_class

#define	ie_bsdc_ind		ie_u.ie_bsdc.ie_ind

#define	ie_trnt_id_type		ie_u.ie_trnt.ie_id_type
#define	ie_trnt_id_plan		ie_u.ie_trnt.ie_id_plan
#define	ie_trnt_id_len		ie_u.ie_trnt.ie_id_len
#define	ie_trnt_id		ie_u.ie_trnt.ie_id

#define	ie_eprf_type		ie_u.ie_eprf.ie_type
#define	ie_eprf_id		ie_u.ie_eprf.ie_id

#define	ie_epst_state		ie_u.ie_epst.ie_state

/*
 * Macro to add an IE to the end of a list of IEs
 */
#define	MSG_IE_ADD(m, i, ind) 					\
	if (m->msg_ie_vec[ind]) {				\
		struct ie_generic *_iep = msg->msg_ie_vec[ind];	\
		while (_iep->ie_next) {				\
			_iep = _iep->ie_next;			\
		}						\
		_iep->ie_next = i;				\
	} else {						\
		m->msg_ie_vec[ind] = i;				\
	}

#endif	/* _UNI_SIG_MSG_H */