^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Layer 2 defines
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright 2008 by Karsten Keil <kkeil@novell.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/mISDNif.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/skbuff.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include "fsm.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #define MAX_WINDOW 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) struct manager {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) struct mISDNchannel ch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) struct mISDNchannel bcast;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) u_long options;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) struct list_head layer2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) rwlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) struct FsmInst deact;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) struct FsmTimer datimer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) struct sk_buff_head sendq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) struct mISDNchannel *up;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) u_int nextid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) u_int lastid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) struct teimgr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) int ri;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) int rcnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) struct FsmInst tei_m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) struct FsmTimer timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) int tval, nval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) struct layer2 *l2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) struct manager *mgr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) struct laddr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) u_char A;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) u_char B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) struct layer2 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) struct mISDNchannel ch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) u_long flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) int id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) struct mISDNchannel *up;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) signed char sapi;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) signed char tei;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) struct laddr addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) u_int maxlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) struct teimgr *tm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) u_int vs, va, vr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) int rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) u_int window;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) u_int sow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) struct FsmInst l2m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) struct FsmTimer t200, t203;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) int T200, N200, T203;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) u_int next_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) u_int down_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) struct sk_buff *windowar[MAX_WINDOW];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) struct sk_buff_head i_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) struct sk_buff_head ui_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) struct sk_buff_head down_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) struct sk_buff_head tmp_queue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) ST_L2_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) ST_L2_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) ST_L2_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) ST_L2_4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) ST_L2_5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) ST_L2_6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) ST_L2_7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) ST_L2_8,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #define L2_STATE_COUNT (ST_L2_8 + 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) extern struct layer2 *create_l2(struct mISDNchannel *, u_int,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) u_long, int, int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) extern int tei_l2(struct layer2 *, u_int, u_long arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) /* from tei.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) extern int l2_tei(struct layer2 *, u_int, u_long arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) extern void TEIrelease(struct layer2 *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) extern int TEIInit(u_int *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) extern void TEIFree(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #define MAX_L2HEADER_LEN 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #define RR 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) #define RNR 0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) #define REJ 0x09
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) #define SABME 0x6f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define SABM 0x2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define DM 0x0f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define UI 0x03
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #define DISC 0x43
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define UA 0x63
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define FRMR 0x87
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define XID 0xaf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define CMD 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define RSP 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #define LC_FLUSH_WAIT 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define FLG_LAPB 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define FLG_LAPD 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define FLG_ORIG 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #define FLG_MOD128 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define FLG_PEND_REL 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #define FLG_L3_INIT 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define FLG_T200_RUN 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #define FLG_ACK_PEND 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #define FLG_REJEXC 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define FLG_OWN_BUSY 9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #define FLG_PEER_BUSY 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #define FLG_DCHAN_BUSY 11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) #define FLG_L1_ACTIV 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #define FLG_ESTAB_PEND 13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) #define FLG_PTP 14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #define FLG_FIXED_TEI 15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) #define FLG_L2BLOCK 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) #define FLG_L1_NOTREADY 17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) #define FLG_LAPD_NET 18