3 * ===================================
4 * HARP | Host ATM Research Platform
5 * ===================================
8 * This Host ATM Research Platform ("HARP") file (the "Software") is
9 * made available by Network Computing Services, Inc. ("NetworkCS")
10 * "AS IS". NetworkCS does not provide maintenance, improvements or
11 * support of any kind.
13 * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED,
14 * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY
15 * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE
16 * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE.
17 * In no event shall NetworkCS be responsible for any damages, including
18 * but not limited to consequential damages, arising from or relating to
19 * any use of the Software or related support.
21 * Copyright 1994-1998 Network Computing Services, Inc.
23 * Copies of this Software may be made, however, the above copyright
24 * notice must be reproduced on all copies.
26 * @(#) $FreeBSD: src/sys/netatm/uni/unisig_util.c,v 1.6 2000/01/17 20:49:58 mks Exp $
31 * ATM Forum UNI 3.0/3.1 Signalling Manager
32 * ----------------------------------------
34 * Protocol processing module
38 #include <netatm/kern_include.h>
40 #include <netatm/uni/unisig_var.h>
41 #include <netatm/uni/unisig_msg.h>
44 __RCSID("@(#) $FreeBSD: src/sys/netatm/uni/unisig_util.c,v 1.6 2000/01/17 20:49:58 mks Exp $");
49 * Free a UNISIG signalling message
51 * Free the passed message and any IEs that are attached to it
54 * msg pointer to UNISIG protocol instance
62 struct unisig_msg *msg;
65 struct ie_generic *ie, *ienxt;
67 ATM_DEBUG1("unisig_free_msg: msg=%p\n", msg);
70 * First free all the IEs
72 for (i=0; i<UNI_MSG_IE_CNT; i++) {
73 ie = msg->msg_ie_vec[i];
82 * Finally, free the message structure itself
91 * Search UNISIG's VCCB queue to verify that a VCCB belongs to UNISIG.
94 * usp pointer to UNISIG protocol instance
95 * svp pointer to a VCCB
98 * TRUE the VCCB belongs to UNISIG
99 * FALSE the VCCB doesn't belong to UNISIG
103 unisig_verify_vccb(usp, uvp)
105 struct unisig_vccb *uvp;
108 struct unisig_vccb *utp, *uvnext;
110 for (utp = Q_HEAD(usp->us_vccq, struct unisig_vccb);
112 uvnext = Q_NEXT(utp, struct unisig_vccb, uv_sigelem);
124 * Find a VCCB given the call reference
127 * usp pointer to UNISIG protocol instance
128 * cref the call reference to search for
131 * 0 there is no such VCCB
132 * uvp the address of the VCCB
136 unisig_find_conn(usp, cref)
141 struct unisig_vccb *uvp, *uvnext;
143 for (uvp = Q_HEAD(usp->us_vccq, struct unisig_vccb); uvp;
145 uvnext = Q_NEXT(uvp, struct unisig_vccb, uv_sigelem);
146 if (uvp->uv_call_ref == cref)
156 * Find a VCCB given the VPI and VCI.
159 * usp pointer to UNISIG protocol instance
160 * vpi the VPI to search for
161 * vci the VCI to search for
162 * dir the direction of the VCC (VCC_IN, VCC_OUT, or both).
163 * If dir is set to zero, return the address of any VCCB
164 * with the given VPI/VCI, regardless of direction.
167 * 0 there is no such VCCB
168 * uvp the address of the VCCB
172 unisig_find_vpvc(usp, vpi, vci, dir)
178 struct unisig_vccb *uvp, *uvnext;
180 for (uvp = Q_HEAD(usp->us_vccq, struct unisig_vccb); uvp;
182 uvnext = Q_NEXT(uvp, struct unisig_vccb, uv_sigelem);
183 if (uvp->uv_vpi == vpi &&
184 uvp->uv_vci == vci &&
185 (uvp->uv_type & dir) == dir)
193 * Allocate a call reference value
196 * usp pointer to UNISIG protocol instance
199 * 0 call reference not available
200 * cref the call reference value
204 unisig_alloc_call_ref(usp)
211 * Get the next call reference value
216 * Make sure it hasn't got too large
218 if (cref >= UNI_MSG_CALL_REF_DUMMY) {
220 log(LOG_ERR, "uni: call reference limit reached\n");
225 * Bump the call reference value
234 * Print an ATM address
236 * Convert an ATM address into an ASCII string suitable for printing.
239 * p pointer to an ATM address
242 * the address of a string with the ASCII representation of the
243 * address. This routine returns the address of a statically-
244 * allocated buffer, so if repeated calls to this routine are made,
245 * each call will destroy the result of the previous call.
253 char *fp, *op, t_buff[16];
255 static char strbuff[256];
257 static char nf_DCC[] = "0xX.XX.X.XXX.XX.XX.XX.XXXXXX.X";
258 static char nf_ICD[] = "0xX.XX.X.XXX.XX.XX.XX.XXXXXX.X";
259 static char nf_E164[] = "0xX.XXXXXXXX.XX.XX.XXXXXX.X";
267 * Clear the print buffer
269 KM_ZERO(strbuff, sizeof(strbuff));
272 * Select appropriate printing format
274 switch(p->address_format) {
275 case T_ATM_ENDSYS_ADDR:
277 * Select format by NSAP type
279 switch(((Atm_addr_nsap *)p->address)->aan_afi) {
293 * Loop through the format string, converting the NSAP
296 cp = (u_char *) p->address;
301 * If format character is an 'X', put a
302 * two-digit hex representation of the
303 * NSAP byte in the output buffer
305 snprintf(t_buff, sizeof(t_buff),
307 strcpy(op, &t_buff[strlen(t_buff)-2]);
312 * If format character isn't an 'X',
313 * just copy it to the output buffer
323 case T_ATM_E164_ADDR:
325 * Print the IA5 characters of the E.164 address
327 for(i=0; i<p->address_length; i++) {
328 snprintf(strbuff + strlen(strbuff),
329 sizeof(strbuff) - strlen(strbuff), "%c",
330 ((Atm_addr_e164 *)p->address)->aae_addr[i]);
334 case T_ATM_SPANS_ADDR:
336 * Get address into integers
338 u1.c[0] = ((Atm_addr_spans *)p->address)->aas_addr[0];
339 u1.c[1] = ((Atm_addr_spans *)p->address)->aas_addr[1];
340 u1.c[2] = ((Atm_addr_spans *)p->address)->aas_addr[2];
341 u1.c[3] = ((Atm_addr_spans *)p->address)->aas_addr[3];
342 u2.c[0] = ((Atm_addr_spans *)p->address)->aas_addr[4];
343 u2.c[1] = ((Atm_addr_spans *)p->address)->aas_addr[5];
344 u2.c[2] = ((Atm_addr_spans *)p->address)->aas_addr[6];
345 u2.c[3] = ((Atm_addr_spans *)p->address)->aas_addr[7];
348 * Print the address as two words xxxxx.yyyyyyyy
350 snprintf(strbuff, sizeof(strbuff), "%x.%x", u1.w, u2.w);
355 strcpy(strbuff, "-");
363 * Print the contents of a message buffer chain
366 * m pointer to a buffer
379 printf("unisig_print_mbuf:\n");
381 KB_DATASTART(m, cp, caddr_t);
382 for (i = 0; i < KB_LEN(m); i++) {
384 printf(" bfr=%p: ", m);
385 printf("%x ", (u_char)*cp++);
387 printf("<end_bfr>\n");