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.6 2006/12/20 18:14:43 dillon Exp $
31 * ATM Forum UNI 3.0/3.1 Signalling Manager
32 * ----------------------------------------
34 * Protocol processing module
38 #include <netproto/atm/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
56 unisig_free_msg(struct unisig_msg *msg)
59 struct ie_generic *ie, *ienxt;
61 ATM_DEBUG1("unisig_free_msg: msg=%p\n", msg);
64 * First free all the IEs
66 for (i=0; i<UNI_MSG_IE_CNT; i++) {
67 ie = msg->msg_ie_vec[i];
76 * Finally, free the message structure itself
85 * Search UNISIG's VCCB queue to verify that a VCCB belongs to UNISIG.
88 * usp pointer to UNISIG protocol instance
89 * svp pointer to a VCCB
92 * TRUE the VCCB belongs to UNISIG
93 * FALSE the VCCB doesn't belong to UNISIG
97 unisig_verify_vccb(struct unisig *usp, struct unisig_vccb *uvp)
99 struct unisig_vccb *utp, *uvnext;
101 for (utp = Q_HEAD(usp->us_vccq, struct unisig_vccb);
103 uvnext = Q_NEXT(utp, struct unisig_vccb, uv_sigelem);
115 * Find a VCCB given the call reference
118 * usp pointer to UNISIG protocol instance
119 * cref the call reference to search for
122 * 0 there is no such VCCB
123 * uvp the address of the VCCB
127 unisig_find_conn(struct unisig *usp, u_int cref)
129 struct unisig_vccb *uvp, *uvnext;
131 for (uvp = Q_HEAD(usp->us_vccq, struct unisig_vccb); uvp;
133 uvnext = Q_NEXT(uvp, struct unisig_vccb, uv_sigelem);
134 if (uvp->uv_call_ref == cref)
144 * Find a VCCB given the VPI and VCI.
147 * usp pointer to UNISIG protocol instance
148 * vpi the VPI to search for
149 * vci the VCI to search for
150 * dir the direction of the VCC (VCC_IN, VCC_OUT, or both).
151 * If dir is set to zero, return the address of any VCCB
152 * with the given VPI/VCI, regardless of direction.
155 * 0 there is no such VCCB
156 * uvp the address of the VCCB
160 unisig_find_vpvc(struct unisig *usp, int vpi, int vci, u_char dir)
162 struct unisig_vccb *uvp, *uvnext;
164 for (uvp = Q_HEAD(usp->us_vccq, struct unisig_vccb); uvp;
166 uvnext = Q_NEXT(uvp, struct unisig_vccb, uv_sigelem);
167 if (uvp->uv_vpi == vpi &&
168 uvp->uv_vci == vci &&
169 (uvp->uv_type & dir) == dir)
177 * Allocate a call reference value
180 * usp pointer to UNISIG protocol instance
183 * 0 call reference not available
184 * cref the call reference value
188 unisig_alloc_call_ref(struct unisig *usp)
193 * Get the next call reference value
198 * Make sure it hasn't got too large
200 if (cref >= UNI_MSG_CALL_REF_DUMMY) {
202 log(LOG_ERR, "uni: call reference limit reached\n");
207 * Bump the call reference value
216 * Print an ATM address
218 * Convert an ATM address into an ASCII string suitable for printing.
221 * p pointer to an ATM address
224 * the address of a string with the ASCII representation of the
225 * address. This routine returns the address of a statically-
226 * allocated buffer, so if repeated calls to this routine are made,
227 * each call will destroy the result of the previous call.
231 unisig_addr_print(Atm_addr *p)
234 char *fp, *op, t_buff[16];
236 static char strbuff[256];
238 static char nf_DCC[] = "0xX.XX.X.XXX.XX.XX.XX.XXXXXX.X";
239 static char nf_ICD[] = "0xX.XX.X.XXX.XX.XX.XX.XXXXXX.X";
240 static char nf_E164[] = "0xX.XXXXXXXX.XX.XX.XXXXXX.X";
248 * Clear the print buffer
250 KM_ZERO(strbuff, sizeof(strbuff));
253 * Select appropriate printing format
255 switch(p->address_format) {
256 case T_ATM_ENDSYS_ADDR:
258 * Select format by NSAP type
260 switch(((Atm_addr_nsap *)p->address)->aan_afi) {
274 * Loop through the format string, converting the NSAP
277 cp = (u_char *) p->address;
282 * If format character is an 'X', put a
283 * two-digit hex representation of the
284 * NSAP byte in the output buffer
286 ksnprintf(t_buff, sizeof(t_buff),
288 strcpy(op, &t_buff[strlen(t_buff)-2]);
293 * If format character isn't an 'X',
294 * just copy it to the output buffer
304 case T_ATM_E164_ADDR:
306 * Print the IA5 characters of the E.164 address
308 for(i=0; i<p->address_length; i++) {
309 ksnprintf(strbuff + strlen(strbuff),
310 sizeof(strbuff) - strlen(strbuff), "%c",
311 ((Atm_addr_e164 *)p->address)->aae_addr[i]);
315 case T_ATM_SPANS_ADDR:
317 * Get address into integers
319 u1.c[0] = ((Atm_addr_spans *)p->address)->aas_addr[0];
320 u1.c[1] = ((Atm_addr_spans *)p->address)->aas_addr[1];
321 u1.c[2] = ((Atm_addr_spans *)p->address)->aas_addr[2];
322 u1.c[3] = ((Atm_addr_spans *)p->address)->aas_addr[3];
323 u2.c[0] = ((Atm_addr_spans *)p->address)->aas_addr[4];
324 u2.c[1] = ((Atm_addr_spans *)p->address)->aas_addr[5];
325 u2.c[2] = ((Atm_addr_spans *)p->address)->aas_addr[6];
326 u2.c[3] = ((Atm_addr_spans *)p->address)->aas_addr[7];
329 * Print the address as two words xxxxx.yyyyyyyy
331 ksnprintf(strbuff, sizeof(strbuff), "%x.%x", u1.w, u2.w);
336 strcpy(strbuff, "-");
344 * Print the contents of a message buffer chain
347 * m pointer to a buffer
354 unisig_print_mbuf(KBuffer *m)
359 printf("unisig_print_mbuf:\n");
361 KB_DATASTART(m, cp, caddr_t);
362 for (i = 0; i < KB_LEN(m); i++) {
364 printf(" bfr=%p: ", m);
365 printf("%x ", (u_char)*cp++);
367 printf("<end_bfr>\n");