home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / linux / mISDNif.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  12.3 KB  |  510 lines

  1. /*
  2.  *
  3.  * Author    Karsten Keil <kkeil@novell.com>
  4.  *
  5.  * Copyright 2008  by Karsten Keil <kkeil@novell.com>
  6.  *
  7.  * This code is free software; you can redistribute it and/or modify
  8.  * it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE
  9.  * version 2.1 as published by the Free Software Foundation.
  10.  *
  11.  * This code is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU LESSER GENERAL PUBLIC LICENSE for more details.
  15.  *
  16.  */
  17.  
  18. #ifndef mISDNIF_H
  19. #define mISDNIF_H
  20.  
  21. #include <stdarg.h>
  22. #include <linux/types.h>
  23. #include <linux/errno.h>
  24. #include <linux/socket.h>
  25.  
  26. /*
  27.  * ABI Version 32 bit
  28.  *
  29.  * <8 bit> Major version
  30.  *        - changed if any interface become backwards incompatible
  31.  *
  32.  * <8 bit> Minor version
  33.  *              - changed if any interface is extended but backwards compatible
  34.  *
  35.  * <16 bit> Release number
  36.  *              - should be incremented on every checkin
  37.  */
  38. #define    MISDN_MAJOR_VERSION    1
  39. #define    MISDN_MINOR_VERSION    0
  40. #define MISDN_RELEASE        19
  41.  
  42. /* primitives for information exchange
  43.  * generell format
  44.  * <16  bit  0 >
  45.  * <8  bit command>
  46.  *    BIT 8 = 1 LAYER private
  47.  *    BIT 7 = 1 answer
  48.  *    BIT 6 = 1 DATA
  49.  * <8  bit target layer mask>
  50.  *
  51.  * Layer = 00 is reserved for general commands
  52.    Layer = 01  L2 -> HW
  53.    Layer = 02  HW -> L2
  54.    Layer = 04  L3 -> L2
  55.    Layer = 08  L2 -> L3
  56.  * Layer = FF is reserved for broadcast commands
  57.  */
  58.  
  59. #define MISDN_CMDMASK        0xff00
  60. #define MISDN_LAYERMASK        0x00ff
  61.  
  62. /* generell commands */
  63. #define OPEN_CHANNEL        0x0100
  64. #define CLOSE_CHANNEL        0x0200
  65. #define CONTROL_CHANNEL        0x0300
  66. #define CHECK_DATA        0x0400
  67.  
  68. /* layer 2 -> layer 1 */
  69. #define PH_ACTIVATE_REQ        0x0101
  70. #define PH_DEACTIVATE_REQ    0x0201
  71. #define PH_DATA_REQ        0x2001
  72. #define MPH_ACTIVATE_REQ    0x0501
  73. #define MPH_DEACTIVATE_REQ    0x0601
  74. #define MPH_INFORMATION_REQ    0x0701
  75. #define PH_CONTROL_REQ        0x0801
  76.  
  77. /* layer 1 -> layer 2 */
  78. #define PH_ACTIVATE_IND        0x0102
  79. #define PH_ACTIVATE_CNF        0x4102
  80. #define PH_DEACTIVATE_IND    0x0202
  81. #define PH_DEACTIVATE_CNF    0x4202
  82. #define PH_DATA_IND        0x2002
  83. #define MPH_ACTIVATE_IND    0x0502
  84. #define MPH_DEACTIVATE_IND    0x0602
  85. #define MPH_INFORMATION_IND    0x0702
  86. #define PH_DATA_CNF        0x6002
  87. #define PH_CONTROL_IND        0x0802
  88. #define PH_CONTROL_CNF        0x4802
  89.  
  90. /* layer 3 -> layer 2 */
  91. #define DL_ESTABLISH_REQ    0x1004
  92. #define DL_RELEASE_REQ        0x1104
  93. #define DL_DATA_REQ        0x3004
  94. #define DL_UNITDATA_REQ        0x3104
  95. #define DL_INFORMATION_REQ    0x0004
  96.  
  97. /* layer 2 -> layer 3 */
  98. #define DL_ESTABLISH_IND    0x1008
  99. #define DL_ESTABLISH_CNF    0x5008
  100. #define DL_RELEASE_IND        0x1108
  101. #define DL_RELEASE_CNF        0x5108
  102. #define DL_DATA_IND        0x3008
  103. #define DL_UNITDATA_IND        0x3108
  104. #define DL_INFORMATION_IND    0x0008
  105.  
  106. /* intern layer 2 managment */
  107. #define MDL_ASSIGN_REQ        0x1804
  108. #define MDL_ASSIGN_IND        0x1904
  109. #define MDL_REMOVE_REQ        0x1A04
  110. #define MDL_REMOVE_IND        0x1B04
  111. #define MDL_STATUS_UP_IND    0x1C04
  112. #define MDL_STATUS_DOWN_IND    0x1D04
  113. #define MDL_STATUS_UI_IND    0x1E04
  114. #define MDL_ERROR_IND        0x1F04
  115. #define MDL_ERROR_RSP        0x5F04
  116.  
  117. /* DL_INFORMATION_IND types */
  118. #define DL_INFO_L2_CONNECT    0x0001
  119. #define DL_INFO_L2_REMOVED    0x0002
  120.  
  121. /* PH_CONTROL types */
  122. /* TOUCH TONE IS 0x20XX  XX "0"..."9", "A","B","C","D","*","#" */
  123. #define DTMF_TONE_VAL        0x2000
  124. #define DTMF_TONE_MASK        0x007F
  125. #define DTMF_TONE_START        0x2100
  126. #define DTMF_TONE_STOP        0x2200
  127. #define DTMF_HFC_COEF        0x4000
  128. #define DSP_CONF_JOIN        0x2403
  129. #define DSP_CONF_SPLIT        0x2404
  130. #define DSP_RECEIVE_OFF        0x2405
  131. #define DSP_RECEIVE_ON        0x2406
  132. #define DSP_ECHO_ON        0x2407
  133. #define DSP_ECHO_OFF        0x2408
  134. #define DSP_MIX_ON        0x2409
  135. #define DSP_MIX_OFF        0x240a
  136. #define DSP_DELAY        0x240b
  137. #define DSP_JITTER        0x240c
  138. #define DSP_TXDATA_ON        0x240d
  139. #define DSP_TXDATA_OFF        0x240e
  140. #define DSP_TX_DEJITTER        0x240f
  141. #define DSP_TX_DEJ_OFF        0x2410
  142. #define DSP_TONE_PATT_ON    0x2411
  143. #define DSP_TONE_PATT_OFF    0x2412
  144. #define DSP_VOL_CHANGE_TX    0x2413
  145. #define DSP_VOL_CHANGE_RX    0x2414
  146. #define DSP_BF_ENABLE_KEY    0x2415
  147. #define DSP_BF_DISABLE        0x2416
  148. #define DSP_BF_ACCEPT        0x2416
  149. #define DSP_BF_REJECT        0x2417
  150. #define DSP_PIPELINE_CFG    0x2418
  151. #define HFC_VOL_CHANGE_TX    0x2601
  152. #define HFC_VOL_CHANGE_RX    0x2602
  153. #define HFC_SPL_LOOP_ON        0x2603
  154. #define HFC_SPL_LOOP_OFF    0x2604
  155.  
  156. /* DSP_TONE_PATT_ON parameter */
  157. #define TONE_OFF            0x0000
  158. #define TONE_GERMAN_DIALTONE        0x0001
  159. #define TONE_GERMAN_OLDDIALTONE        0x0002
  160. #define TONE_AMERICAN_DIALTONE        0x0003
  161. #define TONE_GERMAN_DIALPBX        0x0004
  162. #define TONE_GERMAN_OLDDIALPBX        0x0005
  163. #define TONE_AMERICAN_DIALPBX        0x0006
  164. #define TONE_GERMAN_RINGING        0x0007
  165. #define TONE_GERMAN_OLDRINGING        0x0008
  166. #define TONE_AMERICAN_RINGPBX        0x000b
  167. #define TONE_GERMAN_RINGPBX        0x000c
  168. #define TONE_GERMAN_OLDRINGPBX        0x000d
  169. #define TONE_AMERICAN_RINGING        0x000e
  170. #define TONE_GERMAN_BUSY        0x000f
  171. #define TONE_GERMAN_OLDBUSY        0x0010
  172. #define TONE_AMERICAN_BUSY        0x0011
  173. #define TONE_GERMAN_HANGUP        0x0012
  174. #define TONE_GERMAN_OLDHANGUP        0x0013
  175. #define TONE_AMERICAN_HANGUP        0x0014
  176. #define TONE_SPECIAL_INFO        0x0015
  177. #define TONE_GERMAN_GASSENBESETZT    0x0016
  178. #define TONE_GERMAN_AUFSCHALTTON    0x0016
  179.  
  180. /* MPH_INFORMATION_IND */
  181. #define L1_SIGNAL_LOS_OFF    0x0010
  182. #define L1_SIGNAL_LOS_ON    0x0011
  183. #define L1_SIGNAL_AIS_OFF    0x0012
  184. #define L1_SIGNAL_AIS_ON    0x0013
  185. #define L1_SIGNAL_RDI_OFF    0x0014
  186. #define L1_SIGNAL_RDI_ON    0x0015
  187. #define L1_SIGNAL_SLIP_RX    0x0020
  188. #define L1_SIGNAL_SLIP_TX    0x0021
  189.  
  190. /*
  191.  * protocol ids
  192.  * D channel 1-31
  193.  * B channel 33 - 63
  194.  */
  195.  
  196. #define ISDN_P_NONE        0
  197. #define ISDN_P_BASE        0
  198. #define ISDN_P_TE_S0        0x01
  199. #define ISDN_P_NT_S0          0x02
  200. #define ISDN_P_TE_E1        0x03
  201. #define ISDN_P_NT_E1          0x04
  202. #define ISDN_P_LAPD_TE        0x10
  203. #define    ISDN_P_LAPD_NT        0x11
  204.  
  205. #define ISDN_P_B_MASK        0x1f
  206. #define ISDN_P_B_START        0x20
  207.  
  208. #define ISDN_P_B_RAW        0x21
  209. #define ISDN_P_B_HDLC        0x22
  210. #define ISDN_P_B_X75SLP        0x23
  211. #define ISDN_P_B_L2DTMF        0x24
  212. #define ISDN_P_B_L2DSP        0x25
  213. #define ISDN_P_B_L2DSPHDLC    0x26
  214.  
  215. #define OPTION_L2_PMX        1
  216. #define OPTION_L2_PTP        2
  217. #define OPTION_L2_FIXEDTEI    3
  218. #define OPTION_L2_CLEANUP    4
  219.  
  220. /* should be in sync with linux/kobject.h:KOBJ_NAME_LEN */
  221. #define MISDN_MAX_IDLEN        20
  222.  
  223. struct mISDNhead {
  224.     unsigned int    prim;
  225.     unsigned int    id;
  226. }  __attribute__((packed));
  227.  
  228. #define MISDN_HEADER_LEN    sizeof(struct mISDNhead)
  229. #define MAX_DATA_SIZE        2048
  230. #define MAX_DATA_MEM        (MAX_DATA_SIZE + MISDN_HEADER_LEN)
  231. #define MAX_DFRAME_LEN        260
  232.  
  233. #define MISDN_ID_ADDR_MASK    0xFFFF
  234. #define MISDN_ID_TEI_MASK    0xFF00
  235. #define MISDN_ID_SAPI_MASK    0x00FF
  236. #define MISDN_ID_TEI_ANY    0x7F00
  237.  
  238. #define MISDN_ID_ANY        0xFFFF
  239. #define MISDN_ID_NONE        0xFFFE
  240.  
  241. #define GROUP_TEI        127
  242. #define TEI_SAPI        63
  243. #define CTRL_SAPI        0
  244.  
  245. #define MISDN_MAX_CHANNEL    127
  246. #define MISDN_CHMAP_SIZE    ((MISDN_MAX_CHANNEL + 1) >> 3)
  247.  
  248. #define SOL_MISDN    0
  249.  
  250. struct sockaddr_mISDN {
  251.     sa_family_t    family;
  252.     unsigned char    dev;
  253.     unsigned char    channel;
  254.     unsigned char    sapi;
  255.     unsigned char    tei;
  256. };
  257.  
  258. /* timer device ioctl */
  259. #define IMADDTIMER    _IOR('I', 64, int)
  260. #define IMDELTIMER    _IOR('I', 65, int)
  261. /* socket ioctls */
  262. #define    IMGETVERSION    _IOR('I', 66, int)
  263. #define    IMGETCOUNT    _IOR('I', 67, int)
  264. #define IMGETDEVINFO    _IOR('I', 68, int)
  265. #define IMCTRLREQ    _IOR('I', 69, int)
  266. #define IMCLEAR_L2    _IOR('I', 70, int)
  267.  
  268. struct mISDNversion {
  269.     unsigned char    major;
  270.     unsigned char    minor;
  271.     unsigned short    release;
  272. };
  273.  
  274. struct mISDN_devinfo {
  275.     u_int            id;
  276.     u_int            Dprotocols;
  277.     u_int            Bprotocols;
  278.     u_int            protocol;
  279.     u_char            channelmap[MISDN_CHMAP_SIZE];
  280.     u_int            nrbchan;
  281.     char            name[MISDN_MAX_IDLEN];
  282. };
  283.  
  284. static inline int
  285. test_channelmap(u_int nr, u_char *map)
  286. {
  287.     if (nr <= MISDN_MAX_CHANNEL)
  288.         return map[nr >> 3] & (1 << (nr & 7));
  289.     else
  290.         return 0;
  291. }
  292.  
  293. static inline void
  294. set_channelmap(u_int nr, u_char *map)
  295. {
  296.     map[nr >> 3] |= (1 << (nr & 7));
  297. }
  298.  
  299. static inline void
  300. clear_channelmap(u_int nr, u_char *map)
  301. {
  302.     map[nr >> 3] &= ~(1 << (nr & 7));
  303. }
  304.  
  305. /* CONTROL_CHANNEL parameters */
  306. #define MISDN_CTRL_GETOP        0x0000
  307. #define MISDN_CTRL_LOOP            0x0001
  308. #define MISDN_CTRL_CONNECT        0x0002
  309. #define MISDN_CTRL_DISCONNECT        0x0004
  310. #define MISDN_CTRL_PCMCONNECT        0x0010
  311. #define MISDN_CTRL_PCMDISCONNECT    0x0020
  312. #define MISDN_CTRL_SETPEER        0x0040
  313. #define MISDN_CTRL_UNSETPEER        0x0080
  314. #define MISDN_CTRL_RX_OFF        0x0100
  315. #define MISDN_CTRL_HW_FEATURES_OP    0x2000
  316. #define MISDN_CTRL_HW_FEATURES        0x2001
  317. #define MISDN_CTRL_HFC_OP        0x4000
  318. #define MISDN_CTRL_HFC_PCM_CONN        0x4001
  319. #define MISDN_CTRL_HFC_PCM_DISC        0x4002
  320. #define MISDN_CTRL_HFC_CONF_JOIN    0x4003
  321. #define MISDN_CTRL_HFC_CONF_SPLIT    0x4004
  322. #define MISDN_CTRL_HFC_RECEIVE_OFF    0x4005
  323. #define MISDN_CTRL_HFC_RECEIVE_ON    0x4006
  324. #define MISDN_CTRL_HFC_ECHOCAN_ON     0x4007
  325. #define MISDN_CTRL_HFC_ECHOCAN_OFF     0x4008
  326.  
  327.  
  328. /* socket options */
  329. #define MISDN_TIME_STAMP        0x0001
  330.  
  331. struct mISDN_ctrl_req {
  332.     int        op;
  333.     int        channel;
  334.     int        p1;
  335.     int        p2;
  336. };
  337.  
  338. /* muxer options */
  339. #define MISDN_OPT_ALL        1
  340. #define MISDN_OPT_TEIMGR    2
  341.  
  342. #ifdef __KERNEL__
  343. #include <linux/list.h>
  344. #include <linux/skbuff.h>
  345. #include <linux/net.h>
  346. #include <net/sock.h>
  347. #include <linux/completion.h>
  348.  
  349. #define DEBUG_CORE        0x000000ff
  350. #define DEBUG_CORE_FUNC        0x00000002
  351. #define DEBUG_SOCKET        0x00000004
  352. #define DEBUG_MANAGER        0x00000008
  353. #define DEBUG_SEND_ERR        0x00000010
  354. #define DEBUG_MSG_THREAD    0x00000020
  355. #define DEBUG_QUEUE_FUNC    0x00000040
  356. #define DEBUG_L1        0x0000ff00
  357. #define DEBUG_L1_FSM        0x00000200
  358. #define DEBUG_L2        0x00ff0000
  359. #define DEBUG_L2_FSM        0x00020000
  360. #define DEBUG_L2_CTRL        0x00040000
  361. #define DEBUG_L2_RECV        0x00080000
  362. #define DEBUG_L2_TEI        0x00100000
  363. #define DEBUG_L2_TEIFSM        0x00200000
  364. #define DEBUG_TIMER        0x01000000
  365.  
  366. #define mISDN_HEAD_P(s)        ((struct mISDNhead *)&s->cb[0])
  367. #define mISDN_HEAD_PRIM(s)    (((struct mISDNhead *)&s->cb[0])->prim)
  368. #define mISDN_HEAD_ID(s)    (((struct mISDNhead *)&s->cb[0])->id)
  369.  
  370. /* socket states */
  371. #define MISDN_OPEN    1
  372. #define MISDN_BOUND    2
  373. #define MISDN_CLOSED    3
  374.  
  375. struct mISDNchannel;
  376. struct mISDNdevice;
  377. struct mISDNstack;
  378.  
  379. struct channel_req {
  380.     u_int            protocol;
  381.     struct sockaddr_mISDN    adr;
  382.     struct mISDNchannel    *ch;
  383. };
  384.  
  385. typedef    int    (ctrl_func_t)(struct mISDNchannel *, u_int, void *);
  386. typedef    int    (send_func_t)(struct mISDNchannel *, struct sk_buff *);
  387. typedef int    (create_func_t)(struct channel_req *);
  388.  
  389. struct Bprotocol {
  390.     struct list_head    list;
  391.     char            *name;
  392.     u_int            Bprotocols;
  393.     create_func_t        *create;
  394. };
  395.  
  396. struct mISDNchannel {
  397.     struct list_head    list;
  398.     u_int            protocol;
  399.     u_int            nr;
  400.     u_long            opt;
  401.     u_int            addr;
  402.     struct mISDNstack    *st;
  403.     struct mISDNchannel    *peer;
  404.     send_func_t        *send;
  405.     send_func_t        *recv;
  406.     ctrl_func_t        *ctrl;
  407. };
  408.  
  409. struct mISDN_sock_list {
  410.     struct hlist_head    head;
  411.     rwlock_t        lock;
  412. };
  413.  
  414. struct mISDN_sock {
  415.     struct sock        sk;
  416.     struct mISDNchannel    ch;
  417.     u_int            cmask;
  418.     struct mISDNdevice    *dev;
  419. };
  420.  
  421.  
  422.  
  423. struct mISDNdevice {
  424.     struct mISDNchannel    D;
  425.     u_int            id;
  426.     char            name[MISDN_MAX_IDLEN];
  427.     u_int            Dprotocols;
  428.     u_int            Bprotocols;
  429.     u_int            nrbchan;
  430.     u_char            channelmap[MISDN_CHMAP_SIZE];
  431.     struct list_head    bchannels;
  432.     struct mISDNchannel    *teimgr;
  433.     struct device        dev;
  434. };
  435.  
  436. struct mISDNstack {
  437.     u_long            status;
  438.     struct mISDNdevice    *dev;
  439.     struct task_struct    *thread;
  440.     struct completion    *notify;
  441.     wait_queue_head_t    workq;
  442.     struct sk_buff_head    msgq;
  443.     struct list_head    layer2;
  444.     struct mISDNchannel    *layer1;
  445.     struct mISDNchannel    own;
  446.     struct mutex        lmutex; /* protect lists */
  447.     struct mISDN_sock_list    l1sock;
  448. #ifdef MISDN_MSG_STATS
  449.     u_int            msg_cnt;
  450.     u_int            sleep_cnt;
  451.     u_int            stopped_cnt;
  452. #endif
  453. };
  454.  
  455. /* global alloc/queue functions */
  456.  
  457. static inline struct sk_buff *
  458. mI_alloc_skb(unsigned int len, gfp_t gfp_mask)
  459. {
  460.     struct sk_buff    *skb;
  461.  
  462.     skb = alloc_skb(len + MISDN_HEADER_LEN, gfp_mask);
  463.     if (likely(skb))
  464.         skb_reserve(skb, MISDN_HEADER_LEN);
  465.     return skb;
  466. }
  467.  
  468. static inline struct sk_buff *
  469. _alloc_mISDN_skb(u_int prim, u_int id, u_int len, void *dp, gfp_t gfp_mask)
  470. {
  471.     struct sk_buff    *skb = mI_alloc_skb(len, gfp_mask);
  472.     struct mISDNhead *hh;
  473.  
  474.     if (!skb)
  475.         return NULL;
  476.     if (len)
  477.         memcpy(skb_put(skb, len), dp, len);
  478.     hh = mISDN_HEAD_P(skb);
  479.     hh->prim = prim;
  480.     hh->id = id;
  481.     return skb;
  482. }
  483.  
  484. static inline void
  485. _queue_data(struct mISDNchannel *ch, u_int prim,
  486.     u_int id, u_int len, void *dp, gfp_t gfp_mask)
  487. {
  488.     struct sk_buff        *skb;
  489.  
  490.     if (!ch->peer)
  491.         return;
  492.     skb = _alloc_mISDN_skb(prim, id, len, dp, gfp_mask);
  493.     if (!skb)
  494.         return;
  495.     if (ch->recv(ch->peer, skb))
  496.         dev_kfree_skb(skb);
  497. }
  498.  
  499. /* global register/unregister functions */
  500.  
  501. extern int    mISDN_register_device(struct mISDNdevice *, char *name);
  502. extern void    mISDN_unregister_device(struct mISDNdevice *);
  503. extern int    mISDN_register_Bprotocol(struct Bprotocol *);
  504. extern void    mISDN_unregister_Bprotocol(struct Bprotocol *);
  505.  
  506. extern void    set_channel_address(struct mISDNchannel *, u_int, u_int);
  507.  
  508. #endif /* __KERNEL__ */
  509. #endif /* mISDNIF_H */
  510.