162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * see notice in l1oip.c
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci/* debugging */
762306a36Sopenharmony_ci#define DEBUG_L1OIP_INIT	0x00010000
862306a36Sopenharmony_ci#define DEBUG_L1OIP_SOCKET	0x00020000
962306a36Sopenharmony_ci#define DEBUG_L1OIP_MGR		0x00040000
1062306a36Sopenharmony_ci#define DEBUG_L1OIP_MSG		0x00080000
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci/* enable to disorder received bchannels by sequence 2143658798... */
1362306a36Sopenharmony_ci/*
1462306a36Sopenharmony_ci  #define REORDER_DEBUG
1562306a36Sopenharmony_ci*/
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci/* frames */
1862306a36Sopenharmony_ci#define L1OIP_MAX_LEN		2048		/* max packet size form l2 */
1962306a36Sopenharmony_ci#define L1OIP_MAX_PERFRAME	1400		/* max data size in one frame */
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci/* timers */
2362306a36Sopenharmony_ci#define L1OIP_KEEPALIVE		15
2462306a36Sopenharmony_ci#define L1OIP_TIMEOUT		65
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci/* socket */
2862306a36Sopenharmony_ci#define L1OIP_DEFAULTPORT	931
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci/* channel structure */
3262306a36Sopenharmony_cistruct l1oip_chan {
3362306a36Sopenharmony_ci	struct dchannel		*dch;
3462306a36Sopenharmony_ci	struct bchannel		*bch;
3562306a36Sopenharmony_ci	u32			tx_counter;	/* counts xmit bytes/packets */
3662306a36Sopenharmony_ci	u32			rx_counter;	/* counts recv bytes/packets */
3762306a36Sopenharmony_ci	u32			codecstate;	/* used by codec to save data */
3862306a36Sopenharmony_ci#ifdef REORDER_DEBUG
3962306a36Sopenharmony_ci	int			disorder_flag;
4062306a36Sopenharmony_ci	struct sk_buff		*disorder_skb;
4162306a36Sopenharmony_ci	u32			disorder_cnt;
4262306a36Sopenharmony_ci#endif
4362306a36Sopenharmony_ci};
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci/* card structure */
4762306a36Sopenharmony_cistruct l1oip {
4862306a36Sopenharmony_ci	struct list_head        list;
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci	/* card */
5162306a36Sopenharmony_ci	int			registered;	/* if registered with mISDN */
5262306a36Sopenharmony_ci	char			name[MISDN_MAX_IDLEN];
5362306a36Sopenharmony_ci	int			idx;		/* card index */
5462306a36Sopenharmony_ci	int			pri;		/* 1=pri, 0=bri */
5562306a36Sopenharmony_ci	int			d_idx;		/* current dchannel number */
5662306a36Sopenharmony_ci	int			b_num;		/* number of bchannels */
5762306a36Sopenharmony_ci	u32			id;		/* id of connection */
5862306a36Sopenharmony_ci	int			ondemand;	/* if transmis. is on demand */
5962306a36Sopenharmony_ci	int			bundle;		/* bundle channels in one frm */
6062306a36Sopenharmony_ci	int			codec;		/* codec to use for transmis. */
6162306a36Sopenharmony_ci	int			limit;		/* limit number of bchannels */
6262306a36Sopenharmony_ci	bool			shutdown;	/* if card is released */
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci	/* timer */
6562306a36Sopenharmony_ci	struct timer_list	keep_tl;
6662306a36Sopenharmony_ci	struct timer_list	timeout_tl;
6762306a36Sopenharmony_ci	int			timeout_on;
6862306a36Sopenharmony_ci	struct work_struct	workq;
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci	/* socket */
7162306a36Sopenharmony_ci	struct socket		*socket;	/* if set, socket is created */
7262306a36Sopenharmony_ci	struct completion	socket_complete;/* completion of sock thread */
7362306a36Sopenharmony_ci	struct task_struct	*socket_thread;
7462306a36Sopenharmony_ci	spinlock_t		socket_lock;	/* access sock outside thread */
7562306a36Sopenharmony_ci	u32			remoteip;	/* if all set, ip is assigned */
7662306a36Sopenharmony_ci	u16			localport;	/* must always be set */
7762306a36Sopenharmony_ci	u16			remoteport;	/* must always be set */
7862306a36Sopenharmony_ci	struct sockaddr_in	sin_local;	/* local socket name */
7962306a36Sopenharmony_ci	struct sockaddr_in	sin_remote;	/* remote socket name */
8062306a36Sopenharmony_ci	struct msghdr		sendmsg;	/* ip message to send */
8162306a36Sopenharmony_ci	struct kvec		sendiov;	/* iov for message */
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci	/* frame */
8462306a36Sopenharmony_ci	struct l1oip_chan	chan[128];	/* channel instances */
8562306a36Sopenharmony_ci};
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ciextern int l1oip_law_to_4bit(u8 *data, int len, u8 *result, u32 *state);
8862306a36Sopenharmony_ciextern int l1oip_4bit_to_law(u8 *data, int len, u8 *result);
8962306a36Sopenharmony_ciextern int l1oip_alaw_to_ulaw(u8 *data, int len, u8 *result);
9062306a36Sopenharmony_ciextern int l1oip_ulaw_to_alaw(u8 *data, int len, u8 *result);
9162306a36Sopenharmony_ciextern void l1oip_4bit_free(void);
9262306a36Sopenharmony_ciextern int l1oip_4bit_alloc(int ulaw);
93