]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/contrib/ngatm/netnatm/msg/uni_msg.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / contrib / ngatm / netnatm / msg / uni_msg.c
1 /* This file was created automatically
2  * Source file: $Begemot: libunimsg/atm/msg/msg.def,v 1.3 2003/09/19 11:58:15 hbb Exp $
3  * $FreeBSD$
4  */
5
6 #include <sys/types.h>
7 #include <sys/param.h>
8
9 #ifdef _KERNEL
10 #include <sys/libkern.h>
11 #else
12 #include <string.h>
13 #endif
14 #include <netnatm/unimsg.h>
15 #include <netnatm/msg/unistruct.h>
16 #include <netnatm/msg/unimsglib.h>
17 #include <netnatm/msg/priv.h>
18 #include <netnatm/msg/privmsg.c>
19
20 static void
21 print_alerting(struct uni_alerting *msg, struct unicx *cx)
22 {
23         u_int i;
24
25         if(msg->connid.h.present & UNI_IE_PRESENT)
26                 uni_print_ie_internal(UNI_IE_CONNID, (union uni_ieall *)&msg->connid, cx);
27         if(msg->epref.h.present & UNI_IE_PRESENT)
28                 uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
29         if(msg->notify.h.present & UNI_IE_PRESENT)
30                 uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
31         for(i = 0; i < UNI_NUM_IE_GIT; i++)
32                 if(msg->git[i].h.present & UNI_IE_PRESENT)
33                         uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
34         if(msg->uu.h.present & UNI_IE_PRESENT)
35                 uni_print_ie_internal(UNI_IE_UU, (union uni_ieall *)&msg->uu, cx);
36         if(msg->report.h.present & UNI_IE_PRESENT)
37                 uni_print_ie_internal(UNI_IE_REPORT, (union uni_ieall *)&msg->report, cx);
38         if(msg->unrec.h.present & UNI_IE_PRESENT)
39                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
40 }
41
42 static int
43 check_alerting(struct uni_alerting *m, struct unicx *cx)
44 {
45         int ret = 0;
46         u_int i;
47
48         if(!(!cx->pnni))
49                 ret |= IE_ISPRESENT(m->connid);
50         else
51                 ret |= uni_check_ie(UNI_IE_CONNID, (union uni_ieall *)&m->connid, cx);
52         ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
53         ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
54         for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
55                 ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
56         }
57         if(!(!cx->pnni))
58                 ret |= IE_ISPRESENT(m->uu);
59         else
60                 ret |= uni_check_ie(UNI_IE_UU, (union uni_ieall *)&m->uu, cx);
61         if(!(!cx->pnni))
62                 ret |= IE_ISPRESENT(m->report);
63         else
64                 ret |= uni_check_ie(UNI_IE_REPORT, (union uni_ieall *)&m->report, cx);
65         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
66
67         return ret;
68 }
69
70 static int
71 encode_alerting(struct uni_msg *msg, struct uni_alerting *p, struct unicx *cx)
72 {
73         u_int mlen;
74         u_int i;
75
76         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_ALERTING, cx, &mlen))
77                 return (-2);
78
79         if((p->connid.h.present & UNI_IE_PRESENT) &&
80            uni_encode_ie(UNI_IE_CONNID, msg, (union uni_ieall *)&p->connid, cx))
81                 return (UNI_IE_CONNID);
82         if((p->epref.h.present & UNI_IE_PRESENT) &&
83            uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
84                 return (UNI_IE_EPREF);
85         if((p->notify.h.present & UNI_IE_PRESENT) &&
86            uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
87                 return (UNI_IE_NOTIFY);
88         for(i = 0; i < UNI_NUM_IE_GIT; i++)
89                 if((p->git[i].h.present & UNI_IE_PRESENT) &&
90                    uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
91                 return ((i << 16) + UNI_IE_GIT);
92         if((p->uu.h.present & UNI_IE_PRESENT) &&
93            uni_encode_ie(UNI_IE_UU, msg, (union uni_ieall *)&p->uu, cx))
94                 return (UNI_IE_UU);
95         if((p->report.h.present & UNI_IE_PRESENT) &&
96            uni_encode_ie(UNI_IE_REPORT, msg, (union uni_ieall *)&p->report, cx))
97                 return (UNI_IE_REPORT);
98         if((p->unrec.h.present & UNI_IE_PRESENT) &&
99            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
100                 return (UNI_IE_UNREC);
101
102         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
103         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
104
105         return (0);
106 }
107
108 static int
109 decode_alerting(struct uni_alerting *out, struct uni_msg *msg,
110     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
111     struct unicx *cx)
112 {
113         u_int i;
114
115         switch (ie) {
116
117           case UNI_IE_CONNID:
118                 if (!(!cx->pnni))
119                         return (DEC_ILL);
120                 out->connid.h = *hdr;
121                 if (hdr->present & UNI_IE_ERROR)
122                         return (DEC_ERR);
123                 if(uni_decode_ie_body(UNI_IE_CONNID, (union uni_ieall *)&out->connid, msg, ielen, cx))
124                         return (DEC_ERR);
125                 break;
126
127           case UNI_IE_EPREF:
128                 out->epref.h = *hdr;
129                 if (hdr->present & UNI_IE_ERROR)
130                         return (DEC_ERR);
131                 if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
132                         return (DEC_ERR);
133                 break;
134
135           case UNI_IE_NOTIFY:
136                 out->notify.h = *hdr;
137                 if (hdr->present & UNI_IE_ERROR)
138                         return (DEC_ERR);
139                 if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
140                         return (DEC_ERR);
141                 break;
142
143           case UNI_IE_GIT:
144                 for(i = 0; i < UNI_NUM_IE_GIT; i++)
145                         if (!IE_ISPRESENT(out->git[i])) {
146                                 out->git[i].h = *hdr;
147                                 if (hdr->present & UNI_IE_ERROR)
148                                         return (DEC_ERR);
149                                 if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
150                                         return (DEC_ERR);
151                                 break;
152                         }
153                 break;
154
155           case UNI_IE_UU:
156                 if (!(!cx->pnni))
157                         return (DEC_ILL);
158                 out->uu.h = *hdr;
159                 if (hdr->present & UNI_IE_ERROR)
160                         return (DEC_ERR);
161                 if(uni_decode_ie_body(UNI_IE_UU, (union uni_ieall *)&out->uu, msg, ielen, cx))
162                         return (DEC_ERR);
163                 break;
164
165           case UNI_IE_REPORT:
166                 if (!(!cx->pnni))
167                         return (DEC_ILL);
168                 out->report.h = *hdr;
169                 if (hdr->present & UNI_IE_ERROR)
170                         return (DEC_ERR);
171                 if(uni_decode_ie_body(UNI_IE_REPORT, (union uni_ieall *)&out->report, msg, ielen, cx))
172                         return (DEC_ERR);
173                 break;
174
175           case UNI_IE_UNREC:
176                 out->unrec.h = *hdr;
177                 if (hdr->present & UNI_IE_ERROR)
178                         return (DEC_ERR);
179                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
180                         return (DEC_ERR);
181                 break;
182
183           default:
184                 return (DEC_ILL);
185         }
186         return (DEC_OK);
187 }
188
189 static const struct msgdecl decl_alerting = {
190         0,
191         "alerting",
192         (uni_msg_print_f)print_alerting,
193         (uni_msg_check_f)check_alerting,
194         (uni_msg_encode_f)encode_alerting,
195         (uni_msg_decode_f)decode_alerting
196 };
197
198 static void
199 print_call_proc(struct uni_call_proc *msg, struct unicx *cx)
200 {
201         if(msg->connid.h.present & UNI_IE_PRESENT)
202                 uni_print_ie_internal(UNI_IE_CONNID, (union uni_ieall *)&msg->connid, cx);
203         if(msg->epref.h.present & UNI_IE_PRESENT)
204                 uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
205         if(msg->notify.h.present & UNI_IE_PRESENT)
206                 uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
207         if(msg->unrec.h.present & UNI_IE_PRESENT)
208                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
209 }
210
211 static int
212 check_call_proc(struct uni_call_proc *m, struct unicx *cx)
213 {
214         int ret = 0;
215
216         ret |= uni_check_ie(UNI_IE_CONNID, (union uni_ieall *)&m->connid, cx);
217         ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
218         if(!(!cx->pnni))
219                 ret |= IE_ISPRESENT(m->notify);
220         else
221                 ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
222         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
223
224         return ret;
225 }
226
227 static int
228 encode_call_proc(struct uni_msg *msg, struct uni_call_proc *p, struct unicx *cx)
229 {
230         u_int mlen;
231
232         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_CALL_PROC, cx, &mlen))
233                 return (-2);
234
235         if((p->connid.h.present & UNI_IE_PRESENT) &&
236            uni_encode_ie(UNI_IE_CONNID, msg, (union uni_ieall *)&p->connid, cx))
237                 return (UNI_IE_CONNID);
238         if((p->epref.h.present & UNI_IE_PRESENT) &&
239            uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
240                 return (UNI_IE_EPREF);
241         if((p->notify.h.present & UNI_IE_PRESENT) &&
242            uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
243                 return (UNI_IE_NOTIFY);
244         if((p->unrec.h.present & UNI_IE_PRESENT) &&
245            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
246                 return (UNI_IE_UNREC);
247
248         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
249         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
250
251         return (0);
252 }
253
254 static int
255 decode_call_proc(struct uni_call_proc *out, struct uni_msg *msg,
256     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
257     struct unicx *cx)
258 {
259         switch (ie) {
260
261           case UNI_IE_CONNID:
262                 out->connid.h = *hdr;
263                 if (hdr->present & UNI_IE_ERROR)
264                         return (DEC_ERR);
265                 if(uni_decode_ie_body(UNI_IE_CONNID, (union uni_ieall *)&out->connid, msg, ielen, cx))
266                         return (DEC_ERR);
267                 break;
268
269           case UNI_IE_EPREF:
270                 out->epref.h = *hdr;
271                 if (hdr->present & UNI_IE_ERROR)
272                         return (DEC_ERR);
273                 if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
274                         return (DEC_ERR);
275                 break;
276
277           case UNI_IE_NOTIFY:
278                 if (!(!cx->pnni))
279                         return (DEC_ILL);
280                 out->notify.h = *hdr;
281                 if (hdr->present & UNI_IE_ERROR)
282                         return (DEC_ERR);
283                 if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
284                         return (DEC_ERR);
285                 break;
286
287           case UNI_IE_UNREC:
288                 out->unrec.h = *hdr;
289                 if (hdr->present & UNI_IE_ERROR)
290                         return (DEC_ERR);
291                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
292                         return (DEC_ERR);
293                 break;
294
295           default:
296                 return (DEC_ILL);
297         }
298         return (DEC_OK);
299 }
300
301 static const struct msgdecl decl_call_proc = {
302         0,
303         "call_proc",
304         (uni_msg_print_f)print_call_proc,
305         (uni_msg_check_f)check_call_proc,
306         (uni_msg_encode_f)encode_call_proc,
307         (uni_msg_decode_f)decode_call_proc
308 };
309
310 static void
311 print_connect(struct uni_connect *msg, struct unicx *cx)
312 {
313         u_int i;
314
315         if(msg->aal.h.present & UNI_IE_PRESENT)
316                 uni_print_ie_internal(UNI_IE_AAL, (union uni_ieall *)&msg->aal, cx);
317         if(msg->blli.h.present & UNI_IE_PRESENT)
318                 uni_print_ie_internal(UNI_IE_BLLI, (union uni_ieall *)&msg->blli, cx);
319         if(msg->connid.h.present & UNI_IE_PRESENT)
320                 uni_print_ie_internal(UNI_IE_CONNID, (union uni_ieall *)&msg->connid, cx);
321         if(msg->epref.h.present & UNI_IE_PRESENT)
322                 uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
323         if(msg->notify.h.present & UNI_IE_PRESENT)
324                 uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
325         if(msg->conned.h.present & UNI_IE_PRESENT)
326                 uni_print_ie_internal(UNI_IE_CONNED, (union uni_ieall *)&msg->conned, cx);
327         if(msg->connedsub.h.present & UNI_IE_PRESENT)
328                 uni_print_ie_internal(UNI_IE_CONNEDSUB, (union uni_ieall *)&msg->connedsub, cx);
329         if(msg->eetd.h.present & UNI_IE_PRESENT)
330                 uni_print_ie_internal(UNI_IE_EETD, (union uni_ieall *)&msg->eetd, cx);
331         for(i = 0; i < UNI_NUM_IE_GIT; i++)
332                 if(msg->git[i].h.present & UNI_IE_PRESENT)
333                         uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
334         if(msg->uu.h.present & UNI_IE_PRESENT)
335                 uni_print_ie_internal(UNI_IE_UU, (union uni_ieall *)&msg->uu, cx);
336         if(msg->traffic.h.present & UNI_IE_PRESENT)
337                 uni_print_ie_internal(UNI_IE_TRAFFIC, (union uni_ieall *)&msg->traffic, cx);
338         if(msg->exqos.h.present & UNI_IE_PRESENT)
339                 uni_print_ie_internal(UNI_IE_EXQOS, (union uni_ieall *)&msg->exqos, cx);
340         if(msg->facility.h.present & UNI_IE_PRESENT)
341                 uni_print_ie_internal(UNI_IE_FACILITY, (union uni_ieall *)&msg->facility, cx);
342         if(msg->abrsetup.h.present & UNI_IE_PRESENT)
343                 uni_print_ie_internal(UNI_IE_ABRSETUP, (union uni_ieall *)&msg->abrsetup, cx);
344         if(msg->abradd.h.present & UNI_IE_PRESENT)
345                 uni_print_ie_internal(UNI_IE_ABRADD, (union uni_ieall *)&msg->abradd, cx);
346         if(msg->called_soft.h.present & UNI_IE_PRESENT)
347                 uni_print_ie_internal(UNI_IE_CALLED_SOFT, (union uni_ieall *)&msg->called_soft, cx);
348         if(msg->report.h.present & UNI_IE_PRESENT)
349                 uni_print_ie_internal(UNI_IE_REPORT, (union uni_ieall *)&msg->report, cx);
350         if(msg->unrec.h.present & UNI_IE_PRESENT)
351                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
352 }
353
354 static int
355 check_connect(struct uni_connect *m, struct unicx *cx)
356 {
357         int ret = 0;
358         u_int i;
359
360         ret |= uni_check_ie(UNI_IE_AAL, (union uni_ieall *)&m->aal, cx);
361         ret |= uni_check_ie(UNI_IE_BLLI, (union uni_ieall *)&m->blli, cx);
362         if(!(!cx->pnni))
363                 ret |= IE_ISPRESENT(m->connid);
364         else
365                 ret |= uni_check_ie(UNI_IE_CONNID, (union uni_ieall *)&m->connid, cx);
366         ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
367         ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
368         ret |= uni_check_ie(UNI_IE_CONNED, (union uni_ieall *)&m->conned, cx);
369         ret |= uni_check_ie(UNI_IE_CONNEDSUB, (union uni_ieall *)&m->connedsub, cx);
370         ret |= uni_check_ie(UNI_IE_EETD, (union uni_ieall *)&m->eetd, cx);
371         for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
372                 ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
373         }
374         if(!(!cx->pnni))
375                 ret |= IE_ISPRESENT(m->uu);
376         else
377                 ret |= uni_check_ie(UNI_IE_UU, (union uni_ieall *)&m->uu, cx);
378         ret |= uni_check_ie(UNI_IE_TRAFFIC, (union uni_ieall *)&m->traffic, cx);
379         ret |= uni_check_ie(UNI_IE_EXQOS, (union uni_ieall *)&m->exqos, cx);
380         if(!(cx->q2932))
381                 ret |= IE_ISPRESENT(m->facility);
382         else
383                 ret |= uni_check_ie(UNI_IE_FACILITY, (union uni_ieall *)&m->facility, cx);
384         ret |= uni_check_ie(UNI_IE_ABRSETUP, (union uni_ieall *)&m->abrsetup, cx);
385         ret |= uni_check_ie(UNI_IE_ABRADD, (union uni_ieall *)&m->abradd, cx);
386         if(!(cx->pnni))
387                 ret |= IE_ISPRESENT(m->called_soft);
388         else
389                 ret |= uni_check_ie(UNI_IE_CALLED_SOFT, (union uni_ieall *)&m->called_soft, cx);
390         if(!(!cx->pnni))
391                 ret |= IE_ISPRESENT(m->report);
392         else
393                 ret |= uni_check_ie(UNI_IE_REPORT, (union uni_ieall *)&m->report, cx);
394         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
395
396         return ret;
397 }
398
399 static int
400 encode_connect(struct uni_msg *msg, struct uni_connect *p, struct unicx *cx)
401 {
402         u_int mlen;
403         u_int i;
404
405         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_CONNECT, cx, &mlen))
406                 return (-2);
407
408         if((p->aal.h.present & UNI_IE_PRESENT) &&
409            uni_encode_ie(UNI_IE_AAL, msg, (union uni_ieall *)&p->aal, cx))
410                 return (UNI_IE_AAL);
411         if((p->blli.h.present & UNI_IE_PRESENT) &&
412            uni_encode_ie(UNI_IE_BLLI, msg, (union uni_ieall *)&p->blli, cx))
413                 return (UNI_IE_BLLI);
414         if((p->connid.h.present & UNI_IE_PRESENT) &&
415            uni_encode_ie(UNI_IE_CONNID, msg, (union uni_ieall *)&p->connid, cx))
416                 return (UNI_IE_CONNID);
417         if((p->epref.h.present & UNI_IE_PRESENT) &&
418            uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
419                 return (UNI_IE_EPREF);
420         if((p->notify.h.present & UNI_IE_PRESENT) &&
421            uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
422                 return (UNI_IE_NOTIFY);
423         if((p->conned.h.present & UNI_IE_PRESENT) &&
424            uni_encode_ie(UNI_IE_CONNED, msg, (union uni_ieall *)&p->conned, cx))
425                 return (UNI_IE_CONNED);
426         if((p->connedsub.h.present & UNI_IE_PRESENT) &&
427            uni_encode_ie(UNI_IE_CONNEDSUB, msg, (union uni_ieall *)&p->connedsub, cx))
428                 return (UNI_IE_CONNEDSUB);
429         if((p->eetd.h.present & UNI_IE_PRESENT) &&
430            uni_encode_ie(UNI_IE_EETD, msg, (union uni_ieall *)&p->eetd, cx))
431                 return (UNI_IE_EETD);
432         for(i = 0; i < UNI_NUM_IE_GIT; i++)
433                 if((p->git[i].h.present & UNI_IE_PRESENT) &&
434                    uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
435                 return ((i << 16) + UNI_IE_GIT);
436         if((p->uu.h.present & UNI_IE_PRESENT) &&
437            uni_encode_ie(UNI_IE_UU, msg, (union uni_ieall *)&p->uu, cx))
438                 return (UNI_IE_UU);
439         if((p->traffic.h.present & UNI_IE_PRESENT) &&
440            uni_encode_ie(UNI_IE_TRAFFIC, msg, (union uni_ieall *)&p->traffic, cx))
441                 return (UNI_IE_TRAFFIC);
442         if((p->exqos.h.present & UNI_IE_PRESENT) &&
443            uni_encode_ie(UNI_IE_EXQOS, msg, (union uni_ieall *)&p->exqos, cx))
444                 return (UNI_IE_EXQOS);
445         if((p->facility.h.present & UNI_IE_PRESENT) &&
446            uni_encode_ie(UNI_IE_FACILITY, msg, (union uni_ieall *)&p->facility, cx))
447                 return (UNI_IE_FACILITY);
448         if((p->abrsetup.h.present & UNI_IE_PRESENT) &&
449            uni_encode_ie(UNI_IE_ABRSETUP, msg, (union uni_ieall *)&p->abrsetup, cx))
450                 return (UNI_IE_ABRSETUP);
451         if((p->abradd.h.present & UNI_IE_PRESENT) &&
452            uni_encode_ie(UNI_IE_ABRADD, msg, (union uni_ieall *)&p->abradd, cx))
453                 return (UNI_IE_ABRADD);
454         if((p->called_soft.h.present & UNI_IE_PRESENT) &&
455            uni_encode_ie(UNI_IE_CALLED_SOFT, msg, (union uni_ieall *)&p->called_soft, cx))
456                 return (UNI_IE_CALLED_SOFT);
457         if((p->report.h.present & UNI_IE_PRESENT) &&
458            uni_encode_ie(UNI_IE_REPORT, msg, (union uni_ieall *)&p->report, cx))
459                 return (UNI_IE_REPORT);
460         if((p->unrec.h.present & UNI_IE_PRESENT) &&
461            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
462                 return (UNI_IE_UNREC);
463
464         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
465         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
466
467         return (0);
468 }
469
470 static int
471 decode_connect(struct uni_connect *out, struct uni_msg *msg,
472     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
473     struct unicx *cx)
474 {
475         u_int i;
476
477         switch (ie) {
478
479           case UNI_IE_AAL:
480                 out->aal.h = *hdr;
481                 if (hdr->present & UNI_IE_ERROR)
482                         return (DEC_ERR);
483                 if(uni_decode_ie_body(UNI_IE_AAL, (union uni_ieall *)&out->aal, msg, ielen, cx))
484                         return (DEC_ERR);
485                 break;
486
487           case UNI_IE_BLLI:
488                 out->blli.h = *hdr;
489                 if (hdr->present & UNI_IE_ERROR)
490                         return (DEC_ERR);
491                 if(uni_decode_ie_body(UNI_IE_BLLI, (union uni_ieall *)&out->blli, msg, ielen, cx))
492                         return (DEC_ERR);
493                 break;
494
495           case UNI_IE_CONNID:
496                 if (!(!cx->pnni))
497                         return (DEC_ILL);
498                 out->connid.h = *hdr;
499                 if (hdr->present & UNI_IE_ERROR)
500                         return (DEC_ERR);
501                 if(uni_decode_ie_body(UNI_IE_CONNID, (union uni_ieall *)&out->connid, msg, ielen, cx))
502                         return (DEC_ERR);
503                 break;
504
505           case UNI_IE_EPREF:
506                 out->epref.h = *hdr;
507                 if (hdr->present & UNI_IE_ERROR)
508                         return (DEC_ERR);
509                 if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
510                         return (DEC_ERR);
511                 break;
512
513           case UNI_IE_NOTIFY:
514                 out->notify.h = *hdr;
515                 if (hdr->present & UNI_IE_ERROR)
516                         return (DEC_ERR);
517                 if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
518                         return (DEC_ERR);
519                 break;
520
521           case UNI_IE_CONNED:
522                 out->conned.h = *hdr;
523                 if (hdr->present & UNI_IE_ERROR)
524                         return (DEC_ERR);
525                 if(uni_decode_ie_body(UNI_IE_CONNED, (union uni_ieall *)&out->conned, msg, ielen, cx))
526                         return (DEC_ERR);
527                 break;
528
529           case UNI_IE_CONNEDSUB:
530                 out->connedsub.h = *hdr;
531                 if (hdr->present & UNI_IE_ERROR)
532                         return (DEC_ERR);
533                 if(uni_decode_ie_body(UNI_IE_CONNEDSUB, (union uni_ieall *)&out->connedsub, msg, ielen, cx))
534                         return (DEC_ERR);
535                 break;
536
537           case UNI_IE_EETD:
538                 out->eetd.h = *hdr;
539                 if (hdr->present & UNI_IE_ERROR)
540                         return (DEC_ERR);
541                 if(uni_decode_ie_body(UNI_IE_EETD, (union uni_ieall *)&out->eetd, msg, ielen, cx))
542                         return (DEC_ERR);
543                 break;
544
545           case UNI_IE_GIT:
546                 for(i = 0; i < UNI_NUM_IE_GIT; i++)
547                         if (!IE_ISPRESENT(out->git[i])) {
548                                 out->git[i].h = *hdr;
549                                 if (hdr->present & UNI_IE_ERROR)
550                                         return (DEC_ERR);
551                                 if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
552                                         return (DEC_ERR);
553                                 break;
554                         }
555                 break;
556
557           case UNI_IE_UU:
558                 if (!(!cx->pnni))
559                         return (DEC_ILL);
560                 out->uu.h = *hdr;
561                 if (hdr->present & UNI_IE_ERROR)
562                         return (DEC_ERR);
563                 if(uni_decode_ie_body(UNI_IE_UU, (union uni_ieall *)&out->uu, msg, ielen, cx))
564                         return (DEC_ERR);
565                 break;
566
567           case UNI_IE_TRAFFIC:
568                 out->traffic.h = *hdr;
569                 if (hdr->present & UNI_IE_ERROR)
570                         return (DEC_ERR);
571                 if(uni_decode_ie_body(UNI_IE_TRAFFIC, (union uni_ieall *)&out->traffic, msg, ielen, cx))
572                         return (DEC_ERR);
573                 break;
574
575           case UNI_IE_EXQOS:
576                 out->exqos.h = *hdr;
577                 if (hdr->present & UNI_IE_ERROR)
578                         return (DEC_ERR);
579                 if(uni_decode_ie_body(UNI_IE_EXQOS, (union uni_ieall *)&out->exqos, msg, ielen, cx))
580                         return (DEC_ERR);
581                 break;
582
583           case UNI_IE_FACILITY:
584                 if (!(cx->q2932))
585                         return (DEC_ILL);
586                 out->facility.h = *hdr;
587                 if (hdr->present & UNI_IE_ERROR)
588                         return (DEC_ERR);
589                 if(uni_decode_ie_body(UNI_IE_FACILITY, (union uni_ieall *)&out->facility, msg, ielen, cx))
590                         return (DEC_ERR);
591                 break;
592
593           case UNI_IE_ABRSETUP:
594                 out->abrsetup.h = *hdr;
595                 if (hdr->present & UNI_IE_ERROR)
596                         return (DEC_ERR);
597                 if(uni_decode_ie_body(UNI_IE_ABRSETUP, (union uni_ieall *)&out->abrsetup, msg, ielen, cx))
598                         return (DEC_ERR);
599                 break;
600
601           case UNI_IE_ABRADD:
602                 out->abradd.h = *hdr;
603                 if (hdr->present & UNI_IE_ERROR)
604                         return (DEC_ERR);
605                 if(uni_decode_ie_body(UNI_IE_ABRADD, (union uni_ieall *)&out->abradd, msg, ielen, cx))
606                         return (DEC_ERR);
607                 break;
608
609           case UNI_IE_CALLED_SOFT:
610                 if (!(cx->pnni))
611                         return (DEC_ILL);
612                 out->called_soft.h = *hdr;
613                 if (hdr->present & UNI_IE_ERROR)
614                         return (DEC_ERR);
615                 if(uni_decode_ie_body(UNI_IE_CALLED_SOFT, (union uni_ieall *)&out->called_soft, msg, ielen, cx))
616                         return (DEC_ERR);
617                 break;
618
619           case UNI_IE_REPORT:
620                 if (!(!cx->pnni))
621                         return (DEC_ILL);
622                 out->report.h = *hdr;
623                 if (hdr->present & UNI_IE_ERROR)
624                         return (DEC_ERR);
625                 if(uni_decode_ie_body(UNI_IE_REPORT, (union uni_ieall *)&out->report, msg, ielen, cx))
626                         return (DEC_ERR);
627                 break;
628
629           case UNI_IE_UNREC:
630                 out->unrec.h = *hdr;
631                 if (hdr->present & UNI_IE_ERROR)
632                         return (DEC_ERR);
633                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
634                         return (DEC_ERR);
635                 break;
636
637           default:
638                 return (DEC_ILL);
639         }
640         return (DEC_OK);
641 }
642
643 static const struct msgdecl decl_connect = {
644         0,
645         "connect",
646         (uni_msg_print_f)print_connect,
647         (uni_msg_check_f)check_connect,
648         (uni_msg_encode_f)encode_connect,
649         (uni_msg_decode_f)decode_connect
650 };
651
652 static void
653 print_connect_ack(struct uni_connect_ack *msg, struct unicx *cx)
654 {
655         if(msg->notify.h.present & UNI_IE_PRESENT)
656                 uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
657         if(msg->unrec.h.present & UNI_IE_PRESENT)
658                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
659 }
660
661 static int
662 check_connect_ack(struct uni_connect_ack *m, struct unicx *cx)
663 {
664         int ret = 0;
665
666         ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
667         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
668
669         return ret;
670 }
671
672 static int
673 encode_connect_ack(struct uni_msg *msg, struct uni_connect_ack *p, struct unicx *cx)
674 {
675         u_int mlen;
676
677         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_CONNECT_ACK, cx, &mlen))
678                 return (-2);
679
680         if((p->notify.h.present & UNI_IE_PRESENT) &&
681            uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
682                 return (UNI_IE_NOTIFY);
683         if((p->unrec.h.present & UNI_IE_PRESENT) &&
684            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
685                 return (UNI_IE_UNREC);
686
687         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
688         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
689
690         return (0);
691 }
692
693 static int
694 decode_connect_ack(struct uni_connect_ack *out, struct uni_msg *msg,
695     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
696     struct unicx *cx)
697 {
698         switch (ie) {
699
700           case UNI_IE_NOTIFY:
701                 out->notify.h = *hdr;
702                 if (hdr->present & UNI_IE_ERROR)
703                         return (DEC_ERR);
704                 if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
705                         return (DEC_ERR);
706                 break;
707
708           case UNI_IE_UNREC:
709                 out->unrec.h = *hdr;
710                 if (hdr->present & UNI_IE_ERROR)
711                         return (DEC_ERR);
712                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
713                         return (DEC_ERR);
714                 break;
715
716           default:
717                 return (DEC_ILL);
718         }
719         return (DEC_OK);
720 }
721
722 static const struct msgdecl decl_connect_ack = {
723         0,
724         "connect_ack",
725         (uni_msg_print_f)print_connect_ack,
726         (uni_msg_check_f)check_connect_ack,
727         (uni_msg_encode_f)encode_connect_ack,
728         (uni_msg_decode_f)decode_connect_ack
729 };
730
731 static void
732 print_release(struct uni_release *msg, struct unicx *cx)
733 {
734         u_int i;
735
736         for(i = 0; i < 2; i++)
737                 if(msg->cause[i].h.present & UNI_IE_PRESENT)
738                         uni_print_ie_internal(UNI_IE_CAUSE, (union uni_ieall *)&msg->cause[i], cx);
739         if(msg->notify.h.present & UNI_IE_PRESENT)
740                 uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
741         for(i = 0; i < UNI_NUM_IE_GIT; i++)
742                 if(msg->git[i].h.present & UNI_IE_PRESENT)
743                         uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
744         if(msg->uu.h.present & UNI_IE_PRESENT)
745                 uni_print_ie_internal(UNI_IE_UU, (union uni_ieall *)&msg->uu, cx);
746         if(msg->facility.h.present & UNI_IE_PRESENT)
747                 uni_print_ie_internal(UNI_IE_FACILITY, (union uni_ieall *)&msg->facility, cx);
748         if(msg->crankback.h.present & UNI_IE_PRESENT)
749                 uni_print_ie_internal(UNI_IE_CRANKBACK, (union uni_ieall *)&msg->crankback, cx);
750         if(msg->unrec.h.present & UNI_IE_PRESENT)
751                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
752 }
753
754 static int
755 check_release(struct uni_release *m, struct unicx *cx)
756 {
757         int ret = 0;
758         u_int i;
759
760         for(i = 0; i < 2 ; i++) {
761                 ret |= uni_check_ie(UNI_IE_CAUSE, (union uni_ieall *)&m->cause[i], cx);
762         }
763         ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
764         for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
765                 ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
766         }
767         if(!(!cx->pnni))
768                 ret |= IE_ISPRESENT(m->uu);
769         else
770                 ret |= uni_check_ie(UNI_IE_UU, (union uni_ieall *)&m->uu, cx);
771         if(!(cx->q2932))
772                 ret |= IE_ISPRESENT(m->facility);
773         else
774                 ret |= uni_check_ie(UNI_IE_FACILITY, (union uni_ieall *)&m->facility, cx);
775         if(!(cx->pnni))
776                 ret |= IE_ISPRESENT(m->crankback);
777         else
778                 ret |= uni_check_ie(UNI_IE_CRANKBACK, (union uni_ieall *)&m->crankback, cx);
779         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
780
781         return ret;
782 }
783
784 static int
785 encode_release(struct uni_msg *msg, struct uni_release *p, struct unicx *cx)
786 {
787         u_int mlen;
788         u_int i;
789
790         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_RELEASE, cx, &mlen))
791                 return (-2);
792
793         for(i = 0; i < 2; i++)
794                 if((p->cause[i].h.present & UNI_IE_PRESENT) &&
795                    uni_encode_ie(UNI_IE_CAUSE, msg, (union uni_ieall *)&p->cause[i], cx))
796                 return ((i << 16) + UNI_IE_CAUSE);
797         if((p->notify.h.present & UNI_IE_PRESENT) &&
798            uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
799                 return (UNI_IE_NOTIFY);
800         for(i = 0; i < UNI_NUM_IE_GIT; i++)
801                 if((p->git[i].h.present & UNI_IE_PRESENT) &&
802                    uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
803                 return ((i << 16) + UNI_IE_GIT);
804         if((p->uu.h.present & UNI_IE_PRESENT) &&
805            uni_encode_ie(UNI_IE_UU, msg, (union uni_ieall *)&p->uu, cx))
806                 return (UNI_IE_UU);
807         if((p->facility.h.present & UNI_IE_PRESENT) &&
808            uni_encode_ie(UNI_IE_FACILITY, msg, (union uni_ieall *)&p->facility, cx))
809                 return (UNI_IE_FACILITY);
810         if((p->crankback.h.present & UNI_IE_PRESENT) &&
811            uni_encode_ie(UNI_IE_CRANKBACK, msg, (union uni_ieall *)&p->crankback, cx))
812                 return (UNI_IE_CRANKBACK);
813         if((p->unrec.h.present & UNI_IE_PRESENT) &&
814            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
815                 return (UNI_IE_UNREC);
816
817         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
818         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
819
820         return (0);
821 }
822
823 static int
824 decode_release(struct uni_release *out, struct uni_msg *msg,
825     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
826     struct unicx *cx)
827 {
828         u_int i;
829
830         switch (ie) {
831
832           case UNI_IE_CAUSE:
833                 for(i = 0; i < 2; i++)
834                         if (!IE_ISPRESENT(out->cause[i])) {
835                                 out->cause[i].h = *hdr;
836                                 if (hdr->present & UNI_IE_ERROR)
837                                         return (DEC_ERR);
838                                 if(uni_decode_ie_body(UNI_IE_CAUSE, (union uni_ieall *)&out->cause[i], msg, ielen, cx))
839                                         return (DEC_ERR);
840                                 break;
841                         }
842                 break;
843
844           case UNI_IE_NOTIFY:
845                 out->notify.h = *hdr;
846                 if (hdr->present & UNI_IE_ERROR)
847                         return (DEC_ERR);
848                 if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
849                         return (DEC_ERR);
850                 break;
851
852           case UNI_IE_GIT:
853                 for(i = 0; i < UNI_NUM_IE_GIT; i++)
854                         if (!IE_ISPRESENT(out->git[i])) {
855                                 out->git[i].h = *hdr;
856                                 if (hdr->present & UNI_IE_ERROR)
857                                         return (DEC_ERR);
858                                 if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
859                                         return (DEC_ERR);
860                                 break;
861                         }
862                 break;
863
864           case UNI_IE_UU:
865                 if (!(!cx->pnni))
866                         return (DEC_ILL);
867                 out->uu.h = *hdr;
868                 if (hdr->present & UNI_IE_ERROR)
869                         return (DEC_ERR);
870                 if(uni_decode_ie_body(UNI_IE_UU, (union uni_ieall *)&out->uu, msg, ielen, cx))
871                         return (DEC_ERR);
872                 break;
873
874           case UNI_IE_FACILITY:
875                 if (!(cx->q2932))
876                         return (DEC_ILL);
877                 out->facility.h = *hdr;
878                 if (hdr->present & UNI_IE_ERROR)
879                         return (DEC_ERR);
880                 if(uni_decode_ie_body(UNI_IE_FACILITY, (union uni_ieall *)&out->facility, msg, ielen, cx))
881                         return (DEC_ERR);
882                 break;
883
884           case UNI_IE_CRANKBACK:
885                 if (!(cx->pnni))
886                         return (DEC_ILL);
887                 out->crankback.h = *hdr;
888                 if (hdr->present & UNI_IE_ERROR)
889                         return (DEC_ERR);
890                 if(uni_decode_ie_body(UNI_IE_CRANKBACK, (union uni_ieall *)&out->crankback, msg, ielen, cx))
891                         return (DEC_ERR);
892                 break;
893
894           case UNI_IE_UNREC:
895                 out->unrec.h = *hdr;
896                 if (hdr->present & UNI_IE_ERROR)
897                         return (DEC_ERR);
898                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
899                         return (DEC_ERR);
900                 break;
901
902           default:
903                 return (DEC_ILL);
904         }
905         return (DEC_OK);
906 }
907
908 static const struct msgdecl decl_release = {
909         0,
910         "release",
911         (uni_msg_print_f)print_release,
912         (uni_msg_check_f)check_release,
913         (uni_msg_encode_f)encode_release,
914         (uni_msg_decode_f)decode_release
915 };
916
917 static void
918 print_release_compl(struct uni_release_compl *msg, struct unicx *cx)
919 {
920         u_int i;
921
922         for(i = 0; i < 2; i++)
923                 if(msg->cause[i].h.present & UNI_IE_PRESENT)
924                         uni_print_ie_internal(UNI_IE_CAUSE, (union uni_ieall *)&msg->cause[i], cx);
925         for(i = 0; i < UNI_NUM_IE_GIT; i++)
926                 if(msg->git[i].h.present & UNI_IE_PRESENT)
927                         uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
928         if(msg->uu.h.present & UNI_IE_PRESENT)
929                 uni_print_ie_internal(UNI_IE_UU, (union uni_ieall *)&msg->uu, cx);
930         if(msg->crankback.h.present & UNI_IE_PRESENT)
931                 uni_print_ie_internal(UNI_IE_CRANKBACK, (union uni_ieall *)&msg->crankback, cx);
932         if(msg->unrec.h.present & UNI_IE_PRESENT)
933                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
934 }
935
936 static int
937 check_release_compl(struct uni_release_compl *m, struct unicx *cx)
938 {
939         int ret = 0;
940         u_int i;
941
942         for(i = 0; i < 2 ; i++) {
943                 ret |= uni_check_ie(UNI_IE_CAUSE, (union uni_ieall *)&m->cause[i], cx);
944         }
945         for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
946                 if(!(!cx->pnni))
947                         ret |= IE_ISPRESENT(m->git[i]);
948                 else
949                         ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
950         }
951         if(!(!cx->pnni))
952                 ret |= IE_ISPRESENT(m->uu);
953         else
954                 ret |= uni_check_ie(UNI_IE_UU, (union uni_ieall *)&m->uu, cx);
955         if(!(cx->pnni))
956                 ret |= IE_ISPRESENT(m->crankback);
957         else
958                 ret |= uni_check_ie(UNI_IE_CRANKBACK, (union uni_ieall *)&m->crankback, cx);
959         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
960
961         return ret;
962 }
963
964 static int
965 encode_release_compl(struct uni_msg *msg, struct uni_release_compl *p, struct unicx *cx)
966 {
967         u_int mlen;
968         u_int i;
969
970         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_RELEASE_COMPL, cx, &mlen))
971                 return (-2);
972
973         for(i = 0; i < 2; i++)
974                 if((p->cause[i].h.present & UNI_IE_PRESENT) &&
975                    uni_encode_ie(UNI_IE_CAUSE, msg, (union uni_ieall *)&p->cause[i], cx))
976                 return ((i << 16) + UNI_IE_CAUSE);
977         for(i = 0; i < UNI_NUM_IE_GIT; i++)
978                 if((p->git[i].h.present & UNI_IE_PRESENT) &&
979                    uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
980                 return ((i << 16) + UNI_IE_GIT);
981         if((p->uu.h.present & UNI_IE_PRESENT) &&
982            uni_encode_ie(UNI_IE_UU, msg, (union uni_ieall *)&p->uu, cx))
983                 return (UNI_IE_UU);
984         if((p->crankback.h.present & UNI_IE_PRESENT) &&
985            uni_encode_ie(UNI_IE_CRANKBACK, msg, (union uni_ieall *)&p->crankback, cx))
986                 return (UNI_IE_CRANKBACK);
987         if((p->unrec.h.present & UNI_IE_PRESENT) &&
988            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
989                 return (UNI_IE_UNREC);
990
991         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
992         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
993
994         return (0);
995 }
996
997 static int
998 decode_release_compl(struct uni_release_compl *out, struct uni_msg *msg,
999     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
1000     struct unicx *cx)
1001 {
1002         u_int i;
1003
1004         switch (ie) {
1005
1006           case UNI_IE_CAUSE:
1007                 for(i = 0; i < 2; i++)
1008                         if (!IE_ISPRESENT(out->cause[i])) {
1009                                 out->cause[i].h = *hdr;
1010                                 if (hdr->present & UNI_IE_ERROR)
1011                                         return (DEC_ERR);
1012                                 if(uni_decode_ie_body(UNI_IE_CAUSE, (union uni_ieall *)&out->cause[i], msg, ielen, cx))
1013                                         return (DEC_ERR);
1014                                 break;
1015                         }
1016                 break;
1017
1018           case UNI_IE_GIT:
1019                 if (!(!cx->pnni))
1020                         return (DEC_ILL);
1021                 for(i = 0; i < UNI_NUM_IE_GIT; i++)
1022                         if (!IE_ISPRESENT(out->git[i])) {
1023                                 out->git[i].h = *hdr;
1024                                 if (hdr->present & UNI_IE_ERROR)
1025                                         return (DEC_ERR);
1026                                 if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
1027                                         return (DEC_ERR);
1028                                 break;
1029                         }
1030                 break;
1031
1032           case UNI_IE_UU:
1033                 if (!(!cx->pnni))
1034                         return (DEC_ILL);
1035                 out->uu.h = *hdr;
1036                 if (hdr->present & UNI_IE_ERROR)
1037                         return (DEC_ERR);
1038                 if(uni_decode_ie_body(UNI_IE_UU, (union uni_ieall *)&out->uu, msg, ielen, cx))
1039                         return (DEC_ERR);
1040                 break;
1041
1042           case UNI_IE_CRANKBACK:
1043                 if (!(cx->pnni))
1044                         return (DEC_ILL);
1045                 out->crankback.h = *hdr;
1046                 if (hdr->present & UNI_IE_ERROR)
1047                         return (DEC_ERR);
1048                 if(uni_decode_ie_body(UNI_IE_CRANKBACK, (union uni_ieall *)&out->crankback, msg, ielen, cx))
1049                         return (DEC_ERR);
1050                 break;
1051
1052           case UNI_IE_UNREC:
1053                 out->unrec.h = *hdr;
1054                 if (hdr->present & UNI_IE_ERROR)
1055                         return (DEC_ERR);
1056                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
1057                         return (DEC_ERR);
1058                 break;
1059
1060           default:
1061                 return (DEC_ILL);
1062         }
1063         return (DEC_OK);
1064 }
1065
1066 static const struct msgdecl decl_release_compl = {
1067         0,
1068         "release_compl",
1069         (uni_msg_print_f)print_release_compl,
1070         (uni_msg_check_f)check_release_compl,
1071         (uni_msg_encode_f)encode_release_compl,
1072         (uni_msg_decode_f)decode_release_compl
1073 };
1074
1075 static void
1076 print_setup(struct uni_setup *msg, struct unicx *cx)
1077 {
1078         u_int i;
1079
1080         if(msg->aal.h.present & UNI_IE_PRESENT)
1081                 uni_print_ie_internal(UNI_IE_AAL, (union uni_ieall *)&msg->aal, cx);
1082         if(msg->traffic.h.present & UNI_IE_PRESENT)
1083                 uni_print_ie_internal(UNI_IE_TRAFFIC, (union uni_ieall *)&msg->traffic, cx);
1084         if(msg->bearer.h.present & UNI_IE_PRESENT)
1085                 uni_print_ie_internal(UNI_IE_BEARER, (union uni_ieall *)&msg->bearer, cx);
1086         if(msg->bhli.h.present & UNI_IE_PRESENT)
1087                 uni_print_ie_internal(UNI_IE_BHLI, (union uni_ieall *)&msg->bhli, cx);
1088         if(msg->blli_repeat.h.present & UNI_IE_PRESENT)
1089                 uni_print_ie_internal(UNI_IE_REPEAT, (union uni_ieall *)&msg->blli_repeat, cx);
1090         for(i = 0; i < UNI_NUM_IE_BLLI; i++)
1091                 if(msg->blli[i].h.present & UNI_IE_PRESENT)
1092                         uni_print_ie_internal(UNI_IE_BLLI, (union uni_ieall *)&msg->blli[i], cx);
1093         if(msg->called.h.present & UNI_IE_PRESENT)
1094                 uni_print_ie_internal(UNI_IE_CALLED, (union uni_ieall *)&msg->called, cx);
1095         for(i = 0; i < UNI_NUM_IE_CALLEDSUB; i++)
1096                 if(msg->calledsub[i].h.present & UNI_IE_PRESENT)
1097                         uni_print_ie_internal(UNI_IE_CALLEDSUB, (union uni_ieall *)&msg->calledsub[i], cx);
1098         if(msg->calling.h.present & UNI_IE_PRESENT)
1099                 uni_print_ie_internal(UNI_IE_CALLING, (union uni_ieall *)&msg->calling, cx);
1100         for(i = 0; i < UNI_NUM_IE_CALLINGSUB; i++)
1101                 if(msg->callingsub[i].h.present & UNI_IE_PRESENT)
1102                         uni_print_ie_internal(UNI_IE_CALLINGSUB, (union uni_ieall *)&msg->callingsub[i], cx);
1103         if(msg->connid.h.present & UNI_IE_PRESENT)
1104                 uni_print_ie_internal(UNI_IE_CONNID, (union uni_ieall *)&msg->connid, cx);
1105         if(msg->qos.h.present & UNI_IE_PRESENT)
1106                 uni_print_ie_internal(UNI_IE_QOS, (union uni_ieall *)&msg->qos, cx);
1107         if(msg->eetd.h.present & UNI_IE_PRESENT)
1108                 uni_print_ie_internal(UNI_IE_EETD, (union uni_ieall *)&msg->eetd, cx);
1109         if(msg->notify.h.present & UNI_IE_PRESENT)
1110                 uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
1111         if(msg->scompl.h.present & UNI_IE_PRESENT)
1112                 uni_print_ie_internal(UNI_IE_SCOMPL, (union uni_ieall *)&msg->scompl, cx);
1113         for(i = 0; i < UNI_NUM_IE_TNS; i++)
1114                 if(msg->tns[i].h.present & UNI_IE_PRESENT)
1115                         uni_print_ie_internal(UNI_IE_TNS, (union uni_ieall *)&msg->tns[i], cx);
1116         if(msg->epref.h.present & UNI_IE_PRESENT)
1117                 uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
1118         if(msg->atraffic.h.present & UNI_IE_PRESENT)
1119                 uni_print_ie_internal(UNI_IE_ATRAFFIC, (union uni_ieall *)&msg->atraffic, cx);
1120         if(msg->mintraffic.h.present & UNI_IE_PRESENT)
1121                 uni_print_ie_internal(UNI_IE_MINTRAFFIC, (union uni_ieall *)&msg->mintraffic, cx);
1122         if(msg->uu.h.present & UNI_IE_PRESENT)
1123                 uni_print_ie_internal(UNI_IE_UU, (union uni_ieall *)&msg->uu, cx);
1124         for(i = 0; i < UNI_NUM_IE_GIT; i++)
1125                 if(msg->git[i].h.present & UNI_IE_PRESENT)
1126                         uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
1127         if(msg->lij_callid.h.present & UNI_IE_PRESENT)
1128                 uni_print_ie_internal(UNI_IE_LIJ_CALLID, (union uni_ieall *)&msg->lij_callid, cx);
1129         if(msg->lij_param.h.present & UNI_IE_PRESENT)
1130                 uni_print_ie_internal(UNI_IE_LIJ_PARAM, (union uni_ieall *)&msg->lij_param, cx);
1131         if(msg->lij_seqno.h.present & UNI_IE_PRESENT)
1132                 uni_print_ie_internal(UNI_IE_LIJ_SEQNO, (union uni_ieall *)&msg->lij_seqno, cx);
1133         if(msg->exqos.h.present & UNI_IE_PRESENT)
1134                 uni_print_ie_internal(UNI_IE_EXQOS, (union uni_ieall *)&msg->exqos, cx);
1135         if(msg->abrsetup.h.present & UNI_IE_PRESENT)
1136                 uni_print_ie_internal(UNI_IE_ABRSETUP, (union uni_ieall *)&msg->abrsetup, cx);
1137         if(msg->abradd.h.present & UNI_IE_PRESENT)
1138                 uni_print_ie_internal(UNI_IE_ABRADD, (union uni_ieall *)&msg->abradd, cx);
1139         if(msg->cscope.h.present & UNI_IE_PRESENT)
1140                 uni_print_ie_internal(UNI_IE_CSCOPE, (union uni_ieall *)&msg->cscope, cx);
1141         if(msg->calling_soft.h.present & UNI_IE_PRESENT)
1142                 uni_print_ie_internal(UNI_IE_CALLING_SOFT, (union uni_ieall *)&msg->calling_soft, cx);
1143         if(msg->called_soft.h.present & UNI_IE_PRESENT)
1144                 uni_print_ie_internal(UNI_IE_CALLED_SOFT, (union uni_ieall *)&msg->called_soft, cx);
1145         if(msg->dtl_repeat.h.present & UNI_IE_PRESENT)
1146                 uni_print_ie_internal(UNI_IE_REPEAT, (union uni_ieall *)&msg->dtl_repeat, cx);
1147         for(i = 0; i < UNI_NUM_IE_DTL; i++)
1148                 if(msg->dtl[i].h.present & UNI_IE_PRESENT)
1149                         uni_print_ie_internal(UNI_IE_DTL, (union uni_ieall *)&msg->dtl[i], cx);
1150         if(msg->report.h.present & UNI_IE_PRESENT)
1151                 uni_print_ie_internal(UNI_IE_REPORT, (union uni_ieall *)&msg->report, cx);
1152         if(msg->mdcr.h.present & UNI_IE_PRESENT)
1153                 uni_print_ie_internal(UNI_IE_MDCR, (union uni_ieall *)&msg->mdcr, cx);
1154         if(msg->unrec.h.present & UNI_IE_PRESENT)
1155                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
1156 }
1157
1158 static int
1159 check_setup(struct uni_setup *m, struct unicx *cx)
1160 {
1161         int ret = 0;
1162         u_int i;
1163
1164         ret |= uni_check_ie(UNI_IE_AAL, (union uni_ieall *)&m->aal, cx);
1165         ret |= uni_check_ie(UNI_IE_TRAFFIC, (union uni_ieall *)&m->traffic, cx);
1166         ret |= uni_check_ie(UNI_IE_BEARER, (union uni_ieall *)&m->bearer, cx);
1167         ret |= uni_check_ie(UNI_IE_BHLI, (union uni_ieall *)&m->bhli, cx);
1168         ret |= uni_check_ie(UNI_IE_REPEAT, (union uni_ieall *)&m->blli_repeat, cx);
1169         for(i = 0; i < UNI_NUM_IE_BLLI ; i++) {
1170                 ret |= uni_check_ie(UNI_IE_BLLI, (union uni_ieall *)&m->blli[i], cx);
1171         }
1172         ret |= uni_check_ie(UNI_IE_CALLED, (union uni_ieall *)&m->called, cx);
1173         for(i = 0; i < UNI_NUM_IE_CALLEDSUB ; i++) {
1174                 ret |= uni_check_ie(UNI_IE_CALLEDSUB, (union uni_ieall *)&m->calledsub[i], cx);
1175         }
1176         ret |= uni_check_ie(UNI_IE_CALLING, (union uni_ieall *)&m->calling, cx);
1177         for(i = 0; i < UNI_NUM_IE_CALLINGSUB ; i++) {
1178                 ret |= uni_check_ie(UNI_IE_CALLINGSUB, (union uni_ieall *)&m->callingsub[i], cx);
1179         }
1180         ret |= uni_check_ie(UNI_IE_CONNID, (union uni_ieall *)&m->connid, cx);
1181         ret |= uni_check_ie(UNI_IE_QOS, (union uni_ieall *)&m->qos, cx);
1182         ret |= uni_check_ie(UNI_IE_EETD, (union uni_ieall *)&m->eetd, cx);
1183         ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
1184         if(!(!cx->pnni))
1185                 ret |= IE_ISPRESENT(m->scompl);
1186         else
1187                 ret |= uni_check_ie(UNI_IE_SCOMPL, (union uni_ieall *)&m->scompl, cx);
1188         for(i = 0; i < UNI_NUM_IE_TNS ; i++) {
1189                 ret |= uni_check_ie(UNI_IE_TNS, (union uni_ieall *)&m->tns[i], cx);
1190         }
1191         ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
1192         ret |= uni_check_ie(UNI_IE_ATRAFFIC, (union uni_ieall *)&m->atraffic, cx);
1193         ret |= uni_check_ie(UNI_IE_MINTRAFFIC, (union uni_ieall *)&m->mintraffic, cx);
1194         if(!(!cx->pnni))
1195                 ret |= IE_ISPRESENT(m->uu);
1196         else
1197                 ret |= uni_check_ie(UNI_IE_UU, (union uni_ieall *)&m->uu, cx);
1198         for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
1199                 ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
1200         }
1201         if(!(!cx->pnni))
1202                 ret |= IE_ISPRESENT(m->lij_callid);
1203         else
1204                 ret |= uni_check_ie(UNI_IE_LIJ_CALLID, (union uni_ieall *)&m->lij_callid, cx);
1205         if(!(!cx->pnni))
1206                 ret |= IE_ISPRESENT(m->lij_param);
1207         else
1208                 ret |= uni_check_ie(UNI_IE_LIJ_PARAM, (union uni_ieall *)&m->lij_param, cx);
1209         if(!(!cx->pnni))
1210                 ret |= IE_ISPRESENT(m->lij_seqno);
1211         else
1212                 ret |= uni_check_ie(UNI_IE_LIJ_SEQNO, (union uni_ieall *)&m->lij_seqno, cx);
1213         ret |= uni_check_ie(UNI_IE_EXQOS, (union uni_ieall *)&m->exqos, cx);
1214         ret |= uni_check_ie(UNI_IE_ABRSETUP, (union uni_ieall *)&m->abrsetup, cx);
1215         ret |= uni_check_ie(UNI_IE_ABRADD, (union uni_ieall *)&m->abradd, cx);
1216         ret |= uni_check_ie(UNI_IE_CSCOPE, (union uni_ieall *)&m->cscope, cx);
1217         if(!(cx->pnni))
1218                 ret |= IE_ISPRESENT(m->calling_soft);
1219         else
1220                 ret |= uni_check_ie(UNI_IE_CALLING_SOFT, (union uni_ieall *)&m->calling_soft, cx);
1221         if(!(cx->pnni))
1222                 ret |= IE_ISPRESENT(m->called_soft);
1223         else
1224                 ret |= uni_check_ie(UNI_IE_CALLED_SOFT, (union uni_ieall *)&m->called_soft, cx);
1225         if(!(cx->pnni))
1226                 ret |= IE_ISPRESENT(m->dtl_repeat);
1227         else
1228                 ret |= uni_check_ie(UNI_IE_REPEAT, (union uni_ieall *)&m->dtl_repeat, cx);
1229         for(i = 0; i < UNI_NUM_IE_DTL ; i++) {
1230                 if(!(cx->pnni))
1231                         ret |= IE_ISPRESENT(m->dtl[i]);
1232                 else
1233                         ret |= uni_check_ie(UNI_IE_DTL, (union uni_ieall *)&m->dtl[i], cx);
1234         }
1235         if(!(!cx->pnni))
1236                 ret |= IE_ISPRESENT(m->report);
1237         else
1238                 ret |= uni_check_ie(UNI_IE_REPORT, (union uni_ieall *)&m->report, cx);
1239         ret |= uni_check_ie(UNI_IE_MDCR, (union uni_ieall *)&m->mdcr, cx);
1240         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
1241
1242         return ret;
1243 }
1244
1245 static int
1246 encode_setup(struct uni_msg *msg, struct uni_setup *p, struct unicx *cx)
1247 {
1248         u_int mlen;
1249         u_int i;
1250
1251         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_SETUP, cx, &mlen))
1252                 return (-2);
1253
1254         if((p->aal.h.present & UNI_IE_PRESENT) &&
1255            uni_encode_ie(UNI_IE_AAL, msg, (union uni_ieall *)&p->aal, cx))
1256                 return (UNI_IE_AAL);
1257         if((p->traffic.h.present & UNI_IE_PRESENT) &&
1258            uni_encode_ie(UNI_IE_TRAFFIC, msg, (union uni_ieall *)&p->traffic, cx))
1259                 return (UNI_IE_TRAFFIC);
1260         if((p->bearer.h.present & UNI_IE_PRESENT) &&
1261            uni_encode_ie(UNI_IE_BEARER, msg, (union uni_ieall *)&p->bearer, cx))
1262                 return (UNI_IE_BEARER);
1263         if((p->bhli.h.present & UNI_IE_PRESENT) &&
1264            uni_encode_ie(UNI_IE_BHLI, msg, (union uni_ieall *)&p->bhli, cx))
1265                 return (UNI_IE_BHLI);
1266         if((p->blli_repeat.h.present & UNI_IE_PRESENT) &&
1267            uni_encode_ie(UNI_IE_BLLI, msg, (union uni_ieall *)&p->blli_repeat, cx))
1268                 return (0x10000000 + UNI_IE_BLLI);
1269         for(i = 0; i < UNI_NUM_IE_BLLI; i++)
1270                 if((p->blli[i].h.present & UNI_IE_PRESENT) &&
1271                    uni_encode_ie(UNI_IE_BLLI, msg, (union uni_ieall *)&p->blli[i], cx))
1272                 return ((i << 16) + UNI_IE_BLLI);
1273         if((p->called.h.present & UNI_IE_PRESENT) &&
1274            uni_encode_ie(UNI_IE_CALLED, msg, (union uni_ieall *)&p->called, cx))
1275                 return (UNI_IE_CALLED);
1276         for(i = 0; i < UNI_NUM_IE_CALLEDSUB; i++)
1277                 if((p->calledsub[i].h.present & UNI_IE_PRESENT) &&
1278                    uni_encode_ie(UNI_IE_CALLEDSUB, msg, (union uni_ieall *)&p->calledsub[i], cx))
1279                 return ((i << 16) + UNI_IE_CALLEDSUB);
1280         if((p->calling.h.present & UNI_IE_PRESENT) &&
1281            uni_encode_ie(UNI_IE_CALLING, msg, (union uni_ieall *)&p->calling, cx))
1282                 return (UNI_IE_CALLING);
1283         for(i = 0; i < UNI_NUM_IE_CALLINGSUB; i++)
1284                 if((p->callingsub[i].h.present & UNI_IE_PRESENT) &&
1285                    uni_encode_ie(UNI_IE_CALLINGSUB, msg, (union uni_ieall *)&p->callingsub[i], cx))
1286                 return ((i << 16) + UNI_IE_CALLINGSUB);
1287         if((p->connid.h.present & UNI_IE_PRESENT) &&
1288            uni_encode_ie(UNI_IE_CONNID, msg, (union uni_ieall *)&p->connid, cx))
1289                 return (UNI_IE_CONNID);
1290         if((p->qos.h.present & UNI_IE_PRESENT) &&
1291            uni_encode_ie(UNI_IE_QOS, msg, (union uni_ieall *)&p->qos, cx))
1292                 return (UNI_IE_QOS);
1293         if((p->eetd.h.present & UNI_IE_PRESENT) &&
1294            uni_encode_ie(UNI_IE_EETD, msg, (union uni_ieall *)&p->eetd, cx))
1295                 return (UNI_IE_EETD);
1296         if((p->notify.h.present & UNI_IE_PRESENT) &&
1297            uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
1298                 return (UNI_IE_NOTIFY);
1299         if((p->scompl.h.present & UNI_IE_PRESENT) &&
1300            uni_encode_ie(UNI_IE_SCOMPL, msg, (union uni_ieall *)&p->scompl, cx))
1301                 return (UNI_IE_SCOMPL);
1302         for(i = 0; i < UNI_NUM_IE_TNS; i++)
1303                 if((p->tns[i].h.present & UNI_IE_PRESENT) &&
1304                    uni_encode_ie(UNI_IE_TNS, msg, (union uni_ieall *)&p->tns[i], cx))
1305                 return ((i << 16) + UNI_IE_TNS);
1306         if((p->epref.h.present & UNI_IE_PRESENT) &&
1307            uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
1308                 return (UNI_IE_EPREF);
1309         if((p->atraffic.h.present & UNI_IE_PRESENT) &&
1310            uni_encode_ie(UNI_IE_ATRAFFIC, msg, (union uni_ieall *)&p->atraffic, cx))
1311                 return (UNI_IE_ATRAFFIC);
1312         if((p->mintraffic.h.present & UNI_IE_PRESENT) &&
1313            uni_encode_ie(UNI_IE_MINTRAFFIC, msg, (union uni_ieall *)&p->mintraffic, cx))
1314                 return (UNI_IE_MINTRAFFIC);
1315         if((p->uu.h.present & UNI_IE_PRESENT) &&
1316            uni_encode_ie(UNI_IE_UU, msg, (union uni_ieall *)&p->uu, cx))
1317                 return (UNI_IE_UU);
1318         for(i = 0; i < UNI_NUM_IE_GIT; i++)
1319                 if((p->git[i].h.present & UNI_IE_PRESENT) &&
1320                    uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
1321                 return ((i << 16) + UNI_IE_GIT);
1322         if((p->lij_callid.h.present & UNI_IE_PRESENT) &&
1323            uni_encode_ie(UNI_IE_LIJ_CALLID, msg, (union uni_ieall *)&p->lij_callid, cx))
1324                 return (UNI_IE_LIJ_CALLID);
1325         if((p->lij_param.h.present & UNI_IE_PRESENT) &&
1326            uni_encode_ie(UNI_IE_LIJ_PARAM, msg, (union uni_ieall *)&p->lij_param, cx))
1327                 return (UNI_IE_LIJ_PARAM);
1328         if((p->lij_seqno.h.present & UNI_IE_PRESENT) &&
1329            uni_encode_ie(UNI_IE_LIJ_SEQNO, msg, (union uni_ieall *)&p->lij_seqno, cx))
1330                 return (UNI_IE_LIJ_SEQNO);
1331         if((p->exqos.h.present & UNI_IE_PRESENT) &&
1332            uni_encode_ie(UNI_IE_EXQOS, msg, (union uni_ieall *)&p->exqos, cx))
1333                 return (UNI_IE_EXQOS);
1334         if((p->abrsetup.h.present & UNI_IE_PRESENT) &&
1335            uni_encode_ie(UNI_IE_ABRSETUP, msg, (union uni_ieall *)&p->abrsetup, cx))
1336                 return (UNI_IE_ABRSETUP);
1337         if((p->abradd.h.present & UNI_IE_PRESENT) &&
1338            uni_encode_ie(UNI_IE_ABRADD, msg, (union uni_ieall *)&p->abradd, cx))
1339                 return (UNI_IE_ABRADD);
1340         if((p->cscope.h.present & UNI_IE_PRESENT) &&
1341            uni_encode_ie(UNI_IE_CSCOPE, msg, (union uni_ieall *)&p->cscope, cx))
1342                 return (UNI_IE_CSCOPE);
1343         if((p->calling_soft.h.present & UNI_IE_PRESENT) &&
1344            uni_encode_ie(UNI_IE_CALLING_SOFT, msg, (union uni_ieall *)&p->calling_soft, cx))
1345                 return (UNI_IE_CALLING_SOFT);
1346         if((p->called_soft.h.present & UNI_IE_PRESENT) &&
1347            uni_encode_ie(UNI_IE_CALLED_SOFT, msg, (union uni_ieall *)&p->called_soft, cx))
1348                 return (UNI_IE_CALLED_SOFT);
1349         if((p->dtl_repeat.h.present & UNI_IE_PRESENT) &&
1350            uni_encode_ie(UNI_IE_DTL, msg, (union uni_ieall *)&p->dtl_repeat, cx))
1351                 return (0x10000000 + UNI_IE_DTL);
1352         for(i = 0; i < UNI_NUM_IE_DTL; i++)
1353                 if((p->dtl[i].h.present & UNI_IE_PRESENT) &&
1354                    uni_encode_ie(UNI_IE_DTL, msg, (union uni_ieall *)&p->dtl[i], cx))
1355                 return ((i << 16) + UNI_IE_DTL);
1356         if((p->report.h.present & UNI_IE_PRESENT) &&
1357            uni_encode_ie(UNI_IE_REPORT, msg, (union uni_ieall *)&p->report, cx))
1358                 return (UNI_IE_REPORT);
1359         if((p->mdcr.h.present & UNI_IE_PRESENT) &&
1360            uni_encode_ie(UNI_IE_MDCR, msg, (union uni_ieall *)&p->mdcr, cx))
1361                 return (UNI_IE_MDCR);
1362         if((p->unrec.h.present & UNI_IE_PRESENT) &&
1363            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
1364                 return (UNI_IE_UNREC);
1365
1366         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
1367         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
1368
1369         return (0);
1370 }
1371
1372 static int
1373 decode_setup(struct uni_setup *out, struct uni_msg *msg,
1374     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
1375     struct unicx *cx)
1376 {
1377         u_int i;
1378
1379         switch (ie) {
1380
1381           case UNI_IE_AAL:
1382                 out->aal.h = *hdr;
1383                 if (hdr->present & UNI_IE_ERROR)
1384                         return (DEC_ERR);
1385                 if(uni_decode_ie_body(UNI_IE_AAL, (union uni_ieall *)&out->aal, msg, ielen, cx))
1386                         return (DEC_ERR);
1387                 break;
1388
1389           case UNI_IE_TRAFFIC:
1390                 out->traffic.h = *hdr;
1391                 if (hdr->present & UNI_IE_ERROR)
1392                         return (DEC_ERR);
1393                 if(uni_decode_ie_body(UNI_IE_TRAFFIC, (union uni_ieall *)&out->traffic, msg, ielen, cx))
1394                         return (DEC_ERR);
1395                 break;
1396
1397           case UNI_IE_BEARER:
1398                 out->bearer.h = *hdr;
1399                 if (hdr->present & UNI_IE_ERROR)
1400                         return (DEC_ERR);
1401                 if(uni_decode_ie_body(UNI_IE_BEARER, (union uni_ieall *)&out->bearer, msg, ielen, cx))
1402                         return (DEC_ERR);
1403                 break;
1404
1405           case UNI_IE_BHLI:
1406                 out->bhli.h = *hdr;
1407                 if (hdr->present & UNI_IE_ERROR)
1408                         return (DEC_ERR);
1409                 if(uni_decode_ie_body(UNI_IE_BHLI, (union uni_ieall *)&out->bhli, msg, ielen, cx))
1410                         return (DEC_ERR);
1411                 break;
1412
1413           case UNI_IE_BLLI:
1414                 if (IE_ISPRESENT(cx->repeat))
1415                         out->blli_repeat = cx->repeat;
1416                 for(i = 0; i < UNI_NUM_IE_BLLI; i++)
1417                         if (!IE_ISPRESENT(out->blli[i])) {
1418                                 out->blli[i].h = *hdr;
1419                                 if (hdr->present & UNI_IE_ERROR)
1420                                         return (DEC_ERR);
1421                                 if(uni_decode_ie_body(UNI_IE_BLLI, (union uni_ieall *)&out->blli[i], msg, ielen, cx))
1422                                         return (DEC_ERR);
1423                                 break;
1424                         }
1425                 break;
1426
1427           case UNI_IE_CALLED:
1428                 out->called.h = *hdr;
1429                 if (hdr->present & UNI_IE_ERROR)
1430                         return (DEC_ERR);
1431                 if(uni_decode_ie_body(UNI_IE_CALLED, (union uni_ieall *)&out->called, msg, ielen, cx))
1432                         return (DEC_ERR);
1433                 break;
1434
1435           case UNI_IE_CALLEDSUB:
1436                 for(i = 0; i < UNI_NUM_IE_CALLEDSUB; i++)
1437                         if (!IE_ISPRESENT(out->calledsub[i])) {
1438                                 out->calledsub[i].h = *hdr;
1439                                 if (hdr->present & UNI_IE_ERROR)
1440                                         return (DEC_ERR);
1441                                 if(uni_decode_ie_body(UNI_IE_CALLEDSUB, (union uni_ieall *)&out->calledsub[i], msg, ielen, cx))
1442                                         return (DEC_ERR);
1443                                 break;
1444                         }
1445                 break;
1446
1447           case UNI_IE_CALLING:
1448                 out->calling.h = *hdr;
1449                 if (hdr->present & UNI_IE_ERROR)
1450                         return (DEC_ERR);
1451                 if(uni_decode_ie_body(UNI_IE_CALLING, (union uni_ieall *)&out->calling, msg, ielen, cx))
1452                         return (DEC_ERR);
1453                 break;
1454
1455           case UNI_IE_CALLINGSUB:
1456                 for(i = 0; i < UNI_NUM_IE_CALLINGSUB; i++)
1457                         if (!IE_ISPRESENT(out->callingsub[i])) {
1458                                 out->callingsub[i].h = *hdr;
1459                                 if (hdr->present & UNI_IE_ERROR)
1460                                         return (DEC_ERR);
1461                                 if(uni_decode_ie_body(UNI_IE_CALLINGSUB, (union uni_ieall *)&out->callingsub[i], msg, ielen, cx))
1462                                         return (DEC_ERR);
1463                                 break;
1464                         }
1465                 break;
1466
1467           case UNI_IE_CONNID:
1468                 out->connid.h = *hdr;
1469                 if (hdr->present & UNI_IE_ERROR)
1470                         return (DEC_ERR);
1471                 if(uni_decode_ie_body(UNI_IE_CONNID, (union uni_ieall *)&out->connid, msg, ielen, cx))
1472                         return (DEC_ERR);
1473                 break;
1474
1475           case UNI_IE_QOS:
1476                 out->qos.h = *hdr;
1477                 if (hdr->present & UNI_IE_ERROR)
1478                         return (DEC_ERR);
1479                 if(uni_decode_ie_body(UNI_IE_QOS, (union uni_ieall *)&out->qos, msg, ielen, cx))
1480                         return (DEC_ERR);
1481                 break;
1482
1483           case UNI_IE_EETD:
1484                 out->eetd.h = *hdr;
1485                 if (hdr->present & UNI_IE_ERROR)
1486                         return (DEC_ERR);
1487                 if(uni_decode_ie_body(UNI_IE_EETD, (union uni_ieall *)&out->eetd, msg, ielen, cx))
1488                         return (DEC_ERR);
1489                 break;
1490
1491           case UNI_IE_NOTIFY:
1492                 out->notify.h = *hdr;
1493                 if (hdr->present & UNI_IE_ERROR)
1494                         return (DEC_ERR);
1495                 if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
1496                         return (DEC_ERR);
1497                 break;
1498
1499           case UNI_IE_SCOMPL:
1500                 if (!(!cx->pnni))
1501                         return (DEC_ILL);
1502                 out->scompl.h = *hdr;
1503                 if (hdr->present & UNI_IE_ERROR)
1504                         return (DEC_ERR);
1505                 if(uni_decode_ie_body(UNI_IE_SCOMPL, (union uni_ieall *)&out->scompl, msg, ielen, cx))
1506                         return (DEC_ERR);
1507                 break;
1508
1509           case UNI_IE_TNS:
1510                 for(i = 0; i < UNI_NUM_IE_TNS; i++)
1511                         if (!IE_ISPRESENT(out->tns[i])) {
1512                                 out->tns[i].h = *hdr;
1513                                 if (hdr->present & UNI_IE_ERROR)
1514                                         return (DEC_ERR);
1515                                 if(uni_decode_ie_body(UNI_IE_TNS, (union uni_ieall *)&out->tns[i], msg, ielen, cx))
1516                                         return (DEC_ERR);
1517                                 break;
1518                         }
1519                 break;
1520
1521           case UNI_IE_EPREF:
1522                 out->epref.h = *hdr;
1523                 if (hdr->present & UNI_IE_ERROR)
1524                         return (DEC_ERR);
1525                 if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
1526                         return (DEC_ERR);
1527                 break;
1528
1529           case UNI_IE_ATRAFFIC:
1530                 out->atraffic.h = *hdr;
1531                 if (hdr->present & UNI_IE_ERROR)
1532                         return (DEC_ERR);
1533                 if(uni_decode_ie_body(UNI_IE_ATRAFFIC, (union uni_ieall *)&out->atraffic, msg, ielen, cx))
1534                         return (DEC_ERR);
1535                 break;
1536
1537           case UNI_IE_MINTRAFFIC:
1538                 out->mintraffic.h = *hdr;
1539                 if (hdr->present & UNI_IE_ERROR)
1540                         return (DEC_ERR);
1541                 if(uni_decode_ie_body(UNI_IE_MINTRAFFIC, (union uni_ieall *)&out->mintraffic, msg, ielen, cx))
1542                         return (DEC_ERR);
1543                 break;
1544
1545           case UNI_IE_UU:
1546                 if (!(!cx->pnni))
1547                         return (DEC_ILL);
1548                 out->uu.h = *hdr;
1549                 if (hdr->present & UNI_IE_ERROR)
1550                         return (DEC_ERR);
1551                 if(uni_decode_ie_body(UNI_IE_UU, (union uni_ieall *)&out->uu, msg, ielen, cx))
1552                         return (DEC_ERR);
1553                 break;
1554
1555           case UNI_IE_GIT:
1556                 for(i = 0; i < UNI_NUM_IE_GIT; i++)
1557                         if (!IE_ISPRESENT(out->git[i])) {
1558                                 out->git[i].h = *hdr;
1559                                 if (hdr->present & UNI_IE_ERROR)
1560                                         return (DEC_ERR);
1561                                 if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
1562                                         return (DEC_ERR);
1563                                 break;
1564                         }
1565                 break;
1566
1567           case UNI_IE_LIJ_CALLID:
1568                 if (!(!cx->pnni))
1569                         return (DEC_ILL);
1570                 out->lij_callid.h = *hdr;
1571                 if (hdr->present & UNI_IE_ERROR)
1572                         return (DEC_ERR);
1573                 if(uni_decode_ie_body(UNI_IE_LIJ_CALLID, (union uni_ieall *)&out->lij_callid, msg, ielen, cx))
1574                         return (DEC_ERR);
1575                 break;
1576
1577           case UNI_IE_LIJ_PARAM:
1578                 if (!(!cx->pnni))
1579                         return (DEC_ILL);
1580                 out->lij_param.h = *hdr;
1581                 if (hdr->present & UNI_IE_ERROR)
1582                         return (DEC_ERR);
1583                 if(uni_decode_ie_body(UNI_IE_LIJ_PARAM, (union uni_ieall *)&out->lij_param, msg, ielen, cx))
1584                         return (DEC_ERR);
1585                 break;
1586
1587           case UNI_IE_LIJ_SEQNO:
1588                 if (!(!cx->pnni))
1589                         return (DEC_ILL);
1590                 out->lij_seqno.h = *hdr;
1591                 if (hdr->present & UNI_IE_ERROR)
1592                         return (DEC_ERR);
1593                 if(uni_decode_ie_body(UNI_IE_LIJ_SEQNO, (union uni_ieall *)&out->lij_seqno, msg, ielen, cx))
1594                         return (DEC_ERR);
1595                 break;
1596
1597           case UNI_IE_EXQOS:
1598                 out->exqos.h = *hdr;
1599                 if (hdr->present & UNI_IE_ERROR)
1600                         return (DEC_ERR);
1601                 if(uni_decode_ie_body(UNI_IE_EXQOS, (union uni_ieall *)&out->exqos, msg, ielen, cx))
1602                         return (DEC_ERR);
1603                 break;
1604
1605           case UNI_IE_ABRSETUP:
1606                 out->abrsetup.h = *hdr;
1607                 if (hdr->present & UNI_IE_ERROR)
1608                         return (DEC_ERR);
1609                 if(uni_decode_ie_body(UNI_IE_ABRSETUP, (union uni_ieall *)&out->abrsetup, msg, ielen, cx))
1610                         return (DEC_ERR);
1611                 break;
1612
1613           case UNI_IE_ABRADD:
1614                 out->abradd.h = *hdr;
1615                 if (hdr->present & UNI_IE_ERROR)
1616                         return (DEC_ERR);
1617                 if(uni_decode_ie_body(UNI_IE_ABRADD, (union uni_ieall *)&out->abradd, msg, ielen, cx))
1618                         return (DEC_ERR);
1619                 break;
1620
1621           case UNI_IE_CSCOPE:
1622                 out->cscope.h = *hdr;
1623                 if (hdr->present & UNI_IE_ERROR)
1624                         return (DEC_ERR);
1625                 if(uni_decode_ie_body(UNI_IE_CSCOPE, (union uni_ieall *)&out->cscope, msg, ielen, cx))
1626                         return (DEC_ERR);
1627                 break;
1628
1629           case UNI_IE_CALLING_SOFT:
1630                 if (!(cx->pnni))
1631                         return (DEC_ILL);
1632                 out->calling_soft.h = *hdr;
1633                 if (hdr->present & UNI_IE_ERROR)
1634                         return (DEC_ERR);
1635                 if(uni_decode_ie_body(UNI_IE_CALLING_SOFT, (union uni_ieall *)&out->calling_soft, msg, ielen, cx))
1636                         return (DEC_ERR);
1637                 break;
1638
1639           case UNI_IE_CALLED_SOFT:
1640                 if (!(cx->pnni))
1641                         return (DEC_ILL);
1642                 out->called_soft.h = *hdr;
1643                 if (hdr->present & UNI_IE_ERROR)
1644                         return (DEC_ERR);
1645                 if(uni_decode_ie_body(UNI_IE_CALLED_SOFT, (union uni_ieall *)&out->called_soft, msg, ielen, cx))
1646                         return (DEC_ERR);
1647                 break;
1648
1649           case UNI_IE_DTL:
1650                 if (!(cx->pnni))
1651                         return (DEC_ILL);
1652                 if (IE_ISPRESENT(cx->repeat))
1653                         out->dtl_repeat = cx->repeat;
1654                 for(i = 0; i < UNI_NUM_IE_DTL; i++)
1655                         if (!IE_ISPRESENT(out->dtl[i])) {
1656                                 out->dtl[i].h = *hdr;
1657                                 if (hdr->present & UNI_IE_ERROR)
1658                                         return (DEC_ERR);
1659                                 if(uni_decode_ie_body(UNI_IE_DTL, (union uni_ieall *)&out->dtl[i], msg, ielen, cx))
1660                                         return (DEC_ERR);
1661                                 break;
1662                         }
1663                 break;
1664
1665           case UNI_IE_REPORT:
1666                 if (!(!cx->pnni))
1667                         return (DEC_ILL);
1668                 out->report.h = *hdr;
1669                 if (hdr->present & UNI_IE_ERROR)
1670                         return (DEC_ERR);
1671                 if(uni_decode_ie_body(UNI_IE_REPORT, (union uni_ieall *)&out->report, msg, ielen, cx))
1672                         return (DEC_ERR);
1673                 break;
1674
1675           case UNI_IE_MDCR:
1676                 out->mdcr.h = *hdr;
1677                 if (hdr->present & UNI_IE_ERROR)
1678                         return (DEC_ERR);
1679                 if(uni_decode_ie_body(UNI_IE_MDCR, (union uni_ieall *)&out->mdcr, msg, ielen, cx))
1680                         return (DEC_ERR);
1681                 break;
1682
1683           case UNI_IE_UNREC:
1684                 out->unrec.h = *hdr;
1685                 if (hdr->present & UNI_IE_ERROR)
1686                         return (DEC_ERR);
1687                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
1688                         return (DEC_ERR);
1689                 break;
1690
1691           case UNI_IE_REPEAT:
1692                 cx->repeat.h = *hdr;
1693                 if (hdr->present & UNI_IE_ERROR)
1694                         return (DEC_ERR);
1695                 if (uni_decode_ie_body(UNI_IE_REPEAT, (union uni_ieall *)&cx->repeat, msg, ielen, cx))
1696                         return (DEC_ERR);
1697                 break;
1698
1699           default:
1700                 return (DEC_ILL);
1701         }
1702         return (DEC_OK);
1703 }
1704
1705 static const struct msgdecl decl_setup = {
1706         0,
1707         "setup",
1708         (uni_msg_print_f)print_setup,
1709         (uni_msg_check_f)check_setup,
1710         (uni_msg_encode_f)encode_setup,
1711         (uni_msg_decode_f)decode_setup
1712 };
1713
1714 static void
1715 print_status(struct uni_status *msg, struct unicx *cx)
1716 {
1717         if(msg->callstate.h.present & UNI_IE_PRESENT)
1718                 uni_print_ie_internal(UNI_IE_CALLSTATE, (union uni_ieall *)&msg->callstate, cx);
1719         if(msg->cause.h.present & UNI_IE_PRESENT)
1720                 uni_print_ie_internal(UNI_IE_CAUSE, (union uni_ieall *)&msg->cause, cx);
1721         if(msg->epref.h.present & UNI_IE_PRESENT)
1722                 uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
1723         if(msg->epstate.h.present & UNI_IE_PRESENT)
1724                 uni_print_ie_internal(UNI_IE_EPSTATE, (union uni_ieall *)&msg->epstate, cx);
1725         if(msg->unrec.h.present & UNI_IE_PRESENT)
1726                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
1727 }
1728
1729 static int
1730 check_status(struct uni_status *m, struct unicx *cx)
1731 {
1732         int ret = 0;
1733
1734         ret |= uni_check_ie(UNI_IE_CALLSTATE, (union uni_ieall *)&m->callstate, cx);
1735         ret |= uni_check_ie(UNI_IE_CAUSE, (union uni_ieall *)&m->cause, cx);
1736         ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
1737         ret |= uni_check_ie(UNI_IE_EPSTATE, (union uni_ieall *)&m->epstate, cx);
1738         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
1739
1740         return ret;
1741 }
1742
1743 static int
1744 encode_status(struct uni_msg *msg, struct uni_status *p, struct unicx *cx)
1745 {
1746         u_int mlen;
1747
1748         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_STATUS, cx, &mlen))
1749                 return (-2);
1750
1751         if((p->callstate.h.present & UNI_IE_PRESENT) &&
1752            uni_encode_ie(UNI_IE_CALLSTATE, msg, (union uni_ieall *)&p->callstate, cx))
1753                 return (UNI_IE_CALLSTATE);
1754         if((p->cause.h.present & UNI_IE_PRESENT) &&
1755            uni_encode_ie(UNI_IE_CAUSE, msg, (union uni_ieall *)&p->cause, cx))
1756                 return (UNI_IE_CAUSE);
1757         if((p->epref.h.present & UNI_IE_PRESENT) &&
1758            uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
1759                 return (UNI_IE_EPREF);
1760         if((p->epstate.h.present & UNI_IE_PRESENT) &&
1761            uni_encode_ie(UNI_IE_EPSTATE, msg, (union uni_ieall *)&p->epstate, cx))
1762                 return (UNI_IE_EPSTATE);
1763         if((p->unrec.h.present & UNI_IE_PRESENT) &&
1764            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
1765                 return (UNI_IE_UNREC);
1766
1767         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
1768         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
1769
1770         return (0);
1771 }
1772
1773 static int
1774 decode_status(struct uni_status *out, struct uni_msg *msg,
1775     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
1776     struct unicx *cx)
1777 {
1778         switch (ie) {
1779
1780           case UNI_IE_CALLSTATE:
1781                 out->callstate.h = *hdr;
1782                 if (hdr->present & UNI_IE_ERROR)
1783                         return (DEC_ERR);
1784                 if(uni_decode_ie_body(UNI_IE_CALLSTATE, (union uni_ieall *)&out->callstate, msg, ielen, cx))
1785                         return (DEC_ERR);
1786                 break;
1787
1788           case UNI_IE_CAUSE:
1789                 out->cause.h = *hdr;
1790                 if (hdr->present & UNI_IE_ERROR)
1791                         return (DEC_ERR);
1792                 if(uni_decode_ie_body(UNI_IE_CAUSE, (union uni_ieall *)&out->cause, msg, ielen, cx))
1793                         return (DEC_ERR);
1794                 break;
1795
1796           case UNI_IE_EPREF:
1797                 out->epref.h = *hdr;
1798                 if (hdr->present & UNI_IE_ERROR)
1799                         return (DEC_ERR);
1800                 if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
1801                         return (DEC_ERR);
1802                 break;
1803
1804           case UNI_IE_EPSTATE:
1805                 out->epstate.h = *hdr;
1806                 if (hdr->present & UNI_IE_ERROR)
1807                         return (DEC_ERR);
1808                 if(uni_decode_ie_body(UNI_IE_EPSTATE, (union uni_ieall *)&out->epstate, msg, ielen, cx))
1809                         return (DEC_ERR);
1810                 break;
1811
1812           case UNI_IE_UNREC:
1813                 out->unrec.h = *hdr;
1814                 if (hdr->present & UNI_IE_ERROR)
1815                         return (DEC_ERR);
1816                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
1817                         return (DEC_ERR);
1818                 break;
1819
1820           default:
1821                 return (DEC_ILL);
1822         }
1823         return (DEC_OK);
1824 }
1825
1826 static const struct msgdecl decl_status = {
1827         0,
1828         "status",
1829         (uni_msg_print_f)print_status,
1830         (uni_msg_check_f)check_status,
1831         (uni_msg_encode_f)encode_status,
1832         (uni_msg_decode_f)decode_status
1833 };
1834
1835 static void
1836 print_status_enq(struct uni_status_enq *msg, struct unicx *cx)
1837 {
1838         if(msg->epref.h.present & UNI_IE_PRESENT)
1839                 uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
1840         if(msg->unrec.h.present & UNI_IE_PRESENT)
1841                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
1842 }
1843
1844 static int
1845 check_status_enq(struct uni_status_enq *m, struct unicx *cx)
1846 {
1847         int ret = 0;
1848
1849         ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
1850         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
1851
1852         return ret;
1853 }
1854
1855 static int
1856 encode_status_enq(struct uni_msg *msg, struct uni_status_enq *p, struct unicx *cx)
1857 {
1858         u_int mlen;
1859
1860         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_STATUS_ENQ, cx, &mlen))
1861                 return (-2);
1862
1863         if((p->epref.h.present & UNI_IE_PRESENT) &&
1864            uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
1865                 return (UNI_IE_EPREF);
1866         if((p->unrec.h.present & UNI_IE_PRESENT) &&
1867            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
1868                 return (UNI_IE_UNREC);
1869
1870         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
1871         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
1872
1873         return (0);
1874 }
1875
1876 static int
1877 decode_status_enq(struct uni_status_enq *out, struct uni_msg *msg,
1878     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
1879     struct unicx *cx)
1880 {
1881         switch (ie) {
1882
1883           case UNI_IE_EPREF:
1884                 out->epref.h = *hdr;
1885                 if (hdr->present & UNI_IE_ERROR)
1886                         return (DEC_ERR);
1887                 if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
1888                         return (DEC_ERR);
1889                 break;
1890
1891           case UNI_IE_UNREC:
1892                 out->unrec.h = *hdr;
1893                 if (hdr->present & UNI_IE_ERROR)
1894                         return (DEC_ERR);
1895                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
1896                         return (DEC_ERR);
1897                 break;
1898
1899           default:
1900                 return (DEC_ILL);
1901         }
1902         return (DEC_OK);
1903 }
1904
1905 static const struct msgdecl decl_status_enq = {
1906         0,
1907         "status_enq",
1908         (uni_msg_print_f)print_status_enq,
1909         (uni_msg_check_f)check_status_enq,
1910         (uni_msg_encode_f)encode_status_enq,
1911         (uni_msg_decode_f)decode_status_enq
1912 };
1913
1914 static void
1915 print_notify(struct uni_notify *msg, struct unicx *cx)
1916 {
1917         if(msg->notify.h.present & UNI_IE_PRESENT)
1918                 uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
1919         if(msg->epref.h.present & UNI_IE_PRESENT)
1920                 uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
1921         if(msg->unrec.h.present & UNI_IE_PRESENT)
1922                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
1923 }
1924
1925 static int
1926 check_notify(struct uni_notify *m, struct unicx *cx)
1927 {
1928         int ret = 0;
1929
1930         ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
1931         ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
1932         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
1933
1934         return ret;
1935 }
1936
1937 static int
1938 encode_notify(struct uni_msg *msg, struct uni_notify *p, struct unicx *cx)
1939 {
1940         u_int mlen;
1941
1942         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_NOTIFY, cx, &mlen))
1943                 return (-2);
1944
1945         if((p->notify.h.present & UNI_IE_PRESENT) &&
1946            uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
1947                 return (UNI_IE_NOTIFY);
1948         if((p->epref.h.present & UNI_IE_PRESENT) &&
1949            uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
1950                 return (UNI_IE_EPREF);
1951         if((p->unrec.h.present & UNI_IE_PRESENT) &&
1952            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
1953                 return (UNI_IE_UNREC);
1954
1955         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
1956         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
1957
1958         return (0);
1959 }
1960
1961 static int
1962 decode_notify(struct uni_notify *out, struct uni_msg *msg,
1963     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
1964     struct unicx *cx)
1965 {
1966         switch (ie) {
1967
1968           case UNI_IE_NOTIFY:
1969                 out->notify.h = *hdr;
1970                 if (hdr->present & UNI_IE_ERROR)
1971                         return (DEC_ERR);
1972                 if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
1973                         return (DEC_ERR);
1974                 break;
1975
1976           case UNI_IE_EPREF:
1977                 out->epref.h = *hdr;
1978                 if (hdr->present & UNI_IE_ERROR)
1979                         return (DEC_ERR);
1980                 if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
1981                         return (DEC_ERR);
1982                 break;
1983
1984           case UNI_IE_UNREC:
1985                 out->unrec.h = *hdr;
1986                 if (hdr->present & UNI_IE_ERROR)
1987                         return (DEC_ERR);
1988                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
1989                         return (DEC_ERR);
1990                 break;
1991
1992           default:
1993                 return (DEC_ILL);
1994         }
1995         return (DEC_OK);
1996 }
1997
1998 static const struct msgdecl decl_notify = {
1999         0,
2000         "notify",
2001         (uni_msg_print_f)print_notify,
2002         (uni_msg_check_f)check_notify,
2003         (uni_msg_encode_f)encode_notify,
2004         (uni_msg_decode_f)decode_notify
2005 };
2006
2007 static void
2008 print_restart(struct uni_restart *msg, struct unicx *cx)
2009 {
2010         if(msg->connid.h.present & UNI_IE_PRESENT)
2011                 uni_print_ie_internal(UNI_IE_CONNID, (union uni_ieall *)&msg->connid, cx);
2012         if(msg->restart.h.present & UNI_IE_PRESENT)
2013                 uni_print_ie_internal(UNI_IE_RESTART, (union uni_ieall *)&msg->restart, cx);
2014         if(msg->unrec.h.present & UNI_IE_PRESENT)
2015                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
2016 }
2017
2018 static int
2019 check_restart(struct uni_restart *m, struct unicx *cx)
2020 {
2021         int ret = 0;
2022
2023         ret |= uni_check_ie(UNI_IE_CONNID, (union uni_ieall *)&m->connid, cx);
2024         ret |= uni_check_ie(UNI_IE_RESTART, (union uni_ieall *)&m->restart, cx);
2025         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
2026
2027         return ret;
2028 }
2029
2030 static int
2031 encode_restart(struct uni_msg *msg, struct uni_restart *p, struct unicx *cx)
2032 {
2033         u_int mlen;
2034
2035         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_RESTART, cx, &mlen))
2036                 return (-2);
2037
2038         if((p->connid.h.present & UNI_IE_PRESENT) &&
2039            uni_encode_ie(UNI_IE_CONNID, msg, (union uni_ieall *)&p->connid, cx))
2040                 return (UNI_IE_CONNID);
2041         if((p->restart.h.present & UNI_IE_PRESENT) &&
2042            uni_encode_ie(UNI_IE_RESTART, msg, (union uni_ieall *)&p->restart, cx))
2043                 return (UNI_IE_RESTART);
2044         if((p->unrec.h.present & UNI_IE_PRESENT) &&
2045            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
2046                 return (UNI_IE_UNREC);
2047
2048         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
2049         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
2050
2051         return (0);
2052 }
2053
2054 static int
2055 decode_restart(struct uni_restart *out, struct uni_msg *msg,
2056     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
2057     struct unicx *cx)
2058 {
2059         switch (ie) {
2060
2061           case UNI_IE_CONNID:
2062                 out->connid.h = *hdr;
2063                 if (hdr->present & UNI_IE_ERROR)
2064                         return (DEC_ERR);
2065                 if(uni_decode_ie_body(UNI_IE_CONNID, (union uni_ieall *)&out->connid, msg, ielen, cx))
2066                         return (DEC_ERR);
2067                 break;
2068
2069           case UNI_IE_RESTART:
2070                 out->restart.h = *hdr;
2071                 if (hdr->present & UNI_IE_ERROR)
2072                         return (DEC_ERR);
2073                 if(uni_decode_ie_body(UNI_IE_RESTART, (union uni_ieall *)&out->restart, msg, ielen, cx))
2074                         return (DEC_ERR);
2075                 break;
2076
2077           case UNI_IE_UNREC:
2078                 out->unrec.h = *hdr;
2079                 if (hdr->present & UNI_IE_ERROR)
2080                         return (DEC_ERR);
2081                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
2082                         return (DEC_ERR);
2083                 break;
2084
2085           default:
2086                 return (DEC_ILL);
2087         }
2088         return (DEC_OK);
2089 }
2090
2091 static const struct msgdecl decl_restart = {
2092         0,
2093         "restart",
2094         (uni_msg_print_f)print_restart,
2095         (uni_msg_check_f)check_restart,
2096         (uni_msg_encode_f)encode_restart,
2097         (uni_msg_decode_f)decode_restart
2098 };
2099
2100 static void
2101 print_restart_ack(struct uni_restart_ack *msg, struct unicx *cx)
2102 {
2103         if(msg->connid.h.present & UNI_IE_PRESENT)
2104                 uni_print_ie_internal(UNI_IE_CONNID, (union uni_ieall *)&msg->connid, cx);
2105         if(msg->restart.h.present & UNI_IE_PRESENT)
2106                 uni_print_ie_internal(UNI_IE_RESTART, (union uni_ieall *)&msg->restart, cx);
2107         if(msg->unrec.h.present & UNI_IE_PRESENT)
2108                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
2109 }
2110
2111 static int
2112 check_restart_ack(struct uni_restart_ack *m, struct unicx *cx)
2113 {
2114         int ret = 0;
2115
2116         ret |= uni_check_ie(UNI_IE_CONNID, (union uni_ieall *)&m->connid, cx);
2117         ret |= uni_check_ie(UNI_IE_RESTART, (union uni_ieall *)&m->restart, cx);
2118         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
2119
2120         return ret;
2121 }
2122
2123 static int
2124 encode_restart_ack(struct uni_msg *msg, struct uni_restart_ack *p, struct unicx *cx)
2125 {
2126         u_int mlen;
2127
2128         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_RESTART_ACK, cx, &mlen))
2129                 return (-2);
2130
2131         if((p->connid.h.present & UNI_IE_PRESENT) &&
2132            uni_encode_ie(UNI_IE_CONNID, msg, (union uni_ieall *)&p->connid, cx))
2133                 return (UNI_IE_CONNID);
2134         if((p->restart.h.present & UNI_IE_PRESENT) &&
2135            uni_encode_ie(UNI_IE_RESTART, msg, (union uni_ieall *)&p->restart, cx))
2136                 return (UNI_IE_RESTART);
2137         if((p->unrec.h.present & UNI_IE_PRESENT) &&
2138            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
2139                 return (UNI_IE_UNREC);
2140
2141         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
2142         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
2143
2144         return (0);
2145 }
2146
2147 static int
2148 decode_restart_ack(struct uni_restart_ack *out, struct uni_msg *msg,
2149     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
2150     struct unicx *cx)
2151 {
2152         switch (ie) {
2153
2154           case UNI_IE_CONNID:
2155                 out->connid.h = *hdr;
2156                 if (hdr->present & UNI_IE_ERROR)
2157                         return (DEC_ERR);
2158                 if(uni_decode_ie_body(UNI_IE_CONNID, (union uni_ieall *)&out->connid, msg, ielen, cx))
2159                         return (DEC_ERR);
2160                 break;
2161
2162           case UNI_IE_RESTART:
2163                 out->restart.h = *hdr;
2164                 if (hdr->present & UNI_IE_ERROR)
2165                         return (DEC_ERR);
2166                 if(uni_decode_ie_body(UNI_IE_RESTART, (union uni_ieall *)&out->restart, msg, ielen, cx))
2167                         return (DEC_ERR);
2168                 break;
2169
2170           case UNI_IE_UNREC:
2171                 out->unrec.h = *hdr;
2172                 if (hdr->present & UNI_IE_ERROR)
2173                         return (DEC_ERR);
2174                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
2175                         return (DEC_ERR);
2176                 break;
2177
2178           default:
2179                 return (DEC_ILL);
2180         }
2181         return (DEC_OK);
2182 }
2183
2184 static const struct msgdecl decl_restart_ack = {
2185         0,
2186         "restart_ack",
2187         (uni_msg_print_f)print_restart_ack,
2188         (uni_msg_check_f)check_restart_ack,
2189         (uni_msg_encode_f)encode_restart_ack,
2190         (uni_msg_decode_f)decode_restart_ack
2191 };
2192
2193 static void
2194 print_add_party(struct uni_add_party *msg, struct unicx *cx)
2195 {
2196         u_int i;
2197
2198         if(msg->aal.h.present & UNI_IE_PRESENT)
2199                 uni_print_ie_internal(UNI_IE_AAL, (union uni_ieall *)&msg->aal, cx);
2200         if(msg->bhli.h.present & UNI_IE_PRESENT)
2201                 uni_print_ie_internal(UNI_IE_BHLI, (union uni_ieall *)&msg->bhli, cx);
2202         if(msg->blli.h.present & UNI_IE_PRESENT)
2203                 uni_print_ie_internal(UNI_IE_BLLI, (union uni_ieall *)&msg->blli, cx);
2204         if(msg->called.h.present & UNI_IE_PRESENT)
2205                 uni_print_ie_internal(UNI_IE_CALLED, (union uni_ieall *)&msg->called, cx);
2206         for(i = 0; i < UNI_NUM_IE_CALLEDSUB; i++)
2207                 if(msg->calledsub[i].h.present & UNI_IE_PRESENT)
2208                         uni_print_ie_internal(UNI_IE_CALLEDSUB, (union uni_ieall *)&msg->calledsub[i], cx);
2209         if(msg->calling.h.present & UNI_IE_PRESENT)
2210                 uni_print_ie_internal(UNI_IE_CALLING, (union uni_ieall *)&msg->calling, cx);
2211         for(i = 0; i < UNI_NUM_IE_CALLINGSUB; i++)
2212                 if(msg->callingsub[i].h.present & UNI_IE_PRESENT)
2213                         uni_print_ie_internal(UNI_IE_CALLINGSUB, (union uni_ieall *)&msg->callingsub[i], cx);
2214         if(msg->scompl.h.present & UNI_IE_PRESENT)
2215                 uni_print_ie_internal(UNI_IE_SCOMPL, (union uni_ieall *)&msg->scompl, cx);
2216         for(i = 0; i < UNI_NUM_IE_TNS; i++)
2217                 if(msg->tns[i].h.present & UNI_IE_PRESENT)
2218                         uni_print_ie_internal(UNI_IE_TNS, (union uni_ieall *)&msg->tns[i], cx);
2219         if(msg->epref.h.present & UNI_IE_PRESENT)
2220                 uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
2221         if(msg->notify.h.present & UNI_IE_PRESENT)
2222                 uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
2223         if(msg->eetd.h.present & UNI_IE_PRESENT)
2224                 uni_print_ie_internal(UNI_IE_EETD, (union uni_ieall *)&msg->eetd, cx);
2225         if(msg->uu.h.present & UNI_IE_PRESENT)
2226                 uni_print_ie_internal(UNI_IE_UU, (union uni_ieall *)&msg->uu, cx);
2227         for(i = 0; i < UNI_NUM_IE_GIT; i++)
2228                 if(msg->git[i].h.present & UNI_IE_PRESENT)
2229                         uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
2230         if(msg->lij_seqno.h.present & UNI_IE_PRESENT)
2231                 uni_print_ie_internal(UNI_IE_LIJ_SEQNO, (union uni_ieall *)&msg->lij_seqno, cx);
2232         if(msg->calling_soft.h.present & UNI_IE_PRESENT)
2233                 uni_print_ie_internal(UNI_IE_CALLING_SOFT, (union uni_ieall *)&msg->calling_soft, cx);
2234         if(msg->called_soft.h.present & UNI_IE_PRESENT)
2235                 uni_print_ie_internal(UNI_IE_CALLED_SOFT, (union uni_ieall *)&msg->called_soft, cx);
2236         if(msg->dtl_repeat.h.present & UNI_IE_PRESENT)
2237                 uni_print_ie_internal(UNI_IE_REPEAT, (union uni_ieall *)&msg->dtl_repeat, cx);
2238         for(i = 0; i < UNI_NUM_IE_DTL; i++)
2239                 if(msg->dtl[i].h.present & UNI_IE_PRESENT)
2240                         uni_print_ie_internal(UNI_IE_DTL, (union uni_ieall *)&msg->dtl[i], cx);
2241         if(msg->unrec.h.present & UNI_IE_PRESENT)
2242                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
2243 }
2244
2245 static int
2246 check_add_party(struct uni_add_party *m, struct unicx *cx)
2247 {
2248         int ret = 0;
2249         u_int i;
2250
2251         ret |= uni_check_ie(UNI_IE_AAL, (union uni_ieall *)&m->aal, cx);
2252         ret |= uni_check_ie(UNI_IE_BHLI, (union uni_ieall *)&m->bhli, cx);
2253         ret |= uni_check_ie(UNI_IE_BLLI, (union uni_ieall *)&m->blli, cx);
2254         ret |= uni_check_ie(UNI_IE_CALLED, (union uni_ieall *)&m->called, cx);
2255         for(i = 0; i < UNI_NUM_IE_CALLEDSUB ; i++) {
2256                 ret |= uni_check_ie(UNI_IE_CALLEDSUB, (union uni_ieall *)&m->calledsub[i], cx);
2257         }
2258         ret |= uni_check_ie(UNI_IE_CALLING, (union uni_ieall *)&m->calling, cx);
2259         for(i = 0; i < UNI_NUM_IE_CALLINGSUB ; i++) {
2260                 ret |= uni_check_ie(UNI_IE_CALLINGSUB, (union uni_ieall *)&m->callingsub[i], cx);
2261         }
2262         if(!(!cx->pnni))
2263                 ret |= IE_ISPRESENT(m->scompl);
2264         else
2265                 ret |= uni_check_ie(UNI_IE_SCOMPL, (union uni_ieall *)&m->scompl, cx);
2266         for(i = 0; i < UNI_NUM_IE_TNS ; i++) {
2267                 ret |= uni_check_ie(UNI_IE_TNS, (union uni_ieall *)&m->tns[i], cx);
2268         }
2269         ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
2270         ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
2271         ret |= uni_check_ie(UNI_IE_EETD, (union uni_ieall *)&m->eetd, cx);
2272         if(!(!cx->pnni))
2273                 ret |= IE_ISPRESENT(m->uu);
2274         else
2275                 ret |= uni_check_ie(UNI_IE_UU, (union uni_ieall *)&m->uu, cx);
2276         for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
2277                 ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
2278         }
2279         if(!(!cx->pnni))
2280                 ret |= IE_ISPRESENT(m->lij_seqno);
2281         else
2282                 ret |= uni_check_ie(UNI_IE_LIJ_SEQNO, (union uni_ieall *)&m->lij_seqno, cx);
2283         if(!(cx->pnni))
2284                 ret |= IE_ISPRESENT(m->calling_soft);
2285         else
2286                 ret |= uni_check_ie(UNI_IE_CALLING_SOFT, (union uni_ieall *)&m->calling_soft, cx);
2287         if(!(cx->pnni))
2288                 ret |= IE_ISPRESENT(m->called_soft);
2289         else
2290                 ret |= uni_check_ie(UNI_IE_CALLED_SOFT, (union uni_ieall *)&m->called_soft, cx);
2291         if(!(cx->pnni))
2292                 ret |= IE_ISPRESENT(m->dtl_repeat);
2293         else
2294                 ret |= uni_check_ie(UNI_IE_REPEAT, (union uni_ieall *)&m->dtl_repeat, cx);
2295         for(i = 0; i < UNI_NUM_IE_DTL ; i++) {
2296                 if(!(cx->pnni))
2297                         ret |= IE_ISPRESENT(m->dtl[i]);
2298                 else
2299                         ret |= uni_check_ie(UNI_IE_DTL, (union uni_ieall *)&m->dtl[i], cx);
2300         }
2301         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
2302
2303         return ret;
2304 }
2305
2306 static int
2307 encode_add_party(struct uni_msg *msg, struct uni_add_party *p, struct unicx *cx)
2308 {
2309         u_int mlen;
2310         u_int i;
2311
2312         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_ADD_PARTY, cx, &mlen))
2313                 return (-2);
2314
2315         if((p->aal.h.present & UNI_IE_PRESENT) &&
2316            uni_encode_ie(UNI_IE_AAL, msg, (union uni_ieall *)&p->aal, cx))
2317                 return (UNI_IE_AAL);
2318         if((p->bhli.h.present & UNI_IE_PRESENT) &&
2319            uni_encode_ie(UNI_IE_BHLI, msg, (union uni_ieall *)&p->bhli, cx))
2320                 return (UNI_IE_BHLI);
2321         if((p->blli.h.present & UNI_IE_PRESENT) &&
2322            uni_encode_ie(UNI_IE_BLLI, msg, (union uni_ieall *)&p->blli, cx))
2323                 return (UNI_IE_BLLI);
2324         if((p->called.h.present & UNI_IE_PRESENT) &&
2325            uni_encode_ie(UNI_IE_CALLED, msg, (union uni_ieall *)&p->called, cx))
2326                 return (UNI_IE_CALLED);
2327         for(i = 0; i < UNI_NUM_IE_CALLEDSUB; i++)
2328                 if((p->calledsub[i].h.present & UNI_IE_PRESENT) &&
2329                    uni_encode_ie(UNI_IE_CALLEDSUB, msg, (union uni_ieall *)&p->calledsub[i], cx))
2330                 return ((i << 16) + UNI_IE_CALLEDSUB);
2331         if((p->calling.h.present & UNI_IE_PRESENT) &&
2332            uni_encode_ie(UNI_IE_CALLING, msg, (union uni_ieall *)&p->calling, cx))
2333                 return (UNI_IE_CALLING);
2334         for(i = 0; i < UNI_NUM_IE_CALLINGSUB; i++)
2335                 if((p->callingsub[i].h.present & UNI_IE_PRESENT) &&
2336                    uni_encode_ie(UNI_IE_CALLINGSUB, msg, (union uni_ieall *)&p->callingsub[i], cx))
2337                 return ((i << 16) + UNI_IE_CALLINGSUB);
2338         if((p->scompl.h.present & UNI_IE_PRESENT) &&
2339            uni_encode_ie(UNI_IE_SCOMPL, msg, (union uni_ieall *)&p->scompl, cx))
2340                 return (UNI_IE_SCOMPL);
2341         for(i = 0; i < UNI_NUM_IE_TNS; i++)
2342                 if((p->tns[i].h.present & UNI_IE_PRESENT) &&
2343                    uni_encode_ie(UNI_IE_TNS, msg, (union uni_ieall *)&p->tns[i], cx))
2344                 return ((i << 16) + UNI_IE_TNS);
2345         if((p->epref.h.present & UNI_IE_PRESENT) &&
2346            uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
2347                 return (UNI_IE_EPREF);
2348         if((p->notify.h.present & UNI_IE_PRESENT) &&
2349            uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
2350                 return (UNI_IE_NOTIFY);
2351         if((p->eetd.h.present & UNI_IE_PRESENT) &&
2352            uni_encode_ie(UNI_IE_EETD, msg, (union uni_ieall *)&p->eetd, cx))
2353                 return (UNI_IE_EETD);
2354         if((p->uu.h.present & UNI_IE_PRESENT) &&
2355            uni_encode_ie(UNI_IE_UU, msg, (union uni_ieall *)&p->uu, cx))
2356                 return (UNI_IE_UU);
2357         for(i = 0; i < UNI_NUM_IE_GIT; i++)
2358                 if((p->git[i].h.present & UNI_IE_PRESENT) &&
2359                    uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
2360                 return ((i << 16) + UNI_IE_GIT);
2361         if((p->lij_seqno.h.present & UNI_IE_PRESENT) &&
2362            uni_encode_ie(UNI_IE_LIJ_SEQNO, msg, (union uni_ieall *)&p->lij_seqno, cx))
2363                 return (UNI_IE_LIJ_SEQNO);
2364         if((p->calling_soft.h.present & UNI_IE_PRESENT) &&
2365            uni_encode_ie(UNI_IE_CALLING_SOFT, msg, (union uni_ieall *)&p->calling_soft, cx))
2366                 return (UNI_IE_CALLING_SOFT);
2367         if((p->called_soft.h.present & UNI_IE_PRESENT) &&
2368            uni_encode_ie(UNI_IE_CALLED_SOFT, msg, (union uni_ieall *)&p->called_soft, cx))
2369                 return (UNI_IE_CALLED_SOFT);
2370         if((p->dtl_repeat.h.present & UNI_IE_PRESENT) &&
2371            uni_encode_ie(UNI_IE_DTL, msg, (union uni_ieall *)&p->dtl_repeat, cx))
2372                 return (0x10000000 + UNI_IE_DTL);
2373         for(i = 0; i < UNI_NUM_IE_DTL; i++)
2374                 if((p->dtl[i].h.present & UNI_IE_PRESENT) &&
2375                    uni_encode_ie(UNI_IE_DTL, msg, (union uni_ieall *)&p->dtl[i], cx))
2376                 return ((i << 16) + UNI_IE_DTL);
2377         if((p->unrec.h.present & UNI_IE_PRESENT) &&
2378            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
2379                 return (UNI_IE_UNREC);
2380
2381         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
2382         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
2383
2384         return (0);
2385 }
2386
2387 static int
2388 decode_add_party(struct uni_add_party *out, struct uni_msg *msg,
2389     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
2390     struct unicx *cx)
2391 {
2392         u_int i;
2393
2394         switch (ie) {
2395
2396           case UNI_IE_AAL:
2397                 out->aal.h = *hdr;
2398                 if (hdr->present & UNI_IE_ERROR)
2399                         return (DEC_ERR);
2400                 if(uni_decode_ie_body(UNI_IE_AAL, (union uni_ieall *)&out->aal, msg, ielen, cx))
2401                         return (DEC_ERR);
2402                 break;
2403
2404           case UNI_IE_BHLI:
2405                 out->bhli.h = *hdr;
2406                 if (hdr->present & UNI_IE_ERROR)
2407                         return (DEC_ERR);
2408                 if(uni_decode_ie_body(UNI_IE_BHLI, (union uni_ieall *)&out->bhli, msg, ielen, cx))
2409                         return (DEC_ERR);
2410                 break;
2411
2412           case UNI_IE_BLLI:
2413                 out->blli.h = *hdr;
2414                 if (hdr->present & UNI_IE_ERROR)
2415                         return (DEC_ERR);
2416                 if(uni_decode_ie_body(UNI_IE_BLLI, (union uni_ieall *)&out->blli, msg, ielen, cx))
2417                         return (DEC_ERR);
2418                 break;
2419
2420           case UNI_IE_CALLED:
2421                 out->called.h = *hdr;
2422                 if (hdr->present & UNI_IE_ERROR)
2423                         return (DEC_ERR);
2424                 if(uni_decode_ie_body(UNI_IE_CALLED, (union uni_ieall *)&out->called, msg, ielen, cx))
2425                         return (DEC_ERR);
2426                 break;
2427
2428           case UNI_IE_CALLEDSUB:
2429                 for(i = 0; i < UNI_NUM_IE_CALLEDSUB; i++)
2430                         if (!IE_ISPRESENT(out->calledsub[i])) {
2431                                 out->calledsub[i].h = *hdr;
2432                                 if (hdr->present & UNI_IE_ERROR)
2433                                         return (DEC_ERR);
2434                                 if(uni_decode_ie_body(UNI_IE_CALLEDSUB, (union uni_ieall *)&out->calledsub[i], msg, ielen, cx))
2435                                         return (DEC_ERR);
2436                                 break;
2437                         }
2438                 break;
2439
2440           case UNI_IE_CALLING:
2441                 out->calling.h = *hdr;
2442                 if (hdr->present & UNI_IE_ERROR)
2443                         return (DEC_ERR);
2444                 if(uni_decode_ie_body(UNI_IE_CALLING, (union uni_ieall *)&out->calling, msg, ielen, cx))
2445                         return (DEC_ERR);
2446                 break;
2447
2448           case UNI_IE_CALLINGSUB:
2449                 for(i = 0; i < UNI_NUM_IE_CALLINGSUB; i++)
2450                         if (!IE_ISPRESENT(out->callingsub[i])) {
2451                                 out->callingsub[i].h = *hdr;
2452                                 if (hdr->present & UNI_IE_ERROR)
2453                                         return (DEC_ERR);
2454                                 if(uni_decode_ie_body(UNI_IE_CALLINGSUB, (union uni_ieall *)&out->callingsub[i], msg, ielen, cx))
2455                                         return (DEC_ERR);
2456                                 break;
2457                         }
2458                 break;
2459
2460           case UNI_IE_SCOMPL:
2461                 if (!(!cx->pnni))
2462                         return (DEC_ILL);
2463                 out->scompl.h = *hdr;
2464                 if (hdr->present & UNI_IE_ERROR)
2465                         return (DEC_ERR);
2466                 if(uni_decode_ie_body(UNI_IE_SCOMPL, (union uni_ieall *)&out->scompl, msg, ielen, cx))
2467                         return (DEC_ERR);
2468                 break;
2469
2470           case UNI_IE_TNS:
2471                 for(i = 0; i < UNI_NUM_IE_TNS; i++)
2472                         if (!IE_ISPRESENT(out->tns[i])) {
2473                                 out->tns[i].h = *hdr;
2474                                 if (hdr->present & UNI_IE_ERROR)
2475                                         return (DEC_ERR);
2476                                 if(uni_decode_ie_body(UNI_IE_TNS, (union uni_ieall *)&out->tns[i], msg, ielen, cx))
2477                                         return (DEC_ERR);
2478                                 break;
2479                         }
2480                 break;
2481
2482           case UNI_IE_EPREF:
2483                 out->epref.h = *hdr;
2484                 if (hdr->present & UNI_IE_ERROR)
2485                         return (DEC_ERR);
2486                 if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
2487                         return (DEC_ERR);
2488                 break;
2489
2490           case UNI_IE_NOTIFY:
2491                 out->notify.h = *hdr;
2492                 if (hdr->present & UNI_IE_ERROR)
2493                         return (DEC_ERR);
2494                 if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
2495                         return (DEC_ERR);
2496                 break;
2497
2498           case UNI_IE_EETD:
2499                 out->eetd.h = *hdr;
2500                 if (hdr->present & UNI_IE_ERROR)
2501                         return (DEC_ERR);
2502                 if(uni_decode_ie_body(UNI_IE_EETD, (union uni_ieall *)&out->eetd, msg, ielen, cx))
2503                         return (DEC_ERR);
2504                 break;
2505
2506           case UNI_IE_UU:
2507                 if (!(!cx->pnni))
2508                         return (DEC_ILL);
2509                 out->uu.h = *hdr;
2510                 if (hdr->present & UNI_IE_ERROR)
2511                         return (DEC_ERR);
2512                 if(uni_decode_ie_body(UNI_IE_UU, (union uni_ieall *)&out->uu, msg, ielen, cx))
2513                         return (DEC_ERR);
2514                 break;
2515
2516           case UNI_IE_GIT:
2517                 for(i = 0; i < UNI_NUM_IE_GIT; i++)
2518                         if (!IE_ISPRESENT(out->git[i])) {
2519                                 out->git[i].h = *hdr;
2520                                 if (hdr->present & UNI_IE_ERROR)
2521                                         return (DEC_ERR);
2522                                 if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
2523                                         return (DEC_ERR);
2524                                 break;
2525                         }
2526                 break;
2527
2528           case UNI_IE_LIJ_SEQNO:
2529                 if (!(!cx->pnni))
2530                         return (DEC_ILL);
2531                 out->lij_seqno.h = *hdr;
2532                 if (hdr->present & UNI_IE_ERROR)
2533                         return (DEC_ERR);
2534                 if(uni_decode_ie_body(UNI_IE_LIJ_SEQNO, (union uni_ieall *)&out->lij_seqno, msg, ielen, cx))
2535                         return (DEC_ERR);
2536                 break;
2537
2538           case UNI_IE_CALLING_SOFT:
2539                 if (!(cx->pnni))
2540                         return (DEC_ILL);
2541                 out->calling_soft.h = *hdr;
2542                 if (hdr->present & UNI_IE_ERROR)
2543                         return (DEC_ERR);
2544                 if(uni_decode_ie_body(UNI_IE_CALLING_SOFT, (union uni_ieall *)&out->calling_soft, msg, ielen, cx))
2545                         return (DEC_ERR);
2546                 break;
2547
2548           case UNI_IE_CALLED_SOFT:
2549                 if (!(cx->pnni))
2550                         return (DEC_ILL);
2551                 out->called_soft.h = *hdr;
2552                 if (hdr->present & UNI_IE_ERROR)
2553                         return (DEC_ERR);
2554                 if(uni_decode_ie_body(UNI_IE_CALLED_SOFT, (union uni_ieall *)&out->called_soft, msg, ielen, cx))
2555                         return (DEC_ERR);
2556                 break;
2557
2558           case UNI_IE_DTL:
2559                 if (!(cx->pnni))
2560                         return (DEC_ILL);
2561                 if (IE_ISPRESENT(cx->repeat))
2562                         out->dtl_repeat = cx->repeat;
2563                 for(i = 0; i < UNI_NUM_IE_DTL; i++)
2564                         if (!IE_ISPRESENT(out->dtl[i])) {
2565                                 out->dtl[i].h = *hdr;
2566                                 if (hdr->present & UNI_IE_ERROR)
2567                                         return (DEC_ERR);
2568                                 if(uni_decode_ie_body(UNI_IE_DTL, (union uni_ieall *)&out->dtl[i], msg, ielen, cx))
2569                                         return (DEC_ERR);
2570                                 break;
2571                         }
2572                 break;
2573
2574           case UNI_IE_UNREC:
2575                 out->unrec.h = *hdr;
2576                 if (hdr->present & UNI_IE_ERROR)
2577                         return (DEC_ERR);
2578                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
2579                         return (DEC_ERR);
2580                 break;
2581
2582           case UNI_IE_REPEAT:
2583                 cx->repeat.h = *hdr;
2584                 if (hdr->present & UNI_IE_ERROR)
2585                         return (DEC_ERR);
2586                 if (uni_decode_ie_body(UNI_IE_REPEAT, (union uni_ieall *)&cx->repeat, msg, ielen, cx))
2587                         return (DEC_ERR);
2588                 break;
2589
2590           default:
2591                 return (DEC_ILL);
2592         }
2593         return (DEC_OK);
2594 }
2595
2596 static const struct msgdecl decl_add_party = {
2597         0,
2598         "add_party",
2599         (uni_msg_print_f)print_add_party,
2600         (uni_msg_check_f)check_add_party,
2601         (uni_msg_encode_f)encode_add_party,
2602         (uni_msg_decode_f)decode_add_party
2603 };
2604
2605 static void
2606 print_add_party_ack(struct uni_add_party_ack *msg, struct unicx *cx)
2607 {
2608         u_int i;
2609
2610         if(msg->epref.h.present & UNI_IE_PRESENT)
2611                 uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
2612         if(msg->aal.h.present & UNI_IE_PRESENT)
2613                 uni_print_ie_internal(UNI_IE_AAL, (union uni_ieall *)&msg->aal, cx);
2614         if(msg->blli.h.present & UNI_IE_PRESENT)
2615                 uni_print_ie_internal(UNI_IE_BLLI, (union uni_ieall *)&msg->blli, cx);
2616         if(msg->notify.h.present & UNI_IE_PRESENT)
2617                 uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
2618         if(msg->eetd.h.present & UNI_IE_PRESENT)
2619                 uni_print_ie_internal(UNI_IE_EETD, (union uni_ieall *)&msg->eetd, cx);
2620         if(msg->conned.h.present & UNI_IE_PRESENT)
2621                 uni_print_ie_internal(UNI_IE_CONNED, (union uni_ieall *)&msg->conned, cx);
2622         if(msg->connedsub.h.present & UNI_IE_PRESENT)
2623                 uni_print_ie_internal(UNI_IE_CONNEDSUB, (union uni_ieall *)&msg->connedsub, cx);
2624         if(msg->uu.h.present & UNI_IE_PRESENT)
2625                 uni_print_ie_internal(UNI_IE_UU, (union uni_ieall *)&msg->uu, cx);
2626         for(i = 0; i < UNI_NUM_IE_GIT; i++)
2627                 if(msg->git[i].h.present & UNI_IE_PRESENT)
2628                         uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
2629         if(msg->called_soft.h.present & UNI_IE_PRESENT)
2630                 uni_print_ie_internal(UNI_IE_CALLED_SOFT, (union uni_ieall *)&msg->called_soft, cx);
2631         if(msg->unrec.h.present & UNI_IE_PRESENT)
2632                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
2633 }
2634
2635 static int
2636 check_add_party_ack(struct uni_add_party_ack *m, struct unicx *cx)
2637 {
2638         int ret = 0;
2639         u_int i;
2640
2641         ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
2642         ret |= uni_check_ie(UNI_IE_AAL, (union uni_ieall *)&m->aal, cx);
2643         ret |= uni_check_ie(UNI_IE_BLLI, (union uni_ieall *)&m->blli, cx);
2644         ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
2645         ret |= uni_check_ie(UNI_IE_EETD, (union uni_ieall *)&m->eetd, cx);
2646         ret |= uni_check_ie(UNI_IE_CONNED, (union uni_ieall *)&m->conned, cx);
2647         ret |= uni_check_ie(UNI_IE_CONNEDSUB, (union uni_ieall *)&m->connedsub, cx);
2648         if(!(!cx->pnni))
2649                 ret |= IE_ISPRESENT(m->uu);
2650         else
2651                 ret |= uni_check_ie(UNI_IE_UU, (union uni_ieall *)&m->uu, cx);
2652         for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
2653                 ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
2654         }
2655         if(!(cx->pnni))
2656                 ret |= IE_ISPRESENT(m->called_soft);
2657         else
2658                 ret |= uni_check_ie(UNI_IE_CALLED_SOFT, (union uni_ieall *)&m->called_soft, cx);
2659         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
2660
2661         return ret;
2662 }
2663
2664 static int
2665 encode_add_party_ack(struct uni_msg *msg, struct uni_add_party_ack *p, struct unicx *cx)
2666 {
2667         u_int mlen;
2668         u_int i;
2669
2670         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_ADD_PARTY_ACK, cx, &mlen))
2671                 return (-2);
2672
2673         if((p->epref.h.present & UNI_IE_PRESENT) &&
2674            uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
2675                 return (UNI_IE_EPREF);
2676         if((p->aal.h.present & UNI_IE_PRESENT) &&
2677            uni_encode_ie(UNI_IE_AAL, msg, (union uni_ieall *)&p->aal, cx))
2678                 return (UNI_IE_AAL);
2679         if((p->blli.h.present & UNI_IE_PRESENT) &&
2680            uni_encode_ie(UNI_IE_BLLI, msg, (union uni_ieall *)&p->blli, cx))
2681                 return (UNI_IE_BLLI);
2682         if((p->notify.h.present & UNI_IE_PRESENT) &&
2683            uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
2684                 return (UNI_IE_NOTIFY);
2685         if((p->eetd.h.present & UNI_IE_PRESENT) &&
2686            uni_encode_ie(UNI_IE_EETD, msg, (union uni_ieall *)&p->eetd, cx))
2687                 return (UNI_IE_EETD);
2688         if((p->conned.h.present & UNI_IE_PRESENT) &&
2689            uni_encode_ie(UNI_IE_CONNED, msg, (union uni_ieall *)&p->conned, cx))
2690                 return (UNI_IE_CONNED);
2691         if((p->connedsub.h.present & UNI_IE_PRESENT) &&
2692            uni_encode_ie(UNI_IE_CONNEDSUB, msg, (union uni_ieall *)&p->connedsub, cx))
2693                 return (UNI_IE_CONNEDSUB);
2694         if((p->uu.h.present & UNI_IE_PRESENT) &&
2695            uni_encode_ie(UNI_IE_UU, msg, (union uni_ieall *)&p->uu, cx))
2696                 return (UNI_IE_UU);
2697         for(i = 0; i < UNI_NUM_IE_GIT; i++)
2698                 if((p->git[i].h.present & UNI_IE_PRESENT) &&
2699                    uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
2700                 return ((i << 16) + UNI_IE_GIT);
2701         if((p->called_soft.h.present & UNI_IE_PRESENT) &&
2702            uni_encode_ie(UNI_IE_CALLED_SOFT, msg, (union uni_ieall *)&p->called_soft, cx))
2703                 return (UNI_IE_CALLED_SOFT);
2704         if((p->unrec.h.present & UNI_IE_PRESENT) &&
2705            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
2706                 return (UNI_IE_UNREC);
2707
2708         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
2709         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
2710
2711         return (0);
2712 }
2713
2714 static int
2715 decode_add_party_ack(struct uni_add_party_ack *out, struct uni_msg *msg,
2716     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
2717     struct unicx *cx)
2718 {
2719         u_int i;
2720
2721         switch (ie) {
2722
2723           case UNI_IE_EPREF:
2724                 out->epref.h = *hdr;
2725                 if (hdr->present & UNI_IE_ERROR)
2726                         return (DEC_ERR);
2727                 if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
2728                         return (DEC_ERR);
2729                 break;
2730
2731           case UNI_IE_AAL:
2732                 out->aal.h = *hdr;
2733                 if (hdr->present & UNI_IE_ERROR)
2734                         return (DEC_ERR);
2735                 if(uni_decode_ie_body(UNI_IE_AAL, (union uni_ieall *)&out->aal, msg, ielen, cx))
2736                         return (DEC_ERR);
2737                 break;
2738
2739           case UNI_IE_BLLI:
2740                 out->blli.h = *hdr;
2741                 if (hdr->present & UNI_IE_ERROR)
2742                         return (DEC_ERR);
2743                 if(uni_decode_ie_body(UNI_IE_BLLI, (union uni_ieall *)&out->blli, msg, ielen, cx))
2744                         return (DEC_ERR);
2745                 break;
2746
2747           case UNI_IE_NOTIFY:
2748                 out->notify.h = *hdr;
2749                 if (hdr->present & UNI_IE_ERROR)
2750                         return (DEC_ERR);
2751                 if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
2752                         return (DEC_ERR);
2753                 break;
2754
2755           case UNI_IE_EETD:
2756                 out->eetd.h = *hdr;
2757                 if (hdr->present & UNI_IE_ERROR)
2758                         return (DEC_ERR);
2759                 if(uni_decode_ie_body(UNI_IE_EETD, (union uni_ieall *)&out->eetd, msg, ielen, cx))
2760                         return (DEC_ERR);
2761                 break;
2762
2763           case UNI_IE_CONNED:
2764                 out->conned.h = *hdr;
2765                 if (hdr->present & UNI_IE_ERROR)
2766                         return (DEC_ERR);
2767                 if(uni_decode_ie_body(UNI_IE_CONNED, (union uni_ieall *)&out->conned, msg, ielen, cx))
2768                         return (DEC_ERR);
2769                 break;
2770
2771           case UNI_IE_CONNEDSUB:
2772                 out->connedsub.h = *hdr;
2773                 if (hdr->present & UNI_IE_ERROR)
2774                         return (DEC_ERR);
2775                 if(uni_decode_ie_body(UNI_IE_CONNEDSUB, (union uni_ieall *)&out->connedsub, msg, ielen, cx))
2776                         return (DEC_ERR);
2777                 break;
2778
2779           case UNI_IE_UU:
2780                 if (!(!cx->pnni))
2781                         return (DEC_ILL);
2782                 out->uu.h = *hdr;
2783                 if (hdr->present & UNI_IE_ERROR)
2784                         return (DEC_ERR);
2785                 if(uni_decode_ie_body(UNI_IE_UU, (union uni_ieall *)&out->uu, msg, ielen, cx))
2786                         return (DEC_ERR);
2787                 break;
2788
2789           case UNI_IE_GIT:
2790                 for(i = 0; i < UNI_NUM_IE_GIT; i++)
2791                         if (!IE_ISPRESENT(out->git[i])) {
2792                                 out->git[i].h = *hdr;
2793                                 if (hdr->present & UNI_IE_ERROR)
2794                                         return (DEC_ERR);
2795                                 if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
2796                                         return (DEC_ERR);
2797                                 break;
2798                         }
2799                 break;
2800
2801           case UNI_IE_CALLED_SOFT:
2802                 if (!(cx->pnni))
2803                         return (DEC_ILL);
2804                 out->called_soft.h = *hdr;
2805                 if (hdr->present & UNI_IE_ERROR)
2806                         return (DEC_ERR);
2807                 if(uni_decode_ie_body(UNI_IE_CALLED_SOFT, (union uni_ieall *)&out->called_soft, msg, ielen, cx))
2808                         return (DEC_ERR);
2809                 break;
2810
2811           case UNI_IE_UNREC:
2812                 out->unrec.h = *hdr;
2813                 if (hdr->present & UNI_IE_ERROR)
2814                         return (DEC_ERR);
2815                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
2816                         return (DEC_ERR);
2817                 break;
2818
2819           default:
2820                 return (DEC_ILL);
2821         }
2822         return (DEC_OK);
2823 }
2824
2825 static const struct msgdecl decl_add_party_ack = {
2826         0,
2827         "add_party_ack",
2828         (uni_msg_print_f)print_add_party_ack,
2829         (uni_msg_check_f)check_add_party_ack,
2830         (uni_msg_encode_f)encode_add_party_ack,
2831         (uni_msg_decode_f)decode_add_party_ack
2832 };
2833
2834 static void
2835 print_party_alerting(struct uni_party_alerting *msg, struct unicx *cx)
2836 {
2837         u_int i;
2838
2839         if(msg->epref.h.present & UNI_IE_PRESENT)
2840                 uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
2841         if(msg->notify.h.present & UNI_IE_PRESENT)
2842                 uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
2843         if(msg->uu.h.present & UNI_IE_PRESENT)
2844                 uni_print_ie_internal(UNI_IE_UU, (union uni_ieall *)&msg->uu, cx);
2845         for(i = 0; i < UNI_NUM_IE_GIT; i++)
2846                 if(msg->git[i].h.present & UNI_IE_PRESENT)
2847                         uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
2848         if(msg->unrec.h.present & UNI_IE_PRESENT)
2849                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
2850 }
2851
2852 static int
2853 check_party_alerting(struct uni_party_alerting *m, struct unicx *cx)
2854 {
2855         int ret = 0;
2856         u_int i;
2857
2858         ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
2859         ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
2860         if(!(!cx->pnni))
2861                 ret |= IE_ISPRESENT(m->uu);
2862         else
2863                 ret |= uni_check_ie(UNI_IE_UU, (union uni_ieall *)&m->uu, cx);
2864         for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
2865                 ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
2866         }
2867         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
2868
2869         return ret;
2870 }
2871
2872 static int
2873 encode_party_alerting(struct uni_msg *msg, struct uni_party_alerting *p, struct unicx *cx)
2874 {
2875         u_int mlen;
2876         u_int i;
2877
2878         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_PARTY_ALERTING, cx, &mlen))
2879                 return (-2);
2880
2881         if((p->epref.h.present & UNI_IE_PRESENT) &&
2882            uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
2883                 return (UNI_IE_EPREF);
2884         if((p->notify.h.present & UNI_IE_PRESENT) &&
2885            uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
2886                 return (UNI_IE_NOTIFY);
2887         if((p->uu.h.present & UNI_IE_PRESENT) &&
2888            uni_encode_ie(UNI_IE_UU, msg, (union uni_ieall *)&p->uu, cx))
2889                 return (UNI_IE_UU);
2890         for(i = 0; i < UNI_NUM_IE_GIT; i++)
2891                 if((p->git[i].h.present & UNI_IE_PRESENT) &&
2892                    uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
2893                 return ((i << 16) + UNI_IE_GIT);
2894         if((p->unrec.h.present & UNI_IE_PRESENT) &&
2895            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
2896                 return (UNI_IE_UNREC);
2897
2898         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
2899         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
2900
2901         return (0);
2902 }
2903
2904 static int
2905 decode_party_alerting(struct uni_party_alerting *out, struct uni_msg *msg,
2906     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
2907     struct unicx *cx)
2908 {
2909         u_int i;
2910
2911         switch (ie) {
2912
2913           case UNI_IE_EPREF:
2914                 out->epref.h = *hdr;
2915                 if (hdr->present & UNI_IE_ERROR)
2916                         return (DEC_ERR);
2917                 if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
2918                         return (DEC_ERR);
2919                 break;
2920
2921           case UNI_IE_NOTIFY:
2922                 out->notify.h = *hdr;
2923                 if (hdr->present & UNI_IE_ERROR)
2924                         return (DEC_ERR);
2925                 if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
2926                         return (DEC_ERR);
2927                 break;
2928
2929           case UNI_IE_UU:
2930                 if (!(!cx->pnni))
2931                         return (DEC_ILL);
2932                 out->uu.h = *hdr;
2933                 if (hdr->present & UNI_IE_ERROR)
2934                         return (DEC_ERR);
2935                 if(uni_decode_ie_body(UNI_IE_UU, (union uni_ieall *)&out->uu, msg, ielen, cx))
2936                         return (DEC_ERR);
2937                 break;
2938
2939           case UNI_IE_GIT:
2940                 for(i = 0; i < UNI_NUM_IE_GIT; i++)
2941                         if (!IE_ISPRESENT(out->git[i])) {
2942                                 out->git[i].h = *hdr;
2943                                 if (hdr->present & UNI_IE_ERROR)
2944                                         return (DEC_ERR);
2945                                 if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
2946                                         return (DEC_ERR);
2947                                 break;
2948                         }
2949                 break;
2950
2951           case UNI_IE_UNREC:
2952                 out->unrec.h = *hdr;
2953                 if (hdr->present & UNI_IE_ERROR)
2954                         return (DEC_ERR);
2955                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
2956                         return (DEC_ERR);
2957                 break;
2958
2959           default:
2960                 return (DEC_ILL);
2961         }
2962         return (DEC_OK);
2963 }
2964
2965 static const struct msgdecl decl_party_alerting = {
2966         0,
2967         "party_alerting",
2968         (uni_msg_print_f)print_party_alerting,
2969         (uni_msg_check_f)check_party_alerting,
2970         (uni_msg_encode_f)encode_party_alerting,
2971         (uni_msg_decode_f)decode_party_alerting
2972 };
2973
2974 static void
2975 print_add_party_rej(struct uni_add_party_rej *msg, struct unicx *cx)
2976 {
2977         u_int i;
2978
2979         if(msg->cause.h.present & UNI_IE_PRESENT)
2980                 uni_print_ie_internal(UNI_IE_CAUSE, (union uni_ieall *)&msg->cause, cx);
2981         if(msg->epref.h.present & UNI_IE_PRESENT)
2982                 uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
2983         if(msg->uu.h.present & UNI_IE_PRESENT)
2984                 uni_print_ie_internal(UNI_IE_UU, (union uni_ieall *)&msg->uu, cx);
2985         for(i = 0; i < UNI_NUM_IE_GIT; i++)
2986                 if(msg->git[i].h.present & UNI_IE_PRESENT)
2987                         uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
2988         if(msg->crankback.h.present & UNI_IE_PRESENT)
2989                 uni_print_ie_internal(UNI_IE_CRANKBACK, (union uni_ieall *)&msg->crankback, cx);
2990         if(msg->unrec.h.present & UNI_IE_PRESENT)
2991                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
2992 }
2993
2994 static int
2995 check_add_party_rej(struct uni_add_party_rej *m, struct unicx *cx)
2996 {
2997         int ret = 0;
2998         u_int i;
2999
3000         ret |= uni_check_ie(UNI_IE_CAUSE, (union uni_ieall *)&m->cause, cx);
3001         ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
3002         if(!(!cx->pnni))
3003                 ret |= IE_ISPRESENT(m->uu);
3004         else
3005                 ret |= uni_check_ie(UNI_IE_UU, (union uni_ieall *)&m->uu, cx);
3006         for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
3007                 ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
3008         }
3009         if(!(cx->pnni))
3010                 ret |= IE_ISPRESENT(m->crankback);
3011         else
3012                 ret |= uni_check_ie(UNI_IE_CRANKBACK, (union uni_ieall *)&m->crankback, cx);
3013         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
3014
3015         return ret;
3016 }
3017
3018 static int
3019 encode_add_party_rej(struct uni_msg *msg, struct uni_add_party_rej *p, struct unicx *cx)
3020 {
3021         u_int mlen;
3022         u_int i;
3023
3024         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_ADD_PARTY_REJ, cx, &mlen))
3025                 return (-2);
3026
3027         if((p->cause.h.present & UNI_IE_PRESENT) &&
3028            uni_encode_ie(UNI_IE_CAUSE, msg, (union uni_ieall *)&p->cause, cx))
3029                 return (UNI_IE_CAUSE);
3030         if((p->epref.h.present & UNI_IE_PRESENT) &&
3031            uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
3032                 return (UNI_IE_EPREF);
3033         if((p->uu.h.present & UNI_IE_PRESENT) &&
3034            uni_encode_ie(UNI_IE_UU, msg, (union uni_ieall *)&p->uu, cx))
3035                 return (UNI_IE_UU);
3036         for(i = 0; i < UNI_NUM_IE_GIT; i++)
3037                 if((p->git[i].h.present & UNI_IE_PRESENT) &&
3038                    uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
3039                 return ((i << 16) + UNI_IE_GIT);
3040         if((p->crankback.h.present & UNI_IE_PRESENT) &&
3041            uni_encode_ie(UNI_IE_CRANKBACK, msg, (union uni_ieall *)&p->crankback, cx))
3042                 return (UNI_IE_CRANKBACK);
3043         if((p->unrec.h.present & UNI_IE_PRESENT) &&
3044            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
3045                 return (UNI_IE_UNREC);
3046
3047         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
3048         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
3049
3050         return (0);
3051 }
3052
3053 static int
3054 decode_add_party_rej(struct uni_add_party_rej *out, struct uni_msg *msg,
3055     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
3056     struct unicx *cx)
3057 {
3058         u_int i;
3059
3060         switch (ie) {
3061
3062           case UNI_IE_CAUSE:
3063                 out->cause.h = *hdr;
3064                 if (hdr->present & UNI_IE_ERROR)
3065                         return (DEC_ERR);
3066                 if(uni_decode_ie_body(UNI_IE_CAUSE, (union uni_ieall *)&out->cause, msg, ielen, cx))
3067                         return (DEC_ERR);
3068                 break;
3069
3070           case UNI_IE_EPREF:
3071                 out->epref.h = *hdr;
3072                 if (hdr->present & UNI_IE_ERROR)
3073                         return (DEC_ERR);
3074                 if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
3075                         return (DEC_ERR);
3076                 break;
3077
3078           case UNI_IE_UU:
3079                 if (!(!cx->pnni))
3080                         return (DEC_ILL);
3081                 out->uu.h = *hdr;
3082                 if (hdr->present & UNI_IE_ERROR)
3083                         return (DEC_ERR);
3084                 if(uni_decode_ie_body(UNI_IE_UU, (union uni_ieall *)&out->uu, msg, ielen, cx))
3085                         return (DEC_ERR);
3086                 break;
3087
3088           case UNI_IE_GIT:
3089                 for(i = 0; i < UNI_NUM_IE_GIT; i++)
3090                         if (!IE_ISPRESENT(out->git[i])) {
3091                                 out->git[i].h = *hdr;
3092                                 if (hdr->present & UNI_IE_ERROR)
3093                                         return (DEC_ERR);
3094                                 if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
3095                                         return (DEC_ERR);
3096                                 break;
3097                         }
3098                 break;
3099
3100           case UNI_IE_CRANKBACK:
3101                 if (!(cx->pnni))
3102                         return (DEC_ILL);
3103                 out->crankback.h = *hdr;
3104                 if (hdr->present & UNI_IE_ERROR)
3105                         return (DEC_ERR);
3106                 if(uni_decode_ie_body(UNI_IE_CRANKBACK, (union uni_ieall *)&out->crankback, msg, ielen, cx))
3107                         return (DEC_ERR);
3108                 break;
3109
3110           case UNI_IE_UNREC:
3111                 out->unrec.h = *hdr;
3112                 if (hdr->present & UNI_IE_ERROR)
3113                         return (DEC_ERR);
3114                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
3115                         return (DEC_ERR);
3116                 break;
3117
3118           default:
3119                 return (DEC_ILL);
3120         }
3121         return (DEC_OK);
3122 }
3123
3124 static const struct msgdecl decl_add_party_rej = {
3125         0,
3126         "add_party_rej",
3127         (uni_msg_print_f)print_add_party_rej,
3128         (uni_msg_check_f)check_add_party_rej,
3129         (uni_msg_encode_f)encode_add_party_rej,
3130         (uni_msg_decode_f)decode_add_party_rej
3131 };
3132
3133 static void
3134 print_drop_party(struct uni_drop_party *msg, struct unicx *cx)
3135 {
3136         u_int i;
3137
3138         if(msg->cause.h.present & UNI_IE_PRESENT)
3139                 uni_print_ie_internal(UNI_IE_CAUSE, (union uni_ieall *)&msg->cause, cx);
3140         if(msg->epref.h.present & UNI_IE_PRESENT)
3141                 uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
3142         if(msg->notify.h.present & UNI_IE_PRESENT)
3143                 uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
3144         if(msg->uu.h.present & UNI_IE_PRESENT)
3145                 uni_print_ie_internal(UNI_IE_UU, (union uni_ieall *)&msg->uu, cx);
3146         for(i = 0; i < UNI_NUM_IE_GIT; i++)
3147                 if(msg->git[i].h.present & UNI_IE_PRESENT)
3148                         uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
3149         if(msg->unrec.h.present & UNI_IE_PRESENT)
3150                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
3151 }
3152
3153 static int
3154 check_drop_party(struct uni_drop_party *m, struct unicx *cx)
3155 {
3156         int ret = 0;
3157         u_int i;
3158
3159         ret |= uni_check_ie(UNI_IE_CAUSE, (union uni_ieall *)&m->cause, cx);
3160         ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
3161         ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
3162         if(!(!cx->pnni))
3163                 ret |= IE_ISPRESENT(m->uu);
3164         else
3165                 ret |= uni_check_ie(UNI_IE_UU, (union uni_ieall *)&m->uu, cx);
3166         for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
3167                 ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
3168         }
3169         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
3170
3171         return ret;
3172 }
3173
3174 static int
3175 encode_drop_party(struct uni_msg *msg, struct uni_drop_party *p, struct unicx *cx)
3176 {
3177         u_int mlen;
3178         u_int i;
3179
3180         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_DROP_PARTY, cx, &mlen))
3181                 return (-2);
3182
3183         if((p->cause.h.present & UNI_IE_PRESENT) &&
3184            uni_encode_ie(UNI_IE_CAUSE, msg, (union uni_ieall *)&p->cause, cx))
3185                 return (UNI_IE_CAUSE);
3186         if((p->epref.h.present & UNI_IE_PRESENT) &&
3187            uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
3188                 return (UNI_IE_EPREF);
3189         if((p->notify.h.present & UNI_IE_PRESENT) &&
3190            uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
3191                 return (UNI_IE_NOTIFY);
3192         if((p->uu.h.present & UNI_IE_PRESENT) &&
3193            uni_encode_ie(UNI_IE_UU, msg, (union uni_ieall *)&p->uu, cx))
3194                 return (UNI_IE_UU);
3195         for(i = 0; i < UNI_NUM_IE_GIT; i++)
3196                 if((p->git[i].h.present & UNI_IE_PRESENT) &&
3197                    uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
3198                 return ((i << 16) + UNI_IE_GIT);
3199         if((p->unrec.h.present & UNI_IE_PRESENT) &&
3200            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
3201                 return (UNI_IE_UNREC);
3202
3203         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
3204         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
3205
3206         return (0);
3207 }
3208
3209 static int
3210 decode_drop_party(struct uni_drop_party *out, struct uni_msg *msg,
3211     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
3212     struct unicx *cx)
3213 {
3214         u_int i;
3215
3216         switch (ie) {
3217
3218           case UNI_IE_CAUSE:
3219                 out->cause.h = *hdr;
3220                 if (hdr->present & UNI_IE_ERROR)
3221                         return (DEC_ERR);
3222                 if(uni_decode_ie_body(UNI_IE_CAUSE, (union uni_ieall *)&out->cause, msg, ielen, cx))
3223                         return (DEC_ERR);
3224                 break;
3225
3226           case UNI_IE_EPREF:
3227                 out->epref.h = *hdr;
3228                 if (hdr->present & UNI_IE_ERROR)
3229                         return (DEC_ERR);
3230                 if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
3231                         return (DEC_ERR);
3232                 break;
3233
3234           case UNI_IE_NOTIFY:
3235                 out->notify.h = *hdr;
3236                 if (hdr->present & UNI_IE_ERROR)
3237                         return (DEC_ERR);
3238                 if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
3239                         return (DEC_ERR);
3240                 break;
3241
3242           case UNI_IE_UU:
3243                 if (!(!cx->pnni))
3244                         return (DEC_ILL);
3245                 out->uu.h = *hdr;
3246                 if (hdr->present & UNI_IE_ERROR)
3247                         return (DEC_ERR);
3248                 if(uni_decode_ie_body(UNI_IE_UU, (union uni_ieall *)&out->uu, msg, ielen, cx))
3249                         return (DEC_ERR);
3250                 break;
3251
3252           case UNI_IE_GIT:
3253                 for(i = 0; i < UNI_NUM_IE_GIT; i++)
3254                         if (!IE_ISPRESENT(out->git[i])) {
3255                                 out->git[i].h = *hdr;
3256                                 if (hdr->present & UNI_IE_ERROR)
3257                                         return (DEC_ERR);
3258                                 if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
3259                                         return (DEC_ERR);
3260                                 break;
3261                         }
3262                 break;
3263
3264           case UNI_IE_UNREC:
3265                 out->unrec.h = *hdr;
3266                 if (hdr->present & UNI_IE_ERROR)
3267                         return (DEC_ERR);
3268                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
3269                         return (DEC_ERR);
3270                 break;
3271
3272           default:
3273                 return (DEC_ILL);
3274         }
3275         return (DEC_OK);
3276 }
3277
3278 static const struct msgdecl decl_drop_party = {
3279         0,
3280         "drop_party",
3281         (uni_msg_print_f)print_drop_party,
3282         (uni_msg_check_f)check_drop_party,
3283         (uni_msg_encode_f)encode_drop_party,
3284         (uni_msg_decode_f)decode_drop_party
3285 };
3286
3287 static void
3288 print_drop_party_ack(struct uni_drop_party_ack *msg, struct unicx *cx)
3289 {
3290         u_int i;
3291
3292         if(msg->epref.h.present & UNI_IE_PRESENT)
3293                 uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
3294         if(msg->cause.h.present & UNI_IE_PRESENT)
3295                 uni_print_ie_internal(UNI_IE_CAUSE, (union uni_ieall *)&msg->cause, cx);
3296         if(msg->uu.h.present & UNI_IE_PRESENT)
3297                 uni_print_ie_internal(UNI_IE_UU, (union uni_ieall *)&msg->uu, cx);
3298         for(i = 0; i < UNI_NUM_IE_GIT; i++)
3299                 if(msg->git[i].h.present & UNI_IE_PRESENT)
3300                         uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
3301         if(msg->unrec.h.present & UNI_IE_PRESENT)
3302                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
3303 }
3304
3305 static int
3306 check_drop_party_ack(struct uni_drop_party_ack *m, struct unicx *cx)
3307 {
3308         int ret = 0;
3309         u_int i;
3310
3311         ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
3312         ret |= uni_check_ie(UNI_IE_CAUSE, (union uni_ieall *)&m->cause, cx);
3313         if(!(!cx->pnni))
3314                 ret |= IE_ISPRESENT(m->uu);
3315         else
3316                 ret |= uni_check_ie(UNI_IE_UU, (union uni_ieall *)&m->uu, cx);
3317         for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
3318                 ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
3319         }
3320         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
3321
3322         return ret;
3323 }
3324
3325 static int
3326 encode_drop_party_ack(struct uni_msg *msg, struct uni_drop_party_ack *p, struct unicx *cx)
3327 {
3328         u_int mlen;
3329         u_int i;
3330
3331         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_DROP_PARTY_ACK, cx, &mlen))
3332                 return (-2);
3333
3334         if((p->epref.h.present & UNI_IE_PRESENT) &&
3335            uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
3336                 return (UNI_IE_EPREF);
3337         if((p->cause.h.present & UNI_IE_PRESENT) &&
3338            uni_encode_ie(UNI_IE_CAUSE, msg, (union uni_ieall *)&p->cause, cx))
3339                 return (UNI_IE_CAUSE);
3340         if((p->uu.h.present & UNI_IE_PRESENT) &&
3341            uni_encode_ie(UNI_IE_UU, msg, (union uni_ieall *)&p->uu, cx))
3342                 return (UNI_IE_UU);
3343         for(i = 0; i < UNI_NUM_IE_GIT; i++)
3344                 if((p->git[i].h.present & UNI_IE_PRESENT) &&
3345                    uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
3346                 return ((i << 16) + UNI_IE_GIT);
3347         if((p->unrec.h.present & UNI_IE_PRESENT) &&
3348            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
3349                 return (UNI_IE_UNREC);
3350
3351         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
3352         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
3353
3354         return (0);
3355 }
3356
3357 static int
3358 decode_drop_party_ack(struct uni_drop_party_ack *out, struct uni_msg *msg,
3359     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
3360     struct unicx *cx)
3361 {
3362         u_int i;
3363
3364         switch (ie) {
3365
3366           case UNI_IE_EPREF:
3367                 out->epref.h = *hdr;
3368                 if (hdr->present & UNI_IE_ERROR)
3369                         return (DEC_ERR);
3370                 if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
3371                         return (DEC_ERR);
3372                 break;
3373
3374           case UNI_IE_CAUSE:
3375                 out->cause.h = *hdr;
3376                 if (hdr->present & UNI_IE_ERROR)
3377                         return (DEC_ERR);
3378                 if(uni_decode_ie_body(UNI_IE_CAUSE, (union uni_ieall *)&out->cause, msg, ielen, cx))
3379                         return (DEC_ERR);
3380                 break;
3381
3382           case UNI_IE_UU:
3383                 if (!(!cx->pnni))
3384                         return (DEC_ILL);
3385                 out->uu.h = *hdr;
3386                 if (hdr->present & UNI_IE_ERROR)
3387                         return (DEC_ERR);
3388                 if(uni_decode_ie_body(UNI_IE_UU, (union uni_ieall *)&out->uu, msg, ielen, cx))
3389                         return (DEC_ERR);
3390                 break;
3391
3392           case UNI_IE_GIT:
3393                 for(i = 0; i < UNI_NUM_IE_GIT; i++)
3394                         if (!IE_ISPRESENT(out->git[i])) {
3395                                 out->git[i].h = *hdr;
3396                                 if (hdr->present & UNI_IE_ERROR)
3397                                         return (DEC_ERR);
3398                                 if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
3399                                         return (DEC_ERR);
3400                                 break;
3401                         }
3402                 break;
3403
3404           case UNI_IE_UNREC:
3405                 out->unrec.h = *hdr;
3406                 if (hdr->present & UNI_IE_ERROR)
3407                         return (DEC_ERR);
3408                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
3409                         return (DEC_ERR);
3410                 break;
3411
3412           default:
3413                 return (DEC_ILL);
3414         }
3415         return (DEC_OK);
3416 }
3417
3418 static const struct msgdecl decl_drop_party_ack = {
3419         0,
3420         "drop_party_ack",
3421         (uni_msg_print_f)print_drop_party_ack,
3422         (uni_msg_check_f)check_drop_party_ack,
3423         (uni_msg_encode_f)encode_drop_party_ack,
3424         (uni_msg_decode_f)decode_drop_party_ack
3425 };
3426
3427 static void
3428 print_leaf_setup_req(struct uni_leaf_setup_req *msg, struct unicx *cx)
3429 {
3430         u_int i;
3431
3432         for(i = 0; i < UNI_NUM_IE_TNS; i++)
3433                 if(msg->tns[i].h.present & UNI_IE_PRESENT)
3434                         uni_print_ie_internal(UNI_IE_TNS, (union uni_ieall *)&msg->tns[i], cx);
3435         if(msg->calling.h.present & UNI_IE_PRESENT)
3436                 uni_print_ie_internal(UNI_IE_CALLING, (union uni_ieall *)&msg->calling, cx);
3437         for(i = 0; i < UNI_NUM_IE_CALLINGSUB; i++)
3438                 if(msg->callingsub[i].h.present & UNI_IE_PRESENT)
3439                         uni_print_ie_internal(UNI_IE_CALLINGSUB, (union uni_ieall *)&msg->callingsub[i], cx);
3440         if(msg->called.h.present & UNI_IE_PRESENT)
3441                 uni_print_ie_internal(UNI_IE_CALLED, (union uni_ieall *)&msg->called, cx);
3442         for(i = 0; i < UNI_NUM_IE_CALLEDSUB; i++)
3443                 if(msg->calledsub[i].h.present & UNI_IE_PRESENT)
3444                         uni_print_ie_internal(UNI_IE_CALLEDSUB, (union uni_ieall *)&msg->calledsub[i], cx);
3445         if(msg->lij_callid.h.present & UNI_IE_PRESENT)
3446                 uni_print_ie_internal(UNI_IE_LIJ_CALLID, (union uni_ieall *)&msg->lij_callid, cx);
3447         if(msg->lij_seqno.h.present & UNI_IE_PRESENT)
3448                 uni_print_ie_internal(UNI_IE_LIJ_SEQNO, (union uni_ieall *)&msg->lij_seqno, cx);
3449         if(msg->unrec.h.present & UNI_IE_PRESENT)
3450                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
3451 }
3452
3453 static int
3454 check_leaf_setup_req(struct uni_leaf_setup_req *m, struct unicx *cx)
3455 {
3456         int ret = 0;
3457         u_int i;
3458
3459         for(i = 0; i < UNI_NUM_IE_TNS ; i++) {
3460                 ret |= uni_check_ie(UNI_IE_TNS, (union uni_ieall *)&m->tns[i], cx);
3461         }
3462         ret |= uni_check_ie(UNI_IE_CALLING, (union uni_ieall *)&m->calling, cx);
3463         for(i = 0; i < UNI_NUM_IE_CALLINGSUB ; i++) {
3464                 ret |= uni_check_ie(UNI_IE_CALLINGSUB, (union uni_ieall *)&m->callingsub[i], cx);
3465         }
3466         ret |= uni_check_ie(UNI_IE_CALLED, (union uni_ieall *)&m->called, cx);
3467         for(i = 0; i < UNI_NUM_IE_CALLEDSUB ; i++) {
3468                 ret |= uni_check_ie(UNI_IE_CALLEDSUB, (union uni_ieall *)&m->calledsub[i], cx);
3469         }
3470         ret |= uni_check_ie(UNI_IE_LIJ_CALLID, (union uni_ieall *)&m->lij_callid, cx);
3471         ret |= uni_check_ie(UNI_IE_LIJ_SEQNO, (union uni_ieall *)&m->lij_seqno, cx);
3472         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
3473
3474         return ret;
3475 }
3476
3477 static int
3478 encode_leaf_setup_req(struct uni_msg *msg, struct uni_leaf_setup_req *p, struct unicx *cx)
3479 {
3480         u_int mlen;
3481         u_int i;
3482
3483         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_LEAF_SETUP_REQ, cx, &mlen))
3484                 return (-2);
3485
3486         for(i = 0; i < UNI_NUM_IE_TNS; i++)
3487                 if((p->tns[i].h.present & UNI_IE_PRESENT) &&
3488                    uni_encode_ie(UNI_IE_TNS, msg, (union uni_ieall *)&p->tns[i], cx))
3489                 return ((i << 16) + UNI_IE_TNS);
3490         if((p->calling.h.present & UNI_IE_PRESENT) &&
3491            uni_encode_ie(UNI_IE_CALLING, msg, (union uni_ieall *)&p->calling, cx))
3492                 return (UNI_IE_CALLING);
3493         for(i = 0; i < UNI_NUM_IE_CALLINGSUB; i++)
3494                 if((p->callingsub[i].h.present & UNI_IE_PRESENT) &&
3495                    uni_encode_ie(UNI_IE_CALLINGSUB, msg, (union uni_ieall *)&p->callingsub[i], cx))
3496                 return ((i << 16) + UNI_IE_CALLINGSUB);
3497         if((p->called.h.present & UNI_IE_PRESENT) &&
3498            uni_encode_ie(UNI_IE_CALLED, msg, (union uni_ieall *)&p->called, cx))
3499                 return (UNI_IE_CALLED);
3500         for(i = 0; i < UNI_NUM_IE_CALLEDSUB; i++)
3501                 if((p->calledsub[i].h.present & UNI_IE_PRESENT) &&
3502                    uni_encode_ie(UNI_IE_CALLEDSUB, msg, (union uni_ieall *)&p->calledsub[i], cx))
3503                 return ((i << 16) + UNI_IE_CALLEDSUB);
3504         if((p->lij_callid.h.present & UNI_IE_PRESENT) &&
3505            uni_encode_ie(UNI_IE_LIJ_CALLID, msg, (union uni_ieall *)&p->lij_callid, cx))
3506                 return (UNI_IE_LIJ_CALLID);
3507         if((p->lij_seqno.h.present & UNI_IE_PRESENT) &&
3508            uni_encode_ie(UNI_IE_LIJ_SEQNO, msg, (union uni_ieall *)&p->lij_seqno, cx))
3509                 return (UNI_IE_LIJ_SEQNO);
3510         if((p->unrec.h.present & UNI_IE_PRESENT) &&
3511            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
3512                 return (UNI_IE_UNREC);
3513
3514         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
3515         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
3516
3517         return (0);
3518 }
3519
3520 static int
3521 decode_leaf_setup_req(struct uni_leaf_setup_req *out, struct uni_msg *msg,
3522     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
3523     struct unicx *cx)
3524 {
3525         u_int i;
3526
3527         switch (ie) {
3528
3529           case UNI_IE_TNS:
3530                 for(i = 0; i < UNI_NUM_IE_TNS; i++)
3531                         if (!IE_ISPRESENT(out->tns[i])) {
3532                                 out->tns[i].h = *hdr;
3533                                 if (hdr->present & UNI_IE_ERROR)
3534                                         return (DEC_ERR);
3535                                 if(uni_decode_ie_body(UNI_IE_TNS, (union uni_ieall *)&out->tns[i], msg, ielen, cx))
3536                                         return (DEC_ERR);
3537                                 break;
3538                         }
3539                 break;
3540
3541           case UNI_IE_CALLING:
3542                 out->calling.h = *hdr;
3543                 if (hdr->present & UNI_IE_ERROR)
3544                         return (DEC_ERR);
3545                 if(uni_decode_ie_body(UNI_IE_CALLING, (union uni_ieall *)&out->calling, msg, ielen, cx))
3546                         return (DEC_ERR);
3547                 break;
3548
3549           case UNI_IE_CALLINGSUB:
3550                 for(i = 0; i < UNI_NUM_IE_CALLINGSUB; i++)
3551                         if (!IE_ISPRESENT(out->callingsub[i])) {
3552                                 out->callingsub[i].h = *hdr;
3553                                 if (hdr->present & UNI_IE_ERROR)
3554                                         return (DEC_ERR);
3555                                 if(uni_decode_ie_body(UNI_IE_CALLINGSUB, (union uni_ieall *)&out->callingsub[i], msg, ielen, cx))
3556                                         return (DEC_ERR);
3557                                 break;
3558                         }
3559                 break;
3560
3561           case UNI_IE_CALLED:
3562                 out->called.h = *hdr;
3563                 if (hdr->present & UNI_IE_ERROR)
3564                         return (DEC_ERR);
3565                 if(uni_decode_ie_body(UNI_IE_CALLED, (union uni_ieall *)&out->called, msg, ielen, cx))
3566                         return (DEC_ERR);
3567                 break;
3568
3569           case UNI_IE_CALLEDSUB:
3570                 for(i = 0; i < UNI_NUM_IE_CALLEDSUB; i++)
3571                         if (!IE_ISPRESENT(out->calledsub[i])) {
3572                                 out->calledsub[i].h = *hdr;
3573                                 if (hdr->present & UNI_IE_ERROR)
3574                                         return (DEC_ERR);
3575                                 if(uni_decode_ie_body(UNI_IE_CALLEDSUB, (union uni_ieall *)&out->calledsub[i], msg, ielen, cx))
3576                                         return (DEC_ERR);
3577                                 break;
3578                         }
3579                 break;
3580
3581           case UNI_IE_LIJ_CALLID:
3582                 out->lij_callid.h = *hdr;
3583                 if (hdr->present & UNI_IE_ERROR)
3584                         return (DEC_ERR);
3585                 if(uni_decode_ie_body(UNI_IE_LIJ_CALLID, (union uni_ieall *)&out->lij_callid, msg, ielen, cx))
3586                         return (DEC_ERR);
3587                 break;
3588
3589           case UNI_IE_LIJ_SEQNO:
3590                 out->lij_seqno.h = *hdr;
3591                 if (hdr->present & UNI_IE_ERROR)
3592                         return (DEC_ERR);
3593                 if(uni_decode_ie_body(UNI_IE_LIJ_SEQNO, (union uni_ieall *)&out->lij_seqno, msg, ielen, cx))
3594                         return (DEC_ERR);
3595                 break;
3596
3597           case UNI_IE_UNREC:
3598                 out->unrec.h = *hdr;
3599                 if (hdr->present & UNI_IE_ERROR)
3600                         return (DEC_ERR);
3601                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
3602                         return (DEC_ERR);
3603                 break;
3604
3605           default:
3606                 return (DEC_ILL);
3607         }
3608         return (DEC_OK);
3609 }
3610
3611 static const struct msgdecl decl_leaf_setup_req = {
3612         0,
3613         "leaf_setup_req",
3614         (uni_msg_print_f)print_leaf_setup_req,
3615         (uni_msg_check_f)check_leaf_setup_req,
3616         (uni_msg_encode_f)encode_leaf_setup_req,
3617         (uni_msg_decode_f)decode_leaf_setup_req
3618 };
3619
3620 static void
3621 print_leaf_setup_fail(struct uni_leaf_setup_fail *msg, struct unicx *cx)
3622 {
3623         u_int i;
3624
3625         if(msg->cause.h.present & UNI_IE_PRESENT)
3626                 uni_print_ie_internal(UNI_IE_CAUSE, (union uni_ieall *)&msg->cause, cx);
3627         if(msg->called.h.present & UNI_IE_PRESENT)
3628                 uni_print_ie_internal(UNI_IE_CALLED, (union uni_ieall *)&msg->called, cx);
3629         if(msg->calledsub.h.present & UNI_IE_PRESENT)
3630                 uni_print_ie_internal(UNI_IE_CALLEDSUB, (union uni_ieall *)&msg->calledsub, cx);
3631         if(msg->lij_seqno.h.present & UNI_IE_PRESENT)
3632                 uni_print_ie_internal(UNI_IE_LIJ_SEQNO, (union uni_ieall *)&msg->lij_seqno, cx);
3633         for(i = 0; i < UNI_NUM_IE_TNS; i++)
3634                 if(msg->tns[i].h.present & UNI_IE_PRESENT)
3635                         uni_print_ie_internal(UNI_IE_TNS, (union uni_ieall *)&msg->tns[i], cx);
3636         if(msg->unrec.h.present & UNI_IE_PRESENT)
3637                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
3638 }
3639
3640 static int
3641 check_leaf_setup_fail(struct uni_leaf_setup_fail *m, struct unicx *cx)
3642 {
3643         int ret = 0;
3644         u_int i;
3645
3646         ret |= uni_check_ie(UNI_IE_CAUSE, (union uni_ieall *)&m->cause, cx);
3647         ret |= uni_check_ie(UNI_IE_CALLED, (union uni_ieall *)&m->called, cx);
3648         ret |= uni_check_ie(UNI_IE_CALLEDSUB, (union uni_ieall *)&m->calledsub, cx);
3649         ret |= uni_check_ie(UNI_IE_LIJ_SEQNO, (union uni_ieall *)&m->lij_seqno, cx);
3650         for(i = 0; i < UNI_NUM_IE_TNS ; i++) {
3651                 ret |= uni_check_ie(UNI_IE_TNS, (union uni_ieall *)&m->tns[i], cx);
3652         }
3653         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
3654
3655         return ret;
3656 }
3657
3658 static int
3659 encode_leaf_setup_fail(struct uni_msg *msg, struct uni_leaf_setup_fail *p, struct unicx *cx)
3660 {
3661         u_int mlen;
3662         u_int i;
3663
3664         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_LEAF_SETUP_FAIL, cx, &mlen))
3665                 return (-2);
3666
3667         if((p->cause.h.present & UNI_IE_PRESENT) &&
3668            uni_encode_ie(UNI_IE_CAUSE, msg, (union uni_ieall *)&p->cause, cx))
3669                 return (UNI_IE_CAUSE);
3670         if((p->called.h.present & UNI_IE_PRESENT) &&
3671            uni_encode_ie(UNI_IE_CALLED, msg, (union uni_ieall *)&p->called, cx))
3672                 return (UNI_IE_CALLED);
3673         if((p->calledsub.h.present & UNI_IE_PRESENT) &&
3674            uni_encode_ie(UNI_IE_CALLEDSUB, msg, (union uni_ieall *)&p->calledsub, cx))
3675                 return (UNI_IE_CALLEDSUB);
3676         if((p->lij_seqno.h.present & UNI_IE_PRESENT) &&
3677            uni_encode_ie(UNI_IE_LIJ_SEQNO, msg, (union uni_ieall *)&p->lij_seqno, cx))
3678                 return (UNI_IE_LIJ_SEQNO);
3679         for(i = 0; i < UNI_NUM_IE_TNS; i++)
3680                 if((p->tns[i].h.present & UNI_IE_PRESENT) &&
3681                    uni_encode_ie(UNI_IE_TNS, msg, (union uni_ieall *)&p->tns[i], cx))
3682                 return ((i << 16) + UNI_IE_TNS);
3683         if((p->unrec.h.present & UNI_IE_PRESENT) &&
3684            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
3685                 return (UNI_IE_UNREC);
3686
3687         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
3688         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
3689
3690         return (0);
3691 }
3692
3693 static int
3694 decode_leaf_setup_fail(struct uni_leaf_setup_fail *out, struct uni_msg *msg,
3695     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
3696     struct unicx *cx)
3697 {
3698         u_int i;
3699
3700         switch (ie) {
3701
3702           case UNI_IE_CAUSE:
3703                 out->cause.h = *hdr;
3704                 if (hdr->present & UNI_IE_ERROR)
3705                         return (DEC_ERR);
3706                 if(uni_decode_ie_body(UNI_IE_CAUSE, (union uni_ieall *)&out->cause, msg, ielen, cx))
3707                         return (DEC_ERR);
3708                 break;
3709
3710           case UNI_IE_CALLED:
3711                 out->called.h = *hdr;
3712                 if (hdr->present & UNI_IE_ERROR)
3713                         return (DEC_ERR);
3714                 if(uni_decode_ie_body(UNI_IE_CALLED, (union uni_ieall *)&out->called, msg, ielen, cx))
3715                         return (DEC_ERR);
3716                 break;
3717
3718           case UNI_IE_CALLEDSUB:
3719                 out->calledsub.h = *hdr;
3720                 if (hdr->present & UNI_IE_ERROR)
3721                         return (DEC_ERR);
3722                 if(uni_decode_ie_body(UNI_IE_CALLEDSUB, (union uni_ieall *)&out->calledsub, msg, ielen, cx))
3723                         return (DEC_ERR);
3724                 break;
3725
3726           case UNI_IE_LIJ_SEQNO:
3727                 out->lij_seqno.h = *hdr;
3728                 if (hdr->present & UNI_IE_ERROR)
3729                         return (DEC_ERR);
3730                 if(uni_decode_ie_body(UNI_IE_LIJ_SEQNO, (union uni_ieall *)&out->lij_seqno, msg, ielen, cx))
3731                         return (DEC_ERR);
3732                 break;
3733
3734           case UNI_IE_TNS:
3735                 for(i = 0; i < UNI_NUM_IE_TNS; i++)
3736                         if (!IE_ISPRESENT(out->tns[i])) {
3737                                 out->tns[i].h = *hdr;
3738                                 if (hdr->present & UNI_IE_ERROR)
3739                                         return (DEC_ERR);
3740                                 if(uni_decode_ie_body(UNI_IE_TNS, (union uni_ieall *)&out->tns[i], msg, ielen, cx))
3741                                         return (DEC_ERR);
3742                                 break;
3743                         }
3744                 break;
3745
3746           case UNI_IE_UNREC:
3747                 out->unrec.h = *hdr;
3748                 if (hdr->present & UNI_IE_ERROR)
3749                         return (DEC_ERR);
3750                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
3751                         return (DEC_ERR);
3752                 break;
3753
3754           default:
3755                 return (DEC_ILL);
3756         }
3757         return (DEC_OK);
3758 }
3759
3760 static const struct msgdecl decl_leaf_setup_fail = {
3761         0,
3762         "leaf_setup_fail",
3763         (uni_msg_print_f)print_leaf_setup_fail,
3764         (uni_msg_check_f)check_leaf_setup_fail,
3765         (uni_msg_encode_f)encode_leaf_setup_fail,
3766         (uni_msg_decode_f)decode_leaf_setup_fail
3767 };
3768
3769 static void
3770 print_cobisetup(struct uni_cobisetup *msg, struct unicx *cx)
3771 {
3772         if(msg->facility.h.present & UNI_IE_PRESENT)
3773                 uni_print_ie_internal(UNI_IE_FACILITY, (union uni_ieall *)&msg->facility, cx);
3774         if(msg->called.h.present & UNI_IE_PRESENT)
3775                 uni_print_ie_internal(UNI_IE_CALLED, (union uni_ieall *)&msg->called, cx);
3776         if(msg->calledsub.h.present & UNI_IE_PRESENT)
3777                 uni_print_ie_internal(UNI_IE_CALLEDSUB, (union uni_ieall *)&msg->calledsub, cx);
3778         if(msg->calling.h.present & UNI_IE_PRESENT)
3779                 uni_print_ie_internal(UNI_IE_CALLING, (union uni_ieall *)&msg->calling, cx);
3780         if(msg->notify.h.present & UNI_IE_PRESENT)
3781                 uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
3782         if(msg->unrec.h.present & UNI_IE_PRESENT)
3783                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
3784 }
3785
3786 static int
3787 check_cobisetup(struct uni_cobisetup *m, struct unicx *cx)
3788 {
3789         int ret = 0;
3790
3791         ret |= uni_check_ie(UNI_IE_FACILITY, (union uni_ieall *)&m->facility, cx);
3792         ret |= uni_check_ie(UNI_IE_CALLED, (union uni_ieall *)&m->called, cx);
3793         ret |= uni_check_ie(UNI_IE_CALLEDSUB, (union uni_ieall *)&m->calledsub, cx);
3794         ret |= uni_check_ie(UNI_IE_CALLING, (union uni_ieall *)&m->calling, cx);
3795         ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
3796         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
3797
3798         return ret;
3799 }
3800
3801 static int
3802 encode_cobisetup(struct uni_msg *msg, struct uni_cobisetup *p, struct unicx *cx)
3803 {
3804         u_int mlen;
3805
3806         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_COBISETUP, cx, &mlen))
3807                 return (-2);
3808
3809         if((p->facility.h.present & UNI_IE_PRESENT) &&
3810            uni_encode_ie(UNI_IE_FACILITY, msg, (union uni_ieall *)&p->facility, cx))
3811                 return (UNI_IE_FACILITY);
3812         if((p->called.h.present & UNI_IE_PRESENT) &&
3813            uni_encode_ie(UNI_IE_CALLED, msg, (union uni_ieall *)&p->called, cx))
3814                 return (UNI_IE_CALLED);
3815         if((p->calledsub.h.present & UNI_IE_PRESENT) &&
3816            uni_encode_ie(UNI_IE_CALLEDSUB, msg, (union uni_ieall *)&p->calledsub, cx))
3817                 return (UNI_IE_CALLEDSUB);
3818         if((p->calling.h.present & UNI_IE_PRESENT) &&
3819            uni_encode_ie(UNI_IE_CALLING, msg, (union uni_ieall *)&p->calling, cx))
3820                 return (UNI_IE_CALLING);
3821         if((p->notify.h.present & UNI_IE_PRESENT) &&
3822            uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
3823                 return (UNI_IE_NOTIFY);
3824         if((p->unrec.h.present & UNI_IE_PRESENT) &&
3825            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
3826                 return (UNI_IE_UNREC);
3827
3828         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
3829         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
3830
3831         return (0);
3832 }
3833
3834 static int
3835 decode_cobisetup(struct uni_cobisetup *out, struct uni_msg *msg,
3836     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
3837     struct unicx *cx)
3838 {
3839         switch (ie) {
3840
3841           case UNI_IE_FACILITY:
3842                 out->facility.h = *hdr;
3843                 if (hdr->present & UNI_IE_ERROR)
3844                         return (DEC_ERR);
3845                 if(uni_decode_ie_body(UNI_IE_FACILITY, (union uni_ieall *)&out->facility, msg, ielen, cx))
3846                         return (DEC_ERR);
3847                 break;
3848
3849           case UNI_IE_CALLED:
3850                 out->called.h = *hdr;
3851                 if (hdr->present & UNI_IE_ERROR)
3852                         return (DEC_ERR);
3853                 if(uni_decode_ie_body(UNI_IE_CALLED, (union uni_ieall *)&out->called, msg, ielen, cx))
3854                         return (DEC_ERR);
3855                 break;
3856
3857           case UNI_IE_CALLEDSUB:
3858                 out->calledsub.h = *hdr;
3859                 if (hdr->present & UNI_IE_ERROR)
3860                         return (DEC_ERR);
3861                 if(uni_decode_ie_body(UNI_IE_CALLEDSUB, (union uni_ieall *)&out->calledsub, msg, ielen, cx))
3862                         return (DEC_ERR);
3863                 break;
3864
3865           case UNI_IE_CALLING:
3866                 out->calling.h = *hdr;
3867                 if (hdr->present & UNI_IE_ERROR)
3868                         return (DEC_ERR);
3869                 if(uni_decode_ie_body(UNI_IE_CALLING, (union uni_ieall *)&out->calling, msg, ielen, cx))
3870                         return (DEC_ERR);
3871                 break;
3872
3873           case UNI_IE_NOTIFY:
3874                 out->notify.h = *hdr;
3875                 if (hdr->present & UNI_IE_ERROR)
3876                         return (DEC_ERR);
3877                 if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
3878                         return (DEC_ERR);
3879                 break;
3880
3881           case UNI_IE_UNREC:
3882                 out->unrec.h = *hdr;
3883                 if (hdr->present & UNI_IE_ERROR)
3884                         return (DEC_ERR);
3885                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
3886                         return (DEC_ERR);
3887                 break;
3888
3889           default:
3890                 return (DEC_ILL);
3891         }
3892         return (DEC_OK);
3893 }
3894
3895 static const struct msgdecl decl_cobisetup = {
3896         0,
3897         "cobisetup",
3898         (uni_msg_print_f)print_cobisetup,
3899         (uni_msg_check_f)check_cobisetup,
3900         (uni_msg_encode_f)encode_cobisetup,
3901         (uni_msg_decode_f)decode_cobisetup
3902 };
3903
3904 static void
3905 print_facility(struct uni_facility *msg, struct unicx *cx)
3906 {
3907         if(msg->facility.h.present & UNI_IE_PRESENT)
3908                 uni_print_ie_internal(UNI_IE_FACILITY, (union uni_ieall *)&msg->facility, cx);
3909         if(msg->called.h.present & UNI_IE_PRESENT)
3910                 uni_print_ie_internal(UNI_IE_CALLED, (union uni_ieall *)&msg->called, cx);
3911         if(msg->calledsub.h.present & UNI_IE_PRESENT)
3912                 uni_print_ie_internal(UNI_IE_CALLEDSUB, (union uni_ieall *)&msg->calledsub, cx);
3913         if(msg->calling.h.present & UNI_IE_PRESENT)
3914                 uni_print_ie_internal(UNI_IE_CALLING, (union uni_ieall *)&msg->calling, cx);
3915         if(msg->notify.h.present & UNI_IE_PRESENT)
3916                 uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
3917         if(msg->unrec.h.present & UNI_IE_PRESENT)
3918                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
3919 }
3920
3921 static int
3922 check_facility(struct uni_facility *m, struct unicx *cx)
3923 {
3924         int ret = 0;
3925
3926         ret |= uni_check_ie(UNI_IE_FACILITY, (union uni_ieall *)&m->facility, cx);
3927         ret |= uni_check_ie(UNI_IE_CALLED, (union uni_ieall *)&m->called, cx);
3928         ret |= uni_check_ie(UNI_IE_CALLEDSUB, (union uni_ieall *)&m->calledsub, cx);
3929         ret |= uni_check_ie(UNI_IE_CALLING, (union uni_ieall *)&m->calling, cx);
3930         ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
3931         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
3932
3933         return ret;
3934 }
3935
3936 static int
3937 encode_facility(struct uni_msg *msg, struct uni_facility *p, struct unicx *cx)
3938 {
3939         u_int mlen;
3940
3941         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_FACILITY, cx, &mlen))
3942                 return (-2);
3943
3944         if((p->facility.h.present & UNI_IE_PRESENT) &&
3945            uni_encode_ie(UNI_IE_FACILITY, msg, (union uni_ieall *)&p->facility, cx))
3946                 return (UNI_IE_FACILITY);
3947         if((p->called.h.present & UNI_IE_PRESENT) &&
3948            uni_encode_ie(UNI_IE_CALLED, msg, (union uni_ieall *)&p->called, cx))
3949                 return (UNI_IE_CALLED);
3950         if((p->calledsub.h.present & UNI_IE_PRESENT) &&
3951            uni_encode_ie(UNI_IE_CALLEDSUB, msg, (union uni_ieall *)&p->calledsub, cx))
3952                 return (UNI_IE_CALLEDSUB);
3953         if((p->calling.h.present & UNI_IE_PRESENT) &&
3954            uni_encode_ie(UNI_IE_CALLING, msg, (union uni_ieall *)&p->calling, cx))
3955                 return (UNI_IE_CALLING);
3956         if((p->notify.h.present & UNI_IE_PRESENT) &&
3957            uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
3958                 return (UNI_IE_NOTIFY);
3959         if((p->unrec.h.present & UNI_IE_PRESENT) &&
3960            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
3961                 return (UNI_IE_UNREC);
3962
3963         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
3964         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
3965
3966         return (0);
3967 }
3968
3969 static int
3970 decode_facility(struct uni_facility *out, struct uni_msg *msg,
3971     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
3972     struct unicx *cx)
3973 {
3974         switch (ie) {
3975
3976           case UNI_IE_FACILITY:
3977                 out->facility.h = *hdr;
3978                 if (hdr->present & UNI_IE_ERROR)
3979                         return (DEC_ERR);
3980                 if(uni_decode_ie_body(UNI_IE_FACILITY, (union uni_ieall *)&out->facility, msg, ielen, cx))
3981                         return (DEC_ERR);
3982                 break;
3983
3984           case UNI_IE_CALLED:
3985                 out->called.h = *hdr;
3986                 if (hdr->present & UNI_IE_ERROR)
3987                         return (DEC_ERR);
3988                 if(uni_decode_ie_body(UNI_IE_CALLED, (union uni_ieall *)&out->called, msg, ielen, cx))
3989                         return (DEC_ERR);
3990                 break;
3991
3992           case UNI_IE_CALLEDSUB:
3993                 out->calledsub.h = *hdr;
3994                 if (hdr->present & UNI_IE_ERROR)
3995                         return (DEC_ERR);
3996                 if(uni_decode_ie_body(UNI_IE_CALLEDSUB, (union uni_ieall *)&out->calledsub, msg, ielen, cx))
3997                         return (DEC_ERR);
3998                 break;
3999
4000           case UNI_IE_CALLING:
4001                 out->calling.h = *hdr;
4002                 if (hdr->present & UNI_IE_ERROR)
4003                         return (DEC_ERR);
4004                 if(uni_decode_ie_body(UNI_IE_CALLING, (union uni_ieall *)&out->calling, msg, ielen, cx))
4005                         return (DEC_ERR);
4006                 break;
4007
4008           case UNI_IE_NOTIFY:
4009                 out->notify.h = *hdr;
4010                 if (hdr->present & UNI_IE_ERROR)
4011                         return (DEC_ERR);
4012                 if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
4013                         return (DEC_ERR);
4014                 break;
4015
4016           case UNI_IE_UNREC:
4017                 out->unrec.h = *hdr;
4018                 if (hdr->present & UNI_IE_ERROR)
4019                         return (DEC_ERR);
4020                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
4021                         return (DEC_ERR);
4022                 break;
4023
4024           default:
4025                 return (DEC_ILL);
4026         }
4027         return (DEC_OK);
4028 }
4029
4030 static const struct msgdecl decl_facility = {
4031         0,
4032         "facility",
4033         (uni_msg_print_f)print_facility,
4034         (uni_msg_check_f)check_facility,
4035         (uni_msg_encode_f)encode_facility,
4036         (uni_msg_decode_f)decode_facility
4037 };
4038
4039 static void
4040 print_modify_req(struct uni_modify_req *msg, struct unicx *cx)
4041 {
4042         u_int i;
4043
4044         if(msg->traffic.h.present & UNI_IE_PRESENT)
4045                 uni_print_ie_internal(UNI_IE_TRAFFIC, (union uni_ieall *)&msg->traffic, cx);
4046         if(msg->atraffic.h.present & UNI_IE_PRESENT)
4047                 uni_print_ie_internal(UNI_IE_ATRAFFIC, (union uni_ieall *)&msg->atraffic, cx);
4048         if(msg->mintraffic.h.present & UNI_IE_PRESENT)
4049                 uni_print_ie_internal(UNI_IE_MINTRAFFIC, (union uni_ieall *)&msg->mintraffic, cx);
4050         if(msg->notify.h.present & UNI_IE_PRESENT)
4051                 uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
4052         for(i = 0; i < UNI_NUM_IE_GIT; i++)
4053                 if(msg->git[i].h.present & UNI_IE_PRESENT)
4054                         uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
4055         if(msg->unrec.h.present & UNI_IE_PRESENT)
4056                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
4057 }
4058
4059 static int
4060 check_modify_req(struct uni_modify_req *m, struct unicx *cx)
4061 {
4062         int ret = 0;
4063         u_int i;
4064
4065         ret |= uni_check_ie(UNI_IE_TRAFFIC, (union uni_ieall *)&m->traffic, cx);
4066         ret |= uni_check_ie(UNI_IE_ATRAFFIC, (union uni_ieall *)&m->atraffic, cx);
4067         ret |= uni_check_ie(UNI_IE_MINTRAFFIC, (union uni_ieall *)&m->mintraffic, cx);
4068         ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
4069         for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
4070                 ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
4071         }
4072         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
4073
4074         return ret;
4075 }
4076
4077 static int
4078 encode_modify_req(struct uni_msg *msg, struct uni_modify_req *p, struct unicx *cx)
4079 {
4080         u_int mlen;
4081         u_int i;
4082
4083         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_MODIFY_REQ, cx, &mlen))
4084                 return (-2);
4085
4086         if((p->traffic.h.present & UNI_IE_PRESENT) &&
4087            uni_encode_ie(UNI_IE_TRAFFIC, msg, (union uni_ieall *)&p->traffic, cx))
4088                 return (UNI_IE_TRAFFIC);
4089         if((p->atraffic.h.present & UNI_IE_PRESENT) &&
4090            uni_encode_ie(UNI_IE_ATRAFFIC, msg, (union uni_ieall *)&p->atraffic, cx))
4091                 return (UNI_IE_ATRAFFIC);
4092         if((p->mintraffic.h.present & UNI_IE_PRESENT) &&
4093            uni_encode_ie(UNI_IE_MINTRAFFIC, msg, (union uni_ieall *)&p->mintraffic, cx))
4094                 return (UNI_IE_MINTRAFFIC);
4095         if((p->notify.h.present & UNI_IE_PRESENT) &&
4096            uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
4097                 return (UNI_IE_NOTIFY);
4098         for(i = 0; i < UNI_NUM_IE_GIT; i++)
4099                 if((p->git[i].h.present & UNI_IE_PRESENT) &&
4100                    uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
4101                 return ((i << 16) + UNI_IE_GIT);
4102         if((p->unrec.h.present & UNI_IE_PRESENT) &&
4103            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
4104                 return (UNI_IE_UNREC);
4105
4106         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
4107         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
4108
4109         return (0);
4110 }
4111
4112 static int
4113 decode_modify_req(struct uni_modify_req *out, struct uni_msg *msg,
4114     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
4115     struct unicx *cx)
4116 {
4117         u_int i;
4118
4119         switch (ie) {
4120
4121           case UNI_IE_TRAFFIC:
4122                 out->traffic.h = *hdr;
4123                 if (hdr->present & UNI_IE_ERROR)
4124                         return (DEC_ERR);
4125                 if(uni_decode_ie_body(UNI_IE_TRAFFIC, (union uni_ieall *)&out->traffic, msg, ielen, cx))
4126                         return (DEC_ERR);
4127                 break;
4128
4129           case UNI_IE_ATRAFFIC:
4130                 out->atraffic.h = *hdr;
4131                 if (hdr->present & UNI_IE_ERROR)
4132                         return (DEC_ERR);
4133                 if(uni_decode_ie_body(UNI_IE_ATRAFFIC, (union uni_ieall *)&out->atraffic, msg, ielen, cx))
4134                         return (DEC_ERR);
4135                 break;
4136
4137           case UNI_IE_MINTRAFFIC:
4138                 out->mintraffic.h = *hdr;
4139                 if (hdr->present & UNI_IE_ERROR)
4140                         return (DEC_ERR);
4141                 if(uni_decode_ie_body(UNI_IE_MINTRAFFIC, (union uni_ieall *)&out->mintraffic, msg, ielen, cx))
4142                         return (DEC_ERR);
4143                 break;
4144
4145           case UNI_IE_NOTIFY:
4146                 out->notify.h = *hdr;
4147                 if (hdr->present & UNI_IE_ERROR)
4148                         return (DEC_ERR);
4149                 if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
4150                         return (DEC_ERR);
4151                 break;
4152
4153           case UNI_IE_GIT:
4154                 for(i = 0; i < UNI_NUM_IE_GIT; i++)
4155                         if (!IE_ISPRESENT(out->git[i])) {
4156                                 out->git[i].h = *hdr;
4157                                 if (hdr->present & UNI_IE_ERROR)
4158                                         return (DEC_ERR);
4159                                 if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
4160                                         return (DEC_ERR);
4161                                 break;
4162                         }
4163                 break;
4164
4165           case UNI_IE_UNREC:
4166                 out->unrec.h = *hdr;
4167                 if (hdr->present & UNI_IE_ERROR)
4168                         return (DEC_ERR);
4169                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
4170                         return (DEC_ERR);
4171                 break;
4172
4173           default:
4174                 return (DEC_ILL);
4175         }
4176         return (DEC_OK);
4177 }
4178
4179 static const struct msgdecl decl_modify_req = {
4180         0,
4181         "modify_req",
4182         (uni_msg_print_f)print_modify_req,
4183         (uni_msg_check_f)check_modify_req,
4184         (uni_msg_encode_f)encode_modify_req,
4185         (uni_msg_decode_f)decode_modify_req
4186 };
4187
4188 static void
4189 print_modify_ack(struct uni_modify_ack *msg, struct unicx *cx)
4190 {
4191         u_int i;
4192
4193         if(msg->report.h.present & UNI_IE_PRESENT)
4194                 uni_print_ie_internal(UNI_IE_REPORT, (union uni_ieall *)&msg->report, cx);
4195         if(msg->traffic.h.present & UNI_IE_PRESENT)
4196                 uni_print_ie_internal(UNI_IE_TRAFFIC, (union uni_ieall *)&msg->traffic, cx);
4197         if(msg->notify.h.present & UNI_IE_PRESENT)
4198                 uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
4199         for(i = 0; i < UNI_NUM_IE_GIT; i++)
4200                 if(msg->git[i].h.present & UNI_IE_PRESENT)
4201                         uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
4202         if(msg->unrec.h.present & UNI_IE_PRESENT)
4203                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
4204 }
4205
4206 static int
4207 check_modify_ack(struct uni_modify_ack *m, struct unicx *cx)
4208 {
4209         int ret = 0;
4210         u_int i;
4211
4212         ret |= uni_check_ie(UNI_IE_REPORT, (union uni_ieall *)&m->report, cx);
4213         ret |= uni_check_ie(UNI_IE_TRAFFIC, (union uni_ieall *)&m->traffic, cx);
4214         ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
4215         for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
4216                 ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
4217         }
4218         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
4219
4220         return ret;
4221 }
4222
4223 static int
4224 encode_modify_ack(struct uni_msg *msg, struct uni_modify_ack *p, struct unicx *cx)
4225 {
4226         u_int mlen;
4227         u_int i;
4228
4229         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_MODIFY_ACK, cx, &mlen))
4230                 return (-2);
4231
4232         if((p->report.h.present & UNI_IE_PRESENT) &&
4233            uni_encode_ie(UNI_IE_REPORT, msg, (union uni_ieall *)&p->report, cx))
4234                 return (UNI_IE_REPORT);
4235         if((p->traffic.h.present & UNI_IE_PRESENT) &&
4236            uni_encode_ie(UNI_IE_TRAFFIC, msg, (union uni_ieall *)&p->traffic, cx))
4237                 return (UNI_IE_TRAFFIC);
4238         if((p->notify.h.present & UNI_IE_PRESENT) &&
4239            uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
4240                 return (UNI_IE_NOTIFY);
4241         for(i = 0; i < UNI_NUM_IE_GIT; i++)
4242                 if((p->git[i].h.present & UNI_IE_PRESENT) &&
4243                    uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
4244                 return ((i << 16) + UNI_IE_GIT);
4245         if((p->unrec.h.present & UNI_IE_PRESENT) &&
4246            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
4247                 return (UNI_IE_UNREC);
4248
4249         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
4250         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
4251
4252         return (0);
4253 }
4254
4255 static int
4256 decode_modify_ack(struct uni_modify_ack *out, struct uni_msg *msg,
4257     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
4258     struct unicx *cx)
4259 {
4260         u_int i;
4261
4262         switch (ie) {
4263
4264           case UNI_IE_REPORT:
4265                 out->report.h = *hdr;
4266                 if (hdr->present & UNI_IE_ERROR)
4267                         return (DEC_ERR);
4268                 if(uni_decode_ie_body(UNI_IE_REPORT, (union uni_ieall *)&out->report, msg, ielen, cx))
4269                         return (DEC_ERR);
4270                 break;
4271
4272           case UNI_IE_TRAFFIC:
4273                 out->traffic.h = *hdr;
4274                 if (hdr->present & UNI_IE_ERROR)
4275                         return (DEC_ERR);
4276                 if(uni_decode_ie_body(UNI_IE_TRAFFIC, (union uni_ieall *)&out->traffic, msg, ielen, cx))
4277                         return (DEC_ERR);
4278                 break;
4279
4280           case UNI_IE_NOTIFY:
4281                 out->notify.h = *hdr;
4282                 if (hdr->present & UNI_IE_ERROR)
4283                         return (DEC_ERR);
4284                 if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
4285                         return (DEC_ERR);
4286                 break;
4287
4288           case UNI_IE_GIT:
4289                 for(i = 0; i < UNI_NUM_IE_GIT; i++)
4290                         if (!IE_ISPRESENT(out->git[i])) {
4291                                 out->git[i].h = *hdr;
4292                                 if (hdr->present & UNI_IE_ERROR)
4293                                         return (DEC_ERR);
4294                                 if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
4295                                         return (DEC_ERR);
4296                                 break;
4297                         }
4298                 break;
4299
4300           case UNI_IE_UNREC:
4301                 out->unrec.h = *hdr;
4302                 if (hdr->present & UNI_IE_ERROR)
4303                         return (DEC_ERR);
4304                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
4305                         return (DEC_ERR);
4306                 break;
4307
4308           default:
4309                 return (DEC_ILL);
4310         }
4311         return (DEC_OK);
4312 }
4313
4314 static const struct msgdecl decl_modify_ack = {
4315         0,
4316         "modify_ack",
4317         (uni_msg_print_f)print_modify_ack,
4318         (uni_msg_check_f)check_modify_ack,
4319         (uni_msg_encode_f)encode_modify_ack,
4320         (uni_msg_decode_f)decode_modify_ack
4321 };
4322
4323 static void
4324 print_modify_rej(struct uni_modify_rej *msg, struct unicx *cx)
4325 {
4326         u_int i;
4327
4328         if(msg->cause.h.present & UNI_IE_PRESENT)
4329                 uni_print_ie_internal(UNI_IE_CAUSE, (union uni_ieall *)&msg->cause, cx);
4330         if(msg->notify.h.present & UNI_IE_PRESENT)
4331                 uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
4332         for(i = 0; i < UNI_NUM_IE_GIT; i++)
4333                 if(msg->git[i].h.present & UNI_IE_PRESENT)
4334                         uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
4335         if(msg->unrec.h.present & UNI_IE_PRESENT)
4336                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
4337 }
4338
4339 static int
4340 check_modify_rej(struct uni_modify_rej *m, struct unicx *cx)
4341 {
4342         int ret = 0;
4343         u_int i;
4344
4345         ret |= uni_check_ie(UNI_IE_CAUSE, (union uni_ieall *)&m->cause, cx);
4346         ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
4347         for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
4348                 ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
4349         }
4350         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
4351
4352         return ret;
4353 }
4354
4355 static int
4356 encode_modify_rej(struct uni_msg *msg, struct uni_modify_rej *p, struct unicx *cx)
4357 {
4358         u_int mlen;
4359         u_int i;
4360
4361         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_MODIFY_REJ, cx, &mlen))
4362                 return (-2);
4363
4364         if((p->cause.h.present & UNI_IE_PRESENT) &&
4365            uni_encode_ie(UNI_IE_CAUSE, msg, (union uni_ieall *)&p->cause, cx))
4366                 return (UNI_IE_CAUSE);
4367         if((p->notify.h.present & UNI_IE_PRESENT) &&
4368            uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
4369                 return (UNI_IE_NOTIFY);
4370         for(i = 0; i < UNI_NUM_IE_GIT; i++)
4371                 if((p->git[i].h.present & UNI_IE_PRESENT) &&
4372                    uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
4373                 return ((i << 16) + UNI_IE_GIT);
4374         if((p->unrec.h.present & UNI_IE_PRESENT) &&
4375            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
4376                 return (UNI_IE_UNREC);
4377
4378         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
4379         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
4380
4381         return (0);
4382 }
4383
4384 static int
4385 decode_modify_rej(struct uni_modify_rej *out, struct uni_msg *msg,
4386     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
4387     struct unicx *cx)
4388 {
4389         u_int i;
4390
4391         switch (ie) {
4392
4393           case UNI_IE_CAUSE:
4394                 out->cause.h = *hdr;
4395                 if (hdr->present & UNI_IE_ERROR)
4396                         return (DEC_ERR);
4397                 if(uni_decode_ie_body(UNI_IE_CAUSE, (union uni_ieall *)&out->cause, msg, ielen, cx))
4398                         return (DEC_ERR);
4399                 break;
4400
4401           case UNI_IE_NOTIFY:
4402                 out->notify.h = *hdr;
4403                 if (hdr->present & UNI_IE_ERROR)
4404                         return (DEC_ERR);
4405                 if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
4406                         return (DEC_ERR);
4407                 break;
4408
4409           case UNI_IE_GIT:
4410                 for(i = 0; i < UNI_NUM_IE_GIT; i++)
4411                         if (!IE_ISPRESENT(out->git[i])) {
4412                                 out->git[i].h = *hdr;
4413                                 if (hdr->present & UNI_IE_ERROR)
4414                                         return (DEC_ERR);
4415                                 if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
4416                                         return (DEC_ERR);
4417                                 break;
4418                         }
4419                 break;
4420
4421           case UNI_IE_UNREC:
4422                 out->unrec.h = *hdr;
4423                 if (hdr->present & UNI_IE_ERROR)
4424                         return (DEC_ERR);
4425                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
4426                         return (DEC_ERR);
4427                 break;
4428
4429           default:
4430                 return (DEC_ILL);
4431         }
4432         return (DEC_OK);
4433 }
4434
4435 static const struct msgdecl decl_modify_rej = {
4436         0,
4437         "modify_rej",
4438         (uni_msg_print_f)print_modify_rej,
4439         (uni_msg_check_f)check_modify_rej,
4440         (uni_msg_encode_f)encode_modify_rej,
4441         (uni_msg_decode_f)decode_modify_rej
4442 };
4443
4444 static void
4445 print_conn_avail(struct uni_conn_avail *msg, struct unicx *cx)
4446 {
4447         u_int i;
4448
4449         if(msg->notify.h.present & UNI_IE_PRESENT)
4450                 uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
4451         for(i = 0; i < UNI_NUM_IE_GIT; i++)
4452                 if(msg->git[i].h.present & UNI_IE_PRESENT)
4453                         uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
4454         if(msg->report.h.present & UNI_IE_PRESENT)
4455                 uni_print_ie_internal(UNI_IE_REPORT, (union uni_ieall *)&msg->report, cx);
4456         if(msg->unrec.h.present & UNI_IE_PRESENT)
4457                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
4458 }
4459
4460 static int
4461 check_conn_avail(struct uni_conn_avail *m, struct unicx *cx)
4462 {
4463         int ret = 0;
4464         u_int i;
4465
4466         ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
4467         for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
4468                 ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
4469         }
4470         ret |= uni_check_ie(UNI_IE_REPORT, (union uni_ieall *)&m->report, cx);
4471         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
4472
4473         return ret;
4474 }
4475
4476 static int
4477 encode_conn_avail(struct uni_msg *msg, struct uni_conn_avail *p, struct unicx *cx)
4478 {
4479         u_int mlen;
4480         u_int i;
4481
4482         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_CONN_AVAIL, cx, &mlen))
4483                 return (-2);
4484
4485         if((p->notify.h.present & UNI_IE_PRESENT) &&
4486            uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
4487                 return (UNI_IE_NOTIFY);
4488         for(i = 0; i < UNI_NUM_IE_GIT; i++)
4489                 if((p->git[i].h.present & UNI_IE_PRESENT) &&
4490                    uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
4491                 return ((i << 16) + UNI_IE_GIT);
4492         if((p->report.h.present & UNI_IE_PRESENT) &&
4493            uni_encode_ie(UNI_IE_REPORT, msg, (union uni_ieall *)&p->report, cx))
4494                 return (UNI_IE_REPORT);
4495         if((p->unrec.h.present & UNI_IE_PRESENT) &&
4496            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
4497                 return (UNI_IE_UNREC);
4498
4499         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
4500         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
4501
4502         return (0);
4503 }
4504
4505 static int
4506 decode_conn_avail(struct uni_conn_avail *out, struct uni_msg *msg,
4507     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
4508     struct unicx *cx)
4509 {
4510         u_int i;
4511
4512         switch (ie) {
4513
4514           case UNI_IE_NOTIFY:
4515                 out->notify.h = *hdr;
4516                 if (hdr->present & UNI_IE_ERROR)
4517                         return (DEC_ERR);
4518                 if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
4519                         return (DEC_ERR);
4520                 break;
4521
4522           case UNI_IE_GIT:
4523                 for(i = 0; i < UNI_NUM_IE_GIT; i++)
4524                         if (!IE_ISPRESENT(out->git[i])) {
4525                                 out->git[i].h = *hdr;
4526                                 if (hdr->present & UNI_IE_ERROR)
4527                                         return (DEC_ERR);
4528                                 if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
4529                                         return (DEC_ERR);
4530                                 break;
4531                         }
4532                 break;
4533
4534           case UNI_IE_REPORT:
4535                 out->report.h = *hdr;
4536                 if (hdr->present & UNI_IE_ERROR)
4537                         return (DEC_ERR);
4538                 if(uni_decode_ie_body(UNI_IE_REPORT, (union uni_ieall *)&out->report, msg, ielen, cx))
4539                         return (DEC_ERR);
4540                 break;
4541
4542           case UNI_IE_UNREC:
4543                 out->unrec.h = *hdr;
4544                 if (hdr->present & UNI_IE_ERROR)
4545                         return (DEC_ERR);
4546                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
4547                         return (DEC_ERR);
4548                 break;
4549
4550           default:
4551                 return (DEC_ILL);
4552         }
4553         return (DEC_OK);
4554 }
4555
4556 static const struct msgdecl decl_conn_avail = {
4557         0,
4558         "conn_avail",
4559         (uni_msg_print_f)print_conn_avail,
4560         (uni_msg_check_f)check_conn_avail,
4561         (uni_msg_encode_f)encode_conn_avail,
4562         (uni_msg_decode_f)decode_conn_avail
4563 };
4564
4565 static void
4566 print_unknown(struct uni_unknown *msg, struct unicx *cx)
4567 {
4568         if(msg->epref.h.present & UNI_IE_PRESENT)
4569                 uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
4570         if(msg->unrec.h.present & UNI_IE_PRESENT)
4571                 uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
4572 }
4573
4574 static int
4575 check_unknown(struct uni_unknown *m, struct unicx *cx)
4576 {
4577         int ret = 0;
4578
4579         ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
4580         ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
4581
4582         return ret;
4583 }
4584
4585 static int
4586 encode_unknown(struct uni_msg *msg, struct uni_unknown *p, struct unicx *cx)
4587 {
4588         u_int mlen;
4589
4590         if(uni_encode_msg_hdr(msg, &p->hdr, UNI_UNKNOWN, cx, &mlen))
4591                 return (-2);
4592
4593         if((p->epref.h.present & UNI_IE_PRESENT) &&
4594            uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
4595                 return (UNI_IE_EPREF);
4596         if((p->unrec.h.present & UNI_IE_PRESENT) &&
4597            uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
4598                 return (UNI_IE_UNREC);
4599
4600         msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
4601         msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
4602
4603         return (0);
4604 }
4605
4606 static int
4607 decode_unknown(struct uni_unknown *out, struct uni_msg *msg,
4608     enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
4609     struct unicx *cx)
4610 {
4611         switch (ie) {
4612
4613           case UNI_IE_EPREF:
4614                 out->epref.h = *hdr;
4615                 if (hdr->present & UNI_IE_ERROR)
4616                         return (DEC_ERR);
4617                 if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
4618                         return (DEC_ERR);
4619                 break;
4620
4621           case UNI_IE_UNREC:
4622                 out->unrec.h = *hdr;
4623                 if (hdr->present & UNI_IE_ERROR)
4624                         return (DEC_ERR);
4625                 if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
4626                         return (DEC_ERR);
4627                 break;
4628
4629           default:
4630                 return (DEC_ILL);
4631         }
4632         return (DEC_OK);
4633 }
4634
4635 static const struct msgdecl decl_unknown = {
4636         0,
4637         "unknown",
4638         (uni_msg_print_f)print_unknown,
4639         (uni_msg_check_f)check_unknown,
4640         (uni_msg_encode_f)encode_unknown,
4641         (uni_msg_decode_f)decode_unknown
4642 };
4643
4644 const struct msgdecl *uni_msgtable[256] = {
4645         &decl_unknown,  /* 0x00 */
4646         &decl_alerting, /* 0x01 */
4647         &decl_call_proc,        /* 0x02 */
4648         &decl_unknown,  /* 0x03 */
4649         &decl_unknown,  /* 0x04 */
4650         &decl_setup,    /* 0x05 */
4651         &decl_unknown,  /* 0x06 */
4652         &decl_connect,  /* 0x07 */
4653         &decl_unknown,  /* 0x08 */
4654         &decl_unknown,  /* 0x09 */
4655         &decl_unknown,  /* 0x0a */
4656         &decl_unknown,  /* 0x0b */
4657         &decl_unknown,  /* 0x0c */
4658         &decl_unknown,  /* 0x0d */
4659         &decl_unknown,  /* 0x0e */
4660         &decl_connect_ack,      /* 0x0f */
4661         &decl_unknown,  /* 0x10 */
4662         &decl_unknown,  /* 0x11 */
4663         &decl_unknown,  /* 0x12 */
4664         &decl_unknown,  /* 0x13 */
4665         &decl_unknown,  /* 0x14 */
4666         &decl_cobisetup,        /* 0x15 */
4667         &decl_unknown,  /* 0x16 */
4668         &decl_unknown,  /* 0x17 */
4669         &decl_unknown,  /* 0x18 */
4670         &decl_unknown,  /* 0x19 */
4671         &decl_unknown,  /* 0x1a */
4672         &decl_unknown,  /* 0x1b */
4673         &decl_unknown,  /* 0x1c */
4674         &decl_unknown,  /* 0x1d */
4675         &decl_unknown,  /* 0x1e */
4676         &decl_unknown,  /* 0x1f */
4677         &decl_unknown,  /* 0x20 */
4678         &decl_unknown,  /* 0x21 */
4679         &decl_unknown,  /* 0x22 */
4680         &decl_unknown,  /* 0x23 */
4681         &decl_unknown,  /* 0x24 */
4682         &decl_unknown,  /* 0x25 */
4683         &decl_unknown,  /* 0x26 */
4684         &decl_unknown,  /* 0x27 */
4685         &decl_unknown,  /* 0x28 */
4686         &decl_unknown,  /* 0x29 */
4687         &decl_unknown,  /* 0x2a */
4688         &decl_unknown,  /* 0x2b */
4689         &decl_unknown,  /* 0x2c */
4690         &decl_unknown,  /* 0x2d */
4691         &decl_unknown,  /* 0x2e */
4692         &decl_unknown,  /* 0x2f */
4693         &decl_unknown,  /* 0x30 */
4694         &decl_unknown,  /* 0x31 */
4695         &decl_unknown,  /* 0x32 */
4696         &decl_unknown,  /* 0x33 */
4697         &decl_unknown,  /* 0x34 */
4698         &decl_unknown,  /* 0x35 */
4699         &decl_unknown,  /* 0x36 */
4700         &decl_unknown,  /* 0x37 */
4701         &decl_unknown,  /* 0x38 */
4702         &decl_unknown,  /* 0x39 */
4703         &decl_unknown,  /* 0x3a */
4704         &decl_unknown,  /* 0x3b */
4705         &decl_unknown,  /* 0x3c */
4706         &decl_unknown,  /* 0x3d */
4707         &decl_unknown,  /* 0x3e */
4708         &decl_unknown,  /* 0x3f */
4709         &decl_unknown,  /* 0x40 */
4710         &decl_unknown,  /* 0x41 */
4711         &decl_unknown,  /* 0x42 */
4712         &decl_unknown,  /* 0x43 */
4713         &decl_unknown,  /* 0x44 */
4714         &decl_unknown,  /* 0x45 */
4715         &decl_restart,  /* 0x46 */
4716         &decl_unknown,  /* 0x47 */
4717         &decl_unknown,  /* 0x48 */
4718         &decl_unknown,  /* 0x49 */
4719         &decl_unknown,  /* 0x4a */
4720         &decl_unknown,  /* 0x4b */
4721         &decl_unknown,  /* 0x4c */
4722         &decl_release,  /* 0x4d */
4723         &decl_restart_ack,      /* 0x4e */
4724         &decl_unknown,  /* 0x4f */
4725         &decl_unknown,  /* 0x50 */
4726         &decl_unknown,  /* 0x51 */
4727         &decl_unknown,  /* 0x52 */
4728         &decl_unknown,  /* 0x53 */
4729         &decl_unknown,  /* 0x54 */
4730         &decl_unknown,  /* 0x55 */
4731         &decl_unknown,  /* 0x56 */
4732         &decl_unknown,  /* 0x57 */
4733         &decl_unknown,  /* 0x58 */
4734         &decl_unknown,  /* 0x59 */
4735         &decl_release_compl,    /* 0x5a */
4736         &decl_unknown,  /* 0x5b */
4737         &decl_unknown,  /* 0x5c */
4738         &decl_unknown,  /* 0x5d */
4739         &decl_unknown,  /* 0x5e */
4740         &decl_unknown,  /* 0x5f */
4741         &decl_unknown,  /* 0x60 */
4742         &decl_unknown,  /* 0x61 */
4743         &decl_facility, /* 0x62 */
4744         &decl_unknown,  /* 0x63 */
4745         &decl_unknown,  /* 0x64 */
4746         &decl_unknown,  /* 0x65 */
4747         &decl_unknown,  /* 0x66 */
4748         &decl_unknown,  /* 0x67 */
4749         &decl_unknown,  /* 0x68 */
4750         &decl_unknown,  /* 0x69 */
4751         &decl_unknown,  /* 0x6a */
4752         &decl_unknown,  /* 0x6b */
4753         &decl_unknown,  /* 0x6c */
4754         &decl_unknown,  /* 0x6d */
4755         &decl_notify,   /* 0x6e */
4756         &decl_unknown,  /* 0x6f */
4757         &decl_unknown,  /* 0x70 */
4758         &decl_unknown,  /* 0x71 */
4759         &decl_unknown,  /* 0x72 */
4760         &decl_unknown,  /* 0x73 */
4761         &decl_unknown,  /* 0x74 */
4762         &decl_status_enq,       /* 0x75 */
4763         &decl_unknown,  /* 0x76 */
4764         &decl_unknown,  /* 0x77 */
4765         &decl_unknown,  /* 0x78 */
4766         &decl_unknown,  /* 0x79 */
4767         &decl_unknown,  /* 0x7a */
4768         &decl_unknown,  /* 0x7b */
4769         &decl_unknown,  /* 0x7c */
4770         &decl_status,   /* 0x7d */
4771         &decl_unknown,  /* 0x7e */
4772         &decl_unknown,  /* 0x7f */
4773         &decl_add_party,        /* 0x80 */
4774         &decl_add_party_ack,    /* 0x81 */
4775         &decl_add_party_rej,    /* 0x82 */
4776         &decl_drop_party,       /* 0x83 */
4777         &decl_drop_party_ack,   /* 0x84 */
4778         &decl_party_alerting,   /* 0x85 */
4779         &decl_unknown,  /* 0x86 */
4780         &decl_unknown,  /* 0x87 */
4781         &decl_modify_req,       /* 0x88 */
4782         &decl_modify_ack,       /* 0x89 */
4783         &decl_modify_rej,       /* 0x8a */
4784         &decl_conn_avail,       /* 0x8b */
4785         &decl_unknown,  /* 0x8c */
4786         &decl_unknown,  /* 0x8d */
4787         &decl_unknown,  /* 0x8e */
4788         &decl_unknown,  /* 0x8f */
4789         &decl_leaf_setup_fail,  /* 0x90 */
4790         &decl_leaf_setup_req,   /* 0x91 */
4791         &decl_unknown,  /* 0x92 */
4792         &decl_unknown,  /* 0x93 */
4793         &decl_unknown,  /* 0x94 */
4794         &decl_unknown,  /* 0x95 */
4795         &decl_unknown,  /* 0x96 */
4796         &decl_unknown,  /* 0x97 */
4797         &decl_unknown,  /* 0x98 */
4798         &decl_unknown,  /* 0x99 */
4799         &decl_unknown,  /* 0x9a */
4800         &decl_unknown,  /* 0x9b */
4801         &decl_unknown,  /* 0x9c */
4802         &decl_unknown,  /* 0x9d */
4803         &decl_unknown,  /* 0x9e */
4804         &decl_unknown,  /* 0x9f */
4805         &decl_unknown,  /* 0xa0 */
4806         &decl_unknown,  /* 0xa1 */
4807         &decl_unknown,  /* 0xa2 */
4808         &decl_unknown,  /* 0xa3 */
4809         &decl_unknown,  /* 0xa4 */
4810         &decl_unknown,  /* 0xa5 */
4811         &decl_unknown,  /* 0xa6 */
4812         &decl_unknown,  /* 0xa7 */
4813         &decl_unknown,  /* 0xa8 */
4814         &decl_unknown,  /* 0xa9 */
4815         &decl_unknown,  /* 0xaa */
4816         &decl_unknown,  /* 0xab */
4817         &decl_unknown,  /* 0xac */
4818         &decl_unknown,  /* 0xad */
4819         &decl_unknown,  /* 0xae */
4820         &decl_unknown,  /* 0xaf */
4821         &decl_unknown,  /* 0xb0 */
4822         &decl_unknown,  /* 0xb1 */
4823         &decl_unknown,  /* 0xb2 */
4824         &decl_unknown,  /* 0xb3 */
4825         &decl_unknown,  /* 0xb4 */
4826         &decl_unknown,  /* 0xb5 */
4827         &decl_unknown,  /* 0xb6 */
4828         &decl_unknown,  /* 0xb7 */
4829         &decl_unknown,  /* 0xb8 */
4830         &decl_unknown,  /* 0xb9 */
4831         &decl_unknown,  /* 0xba */
4832         &decl_unknown,  /* 0xbb */
4833         &decl_unknown,  /* 0xbc */
4834         &decl_unknown,  /* 0xbd */
4835         &decl_unknown,  /* 0xbe */
4836         &decl_unknown,  /* 0xbf */
4837         &decl_unknown,  /* 0xc0 */
4838         &decl_unknown,  /* 0xc1 */
4839         &decl_unknown,  /* 0xc2 */
4840         &decl_unknown,  /* 0xc3 */
4841         &decl_unknown,  /* 0xc4 */
4842         &decl_unknown,  /* 0xc5 */
4843         &decl_unknown,  /* 0xc6 */
4844         &decl_unknown,  /* 0xc7 */
4845         &decl_unknown,  /* 0xc8 */
4846         &decl_unknown,  /* 0xc9 */
4847         &decl_unknown,  /* 0xca */
4848         &decl_unknown,  /* 0xcb */
4849         &decl_unknown,  /* 0xcc */
4850         &decl_unknown,  /* 0xcd */
4851         &decl_unknown,  /* 0xce */
4852         &decl_unknown,  /* 0xcf */
4853         &decl_unknown,  /* 0xd0 */
4854         &decl_unknown,  /* 0xd1 */
4855         &decl_unknown,  /* 0xd2 */
4856         &decl_unknown,  /* 0xd3 */
4857         &decl_unknown,  /* 0xd4 */
4858         &decl_unknown,  /* 0xd5 */
4859         &decl_unknown,  /* 0xd6 */
4860         &decl_unknown,  /* 0xd7 */
4861         &decl_unknown,  /* 0xd8 */
4862         &decl_unknown,  /* 0xd9 */
4863         &decl_unknown,  /* 0xda */
4864         &decl_unknown,  /* 0xdb */
4865         &decl_unknown,  /* 0xdc */
4866         &decl_unknown,  /* 0xdd */
4867         &decl_unknown,  /* 0xde */
4868         &decl_unknown,  /* 0xdf */
4869         &decl_unknown,  /* 0xe0 */
4870         &decl_unknown,  /* 0xe1 */
4871         &decl_unknown,  /* 0xe2 */
4872         &decl_unknown,  /* 0xe3 */
4873         &decl_unknown,  /* 0xe4 */
4874         &decl_unknown,  /* 0xe5 */
4875         &decl_unknown,  /* 0xe6 */
4876         &decl_unknown,  /* 0xe7 */
4877         &decl_unknown,  /* 0xe8 */
4878         &decl_unknown,  /* 0xe9 */
4879         &decl_unknown,  /* 0xea */
4880         &decl_unknown,  /* 0xeb */
4881         &decl_unknown,  /* 0xec */
4882         &decl_unknown,  /* 0xed */
4883         &decl_unknown,  /* 0xee */
4884         &decl_unknown,  /* 0xef */
4885         &decl_unknown,  /* 0xf0 */
4886         &decl_unknown,  /* 0xf1 */
4887         &decl_unknown,  /* 0xf2 */
4888         &decl_unknown,  /* 0xf3 */
4889         &decl_unknown,  /* 0xf4 */
4890         &decl_unknown,  /* 0xf5 */
4891         &decl_unknown,  /* 0xf6 */
4892         &decl_unknown,  /* 0xf7 */
4893         &decl_unknown,  /* 0xf8 */
4894         &decl_unknown,  /* 0xf9 */
4895         &decl_unknown,  /* 0xfa */
4896         &decl_unknown,  /* 0xfb */
4897         &decl_unknown,  /* 0xfc */
4898         &decl_unknown,  /* 0xfd */
4899         &decl_unknown,  /* 0xfe */
4900         &decl_unknown,  /* 0xff */
4901 };