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

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

mruby版ECNLプロトタイピング・ツールを追加

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