1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * hdlc.h -- General purpose ISDN HDLC decoder. 4 * 5 * Implementation of a HDLC decoder/encoder in software. 6 * Necessary because some ISDN devices don't have HDLC 7 * controllers. 8 * 9 * Copyright (C) 10 * 2009 Karsten Keil <keil@b1-systems.de> 11 * 2002 Wolfgang Mües <wolfgang@iksw-muees.de> 12 * 2001 Frode Isaksen <fisaksen@bewan.com> 13 * 2001 Kai Germaschewski <kai.germaschewski@gmx.de> 14 */ 15 16 #ifndef __ISDNHDLC_H__ 17 #define __ISDNHDLC_H__ 18 19 struct isdnhdlc_vars { 20 int bit_shift; 21 int hdlc_bits1; 22 int data_bits; 23 int ffbit_shift; /* encoding only */ 24 int state; 25 int dstpos; 26 27 u16 crc; 28 29 u8 cbin; 30 u8 shift_reg; 31 u8 ffvalue; 32 33 /* set if transferring data */ 34 u32 data_received:1; 35 /* set if D channel (send idle instead of flags) */ 36 u32 dchannel:1; 37 /* set if 56K adaptation */ 38 u32 do_adapt56:1; 39 /* set if in closing phase (need to send CRC + flag) */ 40 u32 do_closing:1; 41 /* set if data is bitreverse */ 42 u32 do_bitreverse:1; 43 }; 44 45 /* Feature Flags */ 46 #define HDLC_56KBIT 0x01 47 #define HDLC_DCHANNEL 0x02 48 #define HDLC_BITREVERSE 0x04 49 50 /* 51 The return value from isdnhdlc_decode is 52 the frame length, 0 if no complete frame was decoded, 53 or a negative error number 54 */ 55 #define HDLC_FRAMING_ERROR 1 56 #define HDLC_CRC_ERROR 2 57 #define HDLC_LENGTH_ERROR 3 58 59 extern void isdnhdlc_rcv_init(struct isdnhdlc_vars *hdlc, u32 features); 60 61 extern int isdnhdlc_decode(struct isdnhdlc_vars *hdlc, const u8 *src, 62 int slen, int *count, u8 *dst, int dsize); 63 64 extern void isdnhdlc_out_init(struct isdnhdlc_vars *hdlc, u32 features); 65 66 extern int isdnhdlc_encode(struct isdnhdlc_vars *hdlc, const u8 *src, 67 u16 slen, int *count, u8 *dst, int dsize); 68 69 #endif /* __ISDNHDLC_H__ */ 70