/***************************************************************************** * wanpipe.h WANPIPE(tm) Multiprotocol WAN Link Driver. * User-level API definitions. * * Author: Nenad Corbic * Gideon Hack * * Copyright: (c) 1995-2000 Sangoma Technologies Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * ============================================================================ * Nov 3, 2000 Nenad Corbic Added config_id to sdla_t structure. * Used to determine the protocol running. * Jul 13, 2000 Nenad Corbic Added SyncPPP Support * Feb 24, 2000 Nenad Corbic Added support for x25api driver * Oct 04, 1999 Nenad Corbic New CHDLC and FRAME RELAY code, SMP support * Jun 02, 1999 Gideon Hack Added 'update_call_count' for Cisco HDLC * support * Jun 26, 1998 David Fong Added 'ip_mode' in sdla_t.u.p for dynamic IP * routing mode configuration * Jun 12, 1998 David Fong Added Cisco HDLC union member in sdla_t * Dec 08, 1997 Jaspreet Singh Added 'authenticator' in union of 'sdla_t' * Nov 26, 1997 Jaspreet Singh Added 'load_sharing' structure. Also added * 'devs_struct','dev_to_devtint_next' to 'sdla_t' * Nov 24, 1997 Jaspreet Singh Added 'irq_dis_if_send_count', * 'irq_dis_poll_count' to 'sdla_t'. * Nov 06, 1997 Jaspreet Singh Added a define called 'INTR_TEST_MODE' * Oct 20, 1997 Jaspreet Singh Added 'buff_intr_mode_unbusy' and * 'dlci_intr_mode_unbusy' to 'sdla_t' * Oct 18, 1997 Jaspreet Singh Added structure to maintain global driver * statistics. * Jan 15, 1997 Gene Kozin Version 3.1.0 * o added UDP management stuff * Jan 02, 1997 Gene Kozin Version 3.0.0 *****************************************************************************/ #ifndef _WANPIPE_H #define _WANPIPE_H #include #ifndef KERNEL_VERSION #define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c)) #endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0) #define LINUX_2_4 #define netdevice_t struct net_device #define FREE_READ 1 #define FREE_WRITE 0 #define stop_net_queue(a) netif_stop_queue(a) #define start_net_queue(a) netif_start_queue(a) #define is_queue_stopped(a) netif_queue_stopped(a) #define wake_net_dev(a) netif_wake_queue(a) #define is_dev_running(a) netif_running(a) #define wan_dev_kfree_skb(a,b) dev_kfree_skb_any(a) #elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0) #define LINUX_2_1 #define netdevice_t struct device #define FREE_READ 1 #define FREE_WRITE 0 #define stop_net_queue(a) (set_bit(0, &##a->tbusy)) #define start_net_queue(a) (clear_bit(0,&##a->tbusy)) #define is_queue_stopped(a) (##a->tbusy) #define wake_net_dev(a) {clear_bit(0,&##a->tbusy);mark_bh(NET_BH);} #define is_dev_running(a) (test_bit(0,&##a->start)) #define wan_dev_kfree_skb(a,b) dev_kfree_skb(a) #else #define LINUX_2_0 #define netdevice_t struct device #define test_and_set_bit set_bit #define net_ratelimit() 1 #define stop_net_queue(a) (set_bit(0, &##a->tbusy)) #define start_net_queue(a) (clear_bit(0,&##a->tbusy)) #define is_queue_stopped(a) (##a->tbusy) #define wake_net_dev(a) {clear_bit(0,&##a->tbusy);mark_bh(NET_BH);} #define is_dev_running(a) (test_bit(0,(void*)&##a->start)) #define wan_dev_kfree_skb(a,b) dev_kfree_skb(a,b) #define spin_lock_init(a) #define spin_lock(a) #define spin_unlock(a) #endif #include /* Defines */ #ifndef PACKED #define PACKED __attribute__((packed)) #endif #define WANPIPE_MAGIC 0x414C4453L /* signature: 'SDLA' reversed */ /* IOCTL numbers (up to 16) */ #define WANPIPE_DUMP (ROUTER_USER+0) /* dump adapter's memory */ #define WANPIPE_EXEC (ROUTER_USER+1) /* execute firmware command */ #define TRACE_ALL 0x00 #define TRACE_PROT 0x01 #define TRACE_DATA 0x02 /* values for request/reply byte */ #define UDPMGMT_REQUEST 0x01 #define UDPMGMT_REPLY 0x02 #define UDP_OFFSET 12 #define MAX_CMD_BUFF 10 #define MAX_X25_LCN 255 /* Maximum number of x25 channels */ #define MAX_LCN_NUM 4095 /* Maximum lcn number */ #define MAX_FT1_RETRY 100 #ifdef LINUX_2_4 #ifndef AF_WANPIPE #define AF_WANPIPE 25 #ifndef PF_WANPIPE #define PF_WANPIPE AF_WANPIPE #endif #endif #else #ifndef AF_WANPIPE #define AF_WANPIPE 24 #ifndef PF_WANPIPE #define PF_WANPIPE AF_WANPIPE #endif #endif #endif #define TX_TIMEOUT 5*HZ /* General Critical Flags */ #define SEND_CRIT 0x00 #define PERI_CRIT 0x01 /* Chdlc and PPP polling critical flag */ #define POLL_CRIT 0x03 /* Frame Relay Tx IRQ send critical flag */ #define SEND_TXIRQ_CRIT 0x02 /* Frame Relay ARP critical flag */ #define ARP_CRIT 0x03 /* Bit maps for dynamic interface configuration * DYN_OPT_ON : turns this option on/off * DEV_DOWN : device was shutdown by the driver not * by user */ #define DYN_OPT_ON 0x00 #define DEV_DOWN 0x01 /* * Data structures for IOCTL calls. */ typedef struct sdla_dump /* WANPIPE_DUMP */ { unsigned long magic; /* for verification */ unsigned long offset; /* absolute adapter memory address */ unsigned long length; /* block length */ void* ptr; /* -> buffer */ } sdla_dump_t; typedef struct sdla_exec /* WANPIPE_EXEC */ { unsigned long magic; /* for verification */ void* cmd; /* -> command structure */ void* data; /* -> data buffer */ } sdla_exec_t; /* UDP management stuff */ typedef struct wum_header { unsigned char signature[8]; /* 00h: signature */ unsigned char type; /* 08h: request/reply */ unsigned char command; /* 09h: commnand */ unsigned char reserved[6]; /* 0Ah: reserved */ } wum_header_t; /************************************************************************* Data Structure for global statistics *************************************************************************/ typedef struct global_stats { unsigned long isr_entry; unsigned long isr_already_critical; unsigned long isr_rx; unsigned long isr_tx; unsigned long isr_intr_test; unsigned long isr_spurious; unsigned long isr_enable_tx_int; unsigned long rx_intr_corrupt_rx_bfr; unsigned long rx_intr_on_orphaned_DLCI; unsigned long rx_intr_dev_not_started; unsigned long tx_intr_dev_not_started; unsigned long poll_entry; unsigned long poll_already_critical; unsigned long poll_processed; unsigned long poll_tbusy_bad_status; unsigned long poll_host_disable_irq; unsigned long poll_host_enable_irq; } global_stats_t; typedef struct{ unsigned short udp_src_port PACKED; unsigned short udp_dst_port PACKED; unsigned short udp_length PACKED; unsigned short udp_checksum PACKED; } udp_pkt_t; typedef struct { unsigned char ver_inet_hdr_length; unsigned char service_type; unsigned short total_length PACKED; unsigned short identifier PACKED; unsigned short flags_frag_offset PACKED; unsigned char ttl; unsigned char protocol; unsigned short hdr_checksum PACKED; unsigned long ip_src_address PACKED; unsigned long ip_dst_address PACKED; } ip_pkt_t; typedef struct { unsigned char signature[8]; unsigned char request_reply; unsigned char id; unsigned char reserved[6]; } wp_mgmt_t; /************************************************************************* Data Structure for if_send statistics *************************************************************************/ typedef struct if_send_stat{ unsigned long if_send_entry; unsigned long if_send_skb_null; unsigned long if_send_broadcast; unsigned long if_send_multicast; unsigned long if_send_critical_ISR; unsigned long if_send_critical_non_ISR; unsigned long if_send_tbusy; unsigned long if_send_tbusy_timeout; unsigned long if_send_PIPE_request; unsigned long if_send_wan_disconnected; unsigned long if_send_dlci_disconnected; unsigned long if_send_no_bfrs; unsigned long if_send_adptr_bfrs_full; unsigned long if_send_bfr_passed_to_adptr; unsigned long if_send_protocol_error; unsigned long if_send_bfr_not_passed_to_adptr; unsigned long if_send_tx_int_enabled; unsigned long if_send_consec_send_fail; } if_send_stat_t; typedef struct rx_intr_stat{ unsigned long rx_intr_no_socket; unsigned long rx_intr_dev_not_started; unsigned long rx_intr_PIPE_request; unsigned long rx_intr_bfr_not_passed_to_stack; unsigned long rx_intr_bfr_passed_to_stack; } rx_intr_stat_t; typedef struct pipe_mgmt_stat{ unsigned long UDP_PIPE_mgmt_kmalloc_err; unsigned long UDP_PIPE_mgmt_direction_err; unsigned long UDP_PIPE_mgmt_adptr_type_err; unsigned long UDP_PIPE_mgmt_adptr_cmnd_OK; unsigned long UDP_PIPE_mgmt_adptr_cmnd_timeout; unsigned long UDP_PIPE_mgmt_adptr_send_passed; unsigned long UDP_PIPE_mgmt_adptr_send_failed; unsigned long UDP_PIPE_mgmt_not_passed_to_stack; unsigned long UDP_PIPE_mgmt_passed_to_stack; unsigned long UDP_PIPE_mgmt_no_socket; unsigned long UDP_PIPE_mgmt_passed_to_adptr; } pipe_mgmt_stat_t; typedef struct { struct sk_buff *skb; } bh_data_t, cmd_data_t; #define MAX_LGTH_UDP_MGNT_PKT 2000 /* This is used for interrupt testing */ #define INTR_TEST_MODE 0x02 #define WUM_SIGNATURE_L 0x50495046 #define WUM_SIGNATURE_H 0x444E3845 #define WUM_KILL 0x50 #define WUM_EXEC 0x51 #define WANPIPE 0x00 #define API 0x01 #define BRIDGE 0x02 #define BRIDGE_NODE 0x03 #ifdef __KERNEL__ /****** Kernel Interface ****************************************************/ #include /* SDLA support module API definitions */ #include /* SDLA firmware module definitions */ #include #ifdef LINUX_2_4 #include #include #include #include #endif #include #include #include #define is_digit(ch) (((ch)>=(unsigned)'0'&&(ch)<=(unsigned)'9')?1:0) #define is_alpha(ch) ((((ch)>=(unsigned)'a'&&(ch)<=(unsigned)'z')||\ ((ch)>=(unsigned)'A'&&(ch)<=(unsigned)'Z'))?1:0) #define is_hex_digit(ch) ((((ch)>=(unsigned)'0'&&(ch)<=(unsigned)'9')||\ ((ch)>=(unsigned)'a'&&(ch)<=(unsigned)'f')||\ ((ch)>=(unsigned)'A'&&(ch)<=(unsigned)'F'))?1:0) /****** Data Structures *****************************************************/ /* Adapter Data Space. * This structure is needed because we handle multiple cards, otherwise * static data would do it. */ typedef struct sdla { char devname[WAN_DRVNAME_SZ+1]; /* card name */ sdlahw_t hw; /* hardware configuration */ wan_device_t wandev; /* WAN device data space */ unsigned open_cnt; /* number of open interfaces */ unsigned long state_tick; /* link state timestamp */ unsigned intr_mode; /* Type of Interrupt Mode */ char in_isr; /* interrupt-in-service flag */ char buff_int_mode_unbusy; /* flag for carrying out dev_tint */ char dlci_int_mode_unbusy; /* flag for carrying out dev_tint */ char configured; /* flag for previous configurations */ unsigned short irq_dis_if_send_count; /* Disabling irqs in if_send*/ unsigned short irq_dis_poll_count; /* Disabling irqs in poll routine*/ unsigned short force_enable_irq; char TracingEnabled; /* flag for enabling trace */ global_stats_t statistics; /* global statistics */ void* mbox; /* -> mailbox */ void* rxmb; /* -> receive mailbox */ void* flags; /* -> adapter status flags */ void (*isr)(struct sdla* card); /* interrupt service routine */ void (*poll)(struct sdla* card); /* polling routine */ int (*exec)(struct sdla* card, void* u_cmd, void* u_data); /* Used by the listen() system call */ /* Wanpipe Socket Interface */ int (*func) (struct sk_buff *, struct sock *); struct sock *sk; /* Shutdown function */ void (*disable_comm) (struct sdla *card); /* Secondary Port Device: Piggibacking */ struct sdla *next; /* TTY driver variables */ unsigned char tty_opt; struct tty_struct *tty; unsigned int tty_minor; unsigned int tty_open; unsigned char *tty_buf; unsigned char *tty_rx; struct tq_struct tty_task_queue; union { struct { /****** X.25 specific data **********/ u32 lo_pvc; u32 hi_pvc; u32 lo_svc; u32 hi_svc; netdevice_t *svc_to_dev_map[MAX_X25_LCN]; netdevice_t *pvc_to_dev_map[MAX_X25_LCN]; netdevice_t *tx_dev; netdevice_t *cmd_dev; u32 no_dev; volatile u8 *hdlc_buf_status; u32 tx_interrupts_pending; u16 timer_int_enabled; netdevice_t *poll_device; atomic_t command_busy; u16 udp_pkt_lgth; u32 udp_type; u8 udp_pkt_src; u32 udp_lcn; netdevice_t * udp_dev; s8 udp_pkt_data[MAX_LGTH_UDP_MGNT_PKT]; u8 LAPB_hdlc; /* Option to turn off X25 and run only LAPB */ u8 logging; /* Option to log call messages */ u8 oob_on_modem; /* Option to send modem status to the api */ u16 num_of_ch; /* Number of channels configured by the user */ struct tq_struct x25_poll_task; struct timer_list x25_timer; } x; struct { /****** frame relay specific data ***/ void* rxmb_base; /* -> first Rx buffer */ void* rxmb_last; /* -> last Rx buffer */ unsigned rx_base; /* S508 receive buffer base */ unsigned rx_top; /* S508 receive buffer end */ unsigned short node_dlci[100]; unsigned short dlci_num; netdevice_t *dlci_to_dev_map[991 + 1]; unsigned tx_interrupts_pending; unsigned short timer_int_enabled; unsigned short udp_pkt_lgth; int udp_type; char udp_pkt_src; unsigned udp_dlci; char udp_pkt_data[MAX_LGTH_UDP_MGNT_PKT]; void* trc_el_base; /* first trace element */ void* trc_el_last; /* last trace element */ void *curr_trc_el; /* current trace element */ unsigned short trc_bfr_space; /* trace buffer space */ unsigned char update_comms_stats; netdevice_t *arp_dev; spinlock_t if_send_lock; } f; struct /****** PPP-specific data ***********/ { char if_name[WAN_IFNAME_SZ+1]; /* interface name */ void* txbuf; /* -> current Tx buffer */ void* txbuf_base; /* -> first Tx buffer */ void* txbuf_last; /* -> last Tx buffer */ void* rxbuf_base; /* -> first Rx buffer */ void* rxbuf_last; /* -> last Rx buffer */ unsigned rx_base; /* S508 receive buffer base */ unsigned rx_top; /* S508 receive buffer end */ char ip_mode; /* STATIC/HOST/PEER IP Mode */ char authenticator; /* Authenticator for PAP/CHAP */ unsigned char comm_enabled; /* Is comm enabled or not */ unsigned char peer_route; /* Process Peer Route */ unsigned long *txbuf_next; /* Next Tx buffer to use */ unsigned long *rxbuf_next; /* Next Rx buffer to use */ } p; struct /* Cisco HDLC-specific data */ { char if_name[WAN_IFNAME_SZ+1]; /* interface name */ unsigned char comm_port;/* Communication Port O or 1 */ unsigned char usedby; /* Used by WANPIPE or API */ void* rxmb; /* Receive mail box */ void* flags; /* flags */ void* tx_status; /* Tx status element */ void* rx_status; /* Rx status element */ void* txbuf; /* -> current Tx buffer */ void* txbuf_base; /* -> first Tx buffer */ void* txbuf_last; /* -> last Tx buffer */ void* rxbuf_base; /* -> first Rx buffer */ void* rxbuf_last; /* -> last Rx buffer */ unsigned rx_base; /* S508 receive buffer base */ unsigned rx_top; /* S508 receive buffer end */ unsigned char receive_only; /* high speed receivers */ unsigned short protocol_options; unsigned short kpalv_tx; /* Tx kpalv timer */ unsigned short kpalv_rx; /* Rx kpalv timer */ unsigned short kpalv_err; /* Error tolerance */ unsigned short slarp_timer; /* SLARP req timer */ unsigned state; /* state of the link */ unsigned char api_status; unsigned char update_call_count; unsigned short api_options; /* for async config */ unsigned char async_mode; unsigned short tx_bits_per_char; unsigned short rx_bits_per_char; unsigned short stop_bits; unsigned short parity; unsigned short break_timer; unsigned short inter_char_timer; unsigned short rx_complete_length; unsigned short xon_char; unsigned short xoff_char; unsigned char comm_enabled; /* Is comm enabled or not */ unsigned char backup; } c; struct { void* tx_status; /* Tx status element */ void* rx_status; /* Rx status element */ void* trace_status; /* Trace status element */ void* txbuf; /* -> current Tx buffer */ void* txbuf_base; /* -> first Tx buffer */ void* txbuf_last; /* -> last Tx buffer */ void* rxbuf_base; /* -> first Rx buffer */ void* rxbuf_last; /* -> last Rx buffer */ void* tracebuf; /* -> current Trace buffer */ void* tracebuf_base; /* -> current Trace buffer */ void* tracebuf_last; /* -> current Trace buffer */ unsigned rx_base; /* receive buffer base */ unsigned rx_end; /* receive buffer end */ unsigned trace_base; /* trace buffer base */ unsigned trace_end; /* trace buffer end */ } h; } u; } sdla_t; /****** Public Functions ****************************************************/ void wanpipe_open (sdla_t* card); /* wpmain.c */ void wanpipe_close (sdla_t* card); /* wpmain.c */ void wanpipe_set_state (sdla_t* card, int state); /* wpmain.c */ int wpx_init (sdla_t* card, wandev_conf_t* conf); /* wpx.c */ int wpf_init (sdla_t* card, wandev_conf_t* conf); /* wpf.c */ int wpp_init (sdla_t* card, wandev_conf_t* conf); /* wpp.c */ int wpc_init (sdla_t* card, wandev_conf_t* conf); /* Cisco HDLC */ int bsc_init (sdla_t* card, wandev_conf_t* conf); /* BSC streaming */ int hdlc_init(sdla_t* card, wandev_conf_t* conf); /* HDLC support */ int wpft1_init (sdla_t* card, wandev_conf_t* conf); /* FT1 Config support */ int wsppp_init (sdla_t* card, wandev_conf_t* conf); /* Sync PPP on top of RAW CHDLC */ extern sdla_t * wanpipe_find_card(char *); extern sdla_t * wanpipe_find_card_num (int); extern void wanpipe_queue_tq (struct tq_struct *); extern void wanpipe_mark_bh (void); extern void wakeup_sk_bh (netdevice_t *); extern int change_dev_flags (netdevice_t *, unsigned); extern unsigned long get_ip_address (netdevice_t *dev, int option); extern void add_gateway(sdla_t *, netdevice_t *); #endif /* __KERNEL__ */ #endif /* _WANPIPE_H */