source: EcnlProtoTool/trunk/asp3_dcre/tinet/net/ppp_modem.c@ 321

Last change on this file since 321 was 321, checked in by coas-nagasima, 7 years ago

文字コードを設定

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 6.7 KB
Line 
1/*
2 * TINET (TCP/IP Protocol Stack)
3 *
4 * Copyright (C) 2001-2009 by Dep. of Computer Science and Engineering
5 * Tomakomai National College of Technology, JAPAN
6 *
7 * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation
8 * によって公表されている GNU General Public License の Version 2 に記
9 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
10 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
11 * 利用と呼ぶ)することを無償で許諾する.
12 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
13 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
14 * スコード中に含まれていること.
15 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
16 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
17 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
18 * の無保証規定を掲載すること.
19 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
20 * 用できない形で再配布する場合には,次の条件を満たすこと.
21 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
22 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
23 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
24 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
25 *
26 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
27 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
28 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
29 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
30 *
31 * @(#) $Id$
32 */
33
34/*
35 * PPP モデム制御
36 */
37
38#include <string.h>
39
40#include <t_services.h>
41#include "kernel_id.h"
42
43#include <tinet_defs.h>
44#include <tinet_config.h>
45
46#include <net/if.h>
47#include <net/if_ppp.h>
48#include <net/net.h>
49#include <net/net_buf.h>
50#include <net/net_count.h>
51#include <net/ppp.h>
52#include <net/ppp_var.h>
53#include <net/ppp_fsm.h>
54#include <net/ppp_hdlc.h>
55#include <net/ppp_modem.h>
56#include <net/ppp_lcp.h>
57
58#ifdef SUPPORT_PPP
59
60/*
61 * 全域変数
62 */
63
64uint8_t modem_state = PPP_MODEM_DOWN; /* モデムの状態 */
65
66/*
67 * モデム入力文字列
68 */
69
70#define MODEM_RCODE_OK 0
71#define MODEM_RCODE_CONNECT 1
72#define MODEM_RCODE_RING 2
73#define MODEM_RCODE_NO_CARRIER 3
74#define MODEM_RCODE_ERROR 4
75#define MODEM_RCODE_NO_DIALTONE 5
76#define MODEM_RCODE_BUSY 6
77#define MODEM_RCODE_DELAYED 7
78
79/*
80 * 変数
81 */
82
83static uint8_t *modem_rcode[] = {
84 "OK",
85 "CONNECT",
86 "RING",
87 "NO CARRIER",
88 "ERROR",
89 "NO DIALTONE",
90 "BUSY",
91 "DELAYED"
92 };
93
94static int_t dial_retry;
95
96/*
97 * 関数
98 */
99
100static void do_dial (void);
101static void modem_putstr (uint8_t *str);
102static void modem_wait (uint8_t *line);
103static void modem_putline (uint8_t *line);
104
105/*
106 * modem_getline -- モデム行入力
107 */
108
109T_NET_BUF *
110modem_getline (T_NET_BUF *nbuf, uint16_t size)
111{
112 uint8_t *buf;
113
114 buf = nbuf->buf;
115 size --; /* '\0' の分 */
116 while (size > 0 && (*buf = HDLC_raw_getoctet()) != '\r') {
117 buf ++;
118 size --;
119 }
120 *buf = '\0';
121 HDLC_raw_getoctet(); /* \n を読み飛ばす。*/
122 nbuf->len = buf - nbuf->buf;
123 return nbuf;
124 }
125
126/*
127 * モデム制御
128 *
129 * 戻り値: モデムからのリザルトコード
130 */
131
132int_t
133modem_cntl (T_NET_BUF *input)
134{
135 int_t code;
136
137 code = sizeof(modem_rcode) / sizeof(uint8_t*) - 1;
138 while (strcmp(modem_rcode[code], input->buf) != 0) {
139 if (code == 0)
140 return modem_state;
141 code --;
142 }
143
144 switch (modem_state) {
145
146 case PPP_MODEM_UP:
147 if (code == MODEM_RCODE_RING)
148 modem_state = PPP_MODEM_RING;
149 break;
150
151 case PPP_MODEM_DIAL:
152 if (code == MODEM_RCODE_CONNECT) {
153 syslog(LOG_NOTICE, "[MODEM] up.");
154 modem_state = PPP_MODEM_CONNECT;
155 lcp_open(PPP_OPEN_ACTIVE);
156 sig_sem(SEM_MODEM_READY);
157 }
158 else {
159 syslog(LOG_NOTICE, "[MODEM] dial failed '%s'.", modem_rcode[code]);
160 if (-- dial_retry == 0) {
161 syslog(LOG_WARNING, "[MODEM] dial failed %d times.", MODEM_CFG_RETRY_CNT);
162 modem_state = PPP_MODEM_UP;
163 }
164 else {
165 syscall(dly_tsk(MODEM_CFG_RETRY_WAIT));
166 do_dial();
167 }
168 }
169 break;
170
171 case PPP_MODEM_RING:
172 if (code == MODEM_RCODE_CONNECT) {
173 syslog(LOG_NOTICE, "[MODEM] up.");
174 modem_state = PPP_MODEM_CONNECT;
175 lcp_open(PPP_OPEN_PASSIVE);
176 }
177 else
178 modem_state = PPP_MODEM_UP;
179 break;
180
181 default:
182 if (code == MODEM_RCODE_NO_CARRIER) {
183 if (lcp_fsm.state == PPP_FSM_OPENED)
184 lcp_close();
185 syslog(LOG_NOTICE, "[MODEM] down.");
186 modem_state = PPP_MODEM_UP;
187 }
188 break;
189
190 }
191
192 return code;
193 }
194
195/*
196 * init_modem -- モデムを初期化する。
197 */
198
199void
200init_modem (void)
201{
202 modem_putline("AT");
203
204#ifdef MODEM_CFG_INIT
205
206 modem_putline(MODEM_CFG_INIT);
207
208#endif /* of #ifdef MODEM_CFG_INIT */
209
210 modem_state = PPP_MODEM_UP;
211 }
212
213/*
214 * wait_modem -- 接続完了まで待つ。
215 *
216 * 戻り値: 接続に失敗したら E_OBJ を返す。
217 */
218
219ER
220wait_modem (void)
221{
222 ER error = E_OK;
223
224 if (modem_state == PPP_MODEM_UP) {
225 dial();
226 }
227
228 if (modem_state != PPP_MODEM_CONNECT) {
229 /* 接続完了まで待つ。*/
230 wai_sem(SEM_MODEM_READY);
231 if (modem_state != PPP_MODEM_CONNECT)
232 error = E_OBJ;
233 }
234
235 return error;
236 }
237
238/*
239 * dial -- ダイヤルする。リトライ回数をセットする。
240 */
241
242void
243dial (void)
244{
245 do_dial();
246 dial_retry = MODEM_CFG_RETRY_CNT;
247 modem_state = PPP_MODEM_DIAL;
248 }
249
250/*
251 * do_dial -- ダイヤルする。dial() の下請け関数
252 */
253
254static void
255do_dial (void)
256{
257 syslog(LOG_NOTICE, "[MODEM] dial: %s.", MODEM_CFG_PHONE_NUMBER);
258 modem_putstr(MODEM_CFG_DIAL);
259 modem_putstr(MODEM_CFG_PHONE_NUMBER);
260 modem_putstr("\r");
261 }
262
263/*
264 * modem_putstr -- モデム文字列出力
265 */
266
267static void
268modem_putstr (uint8_t *str)
269{
270 while (*str)
271 HDLC_raw_putoctet(*str ++);
272 }
273
274/*
275 * modem_wait -- モデムから文字列を待つ
276 */
277
278static void
279modem_wait (uint8_t *line)
280{
281 int_t ch, state, len = strlen(line);
282
283 state = len;
284 while (state != 0) {
285 ch = HDLC_raw_getoctet();
286 if (ch != line[len - state])
287 state = len;
288 if (ch == line[len - state])
289 state --;
290 }
291 }
292
293/*
294 * modem_putline -- モデム行出力
295 */
296
297static void
298modem_putline (uint8_t *line)
299{
300 modem_putstr(line);
301 modem_putstr("\r");
302 modem_wait("OK\r\n");
303 }
304
305#endif /* fo #ifdef SUPPORT_PPP */
Note: See TracBrowser for help on using the repository browser.