source: azure_iot_hub/trunk/asp3_dcre/tinet/net/ppp_modem.c@ 389

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

ビルドが通るよう更新

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