18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef _LAPB_H
38c2ecf20Sopenharmony_ci#define _LAPB_H
48c2ecf20Sopenharmony_ci#include <linux/lapb.h>
58c2ecf20Sopenharmony_ci#include <linux/refcount.h>
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#define	LAPB_HEADER_LEN	20		/* LAPB over Ethernet + a bit more */
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#define	LAPB_ACK_PENDING_CONDITION	0x01
108c2ecf20Sopenharmony_ci#define	LAPB_REJECT_CONDITION		0x02
118c2ecf20Sopenharmony_ci#define	LAPB_PEER_RX_BUSY_CONDITION	0x04
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci/* Control field templates */
148c2ecf20Sopenharmony_ci#define	LAPB_I		0x00	/* Information frames */
158c2ecf20Sopenharmony_ci#define	LAPB_S		0x01	/* Supervisory frames */
168c2ecf20Sopenharmony_ci#define	LAPB_U		0x03	/* Unnumbered frames */
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci#define	LAPB_RR		0x01	/* Receiver ready */
198c2ecf20Sopenharmony_ci#define	LAPB_RNR	0x05	/* Receiver not ready */
208c2ecf20Sopenharmony_ci#define	LAPB_REJ	0x09	/* Reject */
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci#define	LAPB_SABM	0x2F	/* Set Asynchronous Balanced Mode */
238c2ecf20Sopenharmony_ci#define	LAPB_SABME	0x6F	/* Set Asynchronous Balanced Mode Extended */
248c2ecf20Sopenharmony_ci#define	LAPB_DISC	0x43	/* Disconnect */
258c2ecf20Sopenharmony_ci#define	LAPB_DM		0x0F	/* Disconnected mode */
268c2ecf20Sopenharmony_ci#define	LAPB_UA		0x63	/* Unnumbered acknowledge */
278c2ecf20Sopenharmony_ci#define	LAPB_FRMR	0x87	/* Frame reject */
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci#define LAPB_ILLEGAL	0x100	/* Impossible to be a real frame type */
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci#define	LAPB_SPF	0x10	/* Poll/final bit for standard LAPB */
328c2ecf20Sopenharmony_ci#define	LAPB_EPF	0x01	/* Poll/final bit for extended LAPB */
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci#define	LAPB_FRMR_W	0x01	/* Control field invalid	*/
358c2ecf20Sopenharmony_ci#define	LAPB_FRMR_X	0x02	/* I field invalid		*/
368c2ecf20Sopenharmony_ci#define	LAPB_FRMR_Y	0x04	/* I field too long		*/
378c2ecf20Sopenharmony_ci#define	LAPB_FRMR_Z	0x08	/* Invalid N(R)			*/
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci#define	LAPB_POLLOFF	0
408c2ecf20Sopenharmony_ci#define	LAPB_POLLON	1
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci/* LAPB C-bit */
438c2ecf20Sopenharmony_ci#define LAPB_COMMAND	1
448c2ecf20Sopenharmony_ci#define LAPB_RESPONSE	2
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci#define	LAPB_ADDR_A	0x03
478c2ecf20Sopenharmony_ci#define	LAPB_ADDR_B	0x01
488c2ecf20Sopenharmony_ci#define	LAPB_ADDR_C	0x0F
498c2ecf20Sopenharmony_ci#define	LAPB_ADDR_D	0x07
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci/* Define Link State constants. */
528c2ecf20Sopenharmony_cienum {
538c2ecf20Sopenharmony_ci	LAPB_STATE_0,	/* Disconnected State		*/
548c2ecf20Sopenharmony_ci	LAPB_STATE_1,	/* Awaiting Connection State	*/
558c2ecf20Sopenharmony_ci	LAPB_STATE_2,	/* Awaiting Disconnection State	*/
568c2ecf20Sopenharmony_ci	LAPB_STATE_3,	/* Data Transfer State		*/
578c2ecf20Sopenharmony_ci	LAPB_STATE_4	/* Frame Reject State		*/
588c2ecf20Sopenharmony_ci};
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_ci#define	LAPB_DEFAULT_MODE		(LAPB_STANDARD | LAPB_SLP | LAPB_DTE)
618c2ecf20Sopenharmony_ci#define	LAPB_DEFAULT_WINDOW		7		/* Window=7 */
628c2ecf20Sopenharmony_ci#define	LAPB_DEFAULT_T1			(5 * HZ)	/* T1=5s    */
638c2ecf20Sopenharmony_ci#define	LAPB_DEFAULT_T2			(1 * HZ)	/* T2=1s    */
648c2ecf20Sopenharmony_ci#define	LAPB_DEFAULT_N2			20		/* N2=20    */
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ci#define	LAPB_SMODULUS	8
678c2ecf20Sopenharmony_ci#define	LAPB_EMODULUS	128
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_ci/*
708c2ecf20Sopenharmony_ci *	Information about the current frame.
718c2ecf20Sopenharmony_ci */
728c2ecf20Sopenharmony_cistruct lapb_frame {
738c2ecf20Sopenharmony_ci	unsigned short		type;		/* Parsed type		*/
748c2ecf20Sopenharmony_ci	unsigned short		nr, ns;		/* N(R), N(S)		*/
758c2ecf20Sopenharmony_ci	unsigned char		cr;		/* Command/Response	*/
768c2ecf20Sopenharmony_ci	unsigned char		pf;		/* Poll/Final		*/
778c2ecf20Sopenharmony_ci	unsigned char		control[2];	/* Original control data*/
788c2ecf20Sopenharmony_ci};
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci/*
818c2ecf20Sopenharmony_ci *	The per LAPB connection control structure.
828c2ecf20Sopenharmony_ci */
838c2ecf20Sopenharmony_cistruct lapb_cb {
848c2ecf20Sopenharmony_ci	struct list_head	node;
858c2ecf20Sopenharmony_ci	struct net_device	*dev;
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_ci	/* Link status fields */
888c2ecf20Sopenharmony_ci	unsigned int		mode;
898c2ecf20Sopenharmony_ci	unsigned char		state;
908c2ecf20Sopenharmony_ci	unsigned short		vs, vr, va;
918c2ecf20Sopenharmony_ci	unsigned char		condition;
928c2ecf20Sopenharmony_ci	unsigned short		n2, n2count;
938c2ecf20Sopenharmony_ci	unsigned short		t1, t2;
948c2ecf20Sopenharmony_ci	struct timer_list	t1timer, t2timer;
958c2ecf20Sopenharmony_ci
968c2ecf20Sopenharmony_ci	/* Internal control information */
978c2ecf20Sopenharmony_ci	struct sk_buff_head	write_queue;
988c2ecf20Sopenharmony_ci	struct sk_buff_head	ack_queue;
998c2ecf20Sopenharmony_ci	unsigned char		window;
1008c2ecf20Sopenharmony_ci	const struct lapb_register_struct *callbacks;
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ci	/* FRMR control information */
1038c2ecf20Sopenharmony_ci	struct lapb_frame	frmr_data;
1048c2ecf20Sopenharmony_ci	unsigned char		frmr_type;
1058c2ecf20Sopenharmony_ci
1068c2ecf20Sopenharmony_ci	refcount_t		refcnt;
1078c2ecf20Sopenharmony_ci};
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_ci/* lapb_iface.c */
1108c2ecf20Sopenharmony_civoid lapb_connect_confirmation(struct lapb_cb *lapb, int);
1118c2ecf20Sopenharmony_civoid lapb_connect_indication(struct lapb_cb *lapb, int);
1128c2ecf20Sopenharmony_civoid lapb_disconnect_confirmation(struct lapb_cb *lapb, int);
1138c2ecf20Sopenharmony_civoid lapb_disconnect_indication(struct lapb_cb *lapb, int);
1148c2ecf20Sopenharmony_ciint lapb_data_indication(struct lapb_cb *lapb, struct sk_buff *);
1158c2ecf20Sopenharmony_ciint lapb_data_transmit(struct lapb_cb *lapb, struct sk_buff *);
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_ci/* lapb_in.c */
1188c2ecf20Sopenharmony_civoid lapb_data_input(struct lapb_cb *lapb, struct sk_buff *);
1198c2ecf20Sopenharmony_ci
1208c2ecf20Sopenharmony_ci/* lapb_out.c */
1218c2ecf20Sopenharmony_civoid lapb_kick(struct lapb_cb *lapb);
1228c2ecf20Sopenharmony_civoid lapb_transmit_buffer(struct lapb_cb *lapb, struct sk_buff *, int);
1238c2ecf20Sopenharmony_civoid lapb_establish_data_link(struct lapb_cb *lapb);
1248c2ecf20Sopenharmony_civoid lapb_enquiry_response(struct lapb_cb *lapb);
1258c2ecf20Sopenharmony_civoid lapb_timeout_response(struct lapb_cb *lapb);
1268c2ecf20Sopenharmony_civoid lapb_check_iframes_acked(struct lapb_cb *lapb, unsigned short);
1278c2ecf20Sopenharmony_civoid lapb_check_need_response(struct lapb_cb *lapb, int, int);
1288c2ecf20Sopenharmony_ci
1298c2ecf20Sopenharmony_ci/* lapb_subr.c */
1308c2ecf20Sopenharmony_civoid lapb_clear_queues(struct lapb_cb *lapb);
1318c2ecf20Sopenharmony_civoid lapb_frames_acked(struct lapb_cb *lapb, unsigned short);
1328c2ecf20Sopenharmony_civoid lapb_requeue_frames(struct lapb_cb *lapb);
1338c2ecf20Sopenharmony_ciint lapb_validate_nr(struct lapb_cb *lapb, unsigned short);
1348c2ecf20Sopenharmony_ciint lapb_decode(struct lapb_cb *lapb, struct sk_buff *, struct lapb_frame *);
1358c2ecf20Sopenharmony_civoid lapb_send_control(struct lapb_cb *lapb, int, int, int);
1368c2ecf20Sopenharmony_civoid lapb_transmit_frmr(struct lapb_cb *lapb);
1378c2ecf20Sopenharmony_ci
1388c2ecf20Sopenharmony_ci/* lapb_timer.c */
1398c2ecf20Sopenharmony_civoid lapb_start_t1timer(struct lapb_cb *lapb);
1408c2ecf20Sopenharmony_civoid lapb_start_t2timer(struct lapb_cb *lapb);
1418c2ecf20Sopenharmony_civoid lapb_stop_t1timer(struct lapb_cb *lapb);
1428c2ecf20Sopenharmony_civoid lapb_stop_t2timer(struct lapb_cb *lapb);
1438c2ecf20Sopenharmony_ciint lapb_t1timer_running(struct lapb_cb *lapb);
1448c2ecf20Sopenharmony_ci
1458c2ecf20Sopenharmony_ci/*
1468c2ecf20Sopenharmony_ci * Debug levels.
1478c2ecf20Sopenharmony_ci *	0 = Off
1488c2ecf20Sopenharmony_ci *	1 = State Changes
1498c2ecf20Sopenharmony_ci *	2 = Packets I/O and State Changes
1508c2ecf20Sopenharmony_ci *	3 = Hex dumps, Packets I/O and State Changes.
1518c2ecf20Sopenharmony_ci */
1528c2ecf20Sopenharmony_ci#define	LAPB_DEBUG	0
1538c2ecf20Sopenharmony_ci
1548c2ecf20Sopenharmony_ci#define lapb_dbg(level, fmt, ...)			\
1558c2ecf20Sopenharmony_cido {							\
1568c2ecf20Sopenharmony_ci	if (level < LAPB_DEBUG)				\
1578c2ecf20Sopenharmony_ci		pr_debug(fmt, ##__VA_ARGS__);		\
1588c2ecf20Sopenharmony_ci} while (0)
1598c2ecf20Sopenharmony_ci
1608c2ecf20Sopenharmony_ci#endif
161