Q921Data Q921DevSpace[Q921MAXTRUNK];\r
int Q921HeaderSpace={0};\r
\r
-int (*Q921Tx21Proc)(int dev, L2UCHAR *, int)={NULL};\r
-int (*Q921Tx23Proc)(int dev, L2UCHAR *, int)={NULL};\r
+int (*Q921Tx21Proc)(L2TRUNK dev, L2UCHAR *, int)={NULL};\r
+int (*Q921Tx23Proc)(L2TRUNK dev, L2UCHAR *, int)={NULL};\r
\r
/*****************************************************************************\r
\r
*****************************************************************************/\r
void Q921Init()\r
{\r
+#ifdef Q921_HANDLE_STATIC\r
int x;\r
for(x=0; x<Q921MAXTRUNK;x++)\r
{\r
- MFIFOCreate(Q921DevSpace[x].HDLCInQueue, Q921MAXHDLCSPACE, 10);\r
- Q921DevSpace[x].vr = 0;\r
- Q921DevSpace[x].vs = 0;\r
- Q921DevSpace[x].state = 0;\r
- Q921DevSpace[x].sapi = 0;\r
- Q921DevSpace[x].tei = 0;\r
- Q921DevSpace[x].NetUser = Q921_TE;\r
+ Q921_InitTrunk(x, 0, 0, Q921_TE);\r
}\r
+#endif\r
}\r
\r
/*****************************************************************************\r
if your trunk is not TE (user) mode (i.e. NET).\r
\r
*****************************************************************************/\r
-int Q921_InitTrunk(long trunk, L2UCHAR sapi, L2UCHAR tei, Q921NetUser_t NetUser)\r
+void Q921_InitTrunk(L2TRUNK trunk, L2UCHAR sapi, L2UCHAR tei, Q921NetUser_t NetUser)\r
{\r
- if (trunk > Q921MAXTRUNK)\r
- return 0;\r
-\r
- Q921DevSpace[trunk].sapi = sapi;\r
- Q921DevSpace[trunk].tei = tei;\r
- Q921DevSpace[trunk].NetUser = NetUser;\r
- return 1;\r
+ if (L2TRUNKHANDLE(trunk).initialized != INITIALIZED_MAGIC) {\r
+ MFIFOCreate(L2TRUNKHANDLE(trunk).HDLCInQueue, Q921MAXHDLCSPACE, 10);\r
+ L2TRUNKHANDLE(trunk).initialized = INITIALIZED_MAGIC;\r
+ }\r
+ L2TRUNKHANDLE(trunk).vr = 0;\r
+ L2TRUNKHANDLE(trunk).vs = 0;\r
+ L2TRUNKHANDLE(trunk).state = 0;\r
+ L2TRUNKHANDLE(trunk).sapi = sapi;\r
+ L2TRUNKHANDLE(trunk).tei = tei;\r
+ L2TRUNKHANDLE(trunk).NetUser = NetUser;\r
}\r
\r
void Q921SetHeaderSpace(int hspace)\r
Q921HeaderSpace=hspace;\r
}\r
\r
-void Q921SetTx21CB(int (*callback)(int dev, L2UCHAR *, int))\r
+void Q921SetTx21CB(int (*callback)(L2TRUNK dev, L2UCHAR *, int))\r
{\r
Q921Tx21Proc = callback;\r
}\r
\r
-void Q921SetTx23CB(int (*callback)(int dev, L2UCHAR *, int))\r
+void Q921SetTx23CB(int (*callback)(L2TRUNK dev, L2UCHAR *, int))\r
{\r
Q921Tx23Proc = callback;\r
}\r
size size of frame in bytes\r
\r
*****************************************************************************/\r
-int Q921QueueHDLCFrame(int trunk, L2UCHAR *b, int size)\r
+int Q921QueueHDLCFrame(L2TRUNK trunk, L2UCHAR *b, int size)\r
{\r
- return MFIFOWriteMes(Q921DevSpace[trunk].HDLCInQueue, b, size);\r
+ return MFIFOWriteMes(L2TRUNKHANDLE(trunk).HDLCInQueue, b, size);\r
}\r
\r
/*****************************************************************************\r
Return Value: 0 if failed, 1 if Send.\r
\r
*****************************************************************************/\r
-int Q921SendI(int trunk, L2UCHAR Sapi, char cr, L2UCHAR Tei, char pf, L2UCHAR *mes, int size)\r
+int Q921SendI(L2TRUNK trunk, L2UCHAR Sapi, char cr, L2UCHAR Tei, char pf, L2UCHAR *mes, int size)\r
{\r
mes[Q921HeaderSpace+0] = (Sapi&0xfc) | ((cr<<1)&0x02);\r
mes[Q921HeaderSpace+1] = (Tei<<1) | 0x01;\r
- mes[Q921HeaderSpace+2] = Q921DevSpace[trunk].vs<<1;\r
- mes[Q921HeaderSpace+3] = (Q921DevSpace[trunk].vr<<1) | (pf & 0x01);\r
- Q921DevSpace[trunk].vs++;\r
+ mes[Q921HeaderSpace+2] = L2TRUNKHANDLE(trunk).vs<<1;\r
+ mes[Q921HeaderSpace+3] = (L2TRUNKHANDLE(trunk).vr<<1) | (pf & 0x01);\r
+ L2TRUNKHANDLE(trunk).vs++;\r
\r
return Q921Tx21Proc(trunk, mes, size);\r
}\r
\r
-int Q921Rx32(long trunk, L2UCHAR * Mes, L2INT Size)\r
+int Q921Rx32(L2TRUNK trunk, L2UCHAR * Mes, L2INT Size)\r
{\r
return Q921SendI(trunk, \r
- Q921DevSpace[trunk].sapi, \r
- Q921DevSpace[trunk].NetUser == Q921_TE ? 0 : 1,\r
- Q921DevSpace[trunk].tei, \r
+ L2TRUNKHANDLE(trunk).sapi, \r
+ L2TRUNKHANDLE(trunk).NetUser == Q921_TE ? 0 : 1,\r
+ L2TRUNKHANDLE(trunk).tei, \r
0, \r
Mes, \r
Size);\r
\r
*****************************************************************************/\r
\r
-int Q921SendRR(int trunk, int Sapi, int cr, int Tei, int pf)\r
+int Q921SendRR(L2TRUNK trunk, int Sapi, int cr, int Tei, int pf)\r
{\r
L2UCHAR mes[400];\r
\r
mes[Q921HeaderSpace+0] = (L2UCHAR)((Sapi&0xfc) | ((cr<<1)&0x02));\r
mes[Q921HeaderSpace+1] = (L2UCHAR)((Tei<<1) | 0x01);\r
mes[Q921HeaderSpace+2] = (L2UCHAR)0x01;\r
- mes[Q921HeaderSpace+3] = (L2UCHAR)((Q921DevSpace[trunk].vr<<1) | (pf & 0x01));\r
+ mes[Q921HeaderSpace+3] = (L2UCHAR)((L2TRUNKHANDLE(trunk).vr<<1) | (pf & 0x01));\r
\r
return Q921Tx21Proc(trunk, mes, Q921HeaderSpace+4);\r
}\r
Return Value: 0 if failed, 1 if Send.\r
\r
*****************************************************************************/\r
-int Q921SendRNR(int trunk, int Sapi, int cr, int Tei, int pf)\r
+int Q921SendRNR(L2TRUNK trunk, int Sapi, int cr, int Tei, int pf)\r
{\r
L2UCHAR mes[400];\r
\r
mes[Q921HeaderSpace+0] = (L2UCHAR)((Sapi&0xfc) | ((cr<<1)&0x02));\r
mes[Q921HeaderSpace+1] = (L2UCHAR)((Tei<<1) | 0x01);\r
mes[Q921HeaderSpace+2] = (L2UCHAR)0x05;\r
- mes[Q921HeaderSpace+3] = (L2UCHAR)((Q921DevSpace[trunk].vr<<1) | (pf & 0x01));\r
+ mes[Q921HeaderSpace+3] = (L2UCHAR)((L2TRUNKHANDLE(trunk).vr<<1) | (pf & 0x01));\r
\r
return Q921Tx21Proc(trunk, mes, Q921HeaderSpace+4);\r
}\r
Return Value: 0 if failed, 1 if Send.\r
\r
*****************************************************************************/\r
-int Q921SendREJ(int trunk, int Sapi, int cr, int Tei, int pf)\r
+int Q921SendREJ(L2TRUNK trunk, int Sapi, int cr, int Tei, int pf)\r
{\r
L2UCHAR mes[400];\r
\r
mes[Q921HeaderSpace+0] = (L2UCHAR)((Sapi&0xfc) | ((cr<<1)&0x02));\r
mes[Q921HeaderSpace+1] = (L2UCHAR)((Tei<<1) | 0x01);\r
mes[Q921HeaderSpace+2] = (L2UCHAR)0x09;\r
- mes[Q921HeaderSpace+3] = (L2UCHAR)((Q921DevSpace[trunk].vr<<1) | (pf & 0x01));\r
+ mes[Q921HeaderSpace+3] = (L2UCHAR)((L2TRUNKHANDLE(trunk).vr<<1) | (pf & 0x01));\r
\r
return Q921Tx21Proc(trunk, mes, Q921HeaderSpace+4);\r
}\r
Return Value: 0 if failed, 1 if Send.\r
\r
*****************************************************************************/\r
-int Q921SendSABME(int trunk, int Sapi, int cr, int Tei, int pf)\r
+int Q921SendSABME(L2TRUNK trunk, int Sapi, int cr, int Tei, int pf)\r
{\r
L2UCHAR mes[400];\r
\r
Return Value: 0 if failed, 1 if Send.\r
\r
*****************************************************************************/\r
-int Q921SendDM(int trunk, int Sapi, int cr, int Tei, int pf)\r
+int Q921SendDM(L2TRUNK trunk, int Sapi, int cr, int Tei, int pf)\r
{\r
L2UCHAR mes[400];\r
\r
Return Value: 0 if failed, 1 if Send.\r
\r
*****************************************************************************/\r
-int Q921SendDISC(int trunk, int Sapi, int cr, int Tei, int pf)\r
+int Q921SendDISC(L2TRUNK trunk, int Sapi, int cr, int Tei, int pf)\r
{\r
L2UCHAR mes[400];\r
\r
Return Value: 0 if failed, 1 if Send.\r
\r
*****************************************************************************/\r
-int Q921SendUA(int trunk, int Sapi, int cr, int Tei, int pf)\r
+int Q921SendUA(L2TRUNK trunk, int Sapi, int cr, int Tei, int pf)\r
{\r
L2UCHAR mes[400];\r
\r
return Q921Tx21Proc(trunk, mes, Q921HeaderSpace+3);\r
}\r
\r
-int Q921ProcSABME(int trunk, L2UCHAR *mes, int size)\r
+int Q921ProcSABME(L2TRUNK trunk, L2UCHAR *mes, int size)\r
{\r
/* TODO: Do we need these paramaters? */\r
(void)mes;\r
(void)size;\r
\r
- Q921DevSpace[trunk].vr=0;\r
- Q921DevSpace[trunk].vs=0;\r
+ L2TRUNKHANDLE(trunk).vr=0;\r
+ L2TRUNKHANDLE(trunk).vs=0;\r
\r
return 1;\r
}\r
Return Value: # messages processed (always 1 or 0).\r
\r
*****************************************************************************/\r
-int Q921Rx12(long trunk)\r
+int Q921Rx12(L2TRUNK trunk)\r
{\r
L2UCHAR *mes;\r
int rs,size; /* receive size & Q921 frame size*/\r
- L2UCHAR *smes = MFIFOGetMesPtr(Q921DevSpace[trunk].HDLCInQueue, &size);\r
+ L2UCHAR *smes = MFIFOGetMesPtr(L2TRUNKHANDLE(trunk).HDLCInQueue, &size);\r
if(smes != NULL)\r
{\r
rs = size - Q921HeaderSpace;\r
{\r
if(Q921Tx23Proc(trunk, smes, size-2)) /* -2 to clip away CRC */\r
{\r
- Q921DevSpace[trunk].vr++;\r
+ L2TRUNKHANDLE(trunk).vr++;\r
Q921SendRR(trunk, (mes[0]&0xfc)>>2, (mes[0]>>1)&0x01,mes[1]>>1, mes[3]&0x01);\r
}\r
else\r
/* todo: REJ or FRMR */\r
}\r
\r
- MFIFOKillNext(Q921DevSpace[trunk].HDLCInQueue);\r
+ MFIFOKillNext(L2TRUNKHANDLE(trunk).HDLCInQueue);\r
\r
return 1;\r
}\r