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