439 lines
11 KiB
C
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
|