diff spandsp-0.0.6pre17/src/spandsp/hdlc.h @ 4:26cd8f1ef0b1

import spandsp-0.0.6pre17
author Peter Meerwald <pmeerw@cosy.sbg.ac.at>
date Fri, 25 Jun 2010 15:50:58 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/spandsp-0.0.6pre17/src/spandsp/hdlc.h	Fri Jun 25 15:50:58 2010 +0200
@@ -0,0 +1,252 @@
+/*
+ * SpanDSP - a series of DSP components for telephony
+ *
+ * hdlc.h
+ *
+ * Written by Steve Underwood <steveu@coppice.org>
+ *
+ * Copyright (C) 2003 Steve Underwood
+ *
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 2.1,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * $Id: hdlc.h,v 1.45 2009/06/02 16:03:56 steveu Exp $
+ */
+
+/*! \file */
+
+/*! \page hdlc_page HDLC
+
+\section hdlc_page_sec_1 What does it do?
+The HDLC module provides bit stuffing, destuffing, framing and deframing,
+according to the HDLC protocol. It also provides 16 and 32 bit CRC generation
+and checking services for HDLC frames.
+
+HDLC may not be a DSP function, but is needed to accompany several DSP components.
+
+\section hdlc_page_sec_2 How does it work?
+*/
+
+#if !defined(_SPANDSP_HDLC_H_)
+#define _SPANDSP_HDLC_H_
+
+/*! 
+    HDLC_MAXFRAME_LEN is the maximum length of a stuffed HDLC frame, excluding the CRC.
+*/
+#define HDLC_MAXFRAME_LEN       400	
+
+typedef void (*hdlc_frame_handler_t)(void *user_data, const uint8_t *pkt, int len, int ok);
+typedef void (*hdlc_underflow_handler_t)(void *user_data);
+
+/*!
+    HDLC receive descriptor. This contains all the state information for an HDLC receiver.
+ */
+typedef struct hdlc_rx_state_s hdlc_rx_state_t;
+
+/*!
+    HDLC received data statistics.
+ */
+typedef struct
+{
+    /*! \brief The number of bytes of good frames received (CRC not included). */
+    unsigned long int bytes;
+    /*! \brief The number of good frames received. */
+    unsigned long int good_frames;
+    /*! \brief The number of frames with CRC errors received. */
+    unsigned long int crc_errors;
+    /*! \brief The number of too short and too long frames received. */
+    unsigned long int length_errors;
+    /*! \brief The number of HDLC aborts received. */
+    unsigned long int aborts;
+} hdlc_rx_stats_t;
+
+/*!
+    HDLC transmit descriptor. This contains all the state information for an
+    HDLC transmitter.
+ */
+typedef struct hdlc_tx_state_s hdlc_tx_state_t;
+
+#if defined(__cplusplus)
+extern "C"
+{
+#endif
+
+/*! \brief Initialise an HDLC receiver context.
+    \param s A pointer to an HDLC receiver context.
+    \param crc32 TRUE to use ITU CRC32. FALSE to use ITU CRC16.
+    \param report_bad_frames TRUE to request the reporting of bad frames.
+    \param framing_ok_threshold The number of back-to-back flags needed to
+           start the framing OK condition. This may be used where a series of
+           flag octets is used as a preamble, such as in the T.30 protocol.
+    \param handler The function to be called when a good HDLC frame is received.
+    \param user_data An opaque parameter for the callback routine.
+    \return A pointer to the HDLC receiver context.
+*/
+SPAN_DECLARE(hdlc_rx_state_t *) hdlc_rx_init(hdlc_rx_state_t *s,
+                                             int crc32,
+                                             int report_bad_frames,
+                                             int framing_ok_threshold,
+                                             hdlc_frame_handler_t handler,
+                                             void *user_data);
+
+/*! Change the put_bit function associated with an HDLC receiver context.
+    \brief Change the put_bit function associated with an HDLC receiver context.
+    \param s A pointer to an HDLC receiver context.
+    \param handler The function to be called when a good HDLC frame is received.
+    \param user_data An opaque parameter for the callback routine.
+*/
+SPAN_DECLARE(void) hdlc_rx_set_frame_handler(hdlc_rx_state_t *s, hdlc_frame_handler_t handler, void *user_data);
+
+/*! Change the status report function associated with an HDLC receiver context.
+    \brief Change the status report function associated with an HDLC receiver context.
+    \param s A pointer to an HDLC receiver context.
+    \param handler The callback routine used to report status changes.
+    \param user_data An opaque parameter for the callback routine.
+*/
+SPAN_DECLARE(void) hdlc_rx_set_status_handler(hdlc_rx_state_t *s, modem_rx_status_func_t handler, void *user_data);
+
+/*! Release an HDLC receiver context.
+    \brief Release an HDLC receiver context.
+    \param s A pointer to an HDLC receiver context.
+    \return 0 for OK */
+SPAN_DECLARE(int) hdlc_rx_release(hdlc_rx_state_t *s);
+
+/*! Free an HDLC receiver context.
+    \brief Free an HDLC receiver context.
+    \param s A pointer to an HDLC receiver context.
+    \return 0 for OK */
+SPAN_DECLARE(int) hdlc_rx_free(hdlc_rx_state_t *s);
+
+/*! \brief Set the maximum frame length for an HDLC receiver context.
+    \param s A pointer to an HDLC receiver context.
+    \param max_len The maximum permitted length of a frame.
+*/
+SPAN_DECLARE(void) hdlc_rx_set_max_frame_len(hdlc_rx_state_t *s, size_t max_len);
+
+/*! \brief Set the octet counting report interval.
+    \param s A pointer to an HDLC receiver context.
+    \param interval The interval, in octets.
+*/
+SPAN_DECLARE(void) hdlc_rx_set_octet_counting_report_interval(hdlc_rx_state_t *s,
+                                                              int interval);
+
+/*! \brief Get the current receive statistics.
+    \param s A pointer to an HDLC receiver context.
+    \param t A pointer to the buffer for the statistics.
+    \return 0 for OK, else -1.
+*/
+SPAN_DECLARE(int) hdlc_rx_get_stats(hdlc_rx_state_t *s,
+                                    hdlc_rx_stats_t *t);
+
+/*! \brief Put a single bit of data to an HDLC receiver.
+    \param s A pointer to an HDLC receiver context.
+    \param new_bit The bit.
+*/
+SPAN_DECLARE_NONSTD(void) hdlc_rx_put_bit(hdlc_rx_state_t *s, int new_bit);
+
+/*! \brief Put a byte of data to an HDLC receiver.
+    \param s A pointer to an HDLC receiver context.
+    \param new_byte The byte of data.
+*/
+SPAN_DECLARE_NONSTD(void) hdlc_rx_put_byte(hdlc_rx_state_t *s, int new_byte);
+
+/*! \brief Put a series of bytes of data to an HDLC receiver.
+    \param s A pointer to an HDLC receiver context.
+    \param buf The buffer of data.
+    \param len The length of the data in the buffer.
+*/
+SPAN_DECLARE_NONSTD(void) hdlc_rx_put(hdlc_rx_state_t *s, const uint8_t buf[], int len);
+
+/*! \brief Initialise an HDLC transmitter context.
+    \param s A pointer to an HDLC transmitter context.
+    \param crc32 TRUE to use ITU CRC32. FALSE to use ITU CRC16.
+    \param inter_frame_flags The minimum flag octets to insert between frames (usually one).
+    \param progressive TRUE if frame creation works in progressive mode.
+    \param handler The callback function called when the HDLC transmitter underflows.
+    \param user_data An opaque parameter for the callback routine.
+    \return A pointer to the HDLC transmitter context.
+*/
+SPAN_DECLARE(hdlc_tx_state_t *) hdlc_tx_init(hdlc_tx_state_t *s,
+                                             int crc32,
+                                             int inter_frame_flags,
+                                             int progressive,
+                                             hdlc_underflow_handler_t handler,
+                                             void *user_data);
+
+SPAN_DECLARE(int) hdlc_tx_release(hdlc_tx_state_t *s);
+
+SPAN_DECLARE(int) hdlc_tx_free(hdlc_tx_state_t *s);
+
+/*! \brief Set the maximum frame length for an HDLC transmitter context.
+    \param s A pointer to an HDLC transmitter context.
+    \param max_len The maximum length.
+*/
+SPAN_DECLARE(void) hdlc_tx_set_max_frame_len(hdlc_tx_state_t *s, size_t max_len);
+
+/*! \brief Transmit a frame.
+    \param s A pointer to an HDLC transmitter context.
+    \param frame A pointer to the frame to be transmitted.
+    \param len The length of the frame to be transmitted.
+    \return 0 if the frame was accepted for transmission, else -1.
+*/
+SPAN_DECLARE(int) hdlc_tx_frame(hdlc_tx_state_t *s, const uint8_t *frame, size_t len);
+
+/*! \brief Corrupt the frame currently being transmitted, by giving it the wrong CRC.
+    \param s A pointer to an HDLC transmitter context.
+    \return 0 if the frame was corrupted, else -1.
+*/
+SPAN_DECLARE(int) hdlc_tx_corrupt_frame(hdlc_tx_state_t *s);
+
+/*! \brief Transmit a specified quantity of flag octets, typically as a preamble.
+    \param s A pointer to an HDLC transmitter context.
+    \param len The length of the required period of flags, in flag octets. If len is zero this
+           requests that HDLC transmission be terminated when the buffers have fully
+           drained.
+    \return 0 if the flags were accepted for transmission, else -1.
+*/
+SPAN_DECLARE(int) hdlc_tx_flags(hdlc_tx_state_t *s, int len);
+
+/*! \brief Send an abort.
+    \param s A pointer to an HDLC transmitter context.
+    \return 0 if the frame was aborted, else -1.
+*/
+SPAN_DECLARE(int) hdlc_tx_abort(hdlc_tx_state_t *s);
+
+/*! \brief Get the next bit for transmission.
+    \param s A pointer to an HDLC transmitter context.
+    \return The next bit for transmission.
+*/
+SPAN_DECLARE_NONSTD(int) hdlc_tx_get_bit(hdlc_tx_state_t *s);
+
+/*! \brief Get the next byte for transmission.
+    \param s A pointer to an HDLC transmitter context.
+    \return The next byte for transmission.
+*/
+SPAN_DECLARE_NONSTD(int) hdlc_tx_get_byte(hdlc_tx_state_t *s);
+
+/*! \brief Get the next sequence of bytes for transmission.
+    \param s A pointer to an HDLC transmitter context.
+    \param buf The buffer for the data.
+    \param max_len The number of bytes to get.
+    \return The number of bytes actually got.
+*/
+SPAN_DECLARE_NONSTD(int) hdlc_tx_get(hdlc_tx_state_t *s, uint8_t buf[], size_t max_len);
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif
+/*- End of file ------------------------------------------------------------*/

Repositories maintained by Peter Meerwald, pmeerw@pmeerw.net.