mISDN/drivers/isdn/hardware/mISDN/x25_l3.h

282 lines
6.4 KiB
C

/* $Id$
*
* Layer 3 X.25 defines
*
* This file is (c) under GNU PUBLIC LICENSE
*
*/
#ifndef _L3_X25_H
#define _L3_X25_H
#include "m_capi.h"
typedef struct _x25_l3 x25_l3_t;
typedef struct _x25_channel x25_channel_t;
typedef struct _x25_B3_cfg x25_B3_cfg_t;
typedef struct _x25_ncpi x25_ncpi_t;
typedef struct _x25_ConfQueue x25_ConfQueue_t;
#define DEBUG_L3X25_WARN 0x0001
#define DEBUG_L3X25_MGR 0x1000
struct _x25_B3_cfg {
__u16 LIC;
__u16 HIC;
__u16 LTC;
__u16 HTC;
__u16 LOC;
__u16 HOC;
__u16 modulo;
__u16 winsize;
};
#define DEFAULT_X25_B3_CFG {0, 0, 1, 1, 0, 0, 8, 2}
struct _x25_ncpi {
__u8 len;
__u8 Flags;
__u8 Group;
__u8 Channel;
__u8 Contens[4]; /* Note this can be less/more bytes in use */
} __attribute__((packed));
struct _x25_ConfQueue {
__u32 PktId;
__u16 DataHandle;
__u16 MsgId;
struct sk_buff *skb;
};
struct _x25_l3 {
struct list_head list;
mISDNinstance_t inst;
struct list_head channellist;
struct FsmInst l2l3m;
struct FsmInst x25r;
struct FsmTimer TR;
int TRval;
int TRrep;
int entity;
int next_id;
struct sk_buff_head downq;
int down_headerlen;
int up_headerlen;
int maxdatalen;
x25_B3_cfg_t B3cfg;
u_long state;
u_int debug;
u_char cause[2];
};
struct _x25_channel {
struct list_head list;
x25_l3_t *l3;
struct FsmInst x25p;
struct FsmInst x25d;
struct FsmTimer TP;
int TPval;
int TPrep;
struct FsmTimer TD;
int TDval;
int TDrep;
__u32 ncci;
u_char *ncpi_data;
u_int ncpi_len;
u_long state;
u_int debug;
u_int pr;
u_int ps;
u_int rps;
u_int lwin;
u_int rwin;
u_int datasize;
struct sk_buff_head dataq;
x25_ConfQueue_t *confq;
u_int recv_handles[CAPI_MAXDATAWINDOW];
__u16 lchan;
u_char cause[2];
};
#define X25_CHANNEL_INCOMING 1
#define X25_CHANNEL_OUTGOING 2
#define X25_STATE_ORGINATE 0
#define X25_STATE_DCE 1
#define X25_STATE_DTEDTE 2
#define X25_STATE_PERMANENT 3
#define X25_STATE_MOD128 4
#define X25_STATE_MOD32768 5
#define X25_STATE_ABIT 6
#define X25_STATE_DBIT 7
#define X25_STATE_ESTABLISH 16
#define X25_STATE_DXE_INTSENT 17
#define X25_STATE_DTE_INTSENT 18
#define X25_STATE_DXE_RNR 19
#define X25_STATE_DTE_RNR 20
#define X25_MINSIZE 8
#define X25_GFI_ABIT 0x80
#define X25_GFI_DBIT 0x40
#define X25_GFI_QBIT 0x80
#define X25_MBIT 0x01
#define X25_MBIT_MOD8 0x10
#define CAPI_FLAG_QUALIFIER 0x01
#define CAPI_FLAG_MOREDATA 0x02
#define CAPI_FLAG_DELIVERCONF 0x04
#define CAPI_FLAG_EXPEDITED 0x08
#define X25_PTYPE_CALL 0x0b
#define X25_PTYPE_CALL_CNF 0x0f
#define X25_PTYPE_CLEAR 0x13
#define X25_PTYPE_CLEAR_CNF 0x17
#define X25_PTYPE_INTERRUPT 0x23
#define X25_PTYPE_INTERRUPT_CNF 0x27
#define X25_PTYPE_DATA 0x00
#define X25_PTYPE_RR 0x01
#define X25_PTYPE_RNR 0x05
#define X25_PTYPE_REJ 0x09
#define X25_PTYPE_RESET 0x1f
#define X25_PTYPE_RESET_CNF 0x1b
#define X25_PTYPE_RESTART 0xfb
#define X25_PTYPE_RESTART_CNF 0xff
#define X25_PTYPE_REGISTER 0xf3
#define X25_PTYPE_REGISTER_CNF 0xf7
#define X25_PTYPE_DIAGNOSTIC 0xf1
#define X25_PTYPE_NOTYPE 0x7F
#define T10_VALUE 60000
#define T11_VALUE 180000
#define T12_VALUE 60000
#define T13_VALUE 60000
#define T20_VALUE 180000
#define T21_VALUE 200000
#define T22_VALUE 180000
#define T23_VALUE 180000
#define T24_VALUE 60000
#define T25_VALUE 200000
#define T26_VALUE 180000
#define T27_VALUE 60000
#define T28_VALUE 300000
#define R20_VALUE 1
#define R22_VALUE 1
#define R23_VALUE 1
#define R25_VALUE 0
#define R27_VALUE 0
#define R28_VALUE 1
#define X25_ERRCODE_DISCARD 0x0100
/* LinkLayer (L2) maintained by L3 statemachine */
enum {
EV_L3_ESTABLISH_REQ,
EV_LL_ESTABLISH_IND,
EV_LL_ESTABLISH_CNF,
EV_L3_RELEASE_REQ,
EV_LL_RELEASE_CNF,
EV_LL_RELEASE_IND,
};
#define LL_EVENT_COUNT (EV_LL_RELEASE_IND+1)
/* X.25 Restart state machine */
enum {
ST_R0,
ST_R1,
ST_R2,
ST_R3,
};
#define R_STATE_COUNT (ST_R3+1)
extern char *X25strRState[];
enum {
EV_LL_READY,
EV_L3_RESTART_REQ,
EV_L2_RESTART,
EV_L2_RESTART_CNF,
EV_L3_RESTART_TOUT,
};
#define R_EVENT_COUNT (EV_L3_RESTART_TOUT+1)
extern char *X25strREvent[];
/* X.25 connection state machine */
enum {
ST_P0,
ST_P1,
ST_P2,
ST_P3,
ST_P4,
ST_P5,
ST_P6,
ST_P7,
};
#define P_STATE_COUNT (ST_P7+1)
extern char *X25strPState[];
enum {
EV_L3_READY,
EV_L3_OUTGOING_CALL,
EV_L2_INCOMING_CALL,
EV_L2_CALL_CNF,
EV_L3_CALL_ACCEPT,
EV_L3_CLEARING,
EV_L2_CLEAR,
EV_L2_CLEAR_CNF,
EV_L2_INVALPKT,
EV_L3_CALL_TOUT,
EV_L3_CLEAR_TOUT,
};
#define P_EVENT_COUNT (EV_L3_CLEAR_TOUT+1)
extern char *X25strPEvent[];
/* X.25 Flowcontrol state machine */
enum {
ST_D0,
ST_D1,
ST_D2,
ST_D3,
};
#define D_STATE_COUNT (ST_D3+1)
extern char *X25strDState[];
enum {
EV_L3_CONNECT,
EV_L3_RESETING,
EV_L2_RESET,
EV_L2_RESET_CNF,
EV_L3_RESET_TOUT,
};
#define D_EVENT_COUNT (EV_L3_RESET_TOUT+1)
extern char *X25strDEvent[];
extern x25_channel_t *X25_get_channel(x25_l3_t *, __u16);
extern x25_channel_t *X25_get_channel4NCCI(x25_l3_t *, __u32);
extern int X25_reset_channel(x25_channel_t *, struct sk_buff *);
extern int X25_restart(x25_l3_t *);
extern int X25_get_header(x25_l3_t *, struct sk_buff *, u_char *, __u16 *, u_char *);
extern void X25_release_channel(x25_channel_t *);
extern void X25_release_l3(x25_l3_t *);
extern int X25_realloc_ncpi_data(x25_channel_t *, int, u_char *);
extern int new_x25_channel(x25_l3_t *, x25_channel_t **, __u16, int, u_char *);
extern int new_x25_l3(x25_l3_t **, mISDNstack_t *, mISDN_pid_t *, mISDNobject_t *, int, if_func_t *);
extern int X25_next_id(x25_l3_t *);
extern int X25_add_header(x25_channel_t *, x25_l3_t *, u_char , u_char *, u_char);
extern int X25sendL3frame(x25_channel_t *, x25_l3_t *, u_char, int, void *);
extern int X25sendL4frame(x25_channel_t *, x25_l3_t *, int, int, int, void *);
extern int X25sendL4skb(x25_channel_t *, x25_l3_t *, __u32, int, int, struct sk_buff *);
extern void X25_send_diagnostic(x25_l3_t *, struct sk_buff *, int, int);
extern int X25_l3down(x25_l3_t *, u_int, u_int, struct sk_buff *);
extern int X25_l3_init(void);
extern void X25_l3_cleanup(void);
extern int X25_get_and_test_pr(x25_channel_t *, u_char, struct sk_buff *);
extern int X25_get_and_test_ps(x25_channel_t *, u_char, struct sk_buff *);
extern int X25_cansend(x25_channel_t *);
extern __u16 x25_data_b3_req(x25_channel_t *, int, struct sk_buff *);
extern int x25_data_b3_resp(x25_channel_t *, int, struct sk_buff *);
extern int X25_invoke_sending(x25_channel_t *);
extern int X25_receive_data(x25_channel_t *, int, int, struct sk_buff *);
#endif