wanpipe/patches/kdrivers/include/if_wanpipe.h

439 lines
11 KiB
C

/*****************************************************************************
* if_wanpipe.h Header file for the Sangoma AF_WANPIPE Socket
*
* Author: Nenad Corbic
*
* Copyright: (c) 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.
* ============================================================================
*
* Jan 28, 2000 Nenad Corbic Initial Version
*
*****************************************************************************/
#ifndef __LINUX_IF_WAN_PACKET_H
#define __LINUX_IF_WAN_PACKET_H
#include <linux/sockios.h>
struct wan_sockaddr_ll
{
unsigned short sll_family;
unsigned short sll_protocol;
int sll_ifindex;
unsigned short sll_hatype;
unsigned char sll_pkttype;
unsigned char sll_halen;
unsigned char sll_addr[8];
unsigned char sll_device[14];
unsigned char sll_card[14];
unsigned int sll_active_ch;
unsigned char sll_prot;
unsigned char sll_prot_opt;
unsigned short sll_mult_cnt;
unsigned char sll_seven_bit_hdlc;
};
typedef struct wan_debug_hdr{
unsigned char free;
unsigned char wp_sk_state;
int rcvbuf;
int sndbuf;
int rmem;
int wmem;
int sk_count;
unsigned char bound;
char name[14];
unsigned char d_state;
unsigned char svc;
unsigned short lcn;
unsigned char mbox;
unsigned char cmd_busy;
unsigned char command;
unsigned poll;
unsigned poll_cnt;
int rblock;
} wan_debug_hdr_t;
#pragma pack(1)
typedef struct {
unsigned char error_flag;
unsigned short time_stamp;
unsigned char channel;
unsigned char direction;
unsigned char reserved[11];
} wp_sock_rx_hdr_t;
typedef struct {
wp_sock_rx_hdr_t api_rx_hdr;
unsigned char data[1];
} wp_sock_rx_element_t;
#pragma pack()
#define MAX_NUM_DEBUG 10
#define LAPB_PROT 0x15
#define WP_LAPB_PROT LAPB_PROT
#define X25_PROT 0x16
#define WP_X25_PROT X25_PROT
#define PVC_PROT 0x17
#define WP_PVC_PROT PVC_PROT
#define SS7_PROT 0x18
#define WP_SS7_PROT SS7_PROT
#define SS7_MONITOR_PROT 0x19
#define WP_SS7_MONITOR_PROT SS7_MONITOR_PROT
#define DSP_PROT 0x20
#define WP_DSP_PROT DSP_PROT
#define SS7_FISU 0x01
#define SS7_LSSU 0x02
#define SS7_MSU 0x04
#define RAW_HDLC 0x08
#define SS7_ALL_PROT (SS7_MSU|SS7_LSSU|SS7_FISU)
#define SS7_FISU_BIT_MAP 0
#define SS7_LSSU_BIT_MAP 1
#define SS7_MSU_BIT_MAP 2
#define HDLC_BIT_MAP 3
#define SS7_FISU_LEN 5
#define SS7_MSU_LEN 8
#define SS7_MSU_END_LEN 278
#define DECODE_SS7_PROT(a) ((a==SS7_MSU)?"SS7 MSU":\
(a==SS7_LSSU)?"SS7 LSSU":\
(a==SS7_FISU)?"SS7 FISU":\
(a==RAW_HDLC)?"RAW HDLC":\
(a==(SS7_MSU|SS7_LSSU))?"SS7 MSU LSSU":\
(a==(SS7_MSU|SS7_FISU))?"SS7 MSU FISU":\
(a==(SS7_LSSU|SS7_FISU))?"SS7 LSSU FISU":\
(a==(SS7_LSSU|SS7_FISU|SS7_MSU))?"SS7 MSU LSSU FISU":\
"Unknown SS7 Prot")
#define DELTA_PROT_OPT 1
#define MULTI_PROT_OPT 2
typedef struct
{
wan_debug_hdr_t debug[MAX_NUM_DEBUG];
}wan_debug_t;
#if 0
#define SIOC_WANPIPE_GET_CALL_DATA (SIOCPROTOPRIVATE + 0)
#define SIOC_WANPIPE_SET_CALL_DATA (SIOCPROTOPRIVATE + 1)
#define SIOC_WANPIPE_ACCEPT_CALL (SIOCPROTOPRIVATE + 2)
#define SIOC_WANPIPE_CLEAR_CALL (SIOCPROTOPRIVATE + 3)
#define SIOC_WANPIPE_RESET_CALL (SIOCPROTOPRIVATE + 4)
#endif
enum {
SIOC_WANPIPE_DEBUG = (SIOCPROTOPRIVATE),
SIOC_WANPIPE_SET_NONBLOCK,
SIOC_WANPIPE_CHECK_TX,
SIOC_WANPIPE_SOCK_STATE,
SIOC_WANPIPE_SOCK_FLUSH_BUFS
};
#define SIOC_ANNEXG_SOCK_STATE SIOC_WANPIPE_SOCK_STATE
enum {
SIOCC_IF_WANPIPE_RESERVED = (SIOCDEVPRIVATE),
SIOC_WANPIPE_PIPEMON,
SIOC_WANPIPE_SNMP,
SIOC_WANPIPE_SNMP_IFSPEED,
#if 0
SIOC_WANPIPE_DEVICE, /* GENERIC */
SIOC_WANPIPE_DUMP, /* GENERIC */
#endif
SIOC_WAN_DEVEL_IOCTL, /* uses wan_cmd_api_t */
SIOC_WAN_EC_IOCTL,
SIOC_WAN_FE_IOCTL,
SIOC_WANAPI_DEVPRIVATE = SIOCDEVPRIVATE + 20,
SIOC_ANNEXG_SET_NONBLOCK,
SIOC_ANNEXG_CHECK_TX,
SIOC_ANNEXG_DEV_STATE,
SIOC_ANNEXG_BIND_SK,
SIOC_ANNEXG_UNBIND_SK,
SIOC_ANNEXG_GET_SK,
SIOC_ANNEXG_KICK,
SIOC_ANNEXG_PLACE_CALL,
SIOC_ANNEXG_CLEAR_CALL,
SIOC_WANPIPE_GET_TIME_SLOTS,
SIOC_WANPIPE_GET_MEDIA_TYPE,
SIOC_WANPIPE_GET_DEVICE_CONFIG_ID,
SIOC_WANPIPE_TDM_API,
SIOC_WANPIPE_DEVPRIVATE
};
#define WAN_DEVPRIV_SIOC(_val) (SIOC_WANPIPE_DEVPRIVATE+(_val))
#define SIOC_WANPIPE_BIND_SK SIOC_ANNEXG_BIND_SK
#define SIOC_WANPIPE_UNBIND_SK SIOC_ANNEXG_UNBIND_SK
#define SIOC_WANPIPE_GET_SK SIOC_ANNEXG_GET_SK
#define SIOC_WANPIPE_KICK SIOC_ANNEXG_KICK
#define SIOC_WANPIPE_DEV_STATE SIOC_ANNEXG_DEV_STATE
#define DECODE_API_CMD(cmd) ((cmd==SIOC_WANPIPE_PIPEMON)?"PIPEMON" : \
(cmd==SIOC_WANPIPE_SNMP)?"SNMP": \
(cmd==SIOC_ANNEXG_CHECK_TX)?"CHECK TX": \
(cmd==SIOC_ANNEXG_SOCK_STATE)?"SOCK STATE": \
(cmd==SIOC_ANNEXG_BIND_SK)?"BIND SK" : \
(cmd==SIOC_ANNEXG_UNBIND_SK)?"UNBIND SK" : \
(cmd==SIOC_ANNEXG_GET_SK)?"GET SK" : \
(cmd==SIOC_ANNEXG_DEV_STATE)?"DEV STATE" : \
(cmd==SIOC_ANNEXG_KICK)? "KICK" : "UNKNOWN")
#define SIOC_WANPIPE_BSC_CMD SIOC_WANPIPE_EXEC_CMD
#define SIOC_WANPIPE_POS_CMD SIOC_WANPIPE_EXEC_CMD
/* Packet types */
#define WAN_PACKET_HOST 0 /* To us */
#define WAN_PACKET_BROADCAST 1 /* To all */
#define WAN_PACKET_MULTICAST 2 /* To group */
#define WAN_PACKET_OTHERHOST 3 /* To someone else */
#define WAN_PACKET_OUTGOING 4 /* Outgoing of any type */
/* These ones are invisible by user level */
#define WAN_PACKET_LOOPBACK 5 /* MC/BRD frame looped back */
#define WAN_PACKET_FASTROUTE 6 /* Fastrouted frame */
/* AF Socket specific */
#define WAN_PACKET_DATA 0
#define WAN_PACKET_CMD 1
#define WAN_PACKET_ERR 2
/* Packet socket options */
#define WAN_PACKET_ADD_MEMBERSHIP 1
#define WAN_PACKET_DROP_MEMBERSHIP 2
#define WAN_PACKET_MR_MULTICAST 0
#define WAN_PACKET_MR_PROMISC 1
#define WAN_PACKET_MR_ALLMULTI 2
#ifdef __KERNEL__
#include <linux/wanpipe_kernel.h>
#define MAX_PARENT_PROT_NUM 10
/* Private wanpipe socket structures. */
#if 0
struct wanpipe_opt
{
void *mbox; /* Mail box */
void *card; /* Card bouded to */
netdevice_t *dev; /* Bounded device */
unsigned short lcn; /* Binded LCN */
unsigned char svc; /* 0=pvc, 1=svc */
unsigned char timer; /* flag for delayed transmit*/
struct timer_list tx_timer;
unsigned poll_cnt;
unsigned char force; /* Used to force sock release */
atomic_t packet_sent;
void *datascope;
};
#else
struct wanpipe_opt
{
netdevice_t *dev; /* Bounded device */
void *datascope;
unsigned short num;
};
#endif
#define MAX_SOCK_CRC_QUEUE 3
#define MAX_SOCK_HDLC_BUF 2000
#define MAX_SOCK_HDLC_LIMIT MAX_SOCK_HDLC_BUF-500
typedef struct wanpipe_hdlc_decoder{
unsigned char rx_decode_buf[MAX_SOCK_HDLC_BUF];
unsigned int rx_decode_len;
unsigned char rx_decode_bit_cnt;
unsigned char rx_decode_onecnt;
unsigned long hdlc_flag;
unsigned short rx_orig_crc;
unsigned short rx_crc[MAX_SOCK_CRC_QUEUE];
unsigned short crc_fin;
unsigned short rx_crc_tmp;
int crc_cur;
int crc_prv;
}wanpipe_hdlc_decoder_t;
typedef struct wanpipe_hdlc_engine
{
wanpipe_hdlc_decoder_t tx_decoder;
wanpipe_hdlc_decoder_t rx_decoder;
struct sk_buff *raw_rx_skb;
struct sk_buff *raw_tx_skb;
struct sk_buff_head data_q;
atomic_t refcnt;
unsigned char bound;
unsigned long active_ch;
unsigned short timeslots;
struct wanpipe_hdlc_engine *next;
int skb_decode_size;
unsigned char seven_bit_hdlc;
void *sk_to_prot_map[MAX_PARENT_PROT_NUM];
}wanpipe_hdlc_engine_t;
typedef struct hdlc_list
{
wanpipe_hdlc_engine_t *hdlc;
struct hdlc_list *next;
}wanpipe_hdlc_list_t;
#define MAX_SOCK_CHANNELS 33
typedef struct wanpipe_parent
{
wanpipe_hdlc_list_t *time_slot_hdlc_map[MAX_SOCK_CHANNELS];
wanpipe_hdlc_engine_t *hdlc_eng_list;
unsigned char hdlc_enabled;
rwlock_t lock;
signed char time_slots;
char media;
unsigned char seven_bit_hdlc;
struct tasklet_struct rx_task;
struct sk_buff_head rx_queue;
void *sk_to_prot_map[MAX_PARENT_PROT_NUM];
}wanpipe_parent_t;
typedef struct wanpipe_datascope
{
unsigned long prot_type;
unsigned int active_ch;
struct sock *parent_sk;
unsigned char delta;
unsigned short max_mult_cnt;
union {
struct {
unsigned short tx_fisu_skb_csum;
unsigned short tx_lssu_skb_csum;
void *tx_fisu_skb;
void *tx_lssu_skb;
unsigned short rx_fisu_skb_csum;
unsigned short rx_lssu_skb_csum;
void *rx_fisu_skb;
void *rx_lssu_skb;
}ss7;
}u;
unsigned char parent;
wanpipe_hdlc_engine_t *hdlc_eng;
wanpipe_parent_t *parent_priv;
}wanpipe_datascope_t;
#define STACK_IF_REQ 0x04
#define WANPIPE_HEADER_SZ 16
#ifdef LINUX_2_6
#define SK_PRIV(x) ((struct wanpipe_opt*)(x->sk_user_data))
#define SK_PRIV_INIT(x,val) (x)->sk_user_data=(void*)(val)
#else
#define SK_PRIV(x) ((struct wanpipe_opt*)(x->user_data))
#define SK_PRIV_INIT(x,val) (x)->user_data=(void*)(val)
#endif
#define DATA_SC(x) ((wanpipe_datascope_t*)(SK_PRIV(x)->datascope))
#define DATA_SC_INIT(x,val) (SK_PRIV(x)->datascope = (void*)(val))
#define PPRIV(x) ((wanpipe_parent_t*)(DATA_SC(x)->parent_priv))
#define PPRIV_INIT(x,val) (DATA_SC(x)->parent_priv = (void*)(val))
#define wp_dev_hold(dev) atomic_inc(&(dev)->refcnt)
#define wp_dev_put(dev) if (atomic_dec_and_test(&dev->refcnt)){ \
DEBUG_TEST("%s: %d: Freeing ptr %p\n",__FUNCTION__,__LINE__,dev);\
wan_free(dev); \
}
#define wp_sock_hold(sk) atomic_inc(&(sk)->sk_refcnt)
#define wp_sock_put(sk) atomic_dec_and_test(&(sk)->sk_refcnt)
struct wanpipe_api_register_struct
{
unsigned char init;
int (*wanpipe_api_sock_rcv)(struct sk_buff *skb, netdevice_t *dev, struct sock *sk);
int (*wanpipe_api_connected)(struct net_device *dev, struct sock *sk);
int (*wanpipe_api_disconnected)(struct sock *sk);
int (*wanpipe_listen_rcv) (struct sk_buff *skb, struct sock *sk);
int (*sk_buf_check) (struct sock *sk, int len);
int (*sk_poll_wake) (struct sock *sk);
int (*wanpipe_api_connecting)(struct net_device *dev, struct sock *sk);
};
extern int register_wanpipe_api_socket (struct wanpipe_api_register_struct *wan_api_reg);
extern void unregister_wanpipe_api_socket (void);
extern int bind_api_to_protocol (netdevice_t *dev, char *, unsigned short protocol, void *sk);
extern int bind_api_listen_to_protocol (netdevice_t *dev, char *,unsigned short protocol, void *sk_id);
extern int unbind_api_listen_from_protocol (unsigned short protocol, void *sk_id);
extern int wanpipe_lip_rx(void *chan, void *sk_id);
extern int wanpipe_lip_connect(void *chan, int );
extern int wanpipe_lip_disconnect(void *chan, int);
extern int wanpipe_lip_kick(void *chan,int);
extern int wanpipe_lip_get_if_status(void *chan, void *m);
extern int protocol_connected (netdevice_t *dev, void *sk_id);
extern int protocol_connecting (netdevice_t *dev, void *sk_id);
extern int protocol_disconnected (void *sk_id);
extern int wanpipe_api_sock_rx (struct sk_buff *skb, netdevice_t *dev, void *sk_id);
extern int wanpipe_api_listen_rx (struct sk_buff *skb, void *sk_id);
extern int wanpipe_api_buf_check (void *sk_id, int len);
extern int wanpipe_api_poll_wake(void *sk_id);
extern void signal_user_state_change(void);
#endif
#endif