source: EcnlProtoTool/trunk/asp3_dcre/tinet/net/ppp_ipcp.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: 18.2 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_ipcp.c 270 2017-02-09 04:03:47Z coas-nagasima $
44 */
45
46/*
47 * ipcp.c - PPP IP Control Protocol.
48 *
49 * Copyright (c) 1989 Carnegie Mellon University.
50 * All rights reserved.
51 *
52 * Redistribution and use in source and binary forms are permitted
53 * provided that the above copyright notice and this paragraph are
54 * duplicated in all such forms and that any documentation,
55 * advertising materials, and other materials related to such
56 * distribution and use acknowledge that the software was developed
57 * by Carnegie Mellon University. The name of the
58 * University may not be used to endorse or promote products derived
59 * from this software without specific prior written permission.
60 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
61 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
62 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
63 */
64
65/*
66 * PPP IP Control Protocol (IPCP) Module
67 *
68 * Written by Toshiharu OHNO (tony-o@iij.ad.jp)
69 *
70 * Copyright (C) 1993, Internet Initiative Japan, Inc. All rights reserverd.
71 *
72 * Redistribution and use in source and binary forms are permitted
73 * provided that the above copyright notice and this paragraph are
74 * duplicated in all such forms and that any documentation,
75 * advertising materials, and other materials related to such
76 * distribution and use acknowledge that the software was developed
77 * by the Internet Initiative Japan, Inc. The name of the
78 * IIJ may not be used to endorse or promote products derived
79 * from this software without specific prior written permission.
80 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
81 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
82 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
83 *
84 * $FreeBSD: src/usr.sbin/ppp/ipcp.c,v 1.90.2.4 2000/08/19 09:30:03 brian Exp $
85 *
86 * TODO:
87 * o Support IPADDRS properly
88 * o Validate the length in IpcpDecodeConfig
89 */
90
91#include <string.h>
92
93#include <s_services.h>
94#include <t_services.h>
95#include "kernel_id.h"
96
97#include <tinet_defs.h>
98#include <tinet_config.h>
99
100#include <net/if.h>
101#include <net/if_ppp.h>
102#include <net/net.h>
103#include <net/net_buf.h>
104#include <net/net_count.h>
105#include <net/ppp.h>
106#include <net/ppp_var.h>
107#include <net/ppp_fsm.h>
108#include <net/ppp_lcp.h>
109#include <net/ppp_ipcp.h>
110#include <net/ppp_modem.h>
111
112#include <netinet/in.h>
113#include <netinet/in_var.h>
114#include <netinet/ip.h>
115#include <netinet/tcp.h>
116#include <netinet/tcp_timer.h>
117#include <netinet/tcp_var.h>
118#include <netinet/udp_var.h>
119
120#include <net/if_var.h>
121
122#ifdef SUPPORT_PPP
123
124/*
125 * 関数
126 */
127
128static void ipcp_init (void);
129static void ipcp_input (T_NET_BUF *input);
130static void ipcp_protrej (void);
131static void ipcp_lowerup (void);
132static void ipcp_lowerdown (void);
133static void ipcp_open (void);
134static void ipcp_close (void);
135
136/*
137 * FSM から呼出されるコールバック関
138 */
139
140static void ipcp_resetci(T_PPP_FSM *fsm); /* 自構成情
141報をリセットする。 */
142static int_t ipcp_cilen (T_PPP_FSM *fsm); /* 構成情
143報の長さを返す。 */
144static void ipcp_addci (T_PPP_FSM *fsm, T_NET_BUF *output);
145 /* 自構成情
146報を追加する。 */
147static bool_t ipcp_ackci (T_PPP_FSM *fsm, T_NET_BUF *input);
148 /* ACK を受信したときの処理 */
149static bool_t ipcp_nakci (T_PPP_FSM *fsm, T_NET_BUF *input);
150 /* NAK を受信したときの処理 */
151static bool_t ipcp_rejci (T_PPP_FSM *fsm, T_NET_BUF *input);
152 /* REJ を受信したときの処理 */
153static int_t ipcp_reqci (T_PPP_FSM *fsm, T_NET_BUF *input, T_NET_BUF *output);
154 /* 相手の構成情
155報を確認する。 */
156static void ipcp_up (T_PPP_FSM *fsm); /* リンク接続を確立する。 */
157static void ipcp_down (T_PPP_FSM *fsm); /* リンク接続を解放する。 */
158static void ipcp_finished(T_PPP_FSM *fsm); /* 下位層を終了する。 */
159
160/*
161 * 変数
162 */
163
164static T_IFNET ipcp_local_def_cfg = { /* 自構成情
165報の規定値 */
166 NULL,
167 {
168 IPV4_ADDR_LOCAL, /* IP アドレス */
169 UINT_C(0), /* サブネットマスク */
170 },
171 };
172
173static T_IFNET ipcp_remote_def_cfg = { /* 相手の構成情
174報の規定値 */
175 NULL,
176 {
177 IPV4_ADDR_REMOTE, /* IP アドレス */
178 UINT_C(0), /* サブネットマスク */
179 }
180 };
181
182static T_IFNET ipcp_local_neg_cfg; /* ネゴ中の自構成情
183å ± */
184
185static T_IFNET ipcp_remote_neg_cfg; /* ネゴ中の相手の構成情
186å ± */
187
188/*
189 * å…
190¨åŸŸå¤‰æ•°
191 */
192
193T_PPP_FSM_CALLBACKS ipcp_callbacks = {
194 ipcp_resetci, /* 自構成情
195報をリセットする。 */
196 ipcp_cilen, /* 構成情
197報の長さを返す。 */
198 ipcp_addci, /* 自構成情
199報を追加する。 */
200 ipcp_ackci, /* ACK を受信したときの処理 */
201 ipcp_nakci, /* NAK を受信したときの処理 */
202 ipcp_rejci, /* REJ を受信したときの処理 */
203 ipcp_reqci, /* 相手の構成情
204報を確認する。 */
205 ipcp_up, /* リンク接続を確立する。 */
206 ipcp_down, /* リンク接続を解放する。 */
207 NULL, /* 下位層を開始する。 */
208 ipcp_finished, /* 下位層を終了する。 */
209 NULL, /* 再送する。 */
210 NULL, /* 不明な CP を受信したときの処理 */
211 };
212
213T_PPP_FSM ipcp_fsm = {
214 &ipcp_callbacks, /* コールバック関数 */
215 PPP_IPCP, /* プロトコル */
216 };
217
218T_PPP_PROTENT ipcp_protent = {
219 PPP_IPCP,
220 ipcp_init, /* 初期化 */
221 ipcp_input, /* å…
222¥åŠ› */
223 ipcp_protrej, /* Proto-REJ 受信処理 */
224 ipcp_lowerup, /* 下位層を起動する */
225 ipcp_lowerdown, /* 下位層を停止する */
226 ipcp_open, /* オープンする */
227 ipcp_close, /* クローズする */
228 ip_input, /* データå…
229¥åŠ›ã€IP å…
230¥åŠ› */
231 };
232
233T_IFNET ipcp_local_ack_cfg; /* 相手に許可されたの自構成情
234å ± */
235T_IFNET ipcp_remote_ack_cfg; /* 相手に許可した構成情
236å ± */
237
238/*
239 * ppp_get_ifnet -- ネットワークインタフェース構造体を返す。
240 */
241
242T_IFNET *
243ppp_get_ifnet (void)
244{
245 return &ipcp_local_ack_cfg;
246 }
247
248/*
249 * wait_ipcp -- IP 接続完了まで待
250つ。
251 *
252 * 戻り値: 接続に失敗したら E_OBJ を返す。
253 */
254
255ER
256wait_ipcp (void)
257{
258#ifdef PPP_CFG_MODEM
259 ER error;
260#endif /* of #ifdef PPP_CFG_MODEM */
261
262 if (ipcp_fsm.state <= PPP_FSM_STOPPED) {
263
264#ifdef PPP_CFG_MODEM
265
266 /* モデムの接続完了まで待
267つ。*/
268 if ((error = wait_modem()) != E_OK)
269 return error;
270
271#else /* of #ifdef PPP_CFG_MODEM */
272
273 /*
274 * 受動オープンし、相手からの接続待
275ちなら LCP を一度クローズし、
276 * 能動オープン状æ…
277‹ã§ã€å†ã‚ªãƒ¼ãƒ—ンする。
278 */
279 lcp_close();
280 lcp_open(PPP_OPEN_ACTIVE);
281
282#endif /* of #ifdef PPP_CFG_MODEM */
283
284 }
285
286 if (ipcp_fsm.state != PPP_FSM_OPENED) {
287 /* IP 接続完了まで待
288つ。*/
289 wai_sem(SEM_IPCP_READY);
290 if (ipcp_fsm.state != PPP_FSM_OPENED)
291 return E_OBJ;
292 }
293
294 return E_OK;
295 }
296
297/*
298 * ipcp_init -- IPCP モジュールの初期化
299 */
300
301static void
302ipcp_init (void)
303{
304 fsm_init(&ipcp_fsm);
305 }
306
307/*
308 * ipcp_input -- IPCP å…
309¥åŠ›
310 */
311
312static void
313ipcp_input (T_NET_BUF *input)
314{
315 NET_COUNT_PPP_IPCP(net_count_ppp_ipcp_in_octets, input->len);
316 NET_COUNT_PPP_IPCP(net_count_ppp_ipcp_in_packets, 1);
317 fsm_input(&ipcp_fsm, input);
318 }
319
320/*
321 * ipcp_resetci -- IPCPの構成情
322報をリセットする。
323 */
324
325static void
326ipcp_resetci (T_PPP_FSM *fsm)
327{
328 /* 自構成情
329報の初期設定 */
330 ipcp_local_neg_cfg = ipcp_local_def_cfg;
331 memset((void*)&ipcp_local_ack_cfg, 0, sizeof(T_IFNET));
332
333 /* 相手の構成情
334報の初期設定 */
335 ipcp_remote_neg_cfg = ipcp_remote_def_cfg;
336 memset((void*)&ipcp_remote_ack_cfg, 0, sizeof(T_IFNET));
337 }
338
339/*
340 * ipcp_cilen -- 構成情
341報の長さを返す。
342 */
343
344static int_t
345ipcp_cilen (T_PPP_FSM *fsm)
346{
347 int_t cilen = 0;
348
349 cilen += sizeof(T_PPP_CI_HDR) + sizeof(uint32_t); /* IP アドレス */
350
351 return cilen;
352 }
353
354/*
355 * ipcp_addci -- IPCPの構成情
356報を追加する。
357 */
358
359static void
360ipcp_addci (T_PPP_FSM *fsm, T_NET_BUF *output)
361{
362 uint8_t *buf;
363
364 buf = output->buf + sizeof(T_PPP_HDR) + sizeof(T_PPP_CP_HDR);
365
366 /* IP アドレスオプションを追加する。 */
367 *buf ++ = IPCP_CIT_ADDR;
368 *buf ++ = sizeof(T_PPP_CI_HDR) + sizeof(uint32_t);
369 ahtonl(buf, ipcp_local_neg_cfg.in_ifaddr.addr);
370 buf += sizeof(uint32_t);
371 }
372
373/*
374 * ipcp_ackci -- ACK を受信したときの処理
375 *
376 * 戻り値: true ACK は正常
377 * false ACK は異常
378 */
379
380static bool_t
381ipcp_ackci (T_PPP_FSM *fsm, T_NET_BUF *input)
382{
383 uint8_t *buf;
384 uint16_t len;
385
386 buf = input->buf + sizeof(T_PPP_HDR) + sizeof(T_PPP_CP_HDR);
387 len = input->len - (sizeof(T_PPP_HDR) + sizeof(T_PPP_CP_HDR));
388
389 /*
390 * 構成情
391報は送信した順に完å…
392¨ã«ä¸€è‡´ã—なければならない。
393 * 従って、ipcp_addci で作成した順に解析する。
394 */
395
396 /* ADDR オプションを解析する。 */
397 if (len < sizeof(T_PPP_CI_HDR) + sizeof(uint32_t) ||
398 *buf ++ != IPCP_CIT_ADDR ||
399 *buf ++ != sizeof(T_PPP_CI_HDR) + sizeof(uint32_t)||
400 nahcmpl(buf, ipcp_local_neg_cfg.in_ifaddr.addr))
401 return false;
402 buf += sizeof(uint32_t);
403 len -= sizeof(T_PPP_CI_HDR) + sizeof(uint32_t);
404
405 return true;
406 }
407
408/*
409 * ipcp_nakci -- NAK を受信したときの処理
410 *
411 * 戻り値: 1 NAK は正常
412 * 0 NAK は異常
413 */
414
415static int_t
416ipcp_nakci (T_PPP_FSM *fsm, T_NET_BUF *input)
417{
418 T_IFNET new_cfg;
419 uint32_t cilong;
420 uint16_t len;
421 uint8_t *buf, cilen;
422
423 buf = input->buf + sizeof(T_PPP_HDR) + sizeof(T_PPP_CP_HDR);
424 len = input->len - (sizeof(T_PPP_HDR) + sizeof(T_PPP_CP_HDR));
425
426 new_cfg = ipcp_local_neg_cfg;
427
428 /* ADDR オプションを解析する。 */
429 if (len >= sizeof(T_PPP_CI_HDR) + sizeof(uint32_t) &&
430 * buf == IPCP_CIT_ADDR &&
431 *(buf + 1) == sizeof(T_PPP_CI_HDR) + sizeof(uint32_t)) {
432 ntoahl(cilong, buf + 2);
433 buf += sizeof(T_PPP_CI_HDR) + sizeof(uint32_t);
434 len -= sizeof(T_PPP_CI_HDR) + sizeof(uint32_t);
435 new_cfg.in_ifaddr.addr = cilong;
436 }
437
438 /* 後は無視する。*/
439 while (len > sizeof(T_PPP_CI_HDR)) {
440 cilen = *(buf + 1);
441 if (len < cilen)
442 return 0;
443 buf += cilen;
444 len -= cilen;
445 }
446
447 /* 長さが 0 でなければエラー */
448 if (len != 0)
449 return 0;
450
451 /* 新しいオプションを設定する。*/
452 if (fsm->state != PPP_FSM_OPENED)
453 ipcp_local_neg_cfg = new_cfg;
454
455 return 1;
456 }
457
458/*
459 * ipcp_rejci -- REJ を受信したときの処理
460 *
461 * 戻り値: 1 REJ は正常
462 * 0 REJ は異常
463 */
464
465static int_t
466ipcp_rejci (T_PPP_FSM *fsm, T_NET_BUF *input)
467{
468 T_IFNET new_cfg;
469 uint8_t *buf;
470 uint16_t len;
471
472 buf = input->buf + sizeof(T_PPP_HDR) + sizeof(T_PPP_CP_HDR);
473 len = input->len - (sizeof(T_PPP_HDR) + sizeof(T_PPP_CP_HDR));
474
475 new_cfg = ipcp_local_neg_cfg;
476
477 /* ADDR オプションを解析する。 */
478 if (len >= sizeof(T_PPP_CI_HDR) + sizeof(uint32_t) &&
479 * buf == IPCP_CIT_ADDR &&
480 *(buf + 1) == sizeof(T_PPP_CI_HDR) + sizeof(uint32_t)) {
481 buf += sizeof(T_PPP_CI_HDR) + sizeof(uint32_t);
482 len -= sizeof(T_PPP_CI_HDR) + sizeof(uint32_t);
483 new_cfg.in_ifaddr.addr = 0;
484 }
485
486 /* 長さが 0 でなければエラー */
487 if (len != 0)
488 return 0;
489
490 /* 新しいオプションを設定する。*/
491 if (fsm->state != PPP_FSM_OPENED)
492 ipcp_local_neg_cfg = new_cfg;
493
494 return 1;
495 }
496
497/*
498 * ipcp_reqci -- 相手の構成情
499報を解析する。
500 */
501
502static int_t
503ipcp_reqci (T_PPP_FSM *fsm, T_NET_BUF *input, T_NET_BUF *output)
504{
505 uint32_t addr;
506 uint16_t code, final, len, cilen;
507 uint8_t *np, *rp, *ap, *cp, type = 0;
508
509 rp = ap = input->buf + sizeof(T_PPP_HDR) + sizeof(T_PPP_CP_HDR);
510 /* rp: REJ、ap: ACK する CI のポインタ */
511 /* 拒否する場合は、引数 buf に上書きする。 */
512 len = input->len - (sizeof(T_PPP_HDR) + sizeof(T_PPP_CP_HDR));
513 np = output->buf + sizeof(T_PPP_HDR) + sizeof(T_PPP_CP_HDR);
514 final = PPP_CONFACK; /* 最終的に送信するコード */
515 while (len > 0) {
516 code = PPP_CONFACK;
517 cp = ap; /* cp: 現在処理中の CI */
518
519 if (len < sizeof(T_PPP_CI_HDR)) {
520
521 /* 残りが CI ヘッダより短い */
522 syslog(LOG_NOTICE, "[PPP/IPCP] bad CI len: %d.", len);
523 cilen = len; /* データ長が異常の場合の処置 */
524 len = 0; /* ループから抜ける。 */
525 code = PPP_CONFREJ;
526 goto endswitch;
527 }
528
529 type = *ap ++; /* CI の型 */
530 cilen = *ap ++; /* CI の長さ */
531 if (len < cilen) {
532
533 /* 残りが CI 長より短い */
534 syslog(LOG_NOTICE, "[PPP/IPCP] bad CI len: %d.", cilen);
535 cilen = len; /* データ長が異常の場合の処置 */
536 len = 0; /* ループから抜ける。 */
537 code = PPP_CONFREJ;
538 goto endswitch;
539 }
540 len -= sizeof(T_PPP_CI_HDR);
541
542 /* CI の型により分岐する。*/
543 switch (type) {
544
545 case IPCP_CIT_ADDR: /* IP アドレス */
546
547 /* CI 長が、ヘッダ + 4 オクテットでなければエラー */
548 if (cilen != sizeof(T_PPP_CI_HDR) + sizeof(uint32_t))
549 code = PPP_CONFREJ;
550 else {
551 ntoahl(addr, ap);
552 if (addr != ipcp_remote_neg_cfg.in_ifaddr.addr &&
553 (addr == 0 || ipcp_remote_neg_cfg.in_ifaddr.addr != 0)) {
554 *np ++ = IPCP_CIT_ADDR;
555 *np ++ = sizeof(T_PPP_CI_HDR) + sizeof(uint32_t);
556 ahtonl(np, ipcp_remote_neg_cfg.in_ifaddr.addr);
557 np += sizeof(uint32_t);
558 code = PPP_CONFNAK;
559 }
560#if 1 /* 要確認 */
561 else if (addr == 0 && ipcp_remote_neg_cfg.in_ifaddr.addr == 0)
562#else
563 else if (addr == 0 || ipcp_remote_neg_cfg.in_ifaddr.addr == 0)
564#endif
565 code = PPP_CONFREJ;
566 else
567 ipcp_remote_neg_cfg.in_ifaddr.addr = addr;
568 }
569 break;
570
571 default:
572 syslog(LOG_INFO, "[PPP/IPCP] unexp opt: %d.", type);
573 code = PPP_CONFREJ;
574 break;
575 }
576endswitch:
577
578 if (code == PPP_CONFNAK) {
579 /* CI の型が Magic Number の場合を除いて、NAK の回数が */
580 /* 最大値 MAX_PPP_FAILURES を超
581えたら拒否する。 */
582 if (fsm->failures >= MAX_PPP_FAILURES)
583 code = PPP_CONFREJ;
584 else if (final != PPP_CONFREJ)
585 final = PPP_CONFNAK;
586 }
587
588 /* この CI を拒否する */
589 if (code == PPP_CONFREJ) {
590 if (rp < cp) /* 前に詰める。*/
591 memcpy(rp, cp, cilen);
592 rp += cilen;
593 final = PPP_CONFREJ;
594 }
595
596 ap += cilen - sizeof(T_PPP_CI_HDR);
597 len -= cilen - sizeof(T_PPP_CI_HDR);
598 }
599
600 /* 最終的な長さを調整する。*/
601 switch (final) {
602 case PPP_CONFNAK:
603 output->len = np - output->buf;
604 memcpy(output->buf, input->buf, sizeof(T_PPP_HDR) + sizeof(T_PPP_CP_HDR));
605 break;
606 case PPP_CONFREJ:
607 memcpy(output->buf, input->buf, output->len = rp - input->buf);
608 break;
609 case PPP_CONFACK:
610 memcpy(output->buf, input->buf, input->len);
611 break;
612 }
613
614 return final;
615 }
616
617/*
618 * ipcp_up -- リンク接続を確立する。
619 */
620
621static void
622ipcp_up (T_PPP_FSM *fsm)
623{
624 /* 自構成情
625報の初期設定 */
626 ipcp_local_ack_cfg = ipcp_local_neg_cfg;
627
628 /*
629 * サブネットマスクと
630 * ローカル・ブロードキャスト IP アドレスを設定する。
631 */
632 ipcp_local_ack_cfg.in_ifaddr.mask = MAKE_IPV4_LOCAL_MASK(ipcp_local_neg_cfg.in_ifaddr.addr);
633
634 /* 相手の構成情
635報の初期設定 */
636 ipcp_remote_ack_cfg = ipcp_remote_neg_cfg;
637
638 /*
639 * サブネットマスクと
640 * ローカル・ブロードキャスト IP アドレスを設定する。
641 */
642 ipcp_remote_ack_cfg.in_ifaddr.mask = MAKE_IPV4_LOCAL_MASK(ipcp_remote_neg_cfg.in_ifaddr.addr);
643
644 sig_sem(SEM_IPCP_READY);
645
646 syslog(LOG_NOTICE, "[PPP/IPCP] up, Local IP Addr: %s, Remote IP Addr: %s.",
647 ip2str(NULL, &ipcp_local_neg_cfg.in_ifaddr.addr),
648 ip2str(NULL, &ipcp_remote_neg_cfg.in_ifaddr.addr));
649 }
650
651/*
652 * ipcp_down -- リンク接続を解放する。
653 */
654
655static void
656ipcp_down (T_PPP_FSM *fsm)
657{
658 sig_sem(SEM_IPCP_READY);
659 syslog(LOG_NOTICE, "[PPP/IPCP] down.");
660 }
661
662/*
663 * ipcp_finished -- 下位層を終了する。
664 */
665
666static void
667ipcp_finished (T_PPP_FSM *fsm)
668{
669 }
670
671/*
672 * ipcp_protrej -- Proto-REJ を受信したときの処理
673 */
674
675static void
676ipcp_protrej (void)
677{
678 fsm_lowerdown(&ipcp_fsm);
679 }
680
681/*
682 * ipcp_lowerup -- IPCP 下位層を起動する。
683 */
684
685static void
686ipcp_lowerup (void)
687{
688 fsm_lowerup(&ipcp_fsm);
689 }
690
691/*
692 * ipcp_lowerdown -- IPCP 下位層を停止する。
693 */
694
695static void
696ipcp_lowerdown (void)
697{
698 fsm_lowerdown(&ipcp_fsm);
699 }
700
701/*
702 * ipcp_open -- IPCP のオープン
703 */
704
705static void
706ipcp_open (void)
707{
708 fsm_open(&ipcp_fsm);
709 }
710
711/*
712 * ipcp_close -- IPCP のクローズ
713 */
714
715static void
716ipcp_close (void)
717{
718 fsm_close(&ipcp_fsm);
719 }
720
721#endif /* fo #ifdef SUPPORT_PPP */
Note: See TracBrowser for help on using the repository browser.