282 lines
6.4 KiB
C
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
|