OpenSS7 SS7 for the Common Man |
© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved. |
||||||||||||||||||||||||||
Home | Overview | Status | News | Documentation | Resources | About | |||||||||||||||||||||
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); }
|
|||||||||||||||||||||||||||
OpenSS7 SS7 for the Common Man |
Home | Overview | Status | News | Documentation | Resources | About | ||||||||||||||||||||
© Copyright 1997-2004,OpenSS7 Corporation, All Rights Reserved. |