1 | /* |
2 | * Kernel CAPI 2.0 Module |
3 | * |
4 | * Copyright 1999 by Carsten Paeth <calle@calle.de> |
5 | * Copyright 2002 by Kai Germaschewski <kai@germaschewski.name> |
6 | * |
7 | * This software may be used and distributed according to the terms |
8 | * of the GNU General Public License, incorporated herein by reference. |
9 | * |
10 | */ |
11 | |
12 | |
13 | #include <linux/kernel.h> |
14 | #include <linux/spinlock.h> |
15 | #include <linux/list.h> |
16 | #include <linux/isdn/capilli.h> |
17 | |
18 | #ifdef KCAPI_DEBUG |
19 | #define DBG(format, arg...) do { \ |
20 | printk(KERN_DEBUG "%s: " format "\n" , __func__ , ## arg); \ |
21 | } while (0) |
22 | #else |
23 | #define DBG(format, arg...) /* */ |
24 | #endif |
25 | |
26 | enum { |
27 | CAPI_CTR_DETACHED = 0, |
28 | CAPI_CTR_DETECTED = 1, |
29 | CAPI_CTR_LOADING = 2, |
30 | CAPI_CTR_RUNNING = 3, |
31 | }; |
32 | |
33 | extern struct capi_ctr *capi_controller[CAPI_MAXCONTR]; |
34 | extern struct mutex capi_controller_lock; |
35 | |
36 | extern struct capi20_appl *capi_applications[CAPI_MAXAPPL]; |
37 | |
38 | void kcapi_proc_init(void); |
39 | void kcapi_proc_exit(void); |
40 | |
41 | struct capi20_appl { |
42 | u16 applid; |
43 | capi_register_params rparam; |
44 | void (*recv_message)(struct capi20_appl *ap, struct sk_buff *skb); |
45 | void *private; |
46 | |
47 | /* internal to kernelcapi.o */ |
48 | unsigned long nrecvctlpkt; |
49 | unsigned long nrecvdatapkt; |
50 | unsigned long nsentctlpkt; |
51 | unsigned long nsentdatapkt; |
52 | struct mutex recv_mtx; |
53 | struct sk_buff_head recv_queue; |
54 | struct work_struct recv_work; |
55 | int release_in_progress; |
56 | }; |
57 | |
58 | u16 capi20_isinstalled(void); |
59 | u16 capi20_register(struct capi20_appl *ap); |
60 | u16 capi20_release(struct capi20_appl *ap); |
61 | u16 capi20_put_message(struct capi20_appl *ap, struct sk_buff *skb); |
62 | u16 capi20_get_manufacturer(u32 contr, u8 buf[CAPI_MANUFACTURER_LEN]); |
63 | u16 capi20_get_version(u32 contr, struct capi_version *verp); |
64 | u16 capi20_get_serial(u32 contr, u8 serial[CAPI_SERIAL_LEN]); |
65 | u16 capi20_get_profile(u32 contr, struct capi_profile *profp); |
66 | int capi20_manufacturer(unsigned long cmd, void __user *data); |
67 | |
68 | #define CAPICTR_UP 0 |
69 | #define CAPICTR_DOWN 1 |
70 | |
71 | int kcapi_init(void); |
72 | void kcapi_exit(void); |
73 | |
74 | /*----- basic-type definitions -----*/ |
75 | |
76 | typedef __u8 *_cstruct; |
77 | |
78 | typedef enum { |
79 | CAPI_COMPOSE, |
80 | CAPI_DEFAULT |
81 | } _cmstruct; |
82 | |
83 | /* |
84 | The _cmsg structure contains all possible CAPI 2.0 parameter. |
85 | All parameters are stored here first. The function CAPI_CMSG_2_MESSAGE |
86 | assembles the parameter and builds CAPI2.0 conform messages. |
87 | CAPI_MESSAGE_2_CMSG disassembles CAPI 2.0 messages and stores the |
88 | parameter in the _cmsg structure |
89 | */ |
90 | |
91 | typedef struct { |
92 | /* Header */ |
93 | __u16 ApplId; |
94 | __u8 Command; |
95 | __u8 Subcommand; |
96 | __u16 Messagenumber; |
97 | |
98 | /* Parameter */ |
99 | union { |
100 | __u32 adrController; |
101 | __u32 adrPLCI; |
102 | __u32 adrNCCI; |
103 | } adr; |
104 | |
105 | _cmstruct AdditionalInfo; |
106 | _cstruct B1configuration; |
107 | __u16 B1protocol; |
108 | _cstruct B2configuration; |
109 | __u16 B2protocol; |
110 | _cstruct B3configuration; |
111 | __u16 B3protocol; |
112 | _cstruct BC; |
113 | _cstruct BChannelinformation; |
114 | _cmstruct BProtocol; |
115 | _cstruct CalledPartyNumber; |
116 | _cstruct CalledPartySubaddress; |
117 | _cstruct CallingPartyNumber; |
118 | _cstruct CallingPartySubaddress; |
119 | __u32 CIPmask; |
120 | __u32 CIPmask2; |
121 | __u16 CIPValue; |
122 | __u32 Class; |
123 | _cstruct ConnectedNumber; |
124 | _cstruct ConnectedSubaddress; |
125 | __u32 Data; |
126 | __u16 DataHandle; |
127 | __u16 DataLength; |
128 | _cstruct FacilityConfirmationParameter; |
129 | _cstruct Facilitydataarray; |
130 | _cstruct FacilityIndicationParameter; |
131 | _cstruct FacilityRequestParameter; |
132 | __u16 FacilitySelector; |
133 | __u16 Flags; |
134 | __u32 Function; |
135 | _cstruct HLC; |
136 | __u16 Info; |
137 | _cstruct InfoElement; |
138 | __u32 InfoMask; |
139 | __u16 InfoNumber; |
140 | _cstruct Keypadfacility; |
141 | _cstruct LLC; |
142 | _cstruct ManuData; |
143 | __u32 ManuID; |
144 | _cstruct NCPI; |
145 | __u16 Reason; |
146 | __u16 Reason_B3; |
147 | __u16 Reject; |
148 | _cstruct Useruserdata; |
149 | |
150 | /* intern */ |
151 | unsigned l, p; |
152 | unsigned char *par; |
153 | __u8 *m; |
154 | |
155 | /* buffer to construct message */ |
156 | __u8 buf[180]; |
157 | |
158 | } _cmsg; |
159 | |
160 | /*-----------------------------------------------------------------------*/ |
161 | |
162 | /* |
163 | * Debugging / Tracing functions |
164 | */ |
165 | |
166 | char *capi_cmd2str(__u8 cmd, __u8 subcmd); |
167 | |
168 | typedef struct { |
169 | u_char *buf; |
170 | u_char *p; |
171 | size_t size; |
172 | size_t pos; |
173 | } _cdebbuf; |
174 | |
175 | #define CDEBUG_SIZE 1024 |
176 | #define CDEBUG_GSIZE 4096 |
177 | |
178 | void cdebbuf_free(_cdebbuf *cdb); |
179 | int cdebug_init(void); |
180 | void cdebug_exit(void); |
181 | |
182 | _cdebbuf *capi_message2str(__u8 *msg); |
183 | |