Changeset 318 for asp3_gr_sakura/trunk/tinet/netapp/dhcp4_cli.c
- Timestamp:
- Aug 3, 2017, 10:46:41 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
asp3_gr_sakura/trunk/tinet/netapp/dhcp4_cli.c
- Property svn:keywords deleted
-
Property svn:mime-type
changed from
text/x-csrc
totext/x-csrc; charset=UTF-8
r317 r318 95 95 * Tomakomai National College of Technology, JAPAN 96 96 * 97 * ä¸è¨èä½æ¨©è 98 ã¯ï¼ä»¥ä¸ã® (1)ï½(4) ã®æ¡ä»¶ãï¼Free Software Foundation 99 * ã«ãã£ã¦å 100 ¬è¡¨ããã¦ãã GNU General Public License ã® Version 2 ã«è¨ 101 * è¿°ããã¦ããæ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§ã¢ï¼æ¬ã½ããã¦ã§ã¢ 102 * ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹å¤ã»åé 103 å¸ï¼ä»¥ä¸ï¼ 104 * å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼ 105 * (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½ 106 * 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼ 107 * ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼ 108 * (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 109 * ç¨ã§ããå½¢ã§åé 110 å¸ããå ´åã«ã¯ï¼åé 111 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨ 112 * è 113 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ 114 * ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 115 * (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 116 * ç¨ã§ããªãå½¢ã§åé 117 å¸ããå ´åã«ã¯ï¼æ¬¡ã®ããããã®æ¡ä»¶ãæºããã 118 * ã¨ï¼ 119 * (a) åé 120 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è 121 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è 122 * ä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 123 * (b) åé 124 å¸ã®å½¢æ 125 ãï¼å¥ã«å®ããæ¹æ³ã«ãã£ã¦ï¼TOPPERSããã¸ã§ã¯ãã« 126 * å ±åãããã¨ï¼ 127 * (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ 128 * 害ãããï¼ä¸è¨èä½æ¨©è 129 ããã³TOPPERSããã¸ã§ã¯ããå 130 責ãããã¨ï¼ 97 * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation 98 * によって公表されている GNU General Public License の Version 2 に記 99 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア 100 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, 101 * 利用と呼ぶ)することを無償で許諾する. 102 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 103 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 104 * スコード中に含まれていること. 105 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 106 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 107 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 108 * の無保証規定を掲載すること. 109 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 110 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 111 * と. 112 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 113 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 114 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 115 * 報告すること. 116 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 117 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 131 118 * 132 * æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 133 ã 134 * ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ãã®é©ç¨å¯è½æ§ã 135 * å«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´ 136 * æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ãã®è²¬ä»»ãè² ããªãï¼ 119 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 120 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も 121 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 122 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. 137 123 * 138 124 * @(#) $Id$ … … 183 169 184 170 /* 185 * DHCP ã¯ã©ã¤ã¢ã³ãã¿ã¹ã¯171 * DHCP クライアントタスク 186 172 */ 187 173 … … 189 175 190 176 /* 191 * å¤æ° 192 */ 193 194 static T_DHCP4_CLI_CONTEXT context; /* ã¯ã©ã¤ã¢ã³ãã³ã³ããã¹ã */ 195 static uint8_t magicno[DHCP4_MAGIC_LEN] = DHCP4_RFC1048_MAGIC; /* magic çªå·ï¼RFC1048ï¼*/ 196 197 /* å¿ 198 é ãªãã·ã§ã³ãªã¹ã */ 177 * 変数 178 */ 179 180 static T_DHCP4_CLI_CONTEXT context; /* クライアントコンテキスト */ 181 static uint8_t magicno[DHCP4_MAGIC_LEN] = DHCP4_RFC1048_MAGIC; /* magic 番号(RFC1048)*/ 182 183 /* 必須オプションリスト */ 199 184 #ifdef DHCP4_CLI_CFG_REQUIRED_OLIST 200 185 static uint8_t required_plist[] = DHCP4_CLI_CFG_REQUIRED_OLIST; 201 186 #endif 202 187 203 /* è¦æ±ãªãã·ã§ã³ãªã¹ã*/188 /* 要求オプションリスト */ 204 189 #ifdef DHCP4_CLI_CFG_REQUEST_OLIST 205 190 static uint8_t request_plist[] = DHCP4_CLI_CFG_REQUEST_OLIST; … … 207 192 208 193 /* 209 * dhcp4_cksum -- ãã§ãã¯ãµã ã®è¨ç®é¢æ°194 * dhcp4_cksum -- チェックサムの計算関数 210 195 */ 211 196 212 197 static uint32_t 213 dhcp4_cksum (void *data, uint_t len /* ãªã¯ãããåä½*/)198 dhcp4_cksum (void *data, uint_t len /*オクテット単位*/) 214 199 { 215 200 uint32_t carry, sum = 0; … … 229 214 230 215 /* 231 * create_xid -- ãã©ã³ã¶ã¯ã·ã§ã³ ID ãçæããã216 * create_xid -- トランザクション ID を生成する。 232 217 */ 233 218 … … 245 230 246 231 /* 247 * find_option_sub -- æå®ãããªãã·ã§ã³ãæ¢ç´¢ããã232 * find_option_sub -- 指定したオプションを探索する。 248 233 * 249 * 注æ: å¼æ° size ã 0 ã®æã¯ãªãã·ã§ã³ãµã¤ãºãæ¤è¨¼ããªãã234 * 注意: 引数 size が 0 の時はオプションサイズを検証しない。 250 235 */ 251 236 … … 282 267 283 268 /* 284 * find_option -- æå®ãããªãã·ã§ã³ãæ¢ç´¢ããã269 * find_option -- 指定したオプションを探索する。 285 270 * 286 * 注æ: å¼æ° size ã 0 ã®æã¯ãªãã·ã§ã³ãµã¤ãºãæ¤è¨¼ããªãã271 * 注意: 引数 size が 0 の時はオプションサイズを検証しない。 287 272 */ 288 273 … … 296 281 297 282 /* 298 * is_equal_sid -- ã¡ãã»ã¼ã¸å 299 ã® SERVER ID ãæ¯è¼ããã 283 * is_equal_sid -- メッセージ内の SERVER ID を比較する。 300 284 */ 301 285 … … 314 298 315 299 /* 316 * timer_value -- ã¡ãã»ã¼ã¸ããæéæ 317 å ±ãåãåºãã 300 * timer_value -- メッセージから時間情報を取り出す。 318 301 */ 319 302 … … 328 311 else { 329 312 330 /* ãµã¼ãããã®ãªã¼ã¹æéã¯[s]ã*/313 /* サーバからのリース時間は[s]。*/ 331 314 seconds = msg2host32(opt + 2); 332 315 333 /* ã³ã³ããã¹ãå 334 ã®ãªã¼ã¹æé㯠SYSTIM_HZã*/ 316 /* コンテキスト内のリース時間は SYSTIM_HZ。*/ 335 317 if (seconds == DHCP4_TIME_INFINITY) 336 318 return DHCP4_TIME_INFINITY; … … 343 325 344 326 /* 345 * rel_addr -- IPv4 ã¢ãã¬ã¹ããµãããããã¹ã¯ãéççµè·¯è¡¨ã解æ¾ããã327 * rel_addr -- IPv4 アドレス、サブネットマスク、静的経路表を解放する。 346 328 */ 347 329 … … 386 368 387 369 /* 388 * rel_options -- ãªã¼ã¹ããããªãã·ã§ã³ã解æãã¦å¤ã解æ¾ããã370 * rel_options -- リースされたオプションを解析して値を解放する。 389 371 */ 390 372 … … 452 434 453 435 /* 454 * rel_lease -- ãªã¼ã¹ãããæ 455 å ±ã解æ¾ããã 436 * rel_lease -- リースされた情報を解放する。 456 437 */ 457 438 … … 459 440 rel_lease (T_DHCP4_CLI_CONTEXT *ct) 460 441 { 461 /* æå¹ãªãªã¼ã¹ã»ã¡ãã»ã¼ã¸æ§é ä½ãç¡ããã°ä½ãããªãã*/442 /* 有効なリース・メッセージ構造体が無ければ何もしない。*/ 462 443 if (ct->act_msg == NULL) 463 444 return; 464 445 465 /* ãªã¼ã¹ããããªãã·ã§ã³ã解æãã¦å¤ã解æ¾ããã*/446 /* リースされたオプションを解析して値を解放する。*/ 466 447 rel_options(ct, DHCP4_OPTION_OFFSET + DHCP4_MAGIC_LEN, 467 448 ct->act_msg->len - (DHCP4_OPTION_OFFSET + DHCP4_MAGIC_LEN), true); 468 449 rel_addr(); 469 450 470 /* æå¹ãªãªã¼ã¹ã»ã¡ãã»ã¼ã¸æ§é ä½ã解æ¾ããã*/451 /* 有効なリース・メッセージ構造体を解放する。*/ 471 452 syscall(rel_mpf(MPF_DHCP4_CLI_MSG, (void*)ct->act_msg)); 472 453 ct->act_msg = NULL; … … 474 455 475 456 /* 476 * set_addr -- IPv4 ã¢ãã¬ã¹ããµãããããã¹ã¯ãéççµè·¯è¡¨ãè¨å®ããã457 * set_addr -- IPv4 アドレス、サブネットマスク、静的経路表を設定する。 477 458 */ 478 459 … … 513 494 514 495 /* 515 * set_options -- ãªã¼ã¹ããããªãã·ã§ã³ã解æãã¦å¤ãè¨å®ããã496 * set_options -- リースされたオプションを解析して値を設定する。 516 497 */ 517 498 … … 586 567 587 568 /* 588 * set_lease -- ãªã¼ã¹ãããæ 589 å ±ãè¨å®ããã 569 * set_lease -- リースされた情報を設定する。 590 570 */ 591 571 … … 593 573 set_lease (T_DHCP4_CLI_CONTEXT *ct) 594 574 { 595 /* ãªã¼ã¹ããããªãã·ã§ã³ã解æãã¦å¤ãè¨å®ããã*/575 /* リースされたオプションを解析して値を設定する。*/ 596 576 set_options(ct, DHCP4_OPTION_OFFSET + DHCP4_MAGIC_LEN, 597 577 ct->act_msg->len - (DHCP4_OPTION_OFFSET + DHCP4_MAGIC_LEN), true); … … 599 579 600 580 /* 601 * validate_duplicate -- æå®ããã IPv4 ã¢ãã¬ã¹ã使ããã¦ããªããæ¤è¨¼ããã581 * validate_duplicate -- 指定された IPv4 アドレスが使われていないか検証する。 602 582 * 603 * 使ããã¦ããªãæ㯠true ãè¿ãã583 * 使われていない時は true を返す。 604 584 */ 605 585 … … 609 589 T_IN4_ADDR yiaddr; 610 590 611 /* æå®ããã IPv4 ã¢ãã¬ã¹ã ADDR ANY ãªã使ããã¦ããªãã¨å¤æããã*/591 /* 指定された IPv4 アドレスが ADDR ANY なら使われていないと判断する。*/ 612 592 yiaddr = ntohl(msg->msg.yiaddr); 613 593 if (yiaddr == IPV4_ADDRANY) 614 594 return true; 615 595 616 /* ARP ãã£ãã·ã¥ã«ããã°ä½¿ããã¦ããã¨å¤æããã*/596 /* ARP キャッシュにあれば使われていると判断する。*/ 617 597 if (arp_lookup(yiaddr, false) != NULL) 618 598 return false; 619 599 620 600 /* 621 * ARP è¦æ±ãåºåã㦠TMO_DHCP4C_ARP_WAIT å¾ 622 ã¡ã 623 * ARP ãã£ãã·ã¥ã«ãªããã°ä½¿ããã¦ããªãã¨å¤æããã 601 * ARP 要求を出力して TMO_DHCP4C_ARP_WAIT 待ち、 602 * ARP キャッシュになければ使われていないと判断する。 624 603 */ 625 604 arp_request(&IF_ETHER_NIC_GET_SOFTC()->ifaddr, yiaddr); … … 629 608 630 609 /* 631 * validate_rcv_msg -- åä¿¡ã¡ãã»ã¼ã¸ãæ¤è¨¼ããã610 * validate_rcv_msg -- 受信メッセージを検証する。 632 611 */ 633 612 … … 637 616 uint8_t *opt; 638 617 639 /* packet type ã DHCP4_REPLY ã§ãããã¨ã確èªããã*/618 /* packet type が DHCP4_REPLY であることを確認する。*/ 640 619 if (!(msg->msg.op == DHCP4_REPLY)) 641 620 return false; 642 621 643 /* ã¡ãã»ã¼ã¸ã¿ã¤ããªãã·ã§ã³ããããã¨ã確èªããã*/622 /* メッセージタイプオプションがあることを確認する。*/ 644 623 if ((opt = find_option(msg, DHCP4_OPT_MSG_TYPE, 1)) == NULL) 645 624 return E_PAR; 646 625 647 /* ã¡ãã»ã¼ã¸ã®ã¿ã¤ããä¸è´ãã¦ãããã¨ãæ¤è¨¼ããã*/626 /* メッセージのタイプが一致していることを検証する。*/ 648 627 msg->type = *(opt + 2); 649 628 switch (ct->fsm) { … … 675 654 } 676 655 677 /* ãã¸ãã¯çªå·ãæ¤è¨¼ããã*/656 /* マジック番号を検証する。*/ 678 657 if (memcmp((uint8_t*)&msg->msg.options, magicno, DHCP4_MAGIC_LEN)) 679 658 return E_PAR; 680 659 681 /* ãã©ã³ã¶ã¯ã·ã§ã³ ID ãç°ãªã£ã¦ããã°ã¨ã©ã¼*/660 /* トランザクション ID が異なっていればエラー */ 682 661 if (ntohl(msg->msg.xid) != ct->xid) 683 662 return E_PAR; 684 663 685 /* ãã¼ãã¦ã§ã¢ã¢ãã¬ã¹é·ã 6ï¼MAC ã¢ãã¬ã¹é·ï¼ã§ãªããã°ã¨ã©ã¼*/664 /* ハードウェアアドレス長が 6(MAC アドレス長)でなければエラー */ 686 665 if (msg->msg.hlen != ETHER_ADDR_LEN) 687 666 return E_PAR; 688 667 689 /* ãã¼ãã¦ã§ã¢ã¢ãã¬ã¹ãç°ãªã£ã¦ããã°ã¨ã©ã¼*/668 /* ハードウェアアドレスが異なっていればエラー */ 690 669 if (memcmp(&msg->msg.chaddr, &ct->sc->ifaddr.lladdr, sizeof(ct->sc->ifaddr.lladdr))) 691 670 return E_PAR; 692 671 693 672 /* 694 * ã¡ãã»ã¼ã¸ã¿ã¤ãã OFFER ã®å ´åã¯ã 695 * ARP ã使ç¨ãã¦ãæå®ããã IPv4 ã¢ãã¬ã¹ã使ããã¦ããªããæ¤è¨¼ããã 696 * 使ããã¦ããæã¯ãä»ã® IPv4 ã¢ãã¬ã¹ã®æä¾ãå¾ 697 ã¤ã 673 * メッセージタイプが OFFER の場合は、 674 * ARP を使用して、指定された IPv4 アドレスが使われていないか検証する。 675 * 使われている時は、他の IPv4 アドレスの提供を待つ。 698 676 */ 699 677 if (msg->type == DHCP4_MTYPE_OFFER) { … … 706 684 707 685 /* 708 * eval_prefer -- åä¿¡ã¡ãã»ã¼ã¸ã®æ¨å¥¨åº¦ãè©ä¾¡ããã686 * eval_prefer -- 受信メッセージの推奨度を評価する。 709 687 */ 710 688 … … 714 692 int ix; 715 693 716 /* ç¡å¹ã®å ´åã¯çµäºããã*/694 /* 無効の場合は終了する。*/ 717 695 if (msg == NULL) 718 696 return; 719 697 720 /* æå®ããã IPv4 ã¢ãã¬ã¹ã ADDR ANY ãªãæ¨å¥¨åº¦ã 0ã«è¨å®ããã*/698 /* 指定された IPv4 アドレスが ADDR ANY なら推奨度を 0に設定する。*/ 721 699 if (ntohl(msg->msg.yiaddr) == IPV4_ADDRANY) 722 700 msg->prefer = 0; … … 726 704 #if defined(DHCP4_CLI_CFG_REQUEST_OLIST) 727 705 728 /* è¦æ±ãªãã·ã§ã³ãæ¤è¨¼ããã*/706 /* 要求オプションを検証する。*/ 729 707 for (ix = sizeof(request_plist); ix -- > 0; ) { 730 708 if (find_option(msg, request_plist[ix], 0) != NULL) … … 736 714 #if defined(DHCP4_CLI_CFG_REQUIRED_OLIST) 737 715 738 /* å¿ 739 é ãªãã·ã§ã³ãæ¤è¨¼ããã*/ 716 /* 必須オプションを検証する。*/ 740 717 for (ix = sizeof(required_plist); ix -- > 0; ) { 741 718 if (find_option(msg, required_plist[ix], 0) == NULL) … … 747 724 748 725 /* 749 * eval_rcv_msg -- åä¿¡ã¡ãã»ã¼ã¸ãè©ä¾¡ããã726 * eval_rcv_msg -- 受信メッセージを評価する。 750 727 */ 751 728 … … 755 732 T_DHCP4_CLI_MSG *evl, *msg; 756 733 757 /* ã¡ãã»ã¼ã¸ãåä¿¡ãã¦ããªããã°ä¸æ¢ããã*/734 /* メッセージを受信していなければ中止する。*/ 758 735 syscall(wai_sem(SEM_DHCP4_CLI_LOCK)); 759 736 if (ct->val_lst == NULL) { … … 762 739 } 763 740 764 /* æ¤è¨¼ã¡ãã»ã¼ã¸ãªã¹ãããè©ä¾¡ã¡ãã»ã¼ã¸ãåãåºãã*/741 /* 検証メッセージリストから評価メッセージを取り出す。*/ 765 742 evl = ct->val_lst; 766 743 ct->val_lst = ct->val_lst->next; … … 768 745 syscall(sig_sem(SEM_DHCP4_CLI_LOCK)); 769 746 770 /* è©ä¾¡ã¡ãã»ã¼ã¸ãæ¤è¨¼ããã*/747 /* 評価メッセージを検証する。*/ 771 748 if (validate_rcv_msg(ct, evl) != E_OK) { 772 749 773 /* ã¨ã©ã¼ãçºçããè©ä¾¡ã¡ãã»ã¼ã¸ãåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã«æ»ãã*/750 /* エラーが発生した評価メッセージを受信メッセージ構造体リストに戻す。*/ 774 751 goto rcv_ret; 775 752 } 776 753 777 /* åä¿¡ããã¡ãã»ã¼ã¸ã NAK ã®æã®å¦ç*/754 /* 受信したメッセージが NAK の時の処理 */ 778 755 if (evl->type == DHCP4_MTYPE_NAK) { 779 756 780 /* ãªã¼ã¹ãããæ 781 å ±ã解æ¾ããã*/ 757 /* リースされた情報を解放する。*/ 782 758 rel_lease(ct); 783 759 784 /* å 785 é¨ã¨ã©ã¼ãè¨å®ãã¦çµäºããã*/ 760 /* 内部エラーを設定して終了する。*/ 786 761 return E_PAR; 787 762 } 788 763 789 /* REL_INFO ç¶æ 790 ã®æã®å¦ç */ 764 /* REL_INFO 状態の時の処理 */ 791 765 //cons_printf(CONSOLE_PORTID, "evl_rcv_msg3[s=%d]\n", ct->fsm); 792 766 if (ct->fsm == DHCP4_FSM_REL_INFO) { … … 798 772 } 799 773 800 /* è©ä¾¡ã¡ãã»ã¼ã¸ã®æ¨å¥¨åº¦ãè©ä¾¡ããã*/774 /* 評価メッセージの推奨度を評価する。*/ 801 775 eval_prefer(evl); 802 776 803 /* æ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ãã空ãªãè©ä¾¡ã¡ãã»ã¼ã¸ã移ãã¦çµäºããã*/777 /* 推奨メッセージリストが空なら評価メッセージを移して終了する。*/ 804 778 if (ct->prf_lst == NULL) { 805 779 ct->max_prefer = evl->prefer; … … 808 782 } 809 783 810 /* è©ä¾¡ã¡ãã»ã¼ã¸ã®æ¨å¥¨åº¦ã¨æ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ãã®æ大æ¨å¥¨åº¦ãæ¯è¼ããã*/784 /* 評価メッセージの推奨度と推奨メッセージリストの最大推奨度を比較する。*/ 811 785 if (evl->prefer > ct->max_prefer) { 812 786 813 787 /* 814 * è©ä¾¡ã¡ãã»ã¼ã¸ã®æ¨å¥¨åº¦ãæ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ãã®æ大æ¨å¥¨åº¦ããé«ããã°ã815 * æ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ããåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã«æ»ãã816 * è©ä¾¡ã¡ãã»ã¼ã¸ãæ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ãã«ç§»ãã788 * 評価メッセージの推奨度が推奨メッセージリストの最大推奨度より高ければ、 789 * 推奨メッセージリストを受信メッセージ構造体リストに戻し、 790 * 評価メッセージを推奨メッセージリストに移す。 817 791 */ 818 792 ct->max_prefer = evl->prefer; … … 835 809 836 810 /* 837 * æ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ãã«åã DHCP4_OPT_SERVER_ID ã®ã¡ãã»ã¼ã¸ãããã°ã838 * è©ä¾¡ã¡ãã»ã¼ã¸ãåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã«æ»ãã811 * 推奨メッセージリストに同じ DHCP4_OPT_SERVER_ID のメッセージがあれば、 812 * 評価メッセージを受信メッセージ構造体リストに戻す。 839 813 */ 840 814 goto rcv_ret; … … 843 817 844 818 /* 845 * è©ä¾¡ã¡ãã»ã¼ã¸ãæ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ãã«ç§»ãã819 * 評価メッセージを推奨メッセージリストに移す。 846 820 */ 847 821 evl->next = ct->prf_lst; … … 852 826 /*else */ 853 827 /* 854 * è©ä¾¡ã¡ãã»ã¼ã¸ã®æ¨å¥¨åº¦ãæ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ãã®æ大æ¨å¥¨åº¦ããä½ããã°ã855 * è©ä¾¡ã¡ãã»ã¼ã¸ãåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã«æ»ãã828 * 評価メッセージの推奨度が推奨メッセージリストの最大推奨度より低ければ、 829 * 評価メッセージを受信メッセージ構造体リストに戻す。 856 830 */ 857 831 … … 865 839 866 840 /* 867 * select_msg -- æ¨å¥¨ã¡ãã»ã¼ã¸ãé¸æããã841 * select_msg -- 推奨メッセージを選択する。 868 842 */ 869 843 … … 875 849 syscall(wai_sem(SEM_DHCP4_CLI_LOCK)); 876 850 if (ct->prf_lst == NULL) { 877 /* ã¡ãã»ã¼ã¸ãåä¿¡ãã¦ããªããã°ä¸æ¢ããã*/851 /* メッセージを受信していなければ中止する。*/ 878 852 syscall(sig_sem(SEM_DHCP4_CLI_LOCK)); 879 853 return NULL; 880 854 } 881 855 882 /* æ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ãã®å 883 é ã®ã¡ãã»ã¼ã¸ãé¸æããã*/ 856 /* 推奨メッセージリストの先頭のメッセージを選択する。*/ 884 857 select = ct->prf_lst; 885 858 ct->prf_lst = ct->prf_lst->next; 886 859 select->next = NULL; 887 860 888 /* é¸æãããªãã£ãæ¤è¨¼ã¡ãã»ã¼ã¸ãåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã«æ»ãã*/861 /* 選択されなかった検証メッセージを受信メッセージ構造体リストに戻す。*/ 889 862 if (ct->rcv_lst == NULL) 890 863 ct->rcv_lst = ct->prf_lst; … … 899 872 900 873 /* 901 * select_ack -- ACK ã¡ãã»ã¼ã¸ãæ¤è¨¼ããã874 * select_ack -- ACK メッセージを検証する。 902 875 * 903 * åãå 904 ¥ãããã¨ãå¯è½ã®æ㯠true ãè¿ãã 876 * 受け入れることが可能の時は true を返す。 905 877 */ 906 878 … … 913 885 return false; 914 886 915 /* æå¹ãªãªã¼ã¹ã»ã¡ãã»ã¼ã¸ãæ®ã£ã¦ããã°ãåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã«æ»ãã*/887 /* 有効なリース・メッセージが残っていれば、受信メッセージ構造体リストに戻す。*/ 916 888 if (ct->act_msg != NULL) { 917 889 syscall(wai_sem(SEM_DHCP4_CLI_LOCK)); … … 921 893 } 922 894 923 /* æå¹ãªãªã¼ã¹ã»ã¡ãã»ã¼ã¸ã«è¨å®ããã*/895 /* 有効なリース・メッセージに設定する。*/ 924 896 ct->act_msg = msg; 925 897 return true; … … 927 899 928 900 /* 929 * select_offer -- OFFER ã¡ãã»ã¼ã¸ãæ¤è¨¼ããã901 * select_offer -- OFFER メッセージを検証する。 930 902 * 931 * åãå 932 ¥ãããã¨ãå¯è½ã®æ㯠true ãè¿ãã 903 * 受け入れることが可能の時は true を返す。 933 904 */ 934 905 … … 940 911 941 912 /* 942 * cancel_all_timers -- å 943 ¨ã¦ã® TIMER ããã£ã³ã»ã«ããã 913 * cancel_all_timers -- 全ての TIMER をキャンセルする。 944 914 */ 945 915 … … 957 927 958 928 /* 959 * start_select -- DISCOVER ã¡ãã»ã¼ã¸ãéä¿¡ã㦠SELECT ç¶æ 960 ã«é·ç§»ããã 929 * start_select -- DISCOVER メッセージを送信して SELECT 状態に遷移する。 961 930 */ 962 931 … … 964 933 start_select (T_DHCP4_CLI_CONTEXT *ct) 965 934 { 966 /* éä¿¡ãéå§ããæéãè¨é²ããã*/935 /* 送信を開始した時間を記録する。*/ 967 936 get_tim(&ct->snd_start); 968 937 969 /* OFFER ã¡ãã»ã¼ã¸åä¿¡ã¿ã¤ã ã¢ã¦ããè¨å®ããã*/938 /* OFFER メッセージ受信タイムアウトを設定する。*/ 970 939 syscall(wai_sem(SEM_DHCP4_CLI_TIMER)); 971 940 ct->timers[DHCP4C_TIMER_RCV_OFFER] = SYSTIM2TIMER(TMO_DHCP4C_OFFER); 972 941 syscall(sig_sem(SEM_DHCP4_CLI_TIMER)); 973 942 974 /* éä¿¡å 975 ã¢ãã¬ã¹ã«ãã¼ã«ã«ãããã¯ã¼ã¯ã¸ã®ããã¼ããã£ã¹ããè¨å®ããã*/ 943 /* 送信先アドレスにローカルネットワークへのブロードキャストを設定する。*/ 976 944 ct->dst.ipaddr = IPV4_ADDRBROADCAST; 977 945 978 /* éä¿¡ééããªã»ããããã*/946 /* 送信間隔をリセットする。*/ 979 947 ct->interval = 0; 980 948 981 /* SELECT ç¶æ 982 ã«é·ç§»ããã*/ 949 /* SELECT 状態に遷移する。*/ 983 950 ct->fsm = DHCP4_FSM_SELECT; 984 951 985 /* DISCOVER ã¡ãã»ã¼ã¸ãéä¿¡ããã*/952 /* DISCOVER メッセージを送信する。*/ 986 953 ct->flags |= DHCP4C_FLAG_TMOUT_SND_DISC; 987 954 syscall(sig_sem(SEM_DHCP4_CLI_READY)); … … 989 956 990 957 /* 991 * start_bound -- BOUND ç¶æ 992 ã«é·ç§»ããã 958 * start_bound -- BOUND 状態に遷移する。 993 959 */ 994 960 … … 996 962 start_bound (T_DHCP4_CLI_CONTEXT *ct) 997 963 { 998 /* ãªã¼ã¹ãããæ 999 å ±ãè¨å®ããã*/ 964 /* リースされた情報を設定する。*/ 1000 965 set_lease(ct); 1001 966 1002 /* ãªã¼ã¹ã®æå¹æéãè¨å®ããã*/967 /* リースの有効時間を設定する。*/ 1003 968 ct->expire = timer_value(ct->act_msg, DHCP4_OPT_LEASE_TIME, TMO_DHCP4C_DEF_LEASE); 1004 969 1005 /* ãªã¼ã¹æéã TMO_DHCP4C_MIN_LEASE 以ä¸ã®æã¯ãTMO_DHCP4C_MIN_LEASE ã«è¨å®ããã*/970 /* リース時間が TMO_DHCP4C_MIN_LEASE 以下の時は、TMO_DHCP4C_MIN_LEASE に設定する。*/ 1006 971 if (ct->expire < TMO_DHCP4C_MIN_LEASE) 1007 972 ct->expire = TMO_DHCP4C_MIN_LEASE; 1008 973 1009 /* RENEW ç¶æ 1010 ã¾ã§ã®æéãè¨å®ããã*/ 974 /* RENEW 状態までの時間を設定する。*/ 1011 975 ct->renew = timer_value(ct->act_msg, DHCP4_OPT_RENEWAL_T1, ct->expire / 2); 1012 976 1013 /* REBIND ç¶æ 1014 ã¾ã§ã®æéãè¨å®ããã*/ 977 /* REBIND 状態までの時間を設定する。*/ 1015 978 ct->rebind = timer_value(ct->act_msg, DHCP4_OPT_REBINDING_T2, ct->renew + ct->renew / 2 + ct->renew / 4); 1016 979 1017 /* EXPIRE ãRENEWãREBIND ã¿ã¤ãã¼ãè¨å®ããã*/980 /* EXPIRE、RENEW、REBIND タイマーを設定する。*/ 1018 981 syscall(wai_sem(SEM_DHCP4_CLI_TIMER)); 1019 ct->timers[DHCP4C_TIMER_EXPIRE] = SYSTIM2TIMER(ct->expire); /* EXPIRE ã¾ã§ã®æé*/1020 ct->timers[DHCP4C_TIMER_REBIND] = SYSTIM2TIMER(ct->rebind); /* REBIND ï¼T2ï¼ã¾ã§ã®æé*/1021 ct->timers[DHCP4C_TIMER_RENEW] = SYSTIM2TIMER(ct->renew); /* RENEW ï¼T1ï¼ã¾ã§ã®æé*/982 ct->timers[DHCP4C_TIMER_EXPIRE] = SYSTIM2TIMER(ct->expire); /* EXPIRE までの時間 */ 983 ct->timers[DHCP4C_TIMER_REBIND] = SYSTIM2TIMER(ct->rebind); /* REBIND(T2)までの時間 */ 984 ct->timers[DHCP4C_TIMER_RENEW] = SYSTIM2TIMER(ct->renew); /* RENEW (T1)までの時間 */ 1022 985 syscall(sig_sem(SEM_DHCP4_CLI_TIMER)); 1023 986 1024 /* BOUND ç¶æ 1025 ã«é·ç§»ããã*/ 987 /* BOUND 状態に遷移する。*/ 1026 988 ct->fsm = DHCP4_FSM_BOUND; 1027 989 1028 /* BIND ãéå§ããæéãè¨é²ããã*/990 /* BIND を開始した時間を記録する。*/ 1029 991 get_tim(&ct->bind_start); 1030 992 } 1031 993 1032 994 /* 1033 * start_send_request -- REQUEST ã¡ãã»ã¼ã¸ãéä¿¡ãã¦ãæå®ãããç¶æ 1034 ã«é·ç§»ããã 995 * start_send_request -- REQUEST メッセージを送信して、指定された状態に遷移する。 1035 996 */ 1036 997 … … 1040 1001 T_IFNET *ifp = IF_GET_IFNET(); 1041 1002 1042 /* éä¿¡ãéå§ããæéãè¨é²ããã*/1003 /* 送信を開始した時間を記録する。*/ 1043 1004 get_tim(&ct->snd_start); 1044 1005 1045 /* é·ç§»ããç¶æ 1046 ã RENEW 以å¤ã§ã¯ ACK/NAK ã¡ãã»ã¼ã¸åä¿¡ã¿ã¤ã ã¢ã¦ããè¨å®ããã*/ 1006 /* 遷移する状態が RENEW 以外では ACK/NAK メッセージ受信タイムアウトを設定する。*/ 1047 1007 if (fsm != DHCP4_FSM_RENEW) { 1048 1008 syscall(wai_sem(SEM_DHCP4_CLI_TIMER)); … … 1052 1012 1053 1013 /* 1054 * é·ç§»ããç¶æ 1055 ã RENEW ã§ã 1056 * SERVER ID ãªãã·ã§ã³ãããã°ãã¼ã«ã«ãããã¯ã¼ã¯ã¸ã®ããã¼ããã£ã¹ããéä¿¡ããã 1014 * 遷移する状態が RENEW で、 1015 * SERVER ID オプションがあればローカルネットワークへのブロードキャストを送信する。 1057 1016 */ 1058 1017 if ((fsm == DHCP4_FSM_RENEW) && … … 1062 1021 ct->dst.ipaddr = IPV4_ADDRBROADCAST; 1063 1022 1064 /* éä¿¡ééããªã»ããããã*/1023 /* 送信間隔をリセットする。*/ 1065 1024 ct->interval = 0; 1066 1025 1067 /* æå®ãããç¶æ 1068 ã«é·ç§»ããã*/ 1026 /* 指定された状態に遷移する。*/ 1069 1027 ct->fsm = fsm; 1070 1028 1071 /* REQUEST ã¡ãã»ã¼ã¸ãéä¿¡ããã*/1029 /* REQUEST メッセージを送信する。*/ 1072 1030 ct->flags |= DHCP4C_FLAG_TMOUT_SND_REQ; 1073 1031 syscall(sig_sem(SEM_DHCP4_CLI_READY)); … … 1075 1033 1076 1034 /* 1077 * start_rel_info -- ã¢ãã¬ã¹æ 1078 å ±ã解æ¾ããã 1035 * start_rel_info -- アドレス情報を解放する。 1079 1036 * 1080 * 注æ: DHCPv4 ã® RFC2131 ã«ã¯ç¡ã1037 * 注意: DHCPv4 の RFC2131 には無い 1081 1038 */ 1082 1039 … … 1084 1041 start_rel_info (T_DHCP4_CLI_CONTEXT *ct) 1085 1042 { 1086 /* å 1087 ¨ã¦ã® TIMER ããã£ã³ã»ã«ããã*/ 1043 /* 全ての TIMER をキャンセルする。*/ 1088 1044 cancel_all_timers(ct); 1089 1045 1090 /* æå¹ãªãªã¼ã¹æ 1091 å ±ãç¡ããã° SLEEP ã«é·ç§»ããã*/ 1046 /* 有効なリース情報が無ければ SLEEP に遷移する。*/ 1092 1047 if (ct->act_msg == NULL) { 1093 1048 ct->fsm = DHCP4_FSM_SLEEP; … … 1095 1050 } 1096 1051 1097 /* éä¿¡å 1098 ã¢ãã¬ã¹ã«ãã¼ã«ã«ãããã¯ã¼ã¯ã¸ã®ããã¼ããã£ã¹ããè¨å®ããã*/ 1052 /* 送信先アドレスにローカルネットワークへのブロードキャストを設定する。*/ 1099 1053 ct->dst.ipaddr = IPV4_ADDRBROADCAST; 1100 1054 1101 /* RELEASE ã¡ãã»ã¼ã¸ãéä¿¡ããã*/1055 /* RELEASE メッセージを送信する。*/ 1102 1056 ct->flags |= DHCP4C_FLAG_TMOUT_SND_REL; 1103 1057 syscall(sig_sem(SEM_DHCP4_CLI_READY)); … … 1105 1059 1106 1060 /* 1107 * setup_dhcp_com_msg -- DHCP ã¡ãã»ã¼ã¸ã®å 1108 ±éé¨åãä½æããã 1061 * setup_dhcp_com_msg -- DHCP メッセージの共通部分を作成する。 1109 1062 */ 1110 1063 … … 1117 1070 ct->snd_msg->len = sizeof(ct->snd_msg->msg); 1118 1071 1119 /* ãããé¨ãè¨å®ããã*/1072 /* ヘッダ部を設定する。*/ 1120 1073 ct->snd_msg->msg.op = op; 1121 1074 ct->snd_msg->msg.htype = DHCP4_HWA_TYPE_ETHER; … … 1123 1076 HOST2MSG32(ct->snd_msg->msg.xid, ct->xid); 1124 1077 1125 /* MAC ã¢ãã¬ã¹ãè¨å®ããã*/1078 /* MAC アドレスを設定する。*/ 1126 1079 memcpy(&ct->snd_msg->msg.chaddr, &ct->sc->ifaddr.lladdr, ETHER_ADDR_LEN); 1127 1080 1128 1081 /* 1129 * ãªãã·ã§ã³é¨ãè¨å®ããã1082 * オプション部を設定する。 1130 1083 */ 1131 1084 1132 /* RFC1048 ã«å®ç¾©ããã¦ãããã¸ãã¯çªå·ãè¨å®ããã*/1085 /* RFC1048 に定義されているマジック番号を設定する。*/ 1133 1086 memcpy(&ct->snd_msg->msg.options, magicno, DHCP4_MAGIC_LEN); 1134 1087 option = ct->snd_msg->msg.options + DHCP4_MAGIC_LEN; 1135 1088 1136 /* DHCP ã¡ãã»ã¼ã¸ã¿ã¤ããè¨å®ããã*/1089 /* DHCP メッセージタイプを設定する。*/ 1137 1090 *(option ++) = DHCP4_OPT_MSG_TYPE; 1138 1091 *(option ++) = 1; … … 1143 1096 1144 1097 /* 1145 * setup_release_msg -- RELEASE ã¡ãã»ã¼ã¸ãä½æããã1098 * setup_release_msg -- RELEASE メッセージを作成する。 1146 1099 */ 1147 1100 … … 1151 1104 uint8_t *opt, *ref_opt; 1152 1105 1153 /* æå¹ãªãªã¼ã¹ã»ã¡ãã»ã¼ã¸ããªããã°ã¨ã©ã¼*/1106 /* 有効なリース・メッセージがなければエラー */ 1154 1107 if (ref == NULL) 1155 1108 return E_PAR; … … 1160 1113 1161 1114 /* 1162 * ãµã¼ã IDï¼server-ipï¼ãè¨å®ããã 1163 * RFC2131 4.4.1 Initialization and allocation of network address åç 1164 § 1115 * サーバ ID(server-ip)を設定する。 1116 * RFC2131 4.4.1 Initialization and allocation of network address 参照 1165 1117 */ 1166 1118 if ((ref_opt = find_option(ref, DHCP4_OPT_SERVER_ID, sizeof(T_IN4_ADDR))) == NULL) … … 1172 1124 1173 1125 /* 1174 * ã¯ã©ã¤ã¢ã³ã IDï¼MAC ã¢ãã¬ã¹ï¼ãè¨å®ããã 1175 * RFC2131 4.4.1 Initialization and allocation of network address åç 1176 § 1126 * クライアント ID(MAC アドレス)を設定する。 1127 * RFC2131 4.4.1 Initialization and allocation of network address 参照 1177 1128 */ 1178 1129 *(opt ++) = DHCP4_OPT_CLIENT_ID; … … 1182 1133 opt += ETHER_ADDR_LEN; 1183 1134 1184 /* ãªãã·ã§ã³ã®çµäºãè¨å®ããã*/1135 /* オプションの終了を設定する。*/ 1185 1136 *(opt ++) = DHCP4_OPT_END; 1186 1137 1187 1138 /* 1188 * ã¯ã©ã¤ã¢ã³ã IP ã¢ãã¬ã¹ï¼ciaddrï¼ãè¨å®ããã 1189 * RFC2131 4.4.1 Initialization and allocation of network address åç 1190 § 1139 * クライアント IP アドレス(ciaddr)を設定する。 1140 * RFC2131 4.4.1 Initialization and allocation of network address 参照 1191 1141 */ 1192 1142 HOST2MSG32(ct->snd_msg->msg.ciaddr, IF_GET_IFNET()->in4_ifaddr.addr); 1193 1143 1194 /* ã¡ãã»ã¼ã¸é·ãè¨å®ããã*/1144 /* メッセージ長を設定する。*/ 1195 1145 ct->snd_msg->len = sizeof(ct->snd_msg->msg) - DHCP4_DFLT_OPT_LEN 1196 1146 + (opt - (uint8_t*)&ct->snd_msg->msg.options); … … 1200 1150 1201 1151 /* 1202 * setup_request_msg -- REQUEST ã¡ãã»ã¼ã¸ãä½æããã1152 * setup_request_msg -- REQUEST メッセージを作成する。 1203 1153 */ 1204 1154 … … 1212 1162 #endif 1213 1163 1214 /* åç 1215 §ããã¡ãã»ã¼ã¸ããªããã°ã¨ã©ã¼ */ 1164 /* 参照するメッセージがなければエラー */ 1216 1165 if (ref == NULL) 1217 1166 return E_PAR; … … 1223 1172 #if defined(DHCP4_CLI_CFG_REQUIRED_OLIST) || defined(DHCP4_CLI_CFG_REQUEST_OLIST) 1224 1173 1225 /* 追å ã®ãªãã·ã§ã³ãè¨å®ããã*/1174 /* 追加のオプションを設定する。*/ 1226 1175 1227 1176 *opt = DHCP4_OPT_REQ_PARAM; … … 1230 1179 #if defined(DHCP4_CLI_CFG_REQUIRED_OLIST) 1231 1180 1232 /* è¦æ±ãªãã·ã§ã³ãªã¹ããè¨å®ããã*/1181 /* 要求オプションリストを設定する。*/ 1233 1182 if (sizeof(required_plist) > 0) { 1234 1183 memcpy(opt, required_plist, sizeof(required_plist)); … … 1241 1190 #if defined(DHCP4_CLI_CFG_REQUEST_OLIST) 1242 1191 1243 /* è¦æ±ãªãã·ã§ã³ãªã¹ããè¨å®ããã*/1192 /* 要求オプションリストを設定する。*/ 1244 1193 if (sizeof(request_plist) > 0) { 1245 1194 memcpy(opt, request_plist, sizeof(request_plist)); … … 1255 1204 1256 1205 /* 1257 * ãµã¼ã IDï¼server-ipï¼ãè¨å®ããã 1258 * RFC2131 4.4.1 Initialization and allocation of network address åç 1259 § 1206 * サーバ ID(server-ip)を設定する。 1207 * RFC2131 4.4.1 Initialization and allocation of network address 参照 1260 1208 */ 1261 1209 if (ct->fsm == DHCP4_FSM_REQUEST) { … … 1269 1217 1270 1218 /* 1271 * è¦æ± IP ã¢ãã¬ã¹ï¼requested-ipï¼ãè¨å®ããã 1272 * RFC2131 4.4.1 Initialization and allocation of network address åç 1273 § 1274 * RFC2131 ã§ã¯ãDHCP4_FSM_RENEW ã®æ MUST NOT ã«ãªã£ã¦ãããã 1275 * MUST ã®ããã§ããã 1219 * 要求 IP アドレス(requested-ip)を設定する。 1220 * RFC2131 4.4.1 Initialization and allocation of network address 参照 1221 * RFC2131 では、DHCP4_FSM_RENEW の時 MUST NOT になっているが、 1222 * MUST のようである。 1276 1223 */ 1277 1224 *(opt ++) = DHCP4_OPT_REQ_IPV4; … … 1279 1226 if (ct->fsm == DHCP4_FSM_REQUEST || ct->fsm == DHCP4_FSM_INIT_REBOOT || 1280 1227 ct->fsm == DHCP4_FSM_RENEW || ct->fsm == DHCP4_FSM_REBIND) 1281 /* åç 1282 §ã¡ãã»ã¼ã¸ã¨åã IP ã¢ãã¬ã¹ï¼requested-ipï¼ãè¦æ±ããã*/ 1228 /* 参照メッセージと同じ IP アドレス(requested-ip)を要求する。*/ 1283 1229 memcpy(opt, (uint8_t*)&ref->msg.yiaddr, sizeof(ref->msg.yiaddr)); 1284 1230 else … … 1287 1233 1288 1234 /* 1289 * ã¯ã©ã¤ã¢ã³ã IDï¼MAC ã¢ãã¬ã¹ï¼ãè¨å®ããã 1290 * RFC2131 4.4.1 Initialization and allocation of network address åç 1291 § 1235 * クライアント ID(MAC アドレス)を設定する。 1236 * RFC2131 4.4.1 Initialization and allocation of network address 参照 1292 1237 */ 1293 1238 *(opt ++) = DHCP4_OPT_CLIENT_ID; … … 1297 1242 opt += ETHER_ADDR_LEN; 1298 1243 1299 /* ãªãã·ã§ã³ã®çµäºãè¨å®ããã*/1244 /* オプションの終了を設定する。*/ 1300 1245 *(opt ++) = DHCP4_OPT_END; 1301 1246 1302 1247 /* 1303 * ã¯ã©ã¤ã¢ã³ã IP ã¢ãã¬ã¹ï¼ciaddrï¼ãè¨å®ããã 1304 * RFC2131 4.4.1 Initialization and allocation of network address åç 1305 § 1248 * クライアント IP アドレス(ciaddr)を設定する。 1249 * RFC2131 4.4.1 Initialization and allocation of network address 参照 1306 1250 */ 1307 1251 if (ct->fsm == DHCP4_FSM_RENEW || ct->fsm == DHCP4_FSM_REBIND) … … 1310 1254 HOST2MSG32(ct->snd_msg->msg.ciaddr, IPV4_ADDRANY); 1311 1255 1312 /* ã¡ãã»ã¼ã¸é·ãè¨å®ããã*/1256 /* メッセージ長を設定する。*/ 1313 1257 ct->snd_msg->len = sizeof(ct->snd_msg->msg) - DHCP4_DFLT_OPT_LEN 1314 1258 + (opt - (uint8_t*)&ct->snd_msg->msg.options); … … 1317 1261 1318 1262 /* 1319 * setup_discover_msg -- DISCOVER ã¡ãã»ã¼ã¸ãä½æããã1263 * setup_discover_msg -- DISCOVER メッセージを作成する。 1320 1264 */ 1321 1265 … … 1335 1279 #if defined(DHCP4_CLI_CFG_REQUIRED_OLIST) || defined(DHCP4_CLI_CFG_REQUEST_OLIST) 1336 1280 1337 /* 追å ã®ãªãã·ã§ã³ãè¨å®ããã*/1281 /* 追加のオプションを設定する。*/ 1338 1282 1339 1283 *opt = DHCP4_OPT_REQ_PARAM; … … 1342 1286 #if defined(DHCP4_CLI_CFG_REQUIRED_OLIST) 1343 1287 1344 /* è¦æ±ãªãã·ã§ã³ãªã¹ããè¨å®ããã*/1288 /* 要求オプションリストを設定する。*/ 1345 1289 if (sizeof(required_plist) > 0) { 1346 1290 memcpy(opt, required_plist, sizeof(required_plist)); … … 1353 1297 #if defined(DHCP4_CLI_CFG_REQUEST_OLIST) 1354 1298 1355 /* è¦æ±ãªãã·ã§ã³ãªã¹ããè¨å®ããã*/1299 /* 要求オプションリストを設定する。*/ 1356 1300 if (sizeof(request_plist) > 0) { 1357 1301 memcpy(opt, request_plist, sizeof(request_plist)); … … 1366 1310 #endif /* of #if defined(DHCP4_CLI_CFG_REQUIRED_OLIST) || defined(DHCP4_CLI_CFG_REQUEST_OLIST) */ 1367 1311 1368 /* æ¢ã«ã¢ãã¬ã¹æ 1369 å ±ããªã¼ã¹ããã¦ããã°ãåã IP ã¢ãã¬ã¹ãè¦æ±ããã*/ 1312 /* 既にアドレス情報がリースされていれば、同じ IP アドレスを要求する。*/ 1370 1313 if (ct->act_msg != NULL) { 1371 1314 *(opt ++) = DHCP4_OPT_REQ_IPV4; … … 1375 1318 } 1376 1319 1377 /* ã¯ã©ã¤ã¢ã³ã IDï¼MAC ã¢ãã¬ã¹ï¼ãè¨å®ããã*/1320 /* クライアント ID(MAC アドレス)を設定する。*/ 1378 1321 *(opt ++) = DHCP4_OPT_CLIENT_ID; 1379 1322 *(opt ++) = ETHER_ADDR_LEN + 1; … … 1382 1325 opt += ETHER_ADDR_LEN; 1383 1326 1384 /* ãªãã·ã§ã³ã®çµäºãè¨å®ããã*/1327 /* オプションの終了を設定する。*/ 1385 1328 *(opt ++) = DHCP4_OPT_END; 1386 1329 1387 /* éä¿¡å 1388 ã¢ãã¬ã¹ãè¨å®ããã*/ 1330 /* 送信先アドレスを設定する。*/ 1389 1331 ct->dst.ipaddr = IPV4_ADDRBROADCAST; 1390 1332 1391 /* ã¡ãã»ã¼ã¸é·ãè¨å®ããã*/1333 /* メッセージ長を設定する。*/ 1392 1334 ct->snd_msg->len = sizeof(ct->snd_msg->msg) - DHCP4_DFLT_OPT_LEN 1393 1335 + (opt - (uint8_t*)&ct->snd_msg->msg.options); … … 1396 1338 1397 1339 /* 1398 * ack_msg_timeout -- ACK/NAK ã¡ãã»ã¼ã¸åä¿¡ã¿ã¤ã ã¢ã¦ãå¦ç1340 * ack_msg_timeout -- ACK/NAK メッセージ受信タイムアウト処理 1399 1341 */ 1400 1342 … … 1402 1344 ack_msg_timeout (T_DHCP4_CLI_CONTEXT *ct) 1403 1345 { 1404 /* ACK ã¡ãã»ã¼ã¸ãåä¿¡ãã¦ããã°ãBOUND ç¶æ 1405 ã«é·ç§»ããã*/ 1346 /* ACK メッセージを受信していれば。BOUND 状態に遷移する。*/ 1406 1347 ct->flags &= ~DHCP4C_FLAG_TMOUT_MASK; 1407 1348 if (select_ack(ct)) { 1408 1349 1409 /* REQUEST ã¡ãã»ã¼ã¸éä¿¡ã¿ã¤ãã¼ãåæ¢ããã*/1350 /* REQUEST メッセージ送信タイマーを停止する。*/ 1410 1351 syscall(wai_sem(SEM_DHCP4_CLI_TIMER)); 1411 1352 ct->timers[DHCP4C_TIMER_SND_REQ] = 0; … … 1413 1354 1414 1355 /* 1415 * ç¶æ 1416 ã REQUEST ã®æã¯ã 1417 * OFFER ã¡ãã»ã¼ã¸ãåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã«æ»ãã 1356 * 状態が REQUEST の時は、 1357 * OFFER メッセージを受信メッセージ構造体リストに戻す。 1418 1358 */ 1419 1359 if (ct->fsm == DHCP4_FSM_REQUEST && ct->off_msg != NULL) { … … 1425 1365 } 1426 1366 1427 /* BOUND ç¶æ 1428 ã«é·ç§»ããã*/ 1367 /* BOUND 状態に遷移する。*/ 1429 1368 start_bound(ct); 1430 1369 return; … … 1432 1371 else { 1433 1372 1434 /* ãªã¼ã¹æ 1435 å ±ã解æ¾ããã*/ 1373 /* リース情報を解放する。*/ 1436 1374 rel_lease(ct); 1437 1375 … … 1441 1379 1442 1380 /* 1443 * send_request_msg -- REQUEST ã¡ãã»ã¼ã¸ãéä¿¡ããã1381 * send_request_msg -- REQUEST メッセージを送信する。 1444 1382 */ 1445 1383 … … 1453 1391 uint16_t secs; 1454 1392 1455 /* ã¿ã¤ã ã¢ã¦ããã©ã°ãã¯ãªã¢ã¼ããã*/1393 /* タイムアウトフラグをクリアーする。*/ 1456 1394 ct->flags &= ~DHCP4C_FLAG_TMOUT_MASK; 1457 1395 1458 /* ACK ã¡ãã»ã¼ã¸ãåä¿¡ãã¦ããã°ãBOUND ç¶æ 1459 ã«é·ç§»ããã*/ 1396 /* ACK メッセージを受信していれば。BOUND 状態に遷移する。*/ 1460 1397 ct->flags &= ~DHCP4C_FLAG_TMOUT_MASK; 1461 1398 if (select_ack(ct)) { 1462 1399 1463 /* ACK/NAK ã¡ãã»ã¼ã¸åä¿¡ã¿ã¤ãã¼ãåæ¢ããã*/1400 /* ACK/NAK メッセージ受信タイマーを停止する。*/ 1464 1401 syscall(wai_sem(SEM_DHCP4_CLI_TIMER)); 1465 1402 ct->timers[DHCP4C_TIMER_RCV_ACK] = 0; … … 1467 1404 1468 1405 /* 1469 * ç¶æ 1470 ã REQUEST ã®æã¯ã 1471 * OFFER ã¡ãã»ã¼ã¸ãåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã«æ»ãã 1406 * 状態が REQUEST の時は、 1407 * OFFER メッセージを受信メッセージ構造体リストに戻す。 1472 1408 */ 1473 1409 if (ct->fsm == DHCP4_FSM_REQUEST && ct->off_msg != NULL) { … … 1479 1415 } 1480 1416 1481 /* BOUND ç¶æ 1482 ã«é·ç§»ããã*/ 1417 /* BOUND 状態に遷移する。*/ 1483 1418 start_bound(ct); 1484 1419 return; 1485 1420 } 1486 1421 1487 /* REQUEST ã¡ãã»ã¼ã¸ãä½æããã*/1422 /* REQUEST メッセージを作成する。*/ 1488 1423 if (ct->fsm == DHCP4_FSM_REQUEST) 1489 1424 ref = ct->off_msg; … … 1496 1431 } 1497 1432 1498 /* éä¿¡ãéå§ãã¦ããã®æéãå¾ãã*/1433 /* 送信を開始してからの時間を得る。*/ 1499 1434 get_tim(&time); 1500 1435 interval = time - ct->snd_start; 1501 1436 1502 1437 /* 1503 * éä¿¡ãéå§ãã¦ããã®æéï¼ç§ï¼ãã¡ãã»ã¼ã¸ã«è¨å®ããã1504 * æ大å¤ã¯ 65535ã1438 * 送信を開始してからの時間(秒)をメッセージに設定する。 1439 * 最大値は 65535。 1505 1440 */ 1506 1441 if (ct->fsm == DHCP4_FSM_REQUEST) … … 1514 1449 HOST2MSG16(ct->snd_msg->msg.secs, secs); 1515 1450 1516 /* ãã³ããããã³ã°ã³ã¼ã«ã§ã¡ãã»ã¼ã¸ãéä¿¡ããã*/1451 /* ノンブロッキングコールでメッセージを送信する。*/ 1517 1452 error = udp_snd_dat(ct->cepid, &ct->dst, &ct->snd_msg->msg, ct->snd_msg->len, TMO_NBLK); 1518 1453 if (error != E_WBLK) { … … 1522 1457 } 1523 1458 1524 /* éä¿¡ééãè¨å®ããã*/1459 /* 送信間隔を設定する。*/ 1525 1460 if (ct->interval == 0) 1526 /* æªè¨å®*/1461 /* 未設定 */ 1527 1462 ct->interval = TMO_DHCP4C_INIT_INTVL; 1528 1463 else 1529 /* ããã¯ãªãã¢ã«ã´ãªãºã 㧠2åã«ããï¼ä¹±æ°ä½¿ç¨ï¼éä¿¡ééãå ç®ããã*/1464 /* バックオフアルゴリズムで 2倍にした(乱数使用)送信間隔を加算する。*/ 1530 1465 ct->interval += (netapp_rand() >> 2) % (ct->interval << 1); 1531 1466 1532 /* éä¿¡å¨æã®å¶éå¤ãè¶ 1533 ããªãããã«ããã*/ 1467 /* 送信周期の制限値を超えないようにする。*/ 1534 1468 if (ct->interval > TMO_DHCP4C_MAX_BACKOFF) 1535 1469 ct->interval = (TMO_DHCP4C_MAX_BACKOFF >> 1) + ((netapp_rand() >> 2) % TMO_DHCP4C_MAX_BACKOFF); 1536 1470 1537 /* ãªã¼ã¹æéã®ã¿ã¤ã ã¢ã¦ããå 1538 éãã */ 1471 /* リース時間のタイムアウト【先送り】 */ 1539 1472 if (ct->fsm != DHCP4_FSM_REQUEST && 1540 1473 TIMEC_GT(ct->interval + time, ct->expire + ct->bind_start)) 1541 1474 ct->interval = ct->expire + ct->bind_start - time + SYSTIM_HZ; 1542 1475 1543 /* åéä¿¡ã¿ã¤ã ã¢ã¦ããè¨å®ããã*/1476 /* 再送信タイムアウトを設定する。*/ 1544 1477 syscall(wai_sem(SEM_DHCP4_CLI_TIMER)); 1545 1478 ct->timers[DHCP4C_TIMER_SND_REQ] = SYSTIM2TIMER(ct->interval); … … 1548 1481 1549 1482 /* 1550 * send_release_msg -- RELEASE ã¡ãã»ã¼ã¸ãéä¿¡ããã1483 * send_release_msg -- RELEASE メッセージを送信する。 1551 1484 */ 1552 1485 … … 1556 1489 ER error; 1557 1490 1558 /* ã¿ã¤ã ã¢ã¦ããã©ã°ãã¯ãªã¢ã¼ããã*/1491 /* タイムアウトフラグをクリアーする。*/ 1559 1492 ct->flags &= ~DHCP4C_FLAG_TMOUT_MASK; 1560 1493 1561 /* RELEASE ã¡ãã»ã¼ã¸ãä½æããã*/1494 /* RELEASE メッセージを作成する。*/ 1562 1495 if ((error = setup_release_msg(ct, ct->act_msg)) != E_OK) { 1563 1496 syslog(LOG_NOTICE, "[DHCP4C] error, setup release message: %s", itron_strerror(error)); … … 1566 1499 } 1567 1500 1568 /* ãªã¼ã¹æ 1569 å ±ã解æ¾ããã*/ 1501 /* リース情報を解放する。*/ 1570 1502 rel_lease(ct); 1571 1503 1572 /* ãã³ããããã³ã°ã³ã¼ã«ã§ã¡ãã»ã¼ã¸ãéä¿¡ããã*/1504 /* ノンブロッキングコールでメッセージを送信する。*/ 1573 1505 error = udp_snd_dat(ct->cepid, &ct->dst, &ct->snd_msg->msg, ct->snd_msg->len, TMO_NBLK); 1574 1506 if (error != E_WBLK) { … … 1578 1510 } 1579 1511 1580 /* ã¡ãã»ã¼ã¸éä¿¡å¾ 1581 ã¡ãè¡ãã*/ 1512 /* メッセージ送信待ちを行う。*/ 1582 1513 syscall(wai_sem(SEM_DHCP4_CLI_READY)); 1583 1514 1584 /* SLEEP ç¶æ 1585 ã«é·ç§»ããã*/ 1515 /* SLEEP 状態に遷移する。*/ 1586 1516 ct->fsm = DHCP4_FSM_SLEEP; 1587 1517 } 1588 1518 1589 1519 /* 1590 * offer_msg_timeout -- OFFER ã¡ãã»ã¼ã¸åä¿¡ã¿ã¤ã ã¢ã¦ãå¦ç1520 * offer_msg_timeout -- OFFER メッセージ受信タイムアウト処理 1591 1521 */ 1592 1522 … … 1594 1524 offer_msg_timeout (T_DHCP4_CLI_CONTEXT *ct) 1595 1525 { 1596 /* OFFER ã¡ãã»ã¼ã¸ãåä¿¡ãã¦ããã°ãREQUEST ç¶æ 1597 ã«é·ç§»ããã*/ 1526 /* OFFER メッセージを受信していれば。REQUEST 状態に遷移する。*/ 1598 1527 ct->flags &= ~DHCP4C_FLAG_TMOUT_MASK; 1599 1528 if (select_offer(ct)) { 1600 1529 1601 /* DISCOVER ã¡ãã»ã¼ã¸éä¿¡ã¿ã¤ãã¼ãåæ¢ããã*/1530 /* DISCOVER メッセージ送信タイマーを停止する。*/ 1602 1531 syscall(wai_sem(SEM_DHCP4_CLI_TIMER)); 1603 1532 ct->timers[DHCP4C_TIMER_SND_DISC] = 0; 1604 1533 syscall(sig_sem(SEM_DHCP4_CLI_TIMER)); 1605 1534 1606 /* REQUEST ã¡ãã»ã¼ã¸ãéä¿¡ã㦠REQUEST ç¶æ 1607 ã«é·ç§»ããã*/ 1535 /* REQUEST メッセージを送信して REQUEST 状態に遷移する。*/ 1608 1536 start_send_request(ct, DHCP4_FSM_REQUEST); 1609 1537 } … … 1613 1541 1614 1542 /* 1615 * send_discover_msg -- DISCOVER ã¡ãã»ã¼ã¸ãéä¿¡ããã1543 * send_discover_msg -- DISCOVERメッセージを送信する。 1616 1544 */ 1617 1545 … … 1623 1551 RELTIM interval; 1624 1552 1625 /* ã¿ã¤ã ã¢ã¦ããã©ã°ãã¯ãªã¢ã¼ããã*/1553 /* タイムアウトフラグをクリアーする。*/ 1626 1554 ct->flags &= ~DHCP4C_FLAG_TMOUT_MASK; 1627 1555 1628 /* OFFER ã¡ãã»ã¼ã¸ãåä¿¡ãã¦ããã°ãREQUEST ç¶æ 1629 ã«é·ç§»ããã*/ 1556 /* OFFER メッセージを受信していれば。REQUEST 状態に遷移する。*/ 1630 1557 ct->flags &= ~DHCP4C_FLAG_TMOUT_MASK; 1631 1558 if (select_offer(ct)) { 1632 1559 1633 /* OFFER ã¡ãã»ã¼ã¸åä¿¡ã¿ã¤ãã¼ãåæ¢ããã*/1560 /* OFFER メッセージ受信タイマーを停止する。*/ 1634 1561 syscall(wai_sem(SEM_DHCP4_CLI_TIMER)); 1635 1562 ct->timers[DHCP4C_TIMER_RCV_OFFER] = 0; 1636 1563 syscall(sig_sem(SEM_DHCP4_CLI_TIMER)); 1637 1564 1638 /* REQUEST ã¡ãã»ã¼ã¸ãéä¿¡ã㦠REQUEST ç¶æ 1639 ã«é·ç§»ããã*/ 1565 /* REQUEST メッセージを送信して REQUEST 状態に遷移する。*/ 1640 1566 start_send_request(ct, DHCP4_FSM_REQUEST); 1641 1567 return; 1642 1568 } 1643 1569 1644 /* DISCOVER ã¡ãã»ã¼ã¸ãä½æããã*/1570 /* DISCOVER メッセージを作成する。*/ 1645 1571 if ((error = setup_discover_msg(ct)) != E_OK) { 1646 1572 syslog(LOG_NOTICE, "[DHCP4C] error, setup discover message: %s", itron_strerror(error)); … … 1649 1575 } 1650 1576 1651 /* éä¿¡ãéå§ãã¦ããã®æéãå¾ãã*/1577 /* 送信を開始してからの時間を得る。*/ 1652 1578 get_tim(&time); 1653 1579 interval = time - ct->snd_start; 1654 1580 1655 1581 /* 1656 * éä¿¡ãéå§ãã¦ããã®æéï¼ç§ï¼ãã¡ãã»ã¼ã¸ã«è¨å®ããã1657 * æ大å¤ã¯ 65535ã1582 * 送信を開始してからの時間(秒)をメッセージに設定する。 1583 * 最大値は 65535。 1658 1584 */ 1659 1585 if (SYSTIM2SEC(interval) < 65536) … … 1663 1589 HOST2MSG16(ct->snd_msg->msg.secs, ct->secs); 1664 1590 1665 /* ãã³ããããã³ã°ã³ã¼ã«ã§ã¡ãã»ã¼ã¸ãéä¿¡ããã*/1591 /* ノンブロッキングコールでメッセージを送信する。*/ 1666 1592 error = udp_snd_dat(ct->cepid, &ct->dst, &ct->snd_msg->msg, ct->snd_msg->len, TMO_NBLK); 1667 1593 if (error != E_WBLK) { … … 1671 1597 } 1672 1598 1673 /* éä¿¡ééãè¨å®ããã*/1599 /* 送信間隔を設定する。*/ 1674 1600 if (ct->interval == 0) 1675 /* æªè¨å®*/1601 /* 未設定 */ 1676 1602 ct->interval = TMO_DHCP4C_INIT_INTVL; 1677 1603 else 1678 /* ããã¯ãªãã¢ã«ã´ãªãºã 㧠2åã«ããï¼ä¹±æ°ä½¿ç¨ï¼éä¿¡ééãå ç®ããã*/1604 /* バックオフアルゴリズムで 2倍にした(乱数使用)送信間隔を加算する。*/ 1679 1605 ct->interval += (netapp_rand() >> 2) % (ct->interval << 1); 1680 1606 1681 /* éä¿¡å¨æã®å¶éå¤ãè¶ 1682 ããªãããã«ããã*/ 1607 /* 送信周期の制限値を超えないようにする。*/ 1683 1608 if (ct->interval > TMO_DHCP4C_MAX_BACKOFF) 1684 1609 ct->interval = (TMO_DHCP4C_MAX_BACKOFF >> 1) + ((netapp_rand() >> 2) % TMO_DHCP4C_MAX_BACKOFF); 1685 1610 1686 /* OFFER ã¡ãã»ã¼ã¸ã®åä¿¡ã¿ã¤ã ã¢ã¦ããè¶ 1687 ããªãããã«èª¿æ´ããã*/ 1611 /* OFFER メッセージの受信タイムアウトを超えないように調整する。*/ 1688 1612 if (TIMEC_GT(time + ct->interval, ct->snd_start + TMO_DHCP4C_OFFER)) 1689 1613 ct->interval = (TMO_DHCP4C_INIT_INTVL + TMO_DHCP4C_OFFER) - time + 1; 1690 1614 1691 /* åéä¿¡ã¿ã¤ã ã¢ã¦ããè¨å®ããã*/1615 /* 再送信タイムアウトを設定する。*/ 1692 1616 syscall(wai_sem(SEM_DHCP4_CLI_TIMER)); 1693 1617 ct->timers[DHCP4C_TIMER_SND_DISC] = SYSTIM2TIMER(ct->interval); … … 1696 1620 1697 1621 /* 1698 * dhcpc_timer -- TIMER 管ç1622 * dhcpc_timer -- TIMER 管理 1699 1623 */ 1700 1624 … … 1716 1640 syscall(sig_sem(SEM_DHCP4_CLI_TIMER)); 1717 1641 1718 /* 1 ç§æ¯ã«ã¿ã¤ã ã¢ã¦ãããã*/1642 /* 1秒毎にタイムアウトする。*/ 1719 1643 timeout((callout_func)dhcpc_timer, ct, NET_TIMER_HZ); 1720 1644 } 1721 1645 1722 1646 /* 1723 * expire_timeout -- EXPIRE ã¿ã¤ã ã¢ã¦ãå¦ç1647 * expire_timeout -- EXPIRE タイムアウト処理 1724 1648 */ 1725 1649 … … 1729 1653 //ER error; 1730 1654 1731 /* ã¿ã¤ã ã¢ã¦ããã©ã°ãã¯ãªã¢ã¼ããã*/1655 /* タイムアウトフラグをクリアーする。*/ 1732 1656 ct->flags &= ~DHCP4C_FLAG_TMOUT_MASK; 1733 1657 1734 /* ç¶æ 1735 ã REQUEST ã®æã¯ä½ãããªãã*/ 1658 /* 状態が REQUEST の時は何もしない。*/ 1736 1659 if (ct->fsm == DHCP4_FSM_REQUEST) 1737 1660 return; 1738 1661 1739 /* å 1740 ¨ã¦ã® TIMER ããã£ã³ã»ã«ããã*/ 1662 /* 全ての TIMER をキャンセルする。*/ 1741 1663 cancel_all_timers(ct); 1742 1664 1743 /* ãªã¼ã¹ãããæ 1744 å ±ã解æ¾ããã*/ 1665 /* リースされた情報を解放する。*/ 1745 1666 rel_lease(ct); 1746 1667 … … 1749 1670 1750 1671 /* 1751 * rebind_timeout -- REBIND ã¿ã¤ã ã¢ã¦ãå¦ç1672 * rebind_timeout -- REBIND タイムアウト処理 1752 1673 */ 1753 1674 … … 1755 1676 rebind_timeout (T_DHCP4_CLI_CONTEXT *ct) 1756 1677 { 1757 /* ã¿ã¤ã ã¢ã¦ããã©ã°ãã¯ãªã¢ã¼ããã*/1678 /* タイムアウトフラグをクリアーする。*/ 1758 1679 ct->flags &= ~DHCP4C_FLAG_TMOUT_MASK; 1759 1680 1760 /* å 1761 ¨ã¦ã® TIMER ããã£ã³ã»ã«ããã*/ 1681 /* 全ての TIMER をキャンセルする。*/ 1762 1682 cancel_all_timers(ct); 1763 1683 1764 /* REQUEST ã¡ãã»ã¼ã¸ãéä¿¡ã㦠REBIND ç¶æ 1765 ã«é·ç§»ããã*/ 1684 /* REQUEST メッセージを送信して REBIND 状態に遷移する。*/ 1766 1685 start_send_request(ct, DHCP4_FSM_REBIND); 1767 1686 } 1768 1687 1769 1688 /* 1770 * renew_timeout -- RENEW ã¿ã¤ã ã¢ã¦ãå¦ç1689 * renew_timeout -- RENEW タイムアウト処理 1771 1690 */ 1772 1691 … … 1774 1693 renew_timeout (T_DHCP4_CLI_CONTEXT *ct) 1775 1694 { 1776 /* ã¿ã¤ã ã¢ã¦ããã©ã°ãã¯ãªã¢ã¼ããã*/1695 /* タイムアウトフラグをクリアーする。*/ 1777 1696 ct->flags &= ~DHCP4C_FLAG_TMOUT_MASK; 1778 1697 1779 /* REQUEST ã¡ãã»ã¼ã¸ãéä¿¡ã㦠RENEW ç¶æ 1780 ã«é·ç§»ããã*/ 1698 /* REQUEST メッセージを送信して RENEW 状態に遷移する。*/ 1781 1699 start_send_request(ct, DHCP4_FSM_RENEW); 1782 1700 } 1783 1701 1784 1702 /* 1785 * dispatch_timeout -- ã¿ã¤ã ã¢ã¦ãããæã®å¦ç1703 * dispatch_timeout -- タイムアウトした時の処理 1786 1704 */ 1787 1705 … … 1831 1749 1832 1750 /* 1833 * dispatch_event -- ã¤ãã³ãæ¯ã®å¦ç1751 * dispatch_event -- イベント毎の処理 1834 1752 */ 1835 1753 … … 1841 1759 while (ct->fsm != DHCP4_FSM_SLEEP && error == E_OK) { 1842 1760 1843 /* ã¡ãã»ã¼ã¸ã®åä¿¡ã¨ã¿ã¤ã ã¢ã¦ããå¾ 1844 ã¤ã*/ 1761 /* メッセージの受信とタイムアウトを待つ。*/ 1845 1762 syscall(wai_sem(SEM_DHCP4_CLI_READY)); 1846 1763 … … 1862 1779 1863 1780 /* 1864 * init_context -- DHCP ã¯ã©ã¤ã¢ã³ãã³ã³ããã¹ãæ§é ä½ãåæåããã1781 * init_context -- DHCP クライアントコンテキスト構造体を初期化する。 1865 1782 */ 1866 1783 … … 1876 1793 1877 1794 /* 1878 * rel_cli_msg -- ã¡ãã»ã¼ã¸æ§é ä½ã解æ¾ããã1795 * rel_cli_msg -- メッセージ構造体を解放する。 1879 1796 */ 1880 1797 … … 1908 1825 1909 1826 /* 1910 * init_cli_msg -- åã¡ãã»ã¼ã¸æ§é ä½ãåæåããã1827 * init_cli_msg -- 各メッセージ構造体を初期化する。 1911 1828 */ 1912 1829 … … 1918 1835 int count; 1919 1836 1920 /* éä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãç²å¾ããã*/1837 /* 送信メッセージ構造体を獲得する。*/ 1921 1838 if ((error = tget_mpf(MPF_DHCP4_CLI_MSG, (void*)&ct->snd_msg, TMO_DHCP4C_MPF_GET)) != E_OK) { 1922 1839 syslog(LOG_NOTICE, "[DHCP4C] error, tget_mpf() for send: %s.", itron_strerror(error)); … … 1925 1842 1926 1843 /* 1927 * æå¹ãªãªã¼ã¹ã»ã¡ãã»ã¼ã¸æ§é ä½ãããå ´åã¯ã1928 * ç²å¾ããåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã®æ§é ä½ã 1æ¸ããã1844 * 有効なリース・メッセージ構造体がある場合は、 1845 * 獲得する受信メッセージ構造体リストの構造体を 1減らす。 1929 1846 */ 1930 1847 if (ct->act_msg == NULL) … … 1933 1850 count = NUM_DHCP4_MSG_LIST - 1; 1934 1851 1935 /* åä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãç²å¾ããã*/1852 /* 受信メッセージ構造体を獲得する。*/ 1936 1853 while (count --> 0) { 1937 1854 if ((error = tget_mpf(MPF_DHCP4_CLI_MSG, (void*)&cell, TMO_DHCP4C_MPF_GET)) != E_OK) { … … 1947 1864 1948 1865 /* 1949 * dhcp4c_renew_info -- ãããã¯ã¼ã¯æ 1950 å ±ãååå¾ããã 1866 * dhcp4c_renew_info -- ネットワーク情報を再取得する。 1951 1867 */ 1952 1868 … … 1956 1872 if (context.fsm == DHCP4_FSM_BOUND) { 1957 1873 1958 /* REL_INFO ç¶æ 1959 ã«é·ç§»ããå¾ã« SLEEP ã解é¤ããããã«è¨å®ããã*/ 1874 /* REL_INFO 状態に遷移した後に SLEEP を解除するように設定する。*/ 1960 1875 context.flags |= DHCP4C_FLAG_RENEW; 1961 1876 start_rel_info(&context); … … 1964 1879 else if (context.fsm == DHCP4_FSM_SLEEP) { 1965 1880 1966 /* SLEEP ã解é¤ããã*/1881 /* SLEEP を解除する。*/ 1967 1882 wup_tsk(DHCP4_CLI_TASK); 1968 1883 return E_OK; … … 1973 1888 1974 1889 /* 1975 * dhcp4c_rel_info -- DHCP ã§è¨å®ããããããã¯ã¼ã¯æ 1976 å ±ã解æ¾ããã 1890 * dhcp4c_rel_info -- DHCP で設定されたネットワーク情報を解放する。 1977 1891 */ 1978 1892 … … 1980 1894 dhcp4c_rel_info (void) 1981 1895 { 1982 /* REL_INFO ç¶æ 1983 ã«é·ç§»ããã*/ 1896 /* REL_INFO 状態に遷移する。*/ 1984 1897 start_rel_info(&context); 1985 1898 return E_OK; … … 1987 1900 1988 1901 /* 1989 * dhcp4c_get_info -- DHCP ã§è¨å®ããããããã¯ã¼ã¯æ 1990 å ±ãè¿ãã 1902 * dhcp4c_get_info -- DHCP で設定されたネットワーク情報を返す。 1991 1903 */ 1992 1904 … … 2011 1923 2012 1924 /* 2013 * ã³ã¼ã«ããã¯é¢æ°1925 * コールバック関数 2014 1926 */ 2015 1927 … … 2022 1934 len = *(ER_UINT*)p_parblk; 2023 1935 if (len < 0 && len != E_RLWAI) { 2024 /* E_RLWAI 以å¤ã§ã0 以ä¸ã®å ´åã¯ãã¨ã©ã¼ãæå³ãã¦ããã*/1936 /* E_RLWAI 以外で、0 以下の場合は、エラーを意味している。*/ 2025 1937 syslog(LOG_NOTICE, "[DHCPC(CBR)] error: %s, fncd: %s", itron_strerror(len), in_strtfn(fncd)); 2026 1938 } … … 2028 1940 if (fncd == TEV_UDP_RCV_DAT) { 2029 1941 2030 /* åä¿¡ã¡ãã»ã¼ã¸ãªã¹ãã空ã®æã¯ãåä¿¡ããªãã§ãã¼ã¿ã°ã©ã ãæ¨ã¦ãã*/1942 /* 受信メッセージリストが空の時は、受信しないでデータグラムを捨てる。*/ 2031 1943 if (context.rcv_lst == NULL) 2032 1944 syslog(LOG_NOTICE, "[DHCP4C(CBR)] receive buffer all busy."); 2033 1945 else { 2034 /* ã¡ãã»ã¼ã¸ãåä¿¡ããã¡ãã»ã¼ã¸æ§é ä½ãæºåããã*/1946 /* メッセージを受信するメッセージ構造体を準備する。*/ 2035 1947 syscall(wai_sem(SEM_DHCP4_CLI_LOCK)); 2036 1948 msg = context.rcv_lst; … … 2038 1950 syscall(sig_sem(SEM_DHCP4_CLI_LOCK)); 2039 1951 2040 /* ã¡ãã»ã¼ã¸ãåä¿¡ããã*/1952 /* メッセージを受信する。*/ 2041 1953 len = udp_rcv_dat(context.cepid, &msg->srv, &msg->msg, sizeof(msg->msg), TMO_POL); 2042 1954 … … 2044 1956 msg->len = len; 2045 1957 if (len >= 0) { 2046 /* åä¿¡ããã¡ãã»ã¼ã¸ãæ¤è¨¼ã¡ãã»ã¼ã¸ãªã¹ãã«ç§»ãã*/1958 /* 受信したメッセージを検証メッセージリストに移す。*/ 2047 1959 msg->next = context.val_lst; 2048 1960 context.val_lst = msg; … … 2050 1962 } 2051 1963 else { 2052 /* ã¡ãã»ã¼ã¸æ§é ä½ãåä¿¡ã¡ãã»ã¼ã¸ãªã¹ãã«æ»ãã*/1964 /* メッセージ構造体を受信メッセージリストに戻す。*/ 2053 1965 context.error = len; 2054 1966 msg->next = context.rcv_lst; … … 2064 1976 2065 1977 /* 2066 * dhcp4_cli_task -- DHCP ã¯ã©ã¤ã¢ã³ãã¿ã¹ã¯1978 * dhcp4_cli_task -- DHCP クライアントタスク 2067 1979 */ 2068 1980 … … 2080 1992 ct = &context; 2081 1993 2082 /* DHCP ã¯ã©ã¤ã¢ã³ãã³ã³ããã¹ãæ§é ä½ãåæåããã*/1994 /* DHCP クライアントコンテキスト構造体を初期化する。*/ 2083 1995 init_context(ct, (ID)exinf); 2084 1996 2085 1997 while (true) { 2086 1998 2087 /* 1 ç§æ¯ã«ã¿ã¤ã ã¢ã¦ãããããã«ã¿ã¤ãã¼ãè¨å®ããã*/1999 /* 1秒毎にタイムアウトするようにタイマーを設定する。*/ 2088 2000 timeout((callout_func)dhcpc_timer, ct, NET_TIMER_HZ / DHCP4C_TIMER_HZ); 2089 2001 2090 /* ã¡ãã»ã¼ã¸æ§é ä½ãåæåããã*/2002 /* メッセージ構造体を初期化する。*/ 2091 2003 if ((error = init_cli_msg(ct)) == E_OK) { 2092 2004 2093 /* SELECT ç¶æ 2094 ã«é·ç§»ããã*/ 2005 /* SELECT 状態に遷移する。*/ 2095 2006 start_select(ct); 2096 2007 2097 /* ã¡ã¤ã³ã«ã¼ã*/2008 /* メインループ */ 2098 2009 error = dispatch_event(ct); 2099 2010 } 2100 2011 2101 /* å 2102 ¨ã¦ã® TIMER ããã£ã³ã»ã«ããã*/ 2012 /* 全ての TIMER をキャンセルする。*/ 2103 2013 cancel_all_timers(ct); 2104 2014 2105 /* ã¿ã¤ãã¼ãåæ¢ããã*/2015 /* タイマーを停止する。*/ 2106 2016 untimeout((callout_func)dhcpc_timer, ct); 2107 2017 2108 /* ã¡ãã»ã¼ã¸æ§é ä½ã解æ¾ããã*/2018 /* メッセージ構造体を解放する。*/ 2109 2019 rel_cli_msg (ct); 2110 2020 2111 /* ãªã¼ã¹ã解æ¾å¾ãååå¾ãæå®ããã¦ããªããã°ä¼æ¢ããã*/2021 /* リースを解放後、再取得が指定されていなければ休止する。*/ 2112 2022 if (!(ct->flags & DHCP4C_FLAG_RENEW)) { 2113 2023 2114 /* ä¼æ¢ããã*/2024 /* 休止する。*/ 2115 2025 if (error == E_OK) 2116 2026 syslog(LOG_NOTICE, "[DHCP4C] lease released, go to sleep.");
Note:
See TracChangeset
for help on using the changeset viewer.