CAPI 2.0 for passive telephony devices
Hans Petter Selasky
hselasky at c2i.net
Tue Jul 5 20:09:40 GMT 2005
Hi,
I'm almost finished integrating CAPI2.0 into I4B. The CAPI interface will have
some limitations like that it only supports HDLC and transparent mode. No
X.75 and no FAX/Modem yet.
I have put CAPI2.0 support into /sys/dev/i4b/layer4/i4b_capidrv.c
And it's only 3000 lines long.
At the moment I am thinking about the CAPI 2.0 user library. I thought that
the Linux way to do it could be supported too. Though I don't recommend using
it. Then I have looked at C4B. I have decided to not go with that either,
because things get a little complicated when having to use macros every time
one is accesing a structure field. So I have created something new:
All CAPI structures will now be defined using a new macro
"CAPI_MAKE_STRUCT()". Here is an example showing how to use it:
#define CH(m)\
m(WORD, wLength,)\
m(WORD, wApp,)\
m(WORD, wCmd,)\
m(WORD, wNum,)\
m(DWORD, dwCid,)\
m(QWORD, qwTest,)\
m(STRUCT, sTest,)\
m(BYTE_ARRAY, sArray, [20])\
CAPI_MAKE_STRUCT(CH);
static void
test()
{
struct capi_message msg.
CH_DECODED_T ch;
u_int16_t len;
bzero(&ch, sizeof(ch)); // clear all unused fields
CAPI_INIT(CH, &ch); // setup tags for encoder/decoder
ch.qwTest = 123;
len = capi_encode(&msg, sizeof(msg), &ch);
msg.head.wLength = htole16(len);
capi_decode(&msg, len, &ch);
return;
}
Here is what CAPI_MAKE_STRUCT() produces:
typedef struct CH_DECODED { u_int8_t wLength_WORD; u_int16_t wLength;
u_int8_t wApp_WORD; u_int16_t wApp; u_int8_t wCmd_WORD; u_int16_t wCmd;
u_int8_t wNum_WORD; u_int16_t wNum; u_int8_t dwCid_DWORD; u_int32_t dwCid;
u_int8_t qwTest_QWORD; u_int64_t qwTest; u_int8_t sTest_STRUCT;
struct capi_struct sTest; u_int8_t sArray_BYTE_ARRAY;
u_int16_t sArray_BYTE_ARRAY_LENGTH; u_int8_t sArray [20]; u_int8_t CH_end; }
__attribute__((__packed__)) CH_DECODED_T;
typedef struct CH_ENCODED { u_int16_t wLength; u_int16_t wApp;
u_int16_t wCmd; u_int16_t wNum; u_int32_t dwCid; u_int64_t qwTest;
u_int8_t sTest_Null; u_int8_t sArray [20]; }
__attribute__((__packed__)) CH_ENCODED_T;
Here is what CAPI_INIT() produces:
{ (&ch) ->wLength_WORD = 2; (&ch) ->wApp_WORD = 2; (&ch) ->wCmd_WORD = 2;
(&ch) ->wNum_WORD = 2; (&ch) ->dwCid_DWORD = 3; (&ch) ->qwTest_QWORD = 4;
(&ch) ->sTest_STRUCT = 5; (&ch) ->sArray_BYTE_ARRAY = 6;
(&ch) ->sTest . ie = ((void *)0);
(&ch) ->sArray_BYTE_ARRAY_LENGTH = sizeof(u_int8_t [20]);
(&ch) -> CH_end = 0; };
If one tries to use CAPI_INIT() on the wrong structure it will cause a
compilation error!
If one enters something wrong in the definition there will most likely be a
compilation error.
So does anyone have any objections? Else this is the way it is going to be.
--HPS
More information about the freebsd-isdn
mailing list