1/* $Id: capiutil.h,v 1.1.1.1 2007/08/03 18:53:43 Exp $
2 *
3 * CAPI 2.0 defines & types
4 *
5 * From CAPI 2.0 Development Kit AVM 1995 (msg.c)
6 * Rewritten for Linux 1996 by Carsten Paeth <calle@calle.de>
7 *
8 * This software may be used and distributed according to the terms
9 * of the GNU General Public License, incorporated herein by reference.
10 *
11 */
12
13#ifndef __CAPIUTIL_H__
14#define __CAPIUTIL_H__
15
16#include <asm/types.h>
17
18#define CAPIMSG_BASELEN		8
19#define CAPIMSG_U8(m, off)	(m[off])
20#define CAPIMSG_U16(m, off)	(m[off]|(m[(off)+1]<<8))
21#define CAPIMSG_U32(m, off)	(m[off]|(m[(off)+1]<<8)|(m[(off)+2]<<16)|(m[(off)+3]<<24))
22#define	CAPIMSG_LEN(m)		CAPIMSG_U16(m,0)
23#define	CAPIMSG_APPID(m)	CAPIMSG_U16(m,2)
24#define	CAPIMSG_COMMAND(m)	CAPIMSG_U8(m,4)
25#define	CAPIMSG_SUBCOMMAND(m)	CAPIMSG_U8(m,5)
26#define CAPIMSG_CMD(m)		(((m[4])<<8)|(m[5]))
27#define	CAPIMSG_MSGID(m)	CAPIMSG_U16(m,6)
28#define CAPIMSG_CONTROLLER(m)	(m[8] & 0x7f)
29#define CAPIMSG_CONTROL(m)	CAPIMSG_U32(m, 8)
30#define CAPIMSG_NCCI(m)		CAPIMSG_CONTROL(m)
31#define CAPIMSG_DATALEN(m)	CAPIMSG_U16(m,16) /* DATA_B3_REQ */
32
33static inline void capimsg_setu8(void *m, int off, __u8 val)
34{
35	((__u8 *)m)[off] = val;
36}
37
38static inline void capimsg_setu16(void *m, int off, __u16 val)
39{
40	((__u8 *)m)[off] = val & 0xff;
41	((__u8 *)m)[off+1] = (val >> 8) & 0xff;
42}
43
44static inline void capimsg_setu32(void *m, int off, __u32 val)
45{
46	((__u8 *)m)[off] = val & 0xff;
47	((__u8 *)m)[off+1] = (val >> 8) & 0xff;
48	((__u8 *)m)[off+2] = (val >> 16) & 0xff;
49	((__u8 *)m)[off+3] = (val >> 24) & 0xff;
50}
51
52#define	CAPIMSG_SETLEN(m, len)		capimsg_setu16(m, 0, len)
53#define	CAPIMSG_SETAPPID(m, applid)	capimsg_setu16(m, 2, applid)
54#define	CAPIMSG_SETCOMMAND(m,cmd)	capimsg_setu8(m, 4, cmd)
55#define	CAPIMSG_SETSUBCOMMAND(m, cmd)	capimsg_setu8(m, 5, cmd)
56#define	CAPIMSG_SETMSGID(m, msgid)	capimsg_setu16(m, 6, msgid)
57#define	CAPIMSG_SETCONTROL(m, contr)	capimsg_setu32(m, 8, contr)
58#define	CAPIMSG_SETDATALEN(m, len)	capimsg_setu16(m, 16, len)
59
60/*----- basic-type definitions -----*/
61
62typedef __u8 *_cstruct;
63
64typedef enum {
65	CAPI_COMPOSE,
66	CAPI_DEFAULT
67} _cmstruct;
68
69/*
70   The _cmsg structure contains all possible CAPI 2.0 parameter.
71   All parameters are stored here first. The function CAPI_CMSG_2_MESSAGE
72   assembles the parameter and builds CAPI2.0 conform messages.
73   CAPI_MESSAGE_2_CMSG disassembles CAPI 2.0 messages and stores the
74   parameter in the _cmsg structure
75 */
76
77typedef struct {
78	/* Header */
79	__u16 ApplId;
80	__u8 Command;
81	__u8 Subcommand;
82	__u16 Messagenumber;
83
84	/* Parameter */
85	union {
86		__u32 adrController;
87		__u32 adrPLCI;
88		__u32 adrNCCI;
89	} adr;
90
91	_cmstruct AdditionalInfo;
92	_cstruct B1configuration;
93	__u16 B1protocol;
94	_cstruct B2configuration;
95	__u16 B2protocol;
96	_cstruct B3configuration;
97	__u16 B3protocol;
98	_cstruct BC;
99	_cstruct BChannelinformation;
100	_cmstruct BProtocol;
101	_cstruct CalledPartyNumber;
102	_cstruct CalledPartySubaddress;
103	_cstruct CallingPartyNumber;
104	_cstruct CallingPartySubaddress;
105	__u32 CIPmask;
106	__u32 CIPmask2;
107	__u16 CIPValue;
108	__u32 Class;
109	_cstruct ConnectedNumber;
110	_cstruct ConnectedSubaddress;
111	__u32 Data;
112	__u16 DataHandle;
113	__u16 DataLength;
114	_cstruct FacilityConfirmationParameter;
115	_cstruct Facilitydataarray;
116	_cstruct FacilityIndicationParameter;
117	_cstruct FacilityRequestParameter;
118	__u16 FacilitySelector;
119	__u16 Flags;
120	__u32 Function;
121	_cstruct HLC;
122	__u16 Info;
123	_cstruct InfoElement;
124	__u32 InfoMask;
125	__u16 InfoNumber;
126	_cstruct Keypadfacility;
127	_cstruct LLC;
128	_cstruct ManuData;
129	__u32 ManuID;
130	_cstruct NCPI;
131	__u16 Reason;
132	__u16 Reason_B3;
133	__u16 Reject;
134	_cstruct Useruserdata;
135
136	/* intern */
137	unsigned l, p;
138	unsigned char *par;
139	__u8 *m;
140
141	/* buffer to construct message */
142	__u8 buf[180];
143
144} _cmsg;
145
146/*
147 * capi_cmsg2message() assembles the parameter from _cmsg to a CAPI 2.0
148 * conform message
149 */
150unsigned capi_cmsg2message(_cmsg * cmsg, __u8 * msg);
151
152/*
153 *  capi_message2cmsg disassembles a CAPI message an writes the parameter
154 *  into _cmsg for easy access
155 */
156unsigned capi_message2cmsg(_cmsg * cmsg, __u8 * msg);
157
158/*
159 * capi_cmsg_header() fills the _cmsg structure with default values, so only
160 * parameter with non default values must be changed before sending the
161 * message.
162 */
163unsigned capi_cmsg_header(_cmsg * cmsg, __u16 _ApplId,
164			  __u8 _Command, __u8 _Subcommand,
165			  __u16 _Messagenumber, __u32 _Controller);
166
167/*
168 * capi_info2str generated a readable string for Capi2.0 reasons.
169 */
170char *capi_info2str(__u16 reason);
171
172/*-----------------------------------------------------------------------*/
173
174/*
175 * Debugging / Tracing functions
176 */
177
178char *capi_cmd2str(__u8 cmd, __u8 subcmd);
179
180typedef struct {
181	u_char	*buf;
182	u_char	*p;
183	size_t	size;
184	size_t	pos;
185} _cdebbuf;
186
187#define	CDEBUG_SIZE	1024
188#define	CDEBUG_GSIZE	4096
189
190void cdebbuf_free(_cdebbuf *cdb);
191int cdebug_init(void);
192void cdebug_exit(void);
193
194_cdebbuf *capi_cmsg2str(_cmsg *cmsg);
195_cdebbuf *capi_message2str(__u8 *msg);
196
197/*-----------------------------------------------------------------------*/
198
199static inline void capi_cmsg_answer(_cmsg * cmsg)
200{
201	cmsg->Subcommand |= 0x01;
202}
203
204/*-----------------------------------------------------------------------*/
205
206static inline void capi_fill_CONNECT_B3_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
207					    __u32 adr,
208					    _cstruct NCPI)
209{
210	capi_cmsg_header(cmsg, ApplId, 0x82, 0x80, Messagenumber, adr);
211	cmsg->NCPI = NCPI;
212}
213
214static inline void capi_fill_FACILITY_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
215					  __u32 adr,
216					  __u16 FacilitySelector,
217				       _cstruct FacilityRequestParameter)
218{
219	capi_cmsg_header(cmsg, ApplId, 0x80, 0x80, Messagenumber, adr);
220	cmsg->FacilitySelector = FacilitySelector;
221	cmsg->FacilityRequestParameter = FacilityRequestParameter;
222}
223
224static inline void capi_fill_INFO_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
225				      __u32 adr,
226				      _cstruct CalledPartyNumber,
227				      _cstruct BChannelinformation,
228				      _cstruct Keypadfacility,
229				      _cstruct Useruserdata,
230				      _cstruct Facilitydataarray)
231{
232	capi_cmsg_header(cmsg, ApplId, 0x08, 0x80, Messagenumber, adr);
233	cmsg->CalledPartyNumber = CalledPartyNumber;
234	cmsg->BChannelinformation = BChannelinformation;
235	cmsg->Keypadfacility = Keypadfacility;
236	cmsg->Useruserdata = Useruserdata;
237	cmsg->Facilitydataarray = Facilitydataarray;
238}
239
240static inline void capi_fill_LISTEN_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
241					__u32 adr,
242					__u32 InfoMask,
243					__u32 CIPmask,
244					__u32 CIPmask2,
245					_cstruct CallingPartyNumber,
246					_cstruct CallingPartySubaddress)
247{
248	capi_cmsg_header(cmsg, ApplId, 0x05, 0x80, Messagenumber, adr);
249	cmsg->InfoMask = InfoMask;
250	cmsg->CIPmask = CIPmask;
251	cmsg->CIPmask2 = CIPmask2;
252	cmsg->CallingPartyNumber = CallingPartyNumber;
253	cmsg->CallingPartySubaddress = CallingPartySubaddress;
254}
255
256static inline void capi_fill_ALERT_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
257				       __u32 adr,
258				       _cstruct BChannelinformation,
259				       _cstruct Keypadfacility,
260				       _cstruct Useruserdata,
261				       _cstruct Facilitydataarray)
262{
263	capi_cmsg_header(cmsg, ApplId, 0x01, 0x80, Messagenumber, adr);
264	cmsg->BChannelinformation = BChannelinformation;
265	cmsg->Keypadfacility = Keypadfacility;
266	cmsg->Useruserdata = Useruserdata;
267	cmsg->Facilitydataarray = Facilitydataarray;
268}
269
270static inline void capi_fill_CONNECT_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
271					 __u32 adr,
272					 __u16 CIPValue,
273					 _cstruct CalledPartyNumber,
274					 _cstruct CallingPartyNumber,
275					 _cstruct CalledPartySubaddress,
276					 _cstruct CallingPartySubaddress,
277					 __u16 B1protocol,
278					 __u16 B2protocol,
279					 __u16 B3protocol,
280					 _cstruct B1configuration,
281					 _cstruct B2configuration,
282					 _cstruct B3configuration,
283					 _cstruct BC,
284					 _cstruct LLC,
285					 _cstruct HLC,
286					 _cstruct BChannelinformation,
287					 _cstruct Keypadfacility,
288					 _cstruct Useruserdata,
289					 _cstruct Facilitydataarray)
290{
291
292	capi_cmsg_header(cmsg, ApplId, 0x02, 0x80, Messagenumber, adr);
293	cmsg->CIPValue = CIPValue;
294	cmsg->CalledPartyNumber = CalledPartyNumber;
295	cmsg->CallingPartyNumber = CallingPartyNumber;
296	cmsg->CalledPartySubaddress = CalledPartySubaddress;
297	cmsg->CallingPartySubaddress = CallingPartySubaddress;
298	cmsg->B1protocol = B1protocol;
299	cmsg->B2protocol = B2protocol;
300	cmsg->B3protocol = B3protocol;
301	cmsg->B1configuration = B1configuration;
302	cmsg->B2configuration = B2configuration;
303	cmsg->B3configuration = B3configuration;
304	cmsg->BC = BC;
305	cmsg->LLC = LLC;
306	cmsg->HLC = HLC;
307	cmsg->BChannelinformation = BChannelinformation;
308	cmsg->Keypadfacility = Keypadfacility;
309	cmsg->Useruserdata = Useruserdata;
310	cmsg->Facilitydataarray = Facilitydataarray;
311}
312
313static inline void capi_fill_DATA_B3_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
314					 __u32 adr,
315					 __u32 Data,
316					 __u16 DataLength,
317					 __u16 DataHandle,
318					 __u16 Flags)
319{
320
321	capi_cmsg_header(cmsg, ApplId, 0x86, 0x80, Messagenumber, adr);
322	cmsg->Data = Data;
323	cmsg->DataLength = DataLength;
324	cmsg->DataHandle = DataHandle;
325	cmsg->Flags = Flags;
326}
327
328static inline void capi_fill_DISCONNECT_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
329					    __u32 adr,
330					    _cstruct BChannelinformation,
331					    _cstruct Keypadfacility,
332					    _cstruct Useruserdata,
333					    _cstruct Facilitydataarray)
334{
335
336	capi_cmsg_header(cmsg, ApplId, 0x04, 0x80, Messagenumber, adr);
337	cmsg->BChannelinformation = BChannelinformation;
338	cmsg->Keypadfacility = Keypadfacility;
339	cmsg->Useruserdata = Useruserdata;
340	cmsg->Facilitydataarray = Facilitydataarray;
341}
342
343static inline void capi_fill_DISCONNECT_B3_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
344					       __u32 adr,
345					       _cstruct NCPI)
346{
347
348	capi_cmsg_header(cmsg, ApplId, 0x84, 0x80, Messagenumber, adr);
349	cmsg->NCPI = NCPI;
350}
351
352static inline void capi_fill_MANUFACTURER_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
353					      __u32 adr,
354					      __u32 ManuID,
355					      __u32 Class,
356					      __u32 Function,
357					      _cstruct ManuData)
358{
359
360	capi_cmsg_header(cmsg, ApplId, 0xff, 0x80, Messagenumber, adr);
361	cmsg->ManuID = ManuID;
362	cmsg->Class = Class;
363	cmsg->Function = Function;
364	cmsg->ManuData = ManuData;
365}
366
367static inline void capi_fill_RESET_B3_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
368					  __u32 adr,
369					  _cstruct NCPI)
370{
371
372	capi_cmsg_header(cmsg, ApplId, 0x87, 0x80, Messagenumber, adr);
373	cmsg->NCPI = NCPI;
374}
375
376static inline void capi_fill_SELECT_B_PROTOCOL_REQ(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
377						   __u32 adr,
378						   __u16 B1protocol,
379						   __u16 B2protocol,
380						   __u16 B3protocol,
381						_cstruct B1configuration,
382						_cstruct B2configuration,
383						_cstruct B3configuration)
384{
385
386	capi_cmsg_header(cmsg, ApplId, 0x41, 0x80, Messagenumber, adr);
387	cmsg->B1protocol = B1protocol;
388	cmsg->B2protocol = B2protocol;
389	cmsg->B3protocol = B3protocol;
390	cmsg->B1configuration = B1configuration;
391	cmsg->B2configuration = B2configuration;
392	cmsg->B3configuration = B3configuration;
393}
394
395static inline void capi_fill_CONNECT_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
396					  __u32 adr,
397					  __u16 Reject,
398					  __u16 B1protocol,
399					  __u16 B2protocol,
400					  __u16 B3protocol,
401					  _cstruct B1configuration,
402					  _cstruct B2configuration,
403					  _cstruct B3configuration,
404					  _cstruct ConnectedNumber,
405					  _cstruct ConnectedSubaddress,
406					  _cstruct LLC,
407					  _cstruct BChannelinformation,
408					  _cstruct Keypadfacility,
409					  _cstruct Useruserdata,
410					  _cstruct Facilitydataarray)
411{
412	capi_cmsg_header(cmsg, ApplId, 0x02, 0x83, Messagenumber, adr);
413	cmsg->Reject = Reject;
414	cmsg->B1protocol = B1protocol;
415	cmsg->B2protocol = B2protocol;
416	cmsg->B3protocol = B3protocol;
417	cmsg->B1configuration = B1configuration;
418	cmsg->B2configuration = B2configuration;
419	cmsg->B3configuration = B3configuration;
420	cmsg->ConnectedNumber = ConnectedNumber;
421	cmsg->ConnectedSubaddress = ConnectedSubaddress;
422	cmsg->LLC = LLC;
423	cmsg->BChannelinformation = BChannelinformation;
424	cmsg->Keypadfacility = Keypadfacility;
425	cmsg->Useruserdata = Useruserdata;
426	cmsg->Facilitydataarray = Facilitydataarray;
427}
428
429static inline void capi_fill_CONNECT_ACTIVE_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
430						 __u32 adr)
431{
432
433	capi_cmsg_header(cmsg, ApplId, 0x03, 0x83, Messagenumber, adr);
434}
435
436static inline void capi_fill_CONNECT_B3_ACTIVE_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
437						    __u32 adr)
438{
439
440	capi_cmsg_header(cmsg, ApplId, 0x83, 0x83, Messagenumber, adr);
441}
442
443static inline void capi_fill_CONNECT_B3_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
444					     __u32 adr,
445					     __u16 Reject,
446					     _cstruct NCPI)
447{
448	capi_cmsg_header(cmsg, ApplId, 0x82, 0x83, Messagenumber, adr);
449	cmsg->Reject = Reject;
450	cmsg->NCPI = NCPI;
451}
452
453static inline void capi_fill_CONNECT_B3_T90_ACTIVE_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
454							__u32 adr)
455{
456
457	capi_cmsg_header(cmsg, ApplId, 0x88, 0x83, Messagenumber, adr);
458}
459
460static inline void capi_fill_DATA_B3_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
461					  __u32 adr,
462					  __u16 DataHandle)
463{
464
465	capi_cmsg_header(cmsg, ApplId, 0x86, 0x83, Messagenumber, adr);
466	cmsg->DataHandle = DataHandle;
467}
468
469static inline void capi_fill_DISCONNECT_B3_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
470						__u32 adr)
471{
472
473	capi_cmsg_header(cmsg, ApplId, 0x84, 0x83, Messagenumber, adr);
474}
475
476static inline void capi_fill_DISCONNECT_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
477					     __u32 adr)
478{
479
480	capi_cmsg_header(cmsg, ApplId, 0x04, 0x83, Messagenumber, adr);
481}
482
483static inline void capi_fill_FACILITY_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
484					   __u32 adr,
485					   __u16 FacilitySelector)
486{
487
488	capi_cmsg_header(cmsg, ApplId, 0x80, 0x83, Messagenumber, adr);
489	cmsg->FacilitySelector = FacilitySelector;
490}
491
492static inline void capi_fill_INFO_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
493				       __u32 adr)
494{
495
496	capi_cmsg_header(cmsg, ApplId, 0x08, 0x83, Messagenumber, adr);
497}
498
499static inline void capi_fill_MANUFACTURER_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
500					       __u32 adr,
501					       __u32 ManuID,
502					       __u32 Class,
503					       __u32 Function,
504					       _cstruct ManuData)
505{
506
507	capi_cmsg_header(cmsg, ApplId, 0xff, 0x83, Messagenumber, adr);
508	cmsg->ManuID = ManuID;
509	cmsg->Class = Class;
510	cmsg->Function = Function;
511	cmsg->ManuData = ManuData;
512}
513
514static inline void capi_fill_RESET_B3_RESP(_cmsg * cmsg, __u16 ApplId, __u16 Messagenumber,
515					   __u32 adr)
516{
517
518	capi_cmsg_header(cmsg, ApplId, 0x87, 0x83, Messagenumber, adr);
519}
520
521#endif				/* __CAPIUTIL_H__ */
522