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
print_alerting(struct uni_alerting * msg,struct unicx * cx)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
check_alerting(struct uni_alerting * m,struct unicx * cx)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
encode_alerting(struct uni_msg * msg,struct uni_alerting * p,struct unicx * cx)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
decode_alerting(struct uni_alerting * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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
print_call_proc(struct uni_call_proc * msg,struct unicx * cx)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
check_call_proc(struct uni_call_proc * m,struct unicx * cx)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
encode_call_proc(struct uni_msg * msg,struct uni_call_proc * p,struct unicx * cx)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
decode_call_proc(struct uni_call_proc * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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
print_connect(struct uni_connect * msg,struct unicx * cx)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
check_connect(struct uni_connect * m,struct unicx * cx)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
encode_connect(struct uni_msg * msg,struct uni_connect * p,struct unicx * cx)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
decode_connect(struct uni_connect * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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
print_connect_ack(struct uni_connect_ack * msg,struct unicx * cx)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
check_connect_ack(struct uni_connect_ack * m,struct unicx * cx)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
encode_connect_ack(struct uni_msg * msg,struct uni_connect_ack * p,struct unicx * cx)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
decode_connect_ack(struct uni_connect_ack * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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
print_release(struct uni_release * msg,struct unicx * cx)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
check_release(struct uni_release * m,struct unicx * cx)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
encode_release(struct uni_msg * msg,struct uni_release * p,struct unicx * cx)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
decode_release(struct uni_release * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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
print_release_compl(struct uni_release_compl * msg,struct unicx * cx)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
check_release_compl(struct uni_release_compl * m,struct unicx * cx)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
encode_release_compl(struct uni_msg * msg,struct uni_release_compl * p,struct unicx * cx)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
decode_release_compl(struct uni_release_compl * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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
print_setup(struct uni_setup * msg,struct unicx * cx)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
check_setup(struct uni_setup * m,struct unicx * cx)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
encode_setup(struct uni_msg * msg,struct uni_setup * p,struct unicx * cx)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
decode_setup(struct uni_setup * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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
print_status(struct uni_status * msg,struct unicx * cx)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
check_status(struct uni_status * m,struct unicx * cx)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
encode_status(struct uni_msg * msg,struct uni_status * p,struct unicx * cx)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
decode_status(struct uni_status * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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
print_status_enq(struct uni_status_enq * msg,struct unicx * cx)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
check_status_enq(struct uni_status_enq * m,struct unicx * cx)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
encode_status_enq(struct uni_msg * msg,struct uni_status_enq * p,struct unicx * cx)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
decode_status_enq(struct uni_status_enq * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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
print_notify(struct uni_notify * msg,struct unicx * cx)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
check_notify(struct uni_notify * m,struct unicx * cx)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
encode_notify(struct uni_msg * msg,struct uni_notify * p,struct unicx * cx)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
decode_notify(struct uni_notify * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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
print_restart(struct uni_restart * msg,struct unicx * cx)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
check_restart(struct uni_restart * m,struct unicx * cx)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
encode_restart(struct uni_msg * msg,struct uni_restart * p,struct unicx * cx)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
decode_restart(struct uni_restart * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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
print_restart_ack(struct uni_restart_ack * msg,struct unicx * cx)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
check_restart_ack(struct uni_restart_ack * m,struct unicx * cx)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
encode_restart_ack(struct uni_msg * msg,struct uni_restart_ack * p,struct unicx * cx)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
decode_restart_ack(struct uni_restart_ack * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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
print_add_party(struct uni_add_party * msg,struct unicx * cx)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
check_add_party(struct uni_add_party * m,struct unicx * cx)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
encode_add_party(struct uni_msg * msg,struct uni_add_party * p,struct unicx * cx)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
decode_add_party(struct uni_add_party * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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
print_add_party_ack(struct uni_add_party_ack * msg,struct unicx * cx)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
check_add_party_ack(struct uni_add_party_ack * m,struct unicx * cx)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
encode_add_party_ack(struct uni_msg * msg,struct uni_add_party_ack * p,struct unicx * cx)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
decode_add_party_ack(struct uni_add_party_ack * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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
print_party_alerting(struct uni_party_alerting * msg,struct unicx * cx)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
check_party_alerting(struct uni_party_alerting * m,struct unicx * cx)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
encode_party_alerting(struct uni_msg * msg,struct uni_party_alerting * p,struct unicx * cx)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
decode_party_alerting(struct uni_party_alerting * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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
print_add_party_rej(struct uni_add_party_rej * msg,struct unicx * cx)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
check_add_party_rej(struct uni_add_party_rej * m,struct unicx * cx)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
encode_add_party_rej(struct uni_msg * msg,struct uni_add_party_rej * p,struct unicx * cx)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
decode_add_party_rej(struct uni_add_party_rej * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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
print_drop_party(struct uni_drop_party * msg,struct unicx * cx)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
check_drop_party(struct uni_drop_party * m,struct unicx * cx)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
encode_drop_party(struct uni_msg * msg,struct uni_drop_party * p,struct unicx * cx)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
decode_drop_party(struct uni_drop_party * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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
print_drop_party_ack(struct uni_drop_party_ack * msg,struct unicx * cx)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
check_drop_party_ack(struct uni_drop_party_ack * m,struct unicx * cx)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
encode_drop_party_ack(struct uni_msg * msg,struct uni_drop_party_ack * p,struct unicx * cx)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
decode_drop_party_ack(struct uni_drop_party_ack * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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
print_leaf_setup_req(struct uni_leaf_setup_req * msg,struct unicx * cx)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
check_leaf_setup_req(struct uni_leaf_setup_req * m,struct unicx * cx)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
encode_leaf_setup_req(struct uni_msg * msg,struct uni_leaf_setup_req * p,struct unicx * cx)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
decode_leaf_setup_req(struct uni_leaf_setup_req * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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
print_leaf_setup_fail(struct uni_leaf_setup_fail * msg,struct unicx * cx)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
check_leaf_setup_fail(struct uni_leaf_setup_fail * m,struct unicx * cx)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
encode_leaf_setup_fail(struct uni_msg * msg,struct uni_leaf_setup_fail * p,struct unicx * cx)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
decode_leaf_setup_fail(struct uni_leaf_setup_fail * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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
print_cobisetup(struct uni_cobisetup * msg,struct unicx * cx)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
check_cobisetup(struct uni_cobisetup * m,struct unicx * cx)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
encode_cobisetup(struct uni_msg * msg,struct uni_cobisetup * p,struct unicx * cx)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
decode_cobisetup(struct uni_cobisetup * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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
print_facility(struct uni_facility * msg,struct unicx * cx)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
check_facility(struct uni_facility * m,struct unicx * cx)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
encode_facility(struct uni_msg * msg,struct uni_facility * p,struct unicx * cx)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
decode_facility(struct uni_facility * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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
print_modify_req(struct uni_modify_req * msg,struct unicx * cx)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
check_modify_req(struct uni_modify_req * m,struct unicx * cx)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
encode_modify_req(struct uni_msg * msg,struct uni_modify_req * p,struct unicx * cx)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
decode_modify_req(struct uni_modify_req * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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
print_modify_ack(struct uni_modify_ack * msg,struct unicx * cx)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
check_modify_ack(struct uni_modify_ack * m,struct unicx * cx)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
encode_modify_ack(struct uni_msg * msg,struct uni_modify_ack * p,struct unicx * cx)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
decode_modify_ack(struct uni_modify_ack * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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
print_modify_rej(struct uni_modify_rej * msg,struct unicx * cx)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
check_modify_rej(struct uni_modify_rej * m,struct unicx * cx)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
encode_modify_rej(struct uni_msg * msg,struct uni_modify_rej * p,struct unicx * cx)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
decode_modify_rej(struct uni_modify_rej * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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
print_conn_avail(struct uni_conn_avail * msg,struct unicx * cx)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
check_conn_avail(struct uni_conn_avail * m,struct unicx * cx)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
encode_conn_avail(struct uni_msg * msg,struct uni_conn_avail * p,struct unicx * cx)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
decode_conn_avail(struct uni_conn_avail * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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
print_unknown(struct uni_unknown * msg,struct unicx * cx)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
check_unknown(struct uni_unknown * m,struct unicx * cx)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
encode_unknown(struct uni_msg * msg,struct uni_unknown * p,struct unicx * cx)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
decode_unknown(struct uni_unknown * out,struct uni_msg * msg,enum uni_ietype ie,struct uni_iehdr * hdr,u_int ielen,struct unicx * cx)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 };
4902