blob: 56369bfd3b7100ed33f8b39a4ce34731f09a5b68 [file] [log] [blame]
Harald Welte85b9fba2018-05-11 17:36:13 +02001/*
Harald Welte9da77ab2018-05-11 17:39:21 +02002 * isdnhdlc.h -- General purpose ISDN HDLC decoder.
Harald Welte85b9fba2018-05-11 17:36:13 +02003 *
4 * Implementation of a HDLC decoder/encoder in software.
5 * Necessary because some ISDN devices don't have HDLC
6 * controllers.
7 *
8 * Copyright (C)
9 * 2009 Karsten Keil <keil@b1-systems.de>
10 * 2002 Wolfgang Mües <wolfgang@iksw-muees.de>
11 * 2001 Frode Isaksen <fisaksen@bewan.com>
12 * 2001 Kai Germaschewski <kai.germaschewski@gmx.de>
13 *
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2 of the License, or
17 * (at your option) any later version.
18 *
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with this program; if not, write to the Free Software
26 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 */
28
29#ifndef __ISDNHDLC_H__
30#define __ISDNHDLC_H__
31
Harald Welte9da77ab2018-05-11 17:39:21 +020032#include <stdint.h>
33
34struct osmo_isdnhdlc_vars {
Harald Welte85b9fba2018-05-11 17:36:13 +020035 int bit_shift;
36 int hdlc_bits1;
37 int data_bits;
38 int ffbit_shift; /* encoding only */
39 int state;
40 int dstpos;
41
Harald Welte9da77ab2018-05-11 17:39:21 +020042 uint16_t crc;
Harald Welte85b9fba2018-05-11 17:36:13 +020043
Harald Welte9da77ab2018-05-11 17:39:21 +020044 uint8_t cbin;
45 uint8_t shift_reg;
46 uint8_t ffvalue;
Harald Welte85b9fba2018-05-11 17:36:13 +020047
48 /* set if transferring data */
Harald Welte9da77ab2018-05-11 17:39:21 +020049 uint32_t data_received:1;
Harald Welte85b9fba2018-05-11 17:36:13 +020050 /* set if D channel (send idle instead of flags) */
Harald Welte9da77ab2018-05-11 17:39:21 +020051 uint32_t dchannel:1;
Harald Welte85b9fba2018-05-11 17:36:13 +020052 /* set if 56K adaptation */
Harald Welte9da77ab2018-05-11 17:39:21 +020053 uint32_t do_adapt56:1;
Harald Welte85b9fba2018-05-11 17:36:13 +020054 /* set if in closing phase (need to send CRC + flag) */
Harald Welte9da77ab2018-05-11 17:39:21 +020055 uint32_t do_closing:1;
Harald Welte85b9fba2018-05-11 17:36:13 +020056 /* set if data is bitreverse */
Harald Welte9da77ab2018-05-11 17:39:21 +020057 uint32_t do_bitreverse:1;
Harald Welte85b9fba2018-05-11 17:36:13 +020058};
59
60/* Feature Flags */
Harald Welte9da77ab2018-05-11 17:39:21 +020061#define OSMO_HDLC_F_56KBIT 0x01
62#define OSMO_HDLC_F_DCHANNEL 0x02
63#define OSMO_HDLC_F_BITREVERSE 0x04
Harald Welte85b9fba2018-05-11 17:36:13 +020064
65/*
66 The return value from isdnhdlc_decode is
67 the frame length, 0 if no complete frame was decoded,
68 or a negative error number
69*/
Harald Welte9da77ab2018-05-11 17:39:21 +020070#define OSMO_HDLC_FRAMING_ERROR 1
71#define OSMO_HDLC_CRC_ERROR 2
72#define OSMO_HDLC_LENGTH_ERROR 3
Harald Welte85b9fba2018-05-11 17:36:13 +020073
Harald Welte9da77ab2018-05-11 17:39:21 +020074extern void osmo_isdnhdlc_rcv_init(struct osmo_isdnhdlc_vars *hdlc, uint32_t features);
Harald Welte85b9fba2018-05-11 17:36:13 +020075
Harald Welte9da77ab2018-05-11 17:39:21 +020076extern int osmo_isdnhdlc_decode(struct osmo_isdnhdlc_vars *hdlc, const uint8_t *src,
77 int slen, int *count, uint8_t *dst, int dsize);
Harald Welte85b9fba2018-05-11 17:36:13 +020078
Harald Welte9da77ab2018-05-11 17:39:21 +020079extern void osmo_isdnhdlc_out_init(struct osmo_isdnhdlc_vars *hdlc, uint32_t features);
Harald Welte85b9fba2018-05-11 17:36:13 +020080
Harald Welte9da77ab2018-05-11 17:39:21 +020081extern int osmo_isdnhdlc_encode(struct osmo_isdnhdlc_vars *hdlc, const uint8_t *src,
82 uint16_t slen, int *count, uint8_t *dst, int dsize);
Harald Welte85b9fba2018-05-11 17:36:13 +020083
84#endif /* __ISDNHDLC_H__ */