L3INT (*Q931Uie [Q931MAXDLCT][Q931MAXIE]) (Q931_TrunkInfo_t *pTrunk, ie *pIE, L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
L3INT (*Q931Pie [Q931MAXDLCT][Q931MAXIE]) (Q931_TrunkInfo_t *pTrunk, L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+L3UINT Q931MsgieOffset[Q931MAXIE];
+
+void Q931Initialize_MsgieOffset()
+{
+ L3INT x;
+ Q931mes_Generic msg;
+ ie *index;
+
+ for(x=0; x<Q931MAXIE; x++) {
+ switch(x)
+ {
+ case Q931ie_SWITCHOOK:\r
+ index = &msg.Switchhook;
+ break;
+ case Q931ie_FEATURE_ACTIVATION:\r
+ index = &msg.FeatAct;
+ break;
+ case Q931ie_FEATURE_INDICATION:\r
+ index = &msg.FeatInd;
+ break;
+ case Q931ie_CALL_IDENTITY:\r
+ index = &msg.CallID;
+ break;
+ case Q931ie_SHIFT:\r
+ index = &msg.Shift;
+ break;
+ case Q931ie_MORE_DATA:\r
+ index = &msg.MoreData;
+ break;
+ case Q931ie_SENDING_COMPLETE:\r
+ index = &msg.SendComplete;
+ break;
+ case Q931ie_CONGESTION_LEVEL:\r
+ index = &msg.CongestionLevel;
+ break;
+ case Q931ie_REPEAT_INDICATOR:\r
+ index = &msg.RepeatInd;
+ break;
+ case Q931ie_SEGMENTED_MESSAGE:\r
+ index = &msg.Segment;
+ break;
+ case Q931ie_BEARER_CAPABILITY:\r
+ index = &msg.BearerCap;
+ break;
+ case Q931ie_CAUSE:\r
+ index = &msg.Cause;
+ break;
+ case Q931ie_CALL_STATE:\r
+ index = &msg.CallState;
+ break;
+ case Q931ie_CHANNEL_IDENTIFICATION:\r
+ index = &msg.ChanID;
+ break;
+ case Q931ie_PROGRESS_INDICATOR:\r
+ index = &msg.ProgInd;
+ break;
+ case Q931ie_NETWORK_SPECIFIC_FACILITIES:\r
+ index = &msg.NetFac;
+ break;
+ case Q931ie_NOTIFICATION_INDICATOR:\r
+ index = &msg.NotifInd;
+ break;
+ case Q931ie_DISPLAY:\r
+ index = &msg.Display;
+ break;
+ case Q931ie_DATETIME:\r
+ index = &msg.DateTime;
+ break;
+ case Q931ie_KEYPAD_FACILITY:\r
+ index = &msg.KeypadFac;
+ break;
+ case Q931ie_SIGNAL:\r
+ index = &msg.Signal;
+ break;\r
+ case Q931ie_INFORMATION_RATE:\r
+ index = &msg.InfoRate;
+ break;
+ case Q931ie_END_TO_END_TRANSIT_DELAY:\r
+ index = &msg.EndEndTxDelay;
+ break;
+ case Q931ie_TRANSIT_DELAY_SELECTION_AND_IND:\r
+ index = &msg.TransDelSelInd;
+ break;
+ case Q931ie_PACKED_LAYER_BIMARY_PARAMETERS:\r
+ index = &msg.PackParam;
+ break;
+ case Q931ie_PACKED_LAYER_WINDOW_SIZE:\r
+ index = &msg.PackWinSize;
+ break;
+ case Q931ie_PACKED_SIZE:\r
+ index = &msg.PackSize;
+ break;
+ case Q931ie_CALLING_PARTY_NUMBER:\r
+ index = &msg.CallingNum;
+ break;
+ case Q931ie_CALLING_PARTY_SUBADDRESS:\r
+ index = &msg.CallingSub;
+ break;
+ case Q931ie_CALLED_PARTY_NUMBER:\r
+ index = &msg.CalledNum;
+ break;
+ case Q931ie_CALLED_PARTY_SUBADDRESS:\r
+ index = &msg.CalledSub;
+ break;
+ case Q931ie_REDIRECTING_NUMBER:\r
+ index = &msg.RedirNum;
+ break;
+ case Q931ie_TRANSIT_NETWORK_SELECTION:\r
+ index = &msg.TransNetSel;
+ break;
+ case Q931ie_RESTART_INDICATOR:\r
+ index = &msg.RestartInd;
+ break;
+ case Q931ie_LOW_LAYER_COMPATIBILITY:\r
+ index = &msg.LLComp;
+ break;
+ case Q931ie_HIGH_LAYER_COMPATIBILITY:\r
+ index = &msg.HLComp;
+ break;
+ case Q931ie_USER_USER:\r
+ index = &msg.UserUser;
+ break;
+ case Q931ie_ESCAPE_FOR_EX:\r
+ index = &msg.Escape;
+ break;
+ default:
+ index = NULL;
+ break;
+ }
+
+ if (index) {
+ Q931MsgieOffset[x] = (L3UINT)((L3UCHAR *)index - (L3UCHAR *)&msg);
+ } else {
+ Q931MsgieOffset[x] = 0;
+ }
+ }
+}
+
+ie *Q931MegGetIE(Q931mes_Generic *msg, L3UINT ie_type)
+{
+ L3UINT offset = Q931MsgieOffset[ie_type];
+
+ if (!offset) {
+ return NULL;
+ }
+
+ return (ie *)((L3UCHAR *)msg + offset);
+
+}
+
void (*Q931CreateDialectCB[Q931MAXDLCT]) (L3UCHAR iDialect)=
{
NULL,
{
L3INT x,y;
+ /* Initialize the Message offset ie Table */
+ Q931Initialize_MsgieOffset();
+
/* Secure the callbacks to default procs */
Q931ErrorProc = Q931ErrorDummy;
ie HLComp; /* High Layer Compatibility */
ie UserUser; /* User-user */
ie Escape; /* Escape for extension */
+ ie Switchhook;
+ ie FeatAct;
+ ie FeatInd;
+
L3UCHAR buf[1]; /* Buffer for IE's */
}Q931mes_Generic;
extern L3INT (*Q931Uie [Q931MAXDLCT][Q931MAXIE] ) (Q931_TrunkInfo_t *pTrunk,ie *pIE,L3UCHAR * IBuf, L3UCHAR * OBuf, L3INT *IOff, L3INT *OOff);
extern L3INT (*Q931Pie [Q931MAXDLCT][Q931MAXIE] ) (Q931_TrunkInfo_t *pTrunk,L3UCHAR *IBuf, L3UCHAR *OBuf, L3INT *Octet);
+extern L3UINT Q931MsgieOffset[Q931MAXIE];
+
/*****************************************************************************
Macro: GetIETotoSize
void Q931AddStateEntry(L3UCHAR iD, L3INT iState, L3INT iMes, L3UCHAR cDir);
L3BOOL Q931IsEventLegal(L3UCHAR iD, L3INT iState, L3INT iMes, L3UCHAR cDir);
+ie *Q931MegGetIE(Q931mes_Generic *msg, L3UINT ie_type);
+
/*****************************************************************************
Q.931 Low Level API Function Prototyping. Implemented in Q931API.c