]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
let us use either static or dynamic trunk handles.
authorMichael Jerris <mike@jerris.com>
Tue, 22 May 2007 04:25:04 +0000 (04:25 +0000)
committerMichael Jerris <mike@jerris.com>
Tue, 22 May 2007 04:25:04 +0000 (04:25 +0000)
git-svn-id: http://svn.openzap.org/svn/openzap/trunk@94 a93c3328-9c30-0410-af19-c9cd2b2d52af

libs/freetdm/src/isdn/Q921.c
libs/freetdm/src/isdn/include/Q921.h

index 1a7e3d402b385a9712a8445d7f85f48dea981452..2a7ed1860497d254ad93a4a3f6e217d887c93cfa 100644 (file)
@@ -53,8 +53,8 @@
 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
@@ -67,17 +67,13 @@ int (*Q921Tx23Proc)(int dev, L2UCHAR *, int)={NULL};
 *****************************************************************************/\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
@@ -90,15 +86,18 @@ void Q921Init()
                                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
@@ -106,12 +105,12 @@ void Q921SetHeaderSpace(int hspace)
     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
@@ -135,9 +134,9 @@ void Q921SetTx23CB(int (*callback)(int dev, L2UCHAR *, int))
                 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
@@ -159,23 +158,23 @@ int Q921QueueHDLCFrame(int trunk, L2UCHAR *b, int size)
   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
@@ -196,14 +195,14 @@ int Q921Rx32(long trunk, L2UCHAR * Mes, L2INT Size)
 \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
@@ -223,14 +222,14 @@ int Q921SendRR(int trunk, int Sapi, int cr, int Tei, int pf)
   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
@@ -250,14 +249,14 @@ int Q921SendRNR(int trunk, int Sapi, int cr, int Tei, int pf)
   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
@@ -277,7 +276,7 @@ int Q921SendREJ(int trunk, int Sapi, int cr, int Tei, int pf)
   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
@@ -303,7 +302,7 @@ int Q921SendSABME(int trunk, int Sapi, int cr, int Tei, int pf)
   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
@@ -329,7 +328,7 @@ int Q921SendDM(int trunk, int Sapi, int cr, int Tei, int pf)
   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
@@ -355,7 +354,7 @@ int Q921SendDISC(int trunk, int Sapi, int cr, int Tei, int pf)
   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
@@ -366,14 +365,14 @@ int Q921SendUA(int trunk, int Sapi, int cr, int Tei, int pf)
     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
@@ -396,11 +395,11 @@ int Q921ProcSABME(int trunk, L2UCHAR *mes, int size)
   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
@@ -410,7 +409,7 @@ int Q921Rx12(long trunk)
         {\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
@@ -449,7 +448,7 @@ int Q921Rx12(long trunk)
             /* todo: REJ or FRMR */\r
         }\r
 \r
-        MFIFOKillNext(Q921DevSpace[trunk].HDLCInQueue);\r
+        MFIFOKillNext(L2TRUNKHANDLE(trunk).HDLCInQueue);\r
 \r
         return 1;\r
     }\r
index aba3fab9a0939bf687e78a21c7cc2881a1e0f52a..6ed40d9a90089968578264b2179e817cc52faf56 100644 (file)
 #define L2UCHAR                unsigned char           /* Min 8 bit                                            */\r
 #define L2INT       int                 /* Min 16 bit signed                */\r
 \r
+#ifdef Q921_HANDLE_STATIC \r
+#define L2TRUNK                long\r
+#define L2TRUNKHANDLE(trunk) Q921DevSpace[trunk]\r
+#else\r
+#define L2TRUNK                Q921Data *\r
+#define L2TRUNKHANDLE(trunk) (*trunk)\r
+#endif\r
+\r
 typedef enum                                   /* Network/User Mode.                   */\r
 {\r
        Q921_TE=0,                  /*  0 : User Mode                       */\r
     Q921_NT=1                   /*  1 : Network Mode                    */\r
 } Q921NetUser_t;\r
 \r
+#define INITIALIZED_MAGIC 42\r
 typedef struct\r
 {\r
     L2UCHAR HDLCInQueue[Q921MAXHDLCSPACE];\r
+       L2INT initialized;\r
     L2UCHAR vs;\r
     L2UCHAR vr;\r
     L2INT state;\r
@@ -117,12 +127,12 @@ typedef struct
 }Q921Data;\r
 \r
 void Q921Init();\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
 void Q921SetHeaderSpace(int hspace);\r
-void Q921SetTx21CB(int (*callback)(int dev, L2UCHAR *, int));\r
-void Q921SetTx23CB(int (*callback)(int dev, L2UCHAR *, int));\r
-int Q921QueueHDLCFrame(int trunk, L2UCHAR *b, int size);\r
-int Q921Rx12(long trunk);\r
-int Q921Rx32(long trunk, L2UCHAR * Mes, L2INT Size);\r
+void Q921SetTx21CB(int (*callback)(L2TRUNK dev, L2UCHAR *, int));\r
+void Q921SetTx23CB(int (*callback)(L2TRUNK dev, L2UCHAR *, int));\r
+int Q921QueueHDLCFrame(L2TRUNK trunk, L2UCHAR *b, int size);\r
+int Q921Rx12(L2TRUNK trunk);\r
+int Q921Rx32(L2TRUNK trunk, L2UCHAR * Mes, L2INT Size);\r
 #endif\r
 \r