wanpipe.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492
  1. /*****************************************************************************
  2. * wanpipe.h WANPIPE(tm) Multiprotocol WAN Link Driver.
  3. * User-level API definitions.
  4. *
  5. * Author: Nenad Corbic <ncorbic@sangoma.com>
  6. * Gideon Hack
  7. *
  8. * Copyright: (c) 1995-2000 Sangoma Technologies Inc.
  9. *
  10. * This program is free software; you can redistribute it and/or
  11. * modify it under the terms of the GNU General Public License
  12. * as published by the Free Software Foundation; either version
  13. * 2 of the License, or (at your option) any later version.
  14. * ============================================================================
  15. * Nov 3, 2000 Nenad Corbic Added config_id to sdla_t structure.
  16. * Used to determine the protocol running.
  17. * Jul 13, 2000 Nenad Corbic Added SyncPPP Support
  18. * Feb 24, 2000 Nenad Corbic Added support for x25api driver
  19. * Oct 04, 1999 Nenad Corbic New CHDLC and FRAME RELAY code, SMP support
  20. * Jun 02, 1999 Gideon Hack Added 'update_call_count' for Cisco HDLC
  21. * support
  22. * Jun 26, 1998 David Fong Added 'ip_mode' in sdla_t.u.p for dynamic IP
  23. * routing mode configuration
  24. * Jun 12, 1998 David Fong Added Cisco HDLC union member in sdla_t
  25. * Dec 08, 1997 Jaspreet Singh Added 'authenticator' in union of 'sdla_t'
  26. * Nov 26, 1997 Jaspreet Singh Added 'load_sharing' structure. Also added
  27. * 'devs_struct','dev_to_devtint_next' to 'sdla_t'
  28. * Nov 24, 1997 Jaspreet Singh Added 'irq_dis_if_send_count',
  29. * 'irq_dis_poll_count' to 'sdla_t'.
  30. * Nov 06, 1997 Jaspreet Singh Added a define called 'INTR_TEST_MODE'
  31. * Oct 20, 1997 Jaspreet Singh Added 'buff_intr_mode_unbusy' and
  32. * 'dlci_intr_mode_unbusy' to 'sdla_t'
  33. * Oct 18, 1997 Jaspreet Singh Added structure to maintain global driver
  34. * statistics.
  35. * Jan 15, 1997 Gene Kozin Version 3.1.0
  36. * o added UDP management stuff
  37. * Jan 02, 1997 Gene Kozin Version 3.0.0
  38. *****************************************************************************/
  39. #ifndef _WANPIPE_H
  40. #define _WANPIPE_H
  41. #include <linux/wanrouter.h>
  42. /* Defines */
  43. #ifndef PACKED
  44. #define PACKED __attribute__((packed))
  45. #endif
  46. #define WANPIPE_MAGIC 0x414C4453L /* signature: 'SDLA' reversed */
  47. /* IOCTL numbers (up to 16) */
  48. #define WANPIPE_DUMP (ROUTER_USER+0) /* dump adapter's memory */
  49. #define WANPIPE_EXEC (ROUTER_USER+1) /* execute firmware command */
  50. #define TRACE_ALL 0x00
  51. #define TRACE_PROT 0x01
  52. #define TRACE_DATA 0x02
  53. /* values for request/reply byte */
  54. #define UDPMGMT_REQUEST 0x01
  55. #define UDPMGMT_REPLY 0x02
  56. #define UDP_OFFSET 12
  57. #define MAX_CMD_BUFF 10
  58. #define MAX_X25_LCN 255 /* Maximum number of x25 channels */
  59. #define MAX_LCN_NUM 4095 /* Maximum lcn number */
  60. #define MAX_FT1_RETRY 100
  61. #ifndef AF_WANPIPE
  62. #define AF_WANPIPE 25
  63. #ifndef PF_WANPIPE
  64. #define PF_WANPIPE AF_WANPIPE
  65. #endif
  66. #endif
  67. #define TX_TIMEOUT 5*HZ
  68. /* General Critical Flags */
  69. #define SEND_CRIT 0x00
  70. #define PERI_CRIT 0x01
  71. /* Chdlc and PPP polling critical flag */
  72. #define POLL_CRIT 0x03
  73. /* Frame Relay Tx IRQ send critical flag */
  74. #define SEND_TXIRQ_CRIT 0x02
  75. /* Frame Relay ARP critical flag */
  76. #define ARP_CRIT 0x03
  77. /* Bit maps for dynamic interface configuration
  78. * DYN_OPT_ON : turns this option on/off
  79. * DEV_DOWN : device was shutdown by the driver not
  80. * by user
  81. */
  82. #define DYN_OPT_ON 0x00
  83. #define DEV_DOWN 0x01
  84. /*
  85. * Data structures for IOCTL calls.
  86. */
  87. typedef struct sdla_dump /* WANPIPE_DUMP */
  88. {
  89. unsigned long magic; /* for verification */
  90. unsigned long offset; /* absolute adapter memory address */
  91. unsigned long length; /* block length */
  92. void* ptr; /* -> buffer */
  93. } sdla_dump_t;
  94. typedef struct sdla_exec /* WANPIPE_EXEC */
  95. {
  96. unsigned long magic; /* for verification */
  97. void* cmd; /* -> command structure */
  98. void* data; /* -> data buffer */
  99. } sdla_exec_t;
  100. /* UDP management stuff */
  101. typedef struct wum_header
  102. {
  103. unsigned char signature[8]; /* 00h: signature */
  104. unsigned char type; /* 08h: request/reply */
  105. unsigned char command; /* 09h: commnand */
  106. unsigned char reserved[6]; /* 0Ah: reserved */
  107. } wum_header_t;
  108. /*************************************************************************
  109. Data Structure for global statistics
  110. *************************************************************************/
  111. typedef struct global_stats
  112. {
  113. unsigned long isr_entry;
  114. unsigned long isr_already_critical;
  115. unsigned long isr_rx;
  116. unsigned long isr_tx;
  117. unsigned long isr_intr_test;
  118. unsigned long isr_spurious;
  119. unsigned long isr_enable_tx_int;
  120. unsigned long rx_intr_corrupt_rx_bfr;
  121. unsigned long rx_intr_on_orphaned_DLCI;
  122. unsigned long rx_intr_dev_not_started;
  123. unsigned long tx_intr_dev_not_started;
  124. unsigned long poll_entry;
  125. unsigned long poll_already_critical;
  126. unsigned long poll_processed;
  127. unsigned long poll_tbusy_bad_status;
  128. unsigned long poll_host_disable_irq;
  129. unsigned long poll_host_enable_irq;
  130. } global_stats_t;
  131. typedef struct{
  132. unsigned short udp_src_port PACKED;
  133. unsigned short udp_dst_port PACKED;
  134. unsigned short udp_length PACKED;
  135. unsigned short udp_checksum PACKED;
  136. } udp_pkt_t;
  137. typedef struct {
  138. unsigned char ver_inet_hdr_length PACKED;
  139. unsigned char service_type PACKED;
  140. unsigned short total_length PACKED;
  141. unsigned short identifier PACKED;
  142. unsigned short flags_frag_offset PACKED;
  143. unsigned char ttl PACKED;
  144. unsigned char protocol PACKED;
  145. unsigned short hdr_checksum PACKED;
  146. unsigned long ip_src_address PACKED;
  147. unsigned long ip_dst_address PACKED;
  148. } ip_pkt_t;
  149. typedef struct {
  150. unsigned char signature[8] PACKED;
  151. unsigned char request_reply PACKED;
  152. unsigned char id PACKED;
  153. unsigned char reserved[6] PACKED;
  154. } wp_mgmt_t;
  155. /*************************************************************************
  156. Data Structure for if_send statistics
  157. *************************************************************************/
  158. typedef struct if_send_stat{
  159. unsigned long if_send_entry;
  160. unsigned long if_send_skb_null;
  161. unsigned long if_send_broadcast;
  162. unsigned long if_send_multicast;
  163. unsigned long if_send_critical_ISR;
  164. unsigned long if_send_critical_non_ISR;
  165. unsigned long if_send_tbusy;
  166. unsigned long if_send_tbusy_timeout;
  167. unsigned long if_send_PIPE_request;
  168. unsigned long if_send_wan_disconnected;
  169. unsigned long if_send_dlci_disconnected;
  170. unsigned long if_send_no_bfrs;
  171. unsigned long if_send_adptr_bfrs_full;
  172. unsigned long if_send_bfr_passed_to_adptr;
  173. unsigned long if_send_protocol_error;
  174. unsigned long if_send_bfr_not_passed_to_adptr;
  175. unsigned long if_send_tx_int_enabled;
  176. unsigned long if_send_consec_send_fail;
  177. } if_send_stat_t;
  178. typedef struct rx_intr_stat{
  179. unsigned long rx_intr_no_socket;
  180. unsigned long rx_intr_dev_not_started;
  181. unsigned long rx_intr_PIPE_request;
  182. unsigned long rx_intr_bfr_not_passed_to_stack;
  183. unsigned long rx_intr_bfr_passed_to_stack;
  184. } rx_intr_stat_t;
  185. typedef struct pipe_mgmt_stat{
  186. unsigned long UDP_PIPE_mgmt_kmalloc_err;
  187. unsigned long UDP_PIPE_mgmt_direction_err;
  188. unsigned long UDP_PIPE_mgmt_adptr_type_err;
  189. unsigned long UDP_PIPE_mgmt_adptr_cmnd_OK;
  190. unsigned long UDP_PIPE_mgmt_adptr_cmnd_timeout;
  191. unsigned long UDP_PIPE_mgmt_adptr_send_passed;
  192. unsigned long UDP_PIPE_mgmt_adptr_send_failed;
  193. unsigned long UDP_PIPE_mgmt_not_passed_to_stack;
  194. unsigned long UDP_PIPE_mgmt_passed_to_stack;
  195. unsigned long UDP_PIPE_mgmt_no_socket;
  196. unsigned long UDP_PIPE_mgmt_passed_to_adptr;
  197. } pipe_mgmt_stat_t;
  198. typedef struct {
  199. struct sk_buff *skb;
  200. } bh_data_t, cmd_data_t;
  201. #define MAX_LGTH_UDP_MGNT_PKT 2000
  202. /* This is used for interrupt testing */
  203. #define INTR_TEST_MODE 0x02
  204. #define WUM_SIGNATURE_L 0x50495046
  205. #define WUM_SIGNATURE_H 0x444E3845
  206. #define WUM_KILL 0x50
  207. #define WUM_EXEC 0x51
  208. #define WANPIPE 0x00
  209. #define API 0x01
  210. #define BRIDGE 0x02
  211. #define BRIDGE_NODE 0x03
  212. #ifdef __KERNEL__
  213. /****** Kernel Interface ****************************************************/
  214. #include <linux/sdladrv.h> /* SDLA support module API definitions */
  215. #include <linux/sdlasfm.h> /* SDLA firmware module definitions */
  216. #include <linux/workqueue.h>
  217. #include <linux/serial.h>
  218. #include <linux/serialP.h>
  219. #include <linux/serial_reg.h>
  220. #include <asm/serial.h>
  221. #include <linux/tty.h>
  222. #include <linux/tty_driver.h>
  223. #include <linux/tty_flip.h>
  224. #define is_digit(ch) (((ch)>=(unsigned)'0'&&(ch)<=(unsigned)'9')?1:0)
  225. #define is_alpha(ch) ((((ch)>=(unsigned)'a'&&(ch)<=(unsigned)'z')||\
  226. ((ch)>=(unsigned)'A'&&(ch)<=(unsigned)'Z'))?1:0)
  227. #define is_hex_digit(ch) ((((ch)>=(unsigned)'0'&&(ch)<=(unsigned)'9')||\
  228. ((ch)>=(unsigned)'a'&&(ch)<=(unsigned)'f')||\
  229. ((ch)>=(unsigned)'A'&&(ch)<=(unsigned)'F'))?1:0)
  230. /****** Data Structures *****************************************************/
  231. /* Adapter Data Space.
  232. * This structure is needed because we handle multiple cards, otherwise
  233. * static data would do it.
  234. */
  235. typedef struct sdla
  236. {
  237. char devname[WAN_DRVNAME_SZ+1]; /* card name */
  238. sdlahw_t hw; /* hardware configuration */
  239. struct wan_device wandev; /* WAN device data space */
  240. unsigned open_cnt; /* number of open interfaces */
  241. unsigned long state_tick; /* link state timestamp */
  242. unsigned intr_mode; /* Type of Interrupt Mode */
  243. char in_isr; /* interrupt-in-service flag */
  244. char buff_int_mode_unbusy; /* flag for carrying out dev_tint */
  245. char dlci_int_mode_unbusy; /* flag for carrying out dev_tint */
  246. long configured; /* flag for previous configurations */
  247. unsigned short irq_dis_if_send_count; /* Disabling irqs in if_send*/
  248. unsigned short irq_dis_poll_count; /* Disabling irqs in poll routine*/
  249. unsigned short force_enable_irq;
  250. char TracingEnabled; /* flag for enabling trace */
  251. global_stats_t statistics; /* global statistics */
  252. void* mbox; /* -> mailbox */
  253. void* rxmb; /* -> receive mailbox */
  254. void* flags; /* -> adapter status flags */
  255. void (*isr)(struct sdla* card); /* interrupt service routine */
  256. void (*poll)(struct sdla* card); /* polling routine */
  257. int (*exec)(struct sdla* card, void* u_cmd, void* u_data);
  258. /* Used by the listen() system call */
  259. /* Wanpipe Socket Interface */
  260. int (*func) (struct sk_buff *, struct sock *);
  261. struct sock *sk;
  262. /* Shutdown function */
  263. void (*disable_comm) (struct sdla *card);
  264. /* Secondary Port Device: Piggibacking */
  265. struct sdla *next;
  266. /* TTY driver variables */
  267. unsigned char tty_opt;
  268. struct tty_struct *tty;
  269. unsigned int tty_minor;
  270. unsigned int tty_open;
  271. unsigned char *tty_buf;
  272. unsigned char *tty_rx;
  273. struct work_struct tty_work;
  274. union
  275. {
  276. struct
  277. { /****** X.25 specific data **********/
  278. u32 lo_pvc;
  279. u32 hi_pvc;
  280. u32 lo_svc;
  281. u32 hi_svc;
  282. struct net_device *svc_to_dev_map[MAX_X25_LCN];
  283. struct net_device *pvc_to_dev_map[MAX_X25_LCN];
  284. struct net_device *tx_dev;
  285. struct net_device *cmd_dev;
  286. u32 no_dev;
  287. volatile u8 *hdlc_buf_status;
  288. u32 tx_interrupts_pending;
  289. u16 timer_int_enabled;
  290. struct net_device *poll_device;
  291. atomic_t command_busy;
  292. u16 udp_pkt_lgth;
  293. u32 udp_type;
  294. u8 udp_pkt_src;
  295. u32 udp_lcn;
  296. struct net_device *udp_dev;
  297. s8 udp_pkt_data[MAX_LGTH_UDP_MGNT_PKT];
  298. u8 LAPB_hdlc; /* Option to turn off X25 and run only LAPB */
  299. u8 logging; /* Option to log call messages */
  300. u8 oob_on_modem; /* Option to send modem status to the api */
  301. u16 num_of_ch; /* Number of channels configured by the user */
  302. struct work_struct x25_poll_work;
  303. struct timer_list x25_timer;
  304. } x;
  305. struct
  306. { /****** frame relay specific data ***/
  307. void* rxmb_base; /* -> first Rx buffer */
  308. void* rxmb_last; /* -> last Rx buffer */
  309. unsigned rx_base; /* S508 receive buffer base */
  310. unsigned rx_top; /* S508 receive buffer end */
  311. unsigned short node_dlci[100];
  312. unsigned short dlci_num;
  313. struct net_device *dlci_to_dev_map[991 + 1];
  314. unsigned tx_interrupts_pending;
  315. unsigned short timer_int_enabled;
  316. unsigned short udp_pkt_lgth;
  317. int udp_type;
  318. char udp_pkt_src;
  319. unsigned udp_dlci;
  320. char udp_pkt_data[MAX_LGTH_UDP_MGNT_PKT];
  321. void* trc_el_base; /* first trace element */
  322. void* trc_el_last; /* last trace element */
  323. void *curr_trc_el; /* current trace element */
  324. unsigned short trc_bfr_space; /* trace buffer space */
  325. unsigned char update_comms_stats;
  326. struct net_device *arp_dev;
  327. spinlock_t if_send_lock;
  328. } f;
  329. struct /****** PPP-specific data ***********/
  330. {
  331. char if_name[WAN_IFNAME_SZ+1]; /* interface name */
  332. void* txbuf; /* -> current Tx buffer */
  333. void* txbuf_base; /* -> first Tx buffer */
  334. void* txbuf_last; /* -> last Tx buffer */
  335. void* rxbuf_base; /* -> first Rx buffer */
  336. void* rxbuf_last; /* -> last Rx buffer */
  337. unsigned rx_base; /* S508 receive buffer base */
  338. unsigned rx_top; /* S508 receive buffer end */
  339. char ip_mode; /* STATIC/HOST/PEER IP Mode */
  340. char authenticator; /* Authenticator for PAP/CHAP */
  341. unsigned char comm_enabled; /* Is comm enabled or not */
  342. unsigned char peer_route; /* Process Peer Route */
  343. unsigned long *txbuf_next; /* Next Tx buffer to use */
  344. unsigned long *rxbuf_next; /* Next Rx buffer to use */
  345. } p;
  346. struct /* Cisco HDLC-specific data */
  347. {
  348. char if_name[WAN_IFNAME_SZ+1]; /* interface name */
  349. unsigned char comm_port;/* Communication Port O or 1 */
  350. unsigned char usedby; /* Used by WANPIPE or API */
  351. void* rxmb; /* Receive mail box */
  352. void* flags; /* flags */
  353. void* tx_status; /* Tx status element */
  354. void* rx_status; /* Rx status element */
  355. void* txbuf; /* -> current Tx buffer */
  356. void* txbuf_base; /* -> first Tx buffer */
  357. void* txbuf_last; /* -> last Tx buffer */
  358. void* rxbuf_base; /* -> first Rx buffer */
  359. void* rxbuf_last; /* -> last Rx buffer */
  360. unsigned rx_base; /* S508 receive buffer base */
  361. unsigned rx_top; /* S508 receive buffer end */
  362. unsigned char receive_only; /* high speed receivers */
  363. unsigned short protocol_options;
  364. unsigned short kpalv_tx; /* Tx kpalv timer */
  365. unsigned short kpalv_rx; /* Rx kpalv timer */
  366. unsigned short kpalv_err; /* Error tolerance */
  367. unsigned short slarp_timer; /* SLARP req timer */
  368. unsigned state; /* state of the link */
  369. unsigned char api_status;
  370. unsigned char update_call_count;
  371. unsigned short api_options; /* for async config */
  372. unsigned char async_mode;
  373. unsigned short tx_bits_per_char;
  374. unsigned short rx_bits_per_char;
  375. unsigned short stop_bits;
  376. unsigned short parity;
  377. unsigned short break_timer;
  378. unsigned short inter_char_timer;
  379. unsigned short rx_complete_length;
  380. unsigned short xon_char;
  381. unsigned short xoff_char;
  382. unsigned char comm_enabled; /* Is comm enabled or not */
  383. unsigned char backup;
  384. } c;
  385. struct
  386. {
  387. void* tx_status; /* Tx status element */
  388. void* rx_status; /* Rx status element */
  389. void* trace_status; /* Trace status element */
  390. void* txbuf; /* -> current Tx buffer */
  391. void* txbuf_base; /* -> first Tx buffer */
  392. void* txbuf_last; /* -> last Tx buffer */
  393. void* rxbuf_base; /* -> first Rx buffer */
  394. void* rxbuf_last; /* -> last Rx buffer */
  395. void* tracebuf; /* -> current Trace buffer */
  396. void* tracebuf_base; /* -> current Trace buffer */
  397. void* tracebuf_last; /* -> current Trace buffer */
  398. unsigned rx_base; /* receive buffer base */
  399. unsigned rx_end; /* receive buffer end */
  400. unsigned trace_base; /* trace buffer base */
  401. unsigned trace_end; /* trace buffer end */
  402. } h;
  403. } u;
  404. } sdla_t;
  405. /****** Public Functions ****************************************************/
  406. void wanpipe_open (sdla_t* card); /* wpmain.c */
  407. void wanpipe_close (sdla_t* card); /* wpmain.c */
  408. void wanpipe_set_state (sdla_t* card, int state); /* wpmain.c */
  409. int wpx_init (sdla_t* card, wandev_conf_t* conf); /* wpx.c */
  410. int wpf_init (sdla_t* card, wandev_conf_t* conf); /* wpf.c */
  411. int wpp_init (sdla_t* card, wandev_conf_t* conf); /* wpp.c */
  412. int wpc_init (sdla_t* card, wandev_conf_t* conf); /* Cisco HDLC */
  413. int bsc_init (sdla_t* card, wandev_conf_t* conf); /* BSC streaming */
  414. int hdlc_init(sdla_t* card, wandev_conf_t* conf); /* HDLC support */
  415. int wpft1_init (sdla_t* card, wandev_conf_t* conf); /* FT1 Config support */
  416. int wsppp_init (sdla_t* card, wandev_conf_t* conf); /* Sync PPP on top of RAW CHDLC */
  417. extern sdla_t * wanpipe_find_card(char *);
  418. extern sdla_t * wanpipe_find_card_num (int);
  419. extern void wanpipe_queue_work (struct work_struct *);
  420. extern void wanpipe_mark_bh (void);
  421. extern void wakeup_sk_bh(struct net_device *dev);
  422. extern int change_dev_flags(struct net_device *dev, unsigned flags);
  423. extern unsigned long get_ip_address(struct net_device *dev, int option);
  424. extern void add_gateway(sdla_t *card, struct net_device *dev);
  425. #endif /* __KERNEL__ */
  426. #endif /* _WANPIPE_H */