1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _LAPB_H 3*4882a593Smuzhiyun #define _LAPB_H 4*4882a593Smuzhiyun #include <linux/lapb.h> 5*4882a593Smuzhiyun #include <linux/refcount.h> 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #define LAPB_HEADER_LEN 20 /* LAPB over Ethernet + a bit more */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #define LAPB_ACK_PENDING_CONDITION 0x01 10*4882a593Smuzhiyun #define LAPB_REJECT_CONDITION 0x02 11*4882a593Smuzhiyun #define LAPB_PEER_RX_BUSY_CONDITION 0x04 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /* Control field templates */ 14*4882a593Smuzhiyun #define LAPB_I 0x00 /* Information frames */ 15*4882a593Smuzhiyun #define LAPB_S 0x01 /* Supervisory frames */ 16*4882a593Smuzhiyun #define LAPB_U 0x03 /* Unnumbered frames */ 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #define LAPB_RR 0x01 /* Receiver ready */ 19*4882a593Smuzhiyun #define LAPB_RNR 0x05 /* Receiver not ready */ 20*4882a593Smuzhiyun #define LAPB_REJ 0x09 /* Reject */ 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #define LAPB_SABM 0x2F /* Set Asynchronous Balanced Mode */ 23*4882a593Smuzhiyun #define LAPB_SABME 0x6F /* Set Asynchronous Balanced Mode Extended */ 24*4882a593Smuzhiyun #define LAPB_DISC 0x43 /* Disconnect */ 25*4882a593Smuzhiyun #define LAPB_DM 0x0F /* Disconnected mode */ 26*4882a593Smuzhiyun #define LAPB_UA 0x63 /* Unnumbered acknowledge */ 27*4882a593Smuzhiyun #define LAPB_FRMR 0x87 /* Frame reject */ 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun #define LAPB_ILLEGAL 0x100 /* Impossible to be a real frame type */ 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun #define LAPB_SPF 0x10 /* Poll/final bit for standard LAPB */ 32*4882a593Smuzhiyun #define LAPB_EPF 0x01 /* Poll/final bit for extended LAPB */ 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun #define LAPB_FRMR_W 0x01 /* Control field invalid */ 35*4882a593Smuzhiyun #define LAPB_FRMR_X 0x02 /* I field invalid */ 36*4882a593Smuzhiyun #define LAPB_FRMR_Y 0x04 /* I field too long */ 37*4882a593Smuzhiyun #define LAPB_FRMR_Z 0x08 /* Invalid N(R) */ 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun #define LAPB_POLLOFF 0 40*4882a593Smuzhiyun #define LAPB_POLLON 1 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun /* LAPB C-bit */ 43*4882a593Smuzhiyun #define LAPB_COMMAND 1 44*4882a593Smuzhiyun #define LAPB_RESPONSE 2 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun #define LAPB_ADDR_A 0x03 47*4882a593Smuzhiyun #define LAPB_ADDR_B 0x01 48*4882a593Smuzhiyun #define LAPB_ADDR_C 0x0F 49*4882a593Smuzhiyun #define LAPB_ADDR_D 0x07 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun /* Define Link State constants. */ 52*4882a593Smuzhiyun enum { 53*4882a593Smuzhiyun LAPB_STATE_0, /* Disconnected State */ 54*4882a593Smuzhiyun LAPB_STATE_1, /* Awaiting Connection State */ 55*4882a593Smuzhiyun LAPB_STATE_2, /* Awaiting Disconnection State */ 56*4882a593Smuzhiyun LAPB_STATE_3, /* Data Transfer State */ 57*4882a593Smuzhiyun LAPB_STATE_4 /* Frame Reject State */ 58*4882a593Smuzhiyun }; 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun #define LAPB_DEFAULT_MODE (LAPB_STANDARD | LAPB_SLP | LAPB_DTE) 61*4882a593Smuzhiyun #define LAPB_DEFAULT_WINDOW 7 /* Window=7 */ 62*4882a593Smuzhiyun #define LAPB_DEFAULT_T1 (5 * HZ) /* T1=5s */ 63*4882a593Smuzhiyun #define LAPB_DEFAULT_T2 (1 * HZ) /* T2=1s */ 64*4882a593Smuzhiyun #define LAPB_DEFAULT_N2 20 /* N2=20 */ 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun #define LAPB_SMODULUS 8 67*4882a593Smuzhiyun #define LAPB_EMODULUS 128 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun /* 70*4882a593Smuzhiyun * Information about the current frame. 71*4882a593Smuzhiyun */ 72*4882a593Smuzhiyun struct lapb_frame { 73*4882a593Smuzhiyun unsigned short type; /* Parsed type */ 74*4882a593Smuzhiyun unsigned short nr, ns; /* N(R), N(S) */ 75*4882a593Smuzhiyun unsigned char cr; /* Command/Response */ 76*4882a593Smuzhiyun unsigned char pf; /* Poll/Final */ 77*4882a593Smuzhiyun unsigned char control[2]; /* Original control data*/ 78*4882a593Smuzhiyun }; 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun /* 81*4882a593Smuzhiyun * The per LAPB connection control structure. 82*4882a593Smuzhiyun */ 83*4882a593Smuzhiyun struct lapb_cb { 84*4882a593Smuzhiyun struct list_head node; 85*4882a593Smuzhiyun struct net_device *dev; 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun /* Link status fields */ 88*4882a593Smuzhiyun unsigned int mode; 89*4882a593Smuzhiyun unsigned char state; 90*4882a593Smuzhiyun unsigned short vs, vr, va; 91*4882a593Smuzhiyun unsigned char condition; 92*4882a593Smuzhiyun unsigned short n2, n2count; 93*4882a593Smuzhiyun unsigned short t1, t2; 94*4882a593Smuzhiyun struct timer_list t1timer, t2timer; 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun /* Internal control information */ 97*4882a593Smuzhiyun struct sk_buff_head write_queue; 98*4882a593Smuzhiyun struct sk_buff_head ack_queue; 99*4882a593Smuzhiyun unsigned char window; 100*4882a593Smuzhiyun const struct lapb_register_struct *callbacks; 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun /* FRMR control information */ 103*4882a593Smuzhiyun struct lapb_frame frmr_data; 104*4882a593Smuzhiyun unsigned char frmr_type; 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun refcount_t refcnt; 107*4882a593Smuzhiyun }; 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun /* lapb_iface.c */ 110*4882a593Smuzhiyun void lapb_connect_confirmation(struct lapb_cb *lapb, int); 111*4882a593Smuzhiyun void lapb_connect_indication(struct lapb_cb *lapb, int); 112*4882a593Smuzhiyun void lapb_disconnect_confirmation(struct lapb_cb *lapb, int); 113*4882a593Smuzhiyun void lapb_disconnect_indication(struct lapb_cb *lapb, int); 114*4882a593Smuzhiyun int lapb_data_indication(struct lapb_cb *lapb, struct sk_buff *); 115*4882a593Smuzhiyun int lapb_data_transmit(struct lapb_cb *lapb, struct sk_buff *); 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun /* lapb_in.c */ 118*4882a593Smuzhiyun void lapb_data_input(struct lapb_cb *lapb, struct sk_buff *); 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun /* lapb_out.c */ 121*4882a593Smuzhiyun void lapb_kick(struct lapb_cb *lapb); 122*4882a593Smuzhiyun void lapb_transmit_buffer(struct lapb_cb *lapb, struct sk_buff *, int); 123*4882a593Smuzhiyun void lapb_establish_data_link(struct lapb_cb *lapb); 124*4882a593Smuzhiyun void lapb_enquiry_response(struct lapb_cb *lapb); 125*4882a593Smuzhiyun void lapb_timeout_response(struct lapb_cb *lapb); 126*4882a593Smuzhiyun void lapb_check_iframes_acked(struct lapb_cb *lapb, unsigned short); 127*4882a593Smuzhiyun void lapb_check_need_response(struct lapb_cb *lapb, int, int); 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun /* lapb_subr.c */ 130*4882a593Smuzhiyun void lapb_clear_queues(struct lapb_cb *lapb); 131*4882a593Smuzhiyun void lapb_frames_acked(struct lapb_cb *lapb, unsigned short); 132*4882a593Smuzhiyun void lapb_requeue_frames(struct lapb_cb *lapb); 133*4882a593Smuzhiyun int lapb_validate_nr(struct lapb_cb *lapb, unsigned short); 134*4882a593Smuzhiyun int lapb_decode(struct lapb_cb *lapb, struct sk_buff *, struct lapb_frame *); 135*4882a593Smuzhiyun void lapb_send_control(struct lapb_cb *lapb, int, int, int); 136*4882a593Smuzhiyun void lapb_transmit_frmr(struct lapb_cb *lapb); 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun /* lapb_timer.c */ 139*4882a593Smuzhiyun void lapb_start_t1timer(struct lapb_cb *lapb); 140*4882a593Smuzhiyun void lapb_start_t2timer(struct lapb_cb *lapb); 141*4882a593Smuzhiyun void lapb_stop_t1timer(struct lapb_cb *lapb); 142*4882a593Smuzhiyun void lapb_stop_t2timer(struct lapb_cb *lapb); 143*4882a593Smuzhiyun int lapb_t1timer_running(struct lapb_cb *lapb); 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun /* 146*4882a593Smuzhiyun * Debug levels. 147*4882a593Smuzhiyun * 0 = Off 148*4882a593Smuzhiyun * 1 = State Changes 149*4882a593Smuzhiyun * 2 = Packets I/O and State Changes 150*4882a593Smuzhiyun * 3 = Hex dumps, Packets I/O and State Changes. 151*4882a593Smuzhiyun */ 152*4882a593Smuzhiyun #define LAPB_DEBUG 0 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun #define lapb_dbg(level, fmt, ...) \ 155*4882a593Smuzhiyun do { \ 156*4882a593Smuzhiyun if (level < LAPB_DEBUG) \ 157*4882a593Smuzhiyun pr_debug(fmt, ##__VA_ARGS__); \ 158*4882a593Smuzhiyun } while (0) 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun #endif 161