source: rubycfg_asp/trunk/asp_dcre/tinet/net/ppp_modem.c@ 313

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

ソースを追加

  • 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.8 KB
Line 
1/*
2 * TINET (TCP/IP Protocol Stack)
3 *
4 * Copyright (C) 2001-2017 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 313 2017-07-23 04:50:32Z 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_endian.h>
62#include <net/net_buf.h>
63#include <net/net_count.h>
64#include <net/ppp.h>
65#include <net/ppp_var.h>
66#include <net/ppp_fsm.h>
67#include <net/ppp_hdlc.h>
68#include <net/ppp_modem.h>
69#include <net/ppp_lcp.h>
70
71#ifdef SUPPORT_PPP
72
73/*
74 * å…
75¨åŸŸå¤‰æ•°
76 */
77
78uint8_t modem_state = PPP_MODEM_DOWN; /* モデムの状æ…
79‹ */
80
81/*
82 * モデムå…
83¥åŠ›æ–‡å­—列
84 */
85
86#define MODEM_RCODE_OK 0
87#define MODEM_RCODE_CONNECT 1
88#define MODEM_RCODE_RING 2
89#define MODEM_RCODE_NO_CARRIER 3
90#define MODEM_RCODE_ERROR 4
91#define MODEM_RCODE_NO_DIALTONE 5
92#define MODEM_RCODE_BUSY 6
93#define MODEM_RCODE_DELAYED 7
94
95/*
96 * 変数
97 */
98
99static uint8_t *modem_rcode[] = {
100 "OK",
101 "CONNECT",
102 "RING",
103 "NO CARRIER",
104 "ERROR",
105 "NO DIALTONE",
106 "BUSY",
107 "DELAYED"
108 };
109
110static int_t dial_retry;
111
112/*
113 * 関数
114 */
115
116static void do_dial (void);
117static void modem_putstr (uint8_t *str);
118static void modem_wait (uint8_t *line);
119static void modem_putline (uint8_t *line);
120
121/*
122 * modem_getline -- モデム行å…
123¥åŠ›
124 */
125
126T_NET_BUF *
127modem_getline (T_NET_BUF *nbuf, uint16_t size)
128{
129 uint8_t *buf;
130
131 buf = nbuf->buf;
132 size --; /* '\0' の分 */
133 while (size > 0 && (*buf = HDLC_raw_getoctet()) != '\r') {
134 buf ++;
135 size --;
136 }
137 *buf = '\0';
138 HDLC_raw_getoctet(); /* \n を読み飛ばす。*/
139 nbuf->len = buf - nbuf->buf;
140 return nbuf;
141 }
142
143/*
144 * モデム制御
145 *
146 * 戻り値: モデムからのリザルトコード
147 */
148
149int_t
150modem_cntl (T_NET_BUF *input)
151{
152 int_t code;
153
154 code = sizeof(modem_rcode) / sizeof(uint8_t*) - 1;
155 while (strcmp(modem_rcode[code], input->buf) != 0) {
156 if (code == 0)
157 return modem_state;
158 code --;
159 }
160
161 switch (modem_state) {
162
163 case PPP_MODEM_UP:
164 if (code == MODEM_RCODE_RING)
165 modem_state = PPP_MODEM_RING;
166 break;
167
168 case PPP_MODEM_DIAL:
169 if (code == MODEM_RCODE_CONNECT) {
170 syslog(LOG_NOTICE, "[MODEM] up.");
171 modem_state = PPP_MODEM_CONNECT;
172 lcp_open(PPP_OPEN_ACTIVE);
173 sig_sem(SEM_MODEM_READY);
174 }
175 else {
176 syslog(LOG_NOTICE, "[MODEM] dial failed '%s'.", modem_rcode[code]);
177 if (-- dial_retry == 0) {
178 syslog(LOG_WARNING, "[MODEM] dial failed %d times.", MODEM_CFG_RETRY_CNT);
179 modem_state = PPP_MODEM_UP;
180 }
181 else {
182 syscall(dly_tsk(MODEM_CFG_RETRY_WAIT));
183 do_dial();
184 }
185 }
186 break;
187
188 case PPP_MODEM_RING:
189 if (code == MODEM_RCODE_CONNECT) {
190 syslog(LOG_NOTICE, "[MODEM] up.");
191 modem_state = PPP_MODEM_CONNECT;
192 lcp_open(PPP_OPEN_PASSIVE);
193 }
194 else
195 modem_state = PPP_MODEM_UP;
196 break;
197
198 default:
199 if (code == MODEM_RCODE_NO_CARRIER) {
200 if (lcp_fsm.state == PPP_FSM_OPENED)
201 lcp_close();
202 syslog(LOG_NOTICE, "[MODEM] down.");
203 modem_state = PPP_MODEM_UP;
204 }
205 break;
206
207 }
208
209 return code;
210 }
211
212/*
213 * init_modem -- モデムを初期化する。
214 */
215
216void
217init_modem (void)
218{
219 modem_putline("AT");
220
221#ifdef MODEM_CFG_INIT
222
223 modem_putline(MODEM_CFG_INIT);
224
225#endif /* of #ifdef MODEM_CFG_INIT */
226
227 modem_state = PPP_MODEM_UP;
228 }
229
230/*
231 * wait_modem -- 接続完了まで待
232つ。
233 *
234 * 戻り値: 接続に失敗したら E_OBJ を返す。
235 */
236
237ER
238wait_modem (void)
239{
240 ER error = E_OK;
241
242 if (modem_state == PPP_MODEM_UP) {
243 dial();
244 }
245
246 if (modem_state != PPP_MODEM_CONNECT) {
247 /* 接続完了まで待
248つ。*/
249 wai_sem(SEM_MODEM_READY);
250 if (modem_state != PPP_MODEM_CONNECT)
251 error = E_OBJ;
252 }
253
254 return error;
255 }
256
257/*
258 * dial -- ダイヤルする。リトライ回数をセットする。
259 */
260
261void
262dial (void)
263{
264 do_dial();
265 dial_retry = MODEM_CFG_RETRY_CNT;
266 modem_state = PPP_MODEM_DIAL;
267 }
268
269/*
270 * do_dial -- ダイヤルする。dial() の下請け関数
271 */
272
273static void
274do_dial (void)
275{
276 syslog(LOG_NOTICE, "[MODEM] dial: %s.", MODEM_CFG_PHONE_NUMBER);
277 modem_putstr(MODEM_CFG_DIAL);
278 modem_putstr(MODEM_CFG_PHONE_NUMBER);
279 modem_putstr("\r");
280 }
281
282/*
283 * modem_putstr -- モデム文字列出力
284 */
285
286static void
287modem_putstr (uint8_t *str)
288{
289 while (*str)
290 HDLC_raw_putoctet(*str ++);
291 }
292
293/*
294 * modem_wait -- モデムから文字列を待
295つ
296 */
297
298static void
299modem_wait (uint8_t *line)
300{
301 int_t ch, state, len = strlen(line);
302
303 state = len;
304 while (state != 0) {
305 ch = HDLC_raw_getoctet();
306 if (ch != line[len - state])
307 state = len;
308 if (ch == line[len - state])
309 state --;
310 }
311 }
312
313/*
314 * modem_putline -- モデム行出力
315 */
316
317static void
318modem_putline (uint8_t *line)
319{
320 modem_putstr(line);
321 modem_putstr("\r");
322 modem_wait("OK\r\n");
323 }
324
325#endif /* fo #ifdef SUPPORT_PPP */
Note: See TracBrowser for help on using the repository browser.