Subversion Repositories shark

Rev

Blame | Last modification | View Log | RSS feed

/*****************************************************************************
* 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 */