OpenSS7
SS7 for the
Common Man

© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved.
Last modified:

Home Overview Status News Documentation Resources About
   
 Overview
 Status
 News
 Documentation
 Resources
 About

   
Home Index Prev Next More Download Info FAQ Mail   Home -> Resources -> Browse Source -> strss7/drivers/sua/sua_msg.c


File /code/strss7/drivers/sua/sua_msg.c



#ident "@(#) $RCSfile: sua_msg.c,v $ $Name:  $($Revision: 0.8.2.1 $) $Date: 2002/10/18 02:33:28 $"

static char const ident[] =
    "$RCSfile: sua_msg.c,v $ $Name:  $($Revision: 0.8.2.1 $) $Date: 2002/10/18 02:33:28 $";

/*
 *  -------------------------------------------------------------------------
 *
 *  General purpose parameter decoder
 *
 *  -------------------------------------------------------------------------
 *
 *  General purpose parameter extractor for UA messages:  Given the pointer to
 *  the parameter, this will generate a parameter array which indexes messages
 *  of each type and provides their length.
 */

int sua_decode_parms(mblk_t * mp, sua_parms_t * sua_results)
{
	int len;
	uint32_t *p = (uint32_t *) mp->b_rptr;
	struct ua_parm *pp = NULL;
	bzero(sua_results, sizeof(*sua_results));
	p += 2;			/* skip header */
	for (; p < (uint32_t *) mp->b_wptr && (len = UA_LENGTH(*p)) >= 4; p += (len + 3) >> 2) {
		int ttag, tag = ntohl(*p) >> 16;

		ttag = tag - UA_PARM_BASE;
		if (0 <= ttag && ttag <= UA_PARM_MAX) {
			pp = ((struct ua_parm *) (sua_results)) + ttag;
			pp->u.wptr = p + 1;
			pp->len = len;
			pp->val = ntohl(p[1]);
		} else {
			ttag = tag - SUA_PARM_BASE;
			if (0 <= ttag && ttag <= SUA_PARM_MAX) {
				int offset;
				struct sua_sparm_results *sp;
				ttag += UA_PARM_MAX + 1;
				pp = ((struct ua_parm *) (sua_results)) + ttag;
				pp->u.wptr = p + 1;
				pp->len = len;
				pp->val = ntohl(p[1]);
				switch (ttag) {
				case 1:	/* srce_addr */
					sp = &sua_results->srce;
					offset = UA_PARM_MAX + 1 + SUA_PARM_MAX + 1;
					break;
				case 2:	/* dest_addr */
					sp = &sua_results->dest;
					offset =
					    UA_PARM_MAX + 1 + SUA_PARM_MAX + 1 + SUA_SPARM_MAX + 1;
					break;
				default:
					continue;
				}
				{
					int len2;
					struct ua_parm *p2 = p + 2;
					for (; p2 < p + (len + 3) >> 2 &&
					     (len2 = UA_LENGTH(*p2)) >= 4; p2 += (len2 + 3) >> 2) {
						int stag = ntohl(*p2) >> 16 - SUA_SPARM_BASE;
						if (0 <= stag && stag <= SUA_SPARM_MAX) {
							stag += offset;
							pp = ((struct ua_parm *) (sp)) + stag;
							pp->u.wptr = p2 + 1;
							pp->len = len2;
							pp->val = ntohl(p2[1]);
						}
					}
				}
			}
		}
	}
	return (0);
}


Home Index Prev Next More Download Info FAQ Mail   Home -> Resources -> Browse Source -> strss7/drivers/sua/sua_msg.c

OpenSS7
SS7 for the
Common Man
Home Overview Status News Documentation Resources About

© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved.
Last modified: