5
|
1 /*
|
|
2 * SpanDSP - a series of DSP components for telephony
|
|
3 *
|
|
4 * v42.h
|
|
5 *
|
|
6 * Written by Steve Underwood <steveu@coppice.org>
|
|
7 *
|
|
8 * Copyright (C) 2003 Steve Underwood
|
|
9 *
|
|
10 * All rights reserved.
|
|
11 *
|
|
12 * This program is free software; you can redistribute it and/or modify
|
|
13 * it under the terms of the GNU General Public License version 2, as
|
|
14 * published by the Free Software Foundation.
|
|
15 *
|
|
16 * This program is distributed in the hope that it will be useful,
|
|
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
19 * GNU General Public License for more details.
|
|
20 *
|
|
21 * You should have received a copy of the GNU General Public License
|
|
22 * along with this program; if not, write to the Free Software
|
|
23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
24 *
|
|
25 * $Id: v42.h,v 1.17 2006/10/24 13:22:02 steveu Exp $
|
|
26 */
|
|
27
|
|
28 /*! \page v42_page V.42 modem error correction
|
|
29 \section v42_page_sec_1 What does it do?
|
|
30 The V.42 specification defines an error correcting protocol for PSTN modems, based on
|
|
31 HDLC and LAP. This makes it similar to an X.25 link. A special variant of LAP, known
|
|
32 as LAP-M, is defined in the V.42 specification. A means for modems to determine if the
|
|
33 far modem supports V.42 is also defined.
|
|
34
|
|
35 \section v42_page_sec_2 How does it work?
|
|
36 */
|
|
37
|
|
38 #if !defined(_V42_H_)
|
|
39 #define _V42_H_
|
|
40
|
|
41 enum
|
|
42 {
|
|
43 LAPM_DETECT = 0,
|
|
44 LAPM_ESTABLISH = 1,
|
|
45 LAPM_DATA = 2,
|
|
46 LAPM_RELEASE = 3,
|
|
47 LAPM_SIGNAL = 4,
|
|
48 LAPM_SETPARM = 5,
|
|
49 LAPM_TEST = 6,
|
|
50 LAPM_UNSUPPORTED = 7
|
|
51 };
|
|
52
|
|
53 typedef void (*v42_status_func_t)(void *user_data, int status);
|
|
54 typedef void (*v42_frame_handler_t)(void *user_data, const uint8_t *pkt, int len);
|
|
55
|
|
56 typedef struct lapm_frame_queue_s
|
|
57 {
|
|
58 struct lapm_frame_queue_s *next;
|
|
59 int len;
|
|
60 uint8_t frame[];
|
|
61 } lapm_frame_queue_t;
|
|
62
|
|
63 /*!
|
|
64 LAP-M descriptor. This defines the working state for a single instance of LAP-M.
|
|
65 */
|
|
66 typedef struct
|
|
67 {
|
|
68 int handle;
|
|
69 hdlc_rx_state_t hdlc_rx;
|
|
70 hdlc_tx_state_t hdlc_tx;
|
|
71
|
|
72 v42_frame_handler_t iframe_receive;
|
|
73 void *iframe_receive_user_data;
|
|
74
|
|
75 v42_status_func_t status_callback;
|
|
76 void *status_callback_user_data;
|
|
77
|
|
78 int state;
|
|
79 int tx_waiting;
|
|
80 int debug;
|
|
81 /*! TRUE if originator. FALSE if answerer */
|
|
82 int we_are_originator;
|
|
83 /*! Remote network type (unknown, answerer. originator) */
|
|
84 int peer_is_originator;
|
|
85 /*! Next N(S) for transmission */
|
|
86 int next_tx_frame;
|
|
87 /*! The last of our frames which the peer acknowledged */
|
|
88 int last_frame_peer_acknowledged;
|
|
89 /*! Next N(R) for reception */
|
|
90 int next_expected_frame;
|
|
91 /*! The last of the peer's frames which we acknowledged */
|
|
92 int last_frame_we_acknowledged;
|
|
93 /*! TRUE if we sent an I or S frame with the F-bit set */
|
|
94 int solicit_f_bit;
|
|
95 /*! Retransmission count */
|
|
96 int retransmissions;
|
|
97 /*! TRUE if peer is busy */
|
|
98 int busy;
|
|
99
|
|
100 /*! Acknowledgement timer */
|
|
101 int t401_timer;
|
|
102 /*! Reply delay timer - optional */
|
|
103 int t402_timer;
|
|
104 /*! Inactivity timer - optional */
|
|
105 int t403_timer;
|
|
106 /*! Maximum number of octets in an information field */
|
|
107 int n401;
|
|
108 /*! Window size */
|
|
109 int window_size_k;
|
|
110
|
|
111 lapm_frame_queue_t *txqueue;
|
|
112 lapm_frame_queue_t *tx_next;
|
|
113 lapm_frame_queue_t *tx_last;
|
|
114 queue_t tx_queue;
|
|
115
|
|
116 span_sched_state_t sched;
|
|
117 /*! \brief Error and flow logging control */
|
|
118 logging_state_t logging;
|
|
119 } lapm_state_t;
|
|
120
|
|
121 /*!
|
|
122 V.42 descriptor. This defines the working state for a single instance of V.42.
|
|
123 */
|
|
124 typedef struct
|
|
125 {
|
|
126 /*! TRUE if we are the calling party, otherwise FALSE */
|
|
127 int caller;
|
|
128 /*! TRUE if we should detect whether the far end is V.42 capable. FALSE if we go
|
|
129 directly to protocol establishment */
|
|
130 int detect;
|
|
131
|
|
132 /*! Stage in negotiating V.42 support */
|
|
133 int rx_negotiation_step;
|
|
134 int rxbits;
|
|
135 int rxstream;
|
|
136 int rxoks;
|
|
137 int odp_seen;
|
|
138 int txbits;
|
|
139 int txstream;
|
|
140 int txadps;
|
|
141 /*! The LAP.M context */
|
|
142 lapm_state_t lapm;
|
|
143
|
|
144 /*! V.42 support detection timer */
|
|
145 int t400_timer;
|
|
146 /*! \brief Error and flow logging control */
|
|
147 logging_state_t logging;
|
|
148 } v42_state_t;
|
|
149
|
|
150 /*! Log the raw HDLC frames */
|
|
151 #define LAPM_DEBUG_LAPM_RAW (1 << 0)
|
|
152 /*! Log the interpreted frames */
|
|
153 #define LAPM_DEBUG_LAPM_DUMP (1 << 1)
|
|
154 /*! Log state machine changes */
|
|
155 #define LAPM_DEBUG_LAPM_STATE (1 << 2)
|
|
156
|
|
157 #ifdef __cplusplus
|
|
158 extern "C" {
|
|
159 #endif
|
|
160
|
|
161 const char *lapm_status_to_str(int status);
|
|
162
|
|
163 /*! Dump LAP.M frames in a raw and/or decoded forms
|
|
164 \param frame The frame itself
|
|
165 \param len The length of the frame, in octets
|
|
166 \param showraw TRUE if the raw octets should be dumped
|
|
167 \param txrx TRUE if tx, FALSE if rx. Used to highlight the packet's direction.
|
|
168 */
|
|
169 void lapm_dump(lapm_state_t *s, const uint8_t *frame, int len, int showraw, int txrx);
|
|
170
|
|
171 /*! Accept an HDLC packet
|
|
172 */
|
|
173 void lapm_receive(void *user_data, int ok, const uint8_t *buf, int len);
|
|
174
|
|
175 /*! Transmit a LAP.M frame
|
|
176 */
|
|
177 int lapm_tx(lapm_state_t *s, const void *buf, int len);
|
|
178
|
|
179 /*! Transmit a LAP.M information frame
|
|
180 */
|
|
181 int lapm_tx_iframe(lapm_state_t *s, const void *buf, int len, int cr);
|
|
182
|
|
183 /*! Send a break over a LAP.M connection
|
|
184 */
|
|
185 int lapm_break(lapm_state_t *s, int enable);
|
|
186
|
|
187 /*! Initiate an orderly release of a LAP.M connection
|
|
188 */
|
|
189 int lapm_release(lapm_state_t *s);
|
|
190
|
|
191 /*! Enable or disable loopback of a LAP.M connection
|
|
192 */
|
|
193 int lapm_loopback(lapm_state_t *s, int enable);
|
|
194
|
|
195 /*! Assign or remove a callback routine used to deal with V.42 status changes.
|
|
196 */
|
|
197 void v42_set_status_callback(v42_state_t *s, v42_status_func_t callback, void *user_data);
|
|
198
|
|
199 /*! Process a newly received bit for a V.42 context.
|
|
200 */
|
|
201 void v42_rx_bit(void *user_data, int bit);
|
|
202
|
|
203 /*! Get the next transmit bit for a V.42 context.
|
|
204 */
|
|
205 int v42_tx_bit(void *user_data);
|
|
206
|
|
207 /*! Initialise a V.42 context.
|
|
208 \param s The V.42 context.
|
|
209 \param caller TRUE if caller mode, else answerer mode.
|
|
210 \param frame_handler A callback function to handle received frames of data.
|
|
211 \param user_data An opaque pointer passed to the frame handler routine.
|
|
212 \return ???
|
|
213 */
|
|
214 v42_state_t *v42_init(v42_state_t *s, int caller, int detect, v42_frame_handler_t frame_handler, void *user_data);
|
|
215
|
|
216 /*! Restart a V.42 context.
|
|
217 \param s The V.42 context.
|
|
218 */
|
|
219 void v42_restart(v42_state_t *s);
|
|
220
|
|
221 /*! Release a V.42 context.
|
|
222 \param s The V.42 context.
|
|
223 \return 0 if OK */
|
|
224 int v42_release(v42_state_t *s);
|
|
225
|
|
226 #ifdef __cplusplus
|
|
227 }
|
|
228 #endif
|
|
229
|
|
230 #endif
|
|
231 /*- End of file ------------------------------------------------------------*/
|