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 $
27 * @(#) $DragonFly: src/sys/netproto/atm/uni/unisig_util.c,v 1.3 2003/08/07 21:17:36 dillon Exp $
31 * ATM Forum UNI 3.0/3.1 Signalling Manager
32 * ----------------------------------------
34 * Protocol processing module
38 #include <netatm/kern_include.h>
40 #include "unisig_var.h"
41 #include "unisig_msg.h"
44 * Free a UNISIG signalling message
46 * Free the passed message and any IEs that are attached to it
49 * msg pointer to UNISIG protocol instance
57 struct unisig_msg *msg;
60 struct ie_generic *ie, *ienxt;
62 ATM_DEBUG1("unisig_free_msg: msg=%p\n", msg);
65 * First free all the IEs
67 for (i=0; i<UNI_MSG_IE_CNT; i++) {
68 ie = msg->msg_ie_vec[i];
77 * Finally, free the message structure itself
86 * Search UNISIG's VCCB queue to verify that a VCCB belongs to UNISIG.
89 * usp pointer to UNISIG protocol instance
90 * svp pointer to a VCCB
93 * TRUE the VCCB belongs to UNISIG
94 * FALSE the VCCB doesn't belong to UNISIG
98 unisig_verify_vccb(usp, uvp)
100 struct unisig_vccb *uvp;
103 struct unisig_vccb *utp, *uvnext;
105 for (utp = Q_HEAD(usp->us_vccq, struct unisig_vccb);
107 uvnext = Q_NEXT(utp, struct unisig_vccb, uv_sigelem);
119 * Find a VCCB given the call reference
122 * usp pointer to UNISIG protocol instance
123 * cref the call reference to search for
126 * 0 there is no such VCCB
127 * uvp the address of the VCCB
131 unisig_find_conn(usp, cref)
136 struct unisig_vccb *uvp, *uvnext;
138 for (uvp = Q_HEAD(usp->us_vccq, struct unisig_vccb); uvp;
140 uvnext = Q_NEXT(uvp, struct unisig_vccb, uv_sigelem);
141 if (uvp->uv_call_ref == cref)
151 * Find a VCCB given the VPI and VCI.
154 * usp pointer to UNISIG protocol instance
155 * vpi the VPI to search for
156 * vci the VCI to search for
157 * dir the direction of the VCC (VCC_IN, VCC_OUT, or both).
158 * If dir is set to zero, return the address of any VCCB
159 * with the given VPI/VCI, regardless of direction.
162 * 0 there is no such VCCB
163 * uvp the address of the VCCB
167 unisig_find_vpvc(usp, vpi, vci, dir)
173 struct unisig_vccb *uvp, *uvnext;
175 for (uvp = Q_HEAD(usp->us_vccq, struct unisig_vccb); uvp;
177 uvnext = Q_NEXT(uvp, struct unisig_vccb, uv_sigelem);
178 if (uvp->uv_vpi == vpi &&
179 uvp->uv_vci == vci &&
180 (uvp->uv_type & dir) == dir)
188 * Allocate a call reference value
191 * usp pointer to UNISIG protocol instance
194 * 0 call reference not available
195 * cref the call reference value
199 unisig_alloc_call_ref(usp)
206 * Get the next call reference value
211 * Make sure it hasn't got too large
213 if (cref >= UNI_MSG_CALL_REF_DUMMY) {
215 log(LOG_ERR, "uni: call reference limit reached\n");
220 * Bump the call reference value
229 * Print an ATM address
231 * Convert an ATM address into an ASCII string suitable for printing.
234 * p pointer to an ATM address
237 * the address of a string with the ASCII representation of the
238 * address. This routine returns the address of a statically-
239 * allocated buffer, so if repeated calls to this routine are made,
240 * each call will destroy the result of the previous call.
248 char *fp, *op, t_buff[16];
250 static char strbuff[256];
252 static char nf_DCC[] = "0xX.XX.X.XXX.XX.XX.XX.XXXXXX.X";
253 static char nf_ICD[] = "0xX.XX.X.XXX.XX.XX.XX.XXXXXX.X";
254 static char nf_E164[] = "0xX.XXXXXXXX.XX.XX.XXXXXX.X";
262 * Clear the print buffer
264 KM_ZERO(strbuff, sizeof(strbuff));
267 * Select appropriate printing format
269 switch(p->address_format) {
270 case T_ATM_ENDSYS_ADDR:
272 * Select format by NSAP type
274 switch(((Atm_addr_nsap *)p->address)->aan_afi) {
288 * Loop through the format string, converting the NSAP
291 cp = (u_char *) p->address;
296 * If format character is an 'X', put a
297 * two-digit hex representation of the
298 * NSAP byte in the output buffer
300 snprintf(t_buff, sizeof(t_buff),
302 strcpy(op, &t_buff[strlen(t_buff)-2]);
307 * If format character isn't an 'X',
308 * just copy it to the output buffer
318 case T_ATM_E164_ADDR:
320 * Print the IA5 characters of the E.164 address
322 for(i=0; i<p->address_length; i++) {
323 snprintf(strbuff + strlen(strbuff),
324 sizeof(strbuff) - strlen(strbuff), "%c",
325 ((Atm_addr_e164 *)p->address)->aae_addr[i]);
329 case T_ATM_SPANS_ADDR:
331 * Get address into integers
333 u1.c[0] = ((Atm_addr_spans *)p->address)->aas_addr[0];
334 u1.c[1] = ((Atm_addr_spans *)p->address)->aas_addr[1];
335 u1.c[2] = ((Atm_addr_spans *)p->address)->aas_addr[2];
336 u1.c[3] = ((Atm_addr_spans *)p->address)->aas_addr[3];
337 u2.c[0] = ((Atm_addr_spans *)p->address)->aas_addr[4];
338 u2.c[1] = ((Atm_addr_spans *)p->address)->aas_addr[5];
339 u2.c[2] = ((Atm_addr_spans *)p->address)->aas_addr[6];
340 u2.c[3] = ((Atm_addr_spans *)p->address)->aas_addr[7];
343 * Print the address as two words xxxxx.yyyyyyyy
345 snprintf(strbuff, sizeof(strbuff), "%x.%x", u1.w, u2.w);
350 strcpy(strbuff, "-");
358 * Print the contents of a message buffer chain
361 * m pointer to a buffer
374 printf("unisig_print_mbuf:\n");
376 KB_DATASTART(m, cp, caddr_t);
377 for (i = 0; i < KB_LEN(m); i++) {
379 printf(" bfr=%p: ", m);
380 printf("%x ", (u_char)*cp++);
382 printf("<end_bfr>\n");