493 строки
17 KiB
C
493 строки
17 KiB
C
/*****************************************************************************
|
|
* wanpipe.h WANPIPE(tm) Multiprotocol WAN Link Driver.
|
|
* User-level API definitions.
|
|
*
|
|
* Author: Nenad Corbic <ncorbic@sangoma.com>
|
|
* 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 <linux/wanrouter.h>
|
|
|
|
/* 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
|
|
|
|
#ifndef AF_WANPIPE
|
|
#define AF_WANPIPE 25
|
|
#ifndef PF_WANPIPE
|
|
#define PF_WANPIPE AF_WANPIPE
|
|
#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 PACKED;
|
|
unsigned char service_type PACKED;
|
|
unsigned short total_length PACKED;
|
|
unsigned short identifier PACKED;
|
|
unsigned short flags_frag_offset PACKED;
|
|
unsigned char ttl PACKED;
|
|
unsigned char protocol PACKED;
|
|
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] PACKED;
|
|
unsigned char request_reply PACKED;
|
|
unsigned char id PACKED;
|
|
unsigned char reserved[6] PACKED;
|
|
} 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 <linux/sdladrv.h> /* SDLA support module API definitions */
|
|
#include <linux/sdlasfm.h> /* SDLA firmware module definitions */
|
|
#include <linux/workqueue.h>
|
|
#include <linux/serial.h>
|
|
#include <linux/serialP.h>
|
|
#include <linux/serial_reg.h>
|
|
#include <asm/serial.h>
|
|
#include <linux/tty.h>
|
|
#include <linux/tty_driver.h>
|
|
#include <linux/tty_flip.h>
|
|
|
|
|
|
#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 */
|
|
struct wan_device 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 */
|
|
long 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 work_struct tty_work;
|
|
|
|
union
|
|
{
|
|
struct
|
|
{ /****** X.25 specific data **********/
|
|
u32 lo_pvc;
|
|
u32 hi_pvc;
|
|
u32 lo_svc;
|
|
u32 hi_svc;
|
|
struct net_device *svc_to_dev_map[MAX_X25_LCN];
|
|
struct net_device *pvc_to_dev_map[MAX_X25_LCN];
|
|
struct net_device *tx_dev;
|
|
struct net_device *cmd_dev;
|
|
u32 no_dev;
|
|
volatile u8 *hdlc_buf_status;
|
|
u32 tx_interrupts_pending;
|
|
u16 timer_int_enabled;
|
|
struct net_device *poll_device;
|
|
atomic_t command_busy;
|
|
|
|
u16 udp_pkt_lgth;
|
|
u32 udp_type;
|
|
u8 udp_pkt_src;
|
|
u32 udp_lcn;
|
|
struct net_device *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 work_struct x25_poll_work;
|
|
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;
|
|
struct net_device *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;
|
|
struct net_device *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_work (struct work_struct *);
|
|
extern void wanpipe_mark_bh (void);
|
|
extern void wakeup_sk_bh(struct net_device *dev);
|
|
extern int change_dev_flags(struct net_device *dev, unsigned flags);
|
|
extern unsigned long get_ip_address(struct net_device *dev, int option);
|
|
extern void add_gateway(sdla_t *card, struct net_device *dev);
|
|
|
|
|
|
#endif /* __KERNEL__ */
|
|
#endif /* _WANPIPE_H */
|
|
|