162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef _LAPB_H
362306a36Sopenharmony_ci#define _LAPB_H
462306a36Sopenharmony_ci#include <linux/lapb.h>
562306a36Sopenharmony_ci#include <linux/refcount.h>
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#define	LAPB_HEADER_LEN	20		/* LAPB over Ethernet + a bit more */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#define	LAPB_ACK_PENDING_CONDITION	0x01
1062306a36Sopenharmony_ci#define	LAPB_REJECT_CONDITION		0x02
1162306a36Sopenharmony_ci#define	LAPB_PEER_RX_BUSY_CONDITION	0x04
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci/* Control field templates */
1462306a36Sopenharmony_ci#define	LAPB_I		0x00	/* Information frames */
1562306a36Sopenharmony_ci#define	LAPB_S		0x01	/* Supervisory frames */
1662306a36Sopenharmony_ci#define	LAPB_U		0x03	/* Unnumbered frames */
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#define	LAPB_RR		0x01	/* Receiver ready */
1962306a36Sopenharmony_ci#define	LAPB_RNR	0x05	/* Receiver not ready */
2062306a36Sopenharmony_ci#define	LAPB_REJ	0x09	/* Reject */
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#define	LAPB_SABM	0x2F	/* Set Asynchronous Balanced Mode */
2362306a36Sopenharmony_ci#define	LAPB_SABME	0x6F	/* Set Asynchronous Balanced Mode Extended */
2462306a36Sopenharmony_ci#define	LAPB_DISC	0x43	/* Disconnect */
2562306a36Sopenharmony_ci#define	LAPB_DM		0x0F	/* Disconnected mode */
2662306a36Sopenharmony_ci#define	LAPB_UA		0x63	/* Unnumbered acknowledge */
2762306a36Sopenharmony_ci#define	LAPB_FRMR	0x87	/* Frame reject */
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#define LAPB_ILLEGAL	0x100	/* Impossible to be a real frame type */
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci#define	LAPB_SPF	0x10	/* Poll/final bit for standard LAPB */
3262306a36Sopenharmony_ci#define	LAPB_EPF	0x01	/* Poll/final bit for extended LAPB */
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci#define	LAPB_FRMR_W	0x01	/* Control field invalid	*/
3562306a36Sopenharmony_ci#define	LAPB_FRMR_X	0x02	/* I field invalid		*/
3662306a36Sopenharmony_ci#define	LAPB_FRMR_Y	0x04	/* I field too long		*/
3762306a36Sopenharmony_ci#define	LAPB_FRMR_Z	0x08	/* Invalid N(R)			*/
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci#define	LAPB_POLLOFF	0
4062306a36Sopenharmony_ci#define	LAPB_POLLON	1
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci/* LAPB C-bit */
4362306a36Sopenharmony_ci#define LAPB_COMMAND	1
4462306a36Sopenharmony_ci#define LAPB_RESPONSE	2
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci#define	LAPB_ADDR_A	0x03
4762306a36Sopenharmony_ci#define	LAPB_ADDR_B	0x01
4862306a36Sopenharmony_ci#define	LAPB_ADDR_C	0x0F
4962306a36Sopenharmony_ci#define	LAPB_ADDR_D	0x07
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci/* Define Link State constants. */
5262306a36Sopenharmony_cienum {
5362306a36Sopenharmony_ci	LAPB_STATE_0,	/* Disconnected State		*/
5462306a36Sopenharmony_ci	LAPB_STATE_1,	/* Awaiting Connection State	*/
5562306a36Sopenharmony_ci	LAPB_STATE_2,	/* Awaiting Disconnection State	*/
5662306a36Sopenharmony_ci	LAPB_STATE_3,	/* Data Transfer State		*/
5762306a36Sopenharmony_ci	LAPB_STATE_4	/* Frame Reject State		*/
5862306a36Sopenharmony_ci};
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci#define	LAPB_DEFAULT_MODE		(LAPB_STANDARD | LAPB_SLP | LAPB_DTE)
6162306a36Sopenharmony_ci#define	LAPB_DEFAULT_WINDOW		7		/* Window=7 */
6262306a36Sopenharmony_ci#define	LAPB_DEFAULT_T1			(5 * HZ)	/* T1=5s    */
6362306a36Sopenharmony_ci#define	LAPB_DEFAULT_T2			(1 * HZ)	/* T2=1s    */
6462306a36Sopenharmony_ci#define	LAPB_DEFAULT_N2			20		/* N2=20    */
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci#define	LAPB_SMODULUS	8
6762306a36Sopenharmony_ci#define	LAPB_EMODULUS	128
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci/*
7062306a36Sopenharmony_ci *	Information about the current frame.
7162306a36Sopenharmony_ci */
7262306a36Sopenharmony_cistruct lapb_frame {
7362306a36Sopenharmony_ci	unsigned short		type;		/* Parsed type		*/
7462306a36Sopenharmony_ci	unsigned short		nr, ns;		/* N(R), N(S)		*/
7562306a36Sopenharmony_ci	unsigned char		cr;		/* Command/Response	*/
7662306a36Sopenharmony_ci	unsigned char		pf;		/* Poll/Final		*/
7762306a36Sopenharmony_ci	unsigned char		control[2];	/* Original control data*/
7862306a36Sopenharmony_ci};
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci/*
8162306a36Sopenharmony_ci *	The per LAPB connection control structure.
8262306a36Sopenharmony_ci */
8362306a36Sopenharmony_cistruct lapb_cb {
8462306a36Sopenharmony_ci	struct list_head	node;
8562306a36Sopenharmony_ci	struct net_device	*dev;
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci	/* Link status fields */
8862306a36Sopenharmony_ci	unsigned int		mode;
8962306a36Sopenharmony_ci	unsigned char		state;
9062306a36Sopenharmony_ci	unsigned short		vs, vr, va;
9162306a36Sopenharmony_ci	unsigned char		condition;
9262306a36Sopenharmony_ci	unsigned short		n2, n2count;
9362306a36Sopenharmony_ci	unsigned short		t1, t2;
9462306a36Sopenharmony_ci	struct timer_list	t1timer, t2timer;
9562306a36Sopenharmony_ci	bool			t1timer_running, t2timer_running;
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci	/* Internal control information */
9862306a36Sopenharmony_ci	struct sk_buff_head	write_queue;
9962306a36Sopenharmony_ci	struct sk_buff_head	ack_queue;
10062306a36Sopenharmony_ci	unsigned char		window;
10162306a36Sopenharmony_ci	const struct lapb_register_struct *callbacks;
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci	/* FRMR control information */
10462306a36Sopenharmony_ci	struct lapb_frame	frmr_data;
10562306a36Sopenharmony_ci	unsigned char		frmr_type;
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci	spinlock_t		lock;
10862306a36Sopenharmony_ci	refcount_t		refcnt;
10962306a36Sopenharmony_ci};
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci/* lapb_iface.c */
11262306a36Sopenharmony_civoid lapb_connect_confirmation(struct lapb_cb *lapb, int);
11362306a36Sopenharmony_civoid lapb_connect_indication(struct lapb_cb *lapb, int);
11462306a36Sopenharmony_civoid lapb_disconnect_confirmation(struct lapb_cb *lapb, int);
11562306a36Sopenharmony_civoid lapb_disconnect_indication(struct lapb_cb *lapb, int);
11662306a36Sopenharmony_ciint lapb_data_indication(struct lapb_cb *lapb, struct sk_buff *);
11762306a36Sopenharmony_ciint lapb_data_transmit(struct lapb_cb *lapb, struct sk_buff *);
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci/* lapb_in.c */
12062306a36Sopenharmony_civoid lapb_data_input(struct lapb_cb *lapb, struct sk_buff *);
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci/* lapb_out.c */
12362306a36Sopenharmony_civoid lapb_kick(struct lapb_cb *lapb);
12462306a36Sopenharmony_civoid lapb_transmit_buffer(struct lapb_cb *lapb, struct sk_buff *, int);
12562306a36Sopenharmony_civoid lapb_establish_data_link(struct lapb_cb *lapb);
12662306a36Sopenharmony_civoid lapb_enquiry_response(struct lapb_cb *lapb);
12762306a36Sopenharmony_civoid lapb_timeout_response(struct lapb_cb *lapb);
12862306a36Sopenharmony_civoid lapb_check_iframes_acked(struct lapb_cb *lapb, unsigned short);
12962306a36Sopenharmony_civoid lapb_check_need_response(struct lapb_cb *lapb, int, int);
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci/* lapb_subr.c */
13262306a36Sopenharmony_civoid lapb_clear_queues(struct lapb_cb *lapb);
13362306a36Sopenharmony_civoid lapb_frames_acked(struct lapb_cb *lapb, unsigned short);
13462306a36Sopenharmony_civoid lapb_requeue_frames(struct lapb_cb *lapb);
13562306a36Sopenharmony_ciint lapb_validate_nr(struct lapb_cb *lapb, unsigned short);
13662306a36Sopenharmony_ciint lapb_decode(struct lapb_cb *lapb, struct sk_buff *, struct lapb_frame *);
13762306a36Sopenharmony_civoid lapb_send_control(struct lapb_cb *lapb, int, int, int);
13862306a36Sopenharmony_civoid lapb_transmit_frmr(struct lapb_cb *lapb);
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci/* lapb_timer.c */
14162306a36Sopenharmony_civoid lapb_start_t1timer(struct lapb_cb *lapb);
14262306a36Sopenharmony_civoid lapb_start_t2timer(struct lapb_cb *lapb);
14362306a36Sopenharmony_civoid lapb_stop_t1timer(struct lapb_cb *lapb);
14462306a36Sopenharmony_civoid lapb_stop_t2timer(struct lapb_cb *lapb);
14562306a36Sopenharmony_ciint lapb_t1timer_running(struct lapb_cb *lapb);
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci/*
14862306a36Sopenharmony_ci * Debug levels.
14962306a36Sopenharmony_ci *	0 = Off
15062306a36Sopenharmony_ci *	1 = State Changes
15162306a36Sopenharmony_ci *	2 = Packets I/O and State Changes
15262306a36Sopenharmony_ci *	3 = Hex dumps, Packets I/O and State Changes.
15362306a36Sopenharmony_ci */
15462306a36Sopenharmony_ci#define	LAPB_DEBUG	0
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_ci#define lapb_dbg(level, fmt, ...)			\
15762306a36Sopenharmony_cido {							\
15862306a36Sopenharmony_ci	if (level < LAPB_DEBUG)				\
15962306a36Sopenharmony_ci		pr_debug(fmt, ##__VA_ARGS__);		\
16062306a36Sopenharmony_ci} while (0)
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci#endif
163