blob: c8cfdc3a1eab26ea2e9fdc502a9643c88ec17bd6 [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.
Harald Welte85b9fba2018-05-11 17:36:13 +020023 */
24
Vadim Yanitskiy395db202022-09-28 23:51:42 +070025#pragma once
Harald Welte85b9fba2018-05-11 17:36:13 +020026
Harald Welte9da77ab2018-05-11 17:39:21 +020027#include <stdint.h>
28
29struct osmo_isdnhdlc_vars {
Harald Welte85b9fba2018-05-11 17:36:13 +020030 int bit_shift;
31 int hdlc_bits1;
32 int data_bits;
33 int ffbit_shift; /* encoding only */
34 int state;
35 int dstpos;
36
Harald Welte9da77ab2018-05-11 17:39:21 +020037 uint16_t crc;
Harald Welte85b9fba2018-05-11 17:36:13 +020038
Harald Welte9da77ab2018-05-11 17:39:21 +020039 uint8_t cbin;
40 uint8_t shift_reg;
41 uint8_t ffvalue;
Harald Welte85b9fba2018-05-11 17:36:13 +020042
43 /* set if transferring data */
Harald Welte9da77ab2018-05-11 17:39:21 +020044 uint32_t data_received:1;
Harald Welte85b9fba2018-05-11 17:36:13 +020045 /* set if D channel (send idle instead of flags) */
Harald Welte9da77ab2018-05-11 17:39:21 +020046 uint32_t dchannel:1;
Harald Welte85b9fba2018-05-11 17:36:13 +020047 /* set if 56K adaptation */
Harald Welte9da77ab2018-05-11 17:39:21 +020048 uint32_t do_adapt56:1;
Harald Welte85b9fba2018-05-11 17:36:13 +020049 /* set if in closing phase (need to send CRC + flag) */
Harald Welte9da77ab2018-05-11 17:39:21 +020050 uint32_t do_closing:1;
Harald Welte85b9fba2018-05-11 17:36:13 +020051 /* set if data is bitreverse */
Harald Welte9da77ab2018-05-11 17:39:21 +020052 uint32_t do_bitreverse:1;
Harald Welte85b9fba2018-05-11 17:36:13 +020053};
54
55/* Feature Flags */
Harald Welte9da77ab2018-05-11 17:39:21 +020056#define OSMO_HDLC_F_56KBIT 0x01
57#define OSMO_HDLC_F_DCHANNEL 0x02
58#define OSMO_HDLC_F_BITREVERSE 0x04
Harald Welte85b9fba2018-05-11 17:36:13 +020059
60/*
61 The return value from isdnhdlc_decode is
62 the frame length, 0 if no complete frame was decoded,
63 or a negative error number
64*/
Harald Welte9da77ab2018-05-11 17:39:21 +020065#define OSMO_HDLC_FRAMING_ERROR 1
66#define OSMO_HDLC_CRC_ERROR 2
67#define OSMO_HDLC_LENGTH_ERROR 3
Harald Welte85b9fba2018-05-11 17:36:13 +020068
Harald Welte9da77ab2018-05-11 17:39:21 +020069extern void osmo_isdnhdlc_rcv_init(struct osmo_isdnhdlc_vars *hdlc, uint32_t features);
Harald Welte85b9fba2018-05-11 17:36:13 +020070
Harald Welte9da77ab2018-05-11 17:39:21 +020071extern int osmo_isdnhdlc_decode(struct osmo_isdnhdlc_vars *hdlc, const uint8_t *src,
72 int slen, int *count, uint8_t *dst, int dsize);
Harald Welte85b9fba2018-05-11 17:36:13 +020073
Harald Welte9da77ab2018-05-11 17:39:21 +020074extern void osmo_isdnhdlc_out_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_encode(struct osmo_isdnhdlc_vars *hdlc, const uint8_t *src,
77 uint16_t slen, int *count, uint8_t *dst, int dsize);