Changeset 389 for azure_iot_hub/trunk/asp3_dcre/tinet/netapp/dhcp4_cli.c
- Timestamp:
- May 22, 2019, 10:03:37 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
azure_iot_hub/trunk/asp3_dcre/tinet/netapp/dhcp4_cli.c
- Property svn:keywords deleted
-
Property svn:mime-type
changed from
text/x-csrc
totext/x-csrc;charset=UTF-8
r388 r389 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; … … 223 208 224 209 /* 225 * dhcp4_cksum -- ãã§ãã¯ãµã ã®è¨ç®é¢æ°210 * dhcp4_cksum -- チェックサムの計算関数 226 211 */ 227 212 228 213 static uint32_t 229 dhcp4_cksum (void *data, uint_t len /* ãªã¯ãããåä½*/)214 dhcp4_cksum (void *data, uint_t len /*オクテット単位*/) 230 215 { 231 216 uint32_t carry, sum = 0; … … 245 230 246 231 /* 247 * create_xid -- ãã©ã³ã¶ã¯ã·ã§ã³ ID ãçæããã232 * create_xid -- トランザクション ID を生成する。 248 233 */ 249 234 … … 261 246 262 247 /* 263 * find_option_sub -- æå®ãããªãã·ã§ã³ãæ¢ç´¢ããã248 * find_option_sub -- 指定したオプションを探索する。 264 249 * 265 * 注æ: å¼æ° size ã 0 ã®æã¯ãªãã·ã§ã³ãµã¤ãºãæ¤è¨¼ããªãã250 * 注意: 引数 size が 0 の時はオプションサイズを検証しない。 266 251 */ 267 252 … … 298 283 299 284 /* 300 * find_option -- æå®ãããªãã·ã§ã³ãæ¢ç´¢ããã285 * find_option -- 指定したオプションを探索する。 301 286 * 302 * 注æ: å¼æ° size ã 0 ã®æã¯ãªãã·ã§ã³ãµã¤ãºãæ¤è¨¼ããªãã287 * 注意: 引数 size が 0 の時はオプションサイズを検証しない。 303 288 */ 304 289 … … 312 297 313 298 /* 314 * is_equal_sid -- ã¡ãã»ã¼ã¸å 315 ã® SERVER ID ãæ¯è¼ããã 299 * is_equal_sid -- メッセージ内の SERVER ID を比較する。 316 300 */ 317 301 … … 330 314 331 315 /* 332 * timer_value -- ã¡ãã»ã¼ã¸ããæéæ 333 å ±ãåãåºãã 316 * timer_value -- メッセージから時間情報を取り出す。 334 317 */ 335 318 … … 344 327 else { 345 328 346 /* ãµã¼ãããã®ãªã¼ã¹æéã¯[s]ã*/329 /* サーバからのリース時間は[s]。*/ 347 330 seconds = msg2host32(opt + 2); 348 331 349 /* ã³ã³ããã¹ãå 350 ã®ãªã¼ã¹æé㯠SYSTIM_HZã*/ 332 /* コンテキスト内のリース時間は SYSTIM_HZ。*/ 351 333 if (seconds == DHCP4_TIME_INFINITY) 352 334 return DHCP4_TIME_INFINITY; … … 359 341 360 342 /* 361 * rel_addr -- IPv4 ã¢ãã¬ã¹ããµãããããã¹ã¯ãéççµè·¯è¡¨ã解æ¾ããã343 * rel_addr -- IPv4 アドレス、サブネットマスク、静的経路表を解放する。 362 344 */ 363 345 … … 402 384 403 385 /* 404 * rel_options -- ãªã¼ã¹ããããªãã·ã§ã³ã解æãã¦å¤ã解æ¾ããã386 * rel_options -- リースされたオプションを解析して値を解放する。 405 387 */ 406 388 … … 468 450 469 451 /* 470 * rel_lease -- ãªã¼ã¹ãããæ 471 å ±ã解æ¾ããã 452 * rel_lease -- リースされた情報を解放する。 472 453 */ 473 454 … … 475 456 rel_lease (T_DHCP4_CLI_CONTEXT *ct) 476 457 { 477 /* æå¹ãªãªã¼ã¹ã»ã¡ãã»ã¼ã¸æ§é ä½ãç¡ããã°ä½ãããªãã*/458 /* 有効なリース・メッセージ構造体が無ければ何もしない。*/ 478 459 if (ct->act_msg == NULL) 479 460 return; 480 461 481 /* ãªã¼ã¹ããããªãã·ã§ã³ã解æãã¦å¤ã解æ¾ããã*/462 /* リースされたオプションを解析して値を解放する。*/ 482 463 rel_options(ct, DHCP4_OPTION_OFFSET + DHCP4_MAGIC_LEN, 483 464 ct->act_msg->len - (DHCP4_OPTION_OFFSET + DHCP4_MAGIC_LEN), true); 484 465 rel_addr(); 485 466 486 /* æå¹ãªãªã¼ã¹ã»ã¡ãã»ã¼ã¸æ§é ä½ã解æ¾ããã*/467 /* 有効なリース・メッセージ構造体を解放する。*/ 487 468 syscall(rel_mpf(MPF_DHCP4_CLI_MSG, (void*)ct->act_msg)); 488 469 ct->act_msg = NULL; … … 490 471 491 472 /* 492 * set_addr -- IPv4 ã¢ãã¬ã¹ããµãããããã¹ã¯ãéççµè·¯è¡¨ãè¨å®ããã473 * set_addr -- IPv4 アドレス、サブネットマスク、静的経路表を設定する。 493 474 */ 494 475 … … 529 510 530 511 /* 531 * set_options -- ãªã¼ã¹ããããªãã·ã§ã³ã解æãã¦å¤ãè¨å®ããã512 * set_options -- リースされたオプションを解析して値を設定する。 532 513 */ 533 514 … … 602 583 603 584 /* 604 * set_lease -- ãªã¼ã¹ãããæ 605 å ±ãè¨å®ããã 585 * set_lease -- リースされた情報を設定する。 606 586 */ 607 587 … … 609 589 set_lease (T_DHCP4_CLI_CONTEXT *ct) 610 590 { 611 /* ãªã¼ã¹ããããªãã·ã§ã³ã解æãã¦å¤ãè¨å®ããã*/591 /* リースされたオプションを解析して値を設定する。*/ 612 592 set_options(ct, DHCP4_OPTION_OFFSET + DHCP4_MAGIC_LEN, 613 593 ct->act_msg->len - (DHCP4_OPTION_OFFSET + DHCP4_MAGIC_LEN), true); … … 615 595 616 596 /* 617 * validate_duplicate -- æå®ããã IPv4 ã¢ãã¬ã¹ã使ããã¦ããªããæ¤è¨¼ããã597 * validate_duplicate -- 指定された IPv4 アドレスが使われていないか検証する。 618 598 * 619 * 使ããã¦ããªãæ㯠true ãè¿ãã599 * 使われていない時は true を返す。 620 600 */ 621 601 … … 625 605 T_IN4_ADDR yiaddr; 626 606 627 /* æå®ããã IPv4 ã¢ãã¬ã¹ã ADDR ANY ãªã使ããã¦ããªãã¨å¤æããã*/607 /* 指定された IPv4 アドレスが ADDR ANY なら使われていないと判断する。*/ 628 608 yiaddr = ntohl(msg->msg.yiaddr); 629 609 if (yiaddr == IPV4_ADDRANY) 630 610 return true; 631 611 632 /* ARP ãã£ãã·ã¥ã«ããã°ä½¿ããã¦ããã¨å¤æããã*/612 /* ARP キャッシュにあれば使われていると判断する。*/ 633 613 if (arp_lookup(yiaddr, false) != NULL) 634 614 return false; 635 615 636 616 /* 637 * ARP è¦æ±ãåºåã㦠TMO_DHCP4C_ARP_WAIT å¾ 638 ã¡ã 639 * ARP ãã£ãã·ã¥ã«ãªããã°ä½¿ããã¦ããªãã¨å¤æããã 617 * ARP 要求を出力して TMO_DHCP4C_ARP_WAIT 待ち、 618 * ARP キャッシュになければ使われていないと判断する。 640 619 */ 641 620 arp_request(&IF_ETHER_NIC_GET_SOFTC()->ifaddr, yiaddr); … … 645 624 646 625 /* 647 * validate_rcv_msg -- åä¿¡ã¡ãã»ã¼ã¸ãæ¤è¨¼ããã626 * validate_rcv_msg -- 受信メッセージを検証する。 648 627 */ 649 628 … … 653 632 uint8_t *opt; 654 633 655 /* packet type ã DHCP4_REPLY ã§ãããã¨ã確èªããã*/634 /* packet type が DHCP4_REPLY であることを確認する。*/ 656 635 if (!(msg->msg.op == DHCP4_REPLY)) 657 636 return false; 658 637 659 /* ã¡ãã»ã¼ã¸ã¿ã¤ããªãã·ã§ã³ããããã¨ã確èªããã*/638 /* メッセージタイプオプションがあることを確認する。*/ 660 639 if ((opt = find_option(msg, DHCP4_OPT_MSG_TYPE, 1)) == NULL) 661 640 return E_PAR; 662 641 663 /* ã¡ãã»ã¼ã¸ã®ã¿ã¤ããä¸è´ãã¦ãããã¨ãæ¤è¨¼ããã*/642 /* メッセージのタイプが一致していることを検証する。*/ 664 643 msg->type = *(opt + 2); 665 644 switch (ct->fsm) { … … 691 670 } 692 671 693 /* ãã¸ãã¯çªå·ãæ¤è¨¼ããã*/672 /* マジック番号を検証する。*/ 694 673 if (memcmp((uint8_t*)&msg->msg.options, magicno, DHCP4_MAGIC_LEN)) 695 674 return E_PAR; 696 675 697 /* ãã©ã³ã¶ã¯ã·ã§ã³ ID ãç°ãªã£ã¦ããã°ã¨ã©ã¼*/676 /* トランザクション ID が異なっていればエラー */ 698 677 if (ntohl(msg->msg.xid) != ct->xid) 699 678 return E_PAR; 700 679 701 /* ãã¼ãã¦ã§ã¢ã¢ãã¬ã¹é·ã 6ï¼MAC ã¢ãã¬ã¹é·ï¼ã§ãªããã°ã¨ã©ã¼*/680 /* ハードウェアアドレス長が 6(MAC アドレス長)でなければエラー */ 702 681 if (msg->msg.hlen != ETHER_ADDR_LEN) 703 682 return E_PAR; 704 683 705 /* ãã¼ãã¦ã§ã¢ã¢ãã¬ã¹ãç°ãªã£ã¦ããã°ã¨ã©ã¼*/684 /* ハードウェアアドレスが異なっていればエラー */ 706 685 if (memcmp(&msg->msg.chaddr, &ct->sc->ifaddr.lladdr, sizeof(ct->sc->ifaddr.lladdr))) 707 686 return E_PAR; 708 687 709 688 /* 710 * ã¡ãã»ã¼ã¸ã¿ã¤ãã OFFER ã®å ´åã¯ã 711 * ARP ã使ç¨ãã¦ãæå®ããã IPv4 ã¢ãã¬ã¹ã使ããã¦ããªããæ¤è¨¼ããã 712 * 使ããã¦ããæã¯ãä»ã® IPv4 ã¢ãã¬ã¹ã®æä¾ãå¾ 713 ã¤ã 689 * メッセージタイプが OFFER の場合は、 690 * ARP を使用して、指定された IPv4 アドレスが使われていないか検証する。 691 * 使われている時は、他の IPv4 アドレスの提供を待つ。 714 692 */ 715 693 if (msg->type == DHCP4_MTYPE_OFFER) { … … 722 700 723 701 /* 724 * eval_prefer -- åä¿¡ã¡ãã»ã¼ã¸ã®æ¨å¥¨åº¦ãè©ä¾¡ããã702 * eval_prefer -- 受信メッセージの推奨度を評価する。 725 703 */ 726 704 … … 730 708 int ix; 731 709 732 /* ç¡å¹ã®å ´åã¯çµäºããã*/710 /* 無効の場合は終了する。*/ 733 711 if (msg == NULL) 734 712 return; 735 713 736 /* æå®ããã IPv4 ã¢ãã¬ã¹ã ADDR ANY ãªãæ¨å¥¨åº¦ã 0ã«è¨å®ããã*/714 /* 指定された IPv4 アドレスが ADDR ANY なら推奨度を 0に設定する。*/ 737 715 if (ntohl(msg->msg.yiaddr) == IPV4_ADDRANY) 738 716 msg->prefer = 0; … … 742 720 #if defined(DHCP4_CLI_CFG_REQUEST_OLIST) 743 721 744 /* è¦æ±ãªãã·ã§ã³ãæ¤è¨¼ããã*/722 /* 要求オプションを検証する。*/ 745 723 for (ix = sizeof(request_plist); ix -- > 0; ) { 746 724 if (find_option(msg, request_plist[ix], 0) != NULL) … … 752 730 #if defined(DHCP4_CLI_CFG_REQUIRED_OLIST) 753 731 754 /* å¿ 755 é ãªãã·ã§ã³ãæ¤è¨¼ããã*/ 732 /* 必須オプションを検証する。*/ 756 733 for (ix = sizeof(required_plist); ix -- > 0; ) { 757 734 if (find_option(msg, required_plist[ix], 0) == NULL) … … 763 740 764 741 /* 765 * eval_rcv_msg -- åä¿¡ã¡ãã»ã¼ã¸ãè©ä¾¡ããã742 * eval_rcv_msg -- 受信メッセージを評価する。 766 743 */ 767 744 … … 771 748 T_DHCP4_CLI_MSG *evl, *msg; 772 749 773 /* ã¡ãã»ã¼ã¸ãåä¿¡ãã¦ããªããã°ä¸æ¢ããã*/750 /* メッセージを受信していなければ中止する。*/ 774 751 syscall(wai_sem(SEM_DHCP4_CLI_LOCK)); 775 752 if (ct->val_lst == NULL) { … … 778 755 } 779 756 780 /* æ¤è¨¼ã¡ãã»ã¼ã¸ãªã¹ãããè©ä¾¡ã¡ãã»ã¼ã¸ãåãåºãã*/757 /* 検証メッセージリストから評価メッセージを取り出す。*/ 781 758 evl = ct->val_lst; 782 759 ct->val_lst = ct->val_lst->next; … … 784 761 syscall(sig_sem(SEM_DHCP4_CLI_LOCK)); 785 762 786 /* è©ä¾¡ã¡ãã»ã¼ã¸ãæ¤è¨¼ããã*/763 /* 評価メッセージを検証する。*/ 787 764 if (validate_rcv_msg(ct, evl) != E_OK) { 788 765 789 /* ã¨ã©ã¼ãçºçããè©ä¾¡ã¡ãã»ã¼ã¸ãåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã«æ»ãã*/766 /* エラーが発生した評価メッセージを受信メッセージ構造体リストに戻す。*/ 790 767 goto rcv_ret; 791 768 } 792 769 793 /* åä¿¡ããã¡ãã»ã¼ã¸ã NAK ã®æã®å¦ç*/770 /* 受信したメッセージが NAK の時の処理 */ 794 771 if (evl->type == DHCP4_MTYPE_NAK) { 795 772 796 /* ãªã¼ã¹ãããæ 797 å ±ã解æ¾ããã*/ 773 /* リースされた情報を解放する。*/ 798 774 rel_lease(ct); 799 775 800 /* å 801 é¨ã¨ã©ã¼ãè¨å®ãã¦çµäºããã*/ 776 /* 内部エラーを設定して終了する。*/ 802 777 return E_PAR; 803 778 } 804 779 805 /* REL_INFO ç¶æ 806 ã®æã®å¦ç */ 780 /* REL_INFO 状態の時の処理 */ 807 781 //cons_printf(CONSOLE_PORTID, "evl_rcv_msg3[s=%d]\n", ct->fsm); 808 782 if (ct->fsm == DHCP4_FSM_REL_INFO) { … … 814 788 } 815 789 816 /* è©ä¾¡ã¡ãã»ã¼ã¸ã®æ¨å¥¨åº¦ãè©ä¾¡ããã*/790 /* 評価メッセージの推奨度を評価する。*/ 817 791 eval_prefer(evl); 818 792 819 /* æ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ãã空ãªãè©ä¾¡ã¡ãã»ã¼ã¸ã移ãã¦çµäºããã*/793 /* 推奨メッセージリストが空なら評価メッセージを移して終了する。*/ 820 794 if (ct->prf_lst == NULL) { 821 795 ct->max_prefer = evl->prefer; … … 824 798 } 825 799 826 /* è©ä¾¡ã¡ãã»ã¼ã¸ã®æ¨å¥¨åº¦ã¨æ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ãã®æ大æ¨å¥¨åº¦ãæ¯è¼ããã*/800 /* 評価メッセージの推奨度と推奨メッセージリストの最大推奨度を比較する。*/ 827 801 if (evl->prefer > ct->max_prefer) { 828 802 829 803 /* 830 * è©ä¾¡ã¡ãã»ã¼ã¸ã®æ¨å¥¨åº¦ãæ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ãã®æ大æ¨å¥¨åº¦ããé«ããã°ã831 * æ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ããåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã«æ»ãã832 * è©ä¾¡ã¡ãã»ã¼ã¸ãæ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ãã«ç§»ãã804 * 評価メッセージの推奨度が推奨メッセージリストの最大推奨度より高ければ、 805 * 推奨メッセージリストを受信メッセージ構造体リストに戻し、 806 * 評価メッセージを推奨メッセージリストに移す。 833 807 */ 834 808 ct->max_prefer = evl->prefer; … … 851 825 852 826 /* 853 * æ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ãã«åã DHCP4_OPT_SERVER_ID ã®ã¡ãã»ã¼ã¸ãããã°ã854 * è©ä¾¡ã¡ãã»ã¼ã¸ãåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã«æ»ãã827 * 推奨メッセージリストに同じ DHCP4_OPT_SERVER_ID のメッセージがあれば、 828 * 評価メッセージを受信メッセージ構造体リストに戻す。 855 829 */ 856 830 goto rcv_ret; … … 859 833 860 834 /* 861 * è©ä¾¡ã¡ãã»ã¼ã¸ãæ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ãã«ç§»ãã835 * 評価メッセージを推奨メッセージリストに移す。 862 836 */ 863 837 evl->next = ct->prf_lst; … … 868 842 /*else */ 869 843 /* 870 * è©ä¾¡ã¡ãã»ã¼ã¸ã®æ¨å¥¨åº¦ãæ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ãã®æ大æ¨å¥¨åº¦ããä½ããã°ã871 * è©ä¾¡ã¡ãã»ã¼ã¸ãåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã«æ»ãã844 * 評価メッセージの推奨度が推奨メッセージリストの最大推奨度より低ければ、 845 * 評価メッセージを受信メッセージ構造体リストに戻す。 872 846 */ 873 847 … … 881 855 882 856 /* 883 * select_msg -- æ¨å¥¨ã¡ãã»ã¼ã¸ãé¸æããã857 * select_msg -- 推奨メッセージを選択する。 884 858 */ 885 859 … … 891 865 syscall(wai_sem(SEM_DHCP4_CLI_LOCK)); 892 866 if (ct->prf_lst == NULL) { 893 /* ã¡ãã»ã¼ã¸ãåä¿¡ãã¦ããªããã°ä¸æ¢ããã*/867 /* メッセージを受信していなければ中止する。*/ 894 868 syscall(sig_sem(SEM_DHCP4_CLI_LOCK)); 895 869 return NULL; 896 870 } 897 871 898 /* æ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ãã®å 899 é ã®ã¡ãã»ã¼ã¸ãé¸æããã*/ 872 /* 推奨メッセージリストの先頭のメッセージを選択する。*/ 900 873 select = ct->prf_lst; 901 874 ct->prf_lst = ct->prf_lst->next; 902 875 select->next = NULL; 903 876 904 /* é¸æãããªãã£ãæ¤è¨¼ã¡ãã»ã¼ã¸ãåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã«æ»ãã*/877 /* 選択されなかった検証メッセージを受信メッセージ構造体リストに戻す。*/ 905 878 if (ct->rcv_lst == NULL) 906 879 ct->rcv_lst = ct->prf_lst; … … 915 888 916 889 /* 917 * select_ack -- ACK ã¡ãã»ã¼ã¸ãæ¤è¨¼ããã890 * select_ack -- ACK メッセージを検証する。 918 891 * 919 * åãå 920 ¥ãããã¨ãå¯è½ã®æ㯠true ãè¿ãã 892 * 受け入れることが可能の時は true を返す。 921 893 */ 922 894 … … 929 901 return false; 930 902 931 /* æå¹ãªãªã¼ã¹ã»ã¡ãã»ã¼ã¸ãæ®ã£ã¦ããã°ãåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã«æ»ãã*/903 /* 有効なリース・メッセージが残っていれば、受信メッセージ構造体リストに戻す。*/ 932 904 if (ct->act_msg != NULL) { 933 905 syscall(wai_sem(SEM_DHCP4_CLI_LOCK)); … … 937 909 } 938 910 939 /* æå¹ãªãªã¼ã¹ã»ã¡ãã»ã¼ã¸ã«è¨å®ããã*/911 /* 有効なリース・メッセージに設定する。*/ 940 912 ct->act_msg = msg; 941 913 return true; … … 943 915 944 916 /* 945 * select_offer -- OFFER ã¡ãã»ã¼ã¸ãæ¤è¨¼ããã917 * select_offer -- OFFER メッセージを検証する。 946 918 * 947 * åãå 948 ¥ãããã¨ãå¯è½ã®æ㯠true ãè¿ãã 919 * 受け入れることが可能の時は true を返す。 949 920 */ 950 921 … … 956 927 957 928 /* 958 * cancel_all_timers -- å 959 ¨ã¦ã® TIMER ããã£ã³ã»ã«ããã 929 * cancel_all_timers -- 全ての TIMER をキャンセルする。 960 930 */ 961 931 … … 973 943 974 944 /* 975 * start_select -- DISCOVER ã¡ãã»ã¼ã¸ãéä¿¡ã㦠SELECT ç¶æ 976 ã«é·ç§»ããã 945 * start_select -- DISCOVER メッセージを送信して SELECT 状態に遷移する。 977 946 */ 978 947 … … 980 949 start_select (T_DHCP4_CLI_CONTEXT *ct) 981 950 { 982 /* éä¿¡ãéå§ããæéãè¨é²ããã*/951 /* 送信を開始した時間を記録する。*/ 983 952 get_tim(&ct->snd_start); 984 953 985 /* OFFER ã¡ãã»ã¼ã¸åä¿¡ã¿ã¤ã ã¢ã¦ããè¨å®ããã*/954 /* OFFER メッセージ受信タイムアウトを設定する。*/ 986 955 DHCP4_CLI_TIMER_LOCK(); 987 956 ct->timers[DHCP4C_TIMER_RCV_OFFER] = SYSTIM2TIMER(TMO_DHCP4C_OFFER); 988 957 DHCP4_CLI_TIMER_UNLOCK(); 989 958 990 /* éä¿¡å 991 ã¢ãã¬ã¹ã«ãã¼ã«ã«ãããã¯ã¼ã¯ã¸ã®ããã¼ããã£ã¹ããè¨å®ããã*/ 959 /* 送信先アドレスにローカルネットワークへのブロードキャストを設定する。*/ 992 960 ct->dst.ipaddr = IPV4_ADDRBROADCAST; 993 961 994 /* éä¿¡ééããªã»ããããã*/962 /* 送信間隔をリセットする。*/ 995 963 ct->interval = 0; 996 964 997 /* SELECT ç¶æ 998 ã«é·ç§»ããã*/ 965 /* SELECT 状態に遷移する。*/ 999 966 ct->fsm = DHCP4_FSM_SELECT; 1000 967 1001 /* DISCOVER ã¡ãã»ã¼ã¸ãéä¿¡ããã*/968 /* DISCOVER メッセージを送信する。*/ 1002 969 ct->flags |= DHCP4C_FLAG_TMOUT_SND_DISC; 1003 970 DHCP4_CLI_READY_SIGNAL(ct); … … 1005 972 1006 973 /* 1007 * start_bound -- BOUND ç¶æ 1008 ã«é·ç§»ããã 974 * start_bound -- BOUND 状態に遷移する。 1009 975 */ 1010 976 … … 1012 978 start_bound (T_DHCP4_CLI_CONTEXT *ct) 1013 979 { 1014 /* ãªã¼ã¹ãããæ 1015 å ±ãè¨å®ããã*/ 980 /* リースされた情報を設定する。*/ 1016 981 set_lease(ct); 1017 982 1018 /* ãªã¼ã¹ã®æå¹æéãè¨å®ããã*/983 /* リースの有効時間を設定する。*/ 1019 984 ct->expire = timer_value(ct->act_msg, DHCP4_OPT_LEASE_TIME, TMO_DHCP4C_DEF_LEASE); 1020 985 1021 /* ãªã¼ã¹æéã TMO_DHCP4C_MIN_LEASE 以ä¸ã®æã¯ãTMO_DHCP4C_MIN_LEASE ã«è¨å®ããã*/986 /* リース時間が TMO_DHCP4C_MIN_LEASE 以下の時は、TMO_DHCP4C_MIN_LEASE に設定する。*/ 1022 987 if (ct->expire < TMO_DHCP4C_MIN_LEASE) 1023 988 ct->expire = TMO_DHCP4C_MIN_LEASE; 1024 989 1025 /* RENEW ç¶æ 1026 ã¾ã§ã®æéãè¨å®ããã*/ 990 /* RENEW 状態までの時間を設定する。*/ 1027 991 ct->renew = timer_value(ct->act_msg, DHCP4_OPT_RENEWAL_T1, ct->expire / 2); 1028 992 1029 /* REBIND ç¶æ 1030 ã¾ã§ã®æéãè¨å®ããã*/ 993 /* REBIND 状態までの時間を設定する。*/ 1031 994 ct->rebind = timer_value(ct->act_msg, DHCP4_OPT_REBINDING_T2, ct->renew + ct->renew / 2 + ct->renew / 4); 1032 995 1033 /* EXPIRE ãRENEWãREBIND ã¿ã¤ãã¼ãè¨å®ããã*/996 /* EXPIRE、RENEW、REBIND タイマーを設定する。*/ 1034 997 DHCP4_CLI_TIMER_LOCK(); 1035 ct->timers[DHCP4C_TIMER_EXPIRE] = SYSTIM2TIMER(ct->expire); /* EXPIRE ã¾ã§ã®æé*/1036 ct->timers[DHCP4C_TIMER_REBIND] = SYSTIM2TIMER(ct->rebind); /* REBIND ï¼T2ï¼ã¾ã§ã®æé*/1037 ct->timers[DHCP4C_TIMER_RENEW] = SYSTIM2TIMER(ct->renew); /* RENEW ï¼T1ï¼ã¾ã§ã®æé*/998 ct->timers[DHCP4C_TIMER_EXPIRE] = SYSTIM2TIMER(ct->expire); /* EXPIRE までの時間 */ 999 ct->timers[DHCP4C_TIMER_REBIND] = SYSTIM2TIMER(ct->rebind); /* REBIND(T2)までの時間 */ 1000 ct->timers[DHCP4C_TIMER_RENEW] = SYSTIM2TIMER(ct->renew); /* RENEW (T1)までの時間 */ 1038 1001 DHCP4_CLI_TIMER_UNLOCK(); 1039 1002 1040 /* BOUND ç¶æ 1041 ã«é·ç§»ããã*/ 1003 /* BOUND 状態に遷移する。*/ 1042 1004 ct->fsm = DHCP4_FSM_BOUND; 1043 1005 1044 /* BIND ãéå§ããæéãè¨é²ããã*/1006 /* BIND を開始した時間を記録する。*/ 1045 1007 get_tim(&ct->bind_start); 1046 1008 } 1047 1009 1048 1010 /* 1049 * start_send_request -- REQUEST ã¡ãã»ã¼ã¸ãéä¿¡ãã¦ãæå®ãããç¶æ 1050 ã«é·ç§»ããã 1011 * start_send_request -- REQUEST メッセージを送信して、指定された状態に遷移する。 1051 1012 */ 1052 1013 … … 1056 1017 T_IFNET *ifp = IF_GET_IFNET(); 1057 1018 1058 /* éä¿¡ãéå§ããæéãè¨é²ããã*/1019 /* 送信を開始した時間を記録する。*/ 1059 1020 get_tim(&ct->snd_start); 1060 1021 1061 /* é·ç§»ããç¶æ 1062 ã RENEW 以å¤ã§ã¯ ACK/NAK ã¡ãã»ã¼ã¸åä¿¡ã¿ã¤ã ã¢ã¦ããè¨å®ããã*/ 1022 /* 遷移する状態が RENEW 以外では ACK/NAK メッセージ受信タイムアウトを設定する。*/ 1063 1023 if (fsm != DHCP4_FSM_RENEW) { 1064 1024 DHCP4_CLI_TIMER_LOCK(); … … 1068 1028 1069 1029 /* 1070 * é·ç§»ããç¶æ 1071 ã RENEW ã§ã 1072 * SERVER ID ãªãã·ã§ã³ãããã°ãã¼ã«ã«ãããã¯ã¼ã¯ã¸ã®ããã¼ããã£ã¹ããéä¿¡ããã 1030 * 遷移する状態が RENEW で、 1031 * SERVER ID オプションがあればローカルネットワークへのブロードキャストを送信する。 1073 1032 */ 1074 1033 if ((fsm == DHCP4_FSM_RENEW) && … … 1078 1037 ct->dst.ipaddr = IPV4_ADDRBROADCAST; 1079 1038 1080 /* éä¿¡ééããªã»ããããã*/1039 /* 送信間隔をリセットする。*/ 1081 1040 ct->interval = 0; 1082 1041 1083 /* æå®ãããç¶æ 1084 ã«é·ç§»ããã*/ 1042 /* 指定された状態に遷移する。*/ 1085 1043 ct->fsm = fsm; 1086 1044 1087 /* REQUEST ã¡ãã»ã¼ã¸ãéä¿¡ããã*/1045 /* REQUEST メッセージを送信する。*/ 1088 1046 ct->flags |= DHCP4C_FLAG_TMOUT_SND_REQ; 1089 1047 DHCP4_CLI_READY_SIGNAL(ct); … … 1091 1049 1092 1050 /* 1093 * start_rel_info -- ã¢ãã¬ã¹æ 1094 å ±ã解æ¾ããã 1051 * start_rel_info -- アドレス情報を解放する。 1095 1052 * 1096 * 注æ: DHCPv4 ã® RFC2131 ã«ã¯ç¡ã1053 * 注意: DHCPv4 の RFC2131 には無い 1097 1054 */ 1098 1055 … … 1100 1057 start_rel_info (T_DHCP4_CLI_CONTEXT *ct) 1101 1058 { 1102 /* å 1103 ¨ã¦ã® TIMER ããã£ã³ã»ã«ããã*/ 1059 /* 全ての TIMER をキャンセルする。*/ 1104 1060 cancel_all_timers(ct); 1105 1061 1106 /* æå¹ãªãªã¼ã¹æ 1107 å ±ãç¡ããã° SLEEP ã«é·ç§»ããã*/ 1062 /* 有効なリース情報が無ければ SLEEP に遷移する。*/ 1108 1063 if (ct->act_msg == NULL) { 1109 1064 ct->fsm = DHCP4_FSM_SLEEP; … … 1111 1066 } 1112 1067 1113 /* éä¿¡å 1114 ã¢ãã¬ã¹ã«ãã¼ã«ã«ãããã¯ã¼ã¯ã¸ã®ããã¼ããã£ã¹ããè¨å®ããã*/ 1068 /* 送信先アドレスにローカルネットワークへのブロードキャストを設定する。*/ 1115 1069 ct->dst.ipaddr = IPV4_ADDRBROADCAST; 1116 1070 1117 /* RELEASE ã¡ãã»ã¼ã¸ãéä¿¡ããã*/1071 /* RELEASE メッセージを送信する。*/ 1118 1072 ct->flags |= DHCP4C_FLAG_TMOUT_SND_REL; 1119 1073 DHCP4_CLI_READY_SIGNAL(ct); … … 1121 1075 1122 1076 /* 1123 * setup_dhcp_com_msg -- DHCP ã¡ãã»ã¼ã¸ã®å 1124 ±éé¨åãä½æããã 1077 * setup_dhcp_com_msg -- DHCP メッセージの共通部分を作成する。 1125 1078 */ 1126 1079 … … 1133 1086 ct->snd_msg->len = sizeof(ct->snd_msg->msg); 1134 1087 1135 /* ãããé¨ãè¨å®ããã*/1088 /* ヘッダ部を設定する。*/ 1136 1089 ct->snd_msg->msg.op = op; 1137 1090 ct->snd_msg->msg.htype = DHCP4_HWA_TYPE_ETHER; … … 1139 1092 HOST2MSG32(ct->snd_msg->msg.xid, ct->xid); 1140 1093 1141 /* MAC ã¢ãã¬ã¹ãè¨å®ããã*/1094 /* MAC アドレスを設定する。*/ 1142 1095 memcpy(&ct->snd_msg->msg.chaddr, &ct->sc->ifaddr.lladdr, ETHER_ADDR_LEN); 1143 1096 1144 1097 /* 1145 * ãªãã·ã§ã³é¨ãè¨å®ããã1098 * オプション部を設定する。 1146 1099 */ 1147 1100 1148 /* RFC1048 ã«å®ç¾©ããã¦ãããã¸ãã¯çªå·ãè¨å®ããã*/1101 /* RFC1048 に定義されているマジック番号を設定する。*/ 1149 1102 memcpy(&ct->snd_msg->msg.options, magicno, DHCP4_MAGIC_LEN); 1150 1103 option = ct->snd_msg->msg.options + DHCP4_MAGIC_LEN; 1151 1104 1152 /* DHCP ã¡ãã»ã¼ã¸ã¿ã¤ããè¨å®ããã*/1105 /* DHCP メッセージタイプを設定する。*/ 1153 1106 *(option ++) = DHCP4_OPT_MSG_TYPE; 1154 1107 *(option ++) = 1; … … 1159 1112 1160 1113 /* 1161 * setup_release_msg -- RELEASE ã¡ãã»ã¼ã¸ãä½æããã1114 * setup_release_msg -- RELEASE メッセージを作成する。 1162 1115 */ 1163 1116 … … 1167 1120 uint8_t *opt, *ref_opt; 1168 1121 1169 /* æå¹ãªãªã¼ã¹ã»ã¡ãã»ã¼ã¸ããªããã°ã¨ã©ã¼*/1122 /* 有効なリース・メッセージがなければエラー */ 1170 1123 if (ref == NULL) 1171 1124 return E_PAR; … … 1176 1129 1177 1130 /* 1178 * ãµã¼ã IDï¼server-ipï¼ãè¨å®ããã 1179 * RFC2131 4.4.1 Initialization and allocation of network address åç 1180 § 1131 * サーバ ID(server-ip)を設定する。 1132 * RFC2131 4.4.1 Initialization and allocation of network address 参照 1181 1133 */ 1182 1134 if ((ref_opt = find_option(ref, DHCP4_OPT_SERVER_ID, sizeof(T_IN4_ADDR))) == NULL) … … 1188 1140 1189 1141 /* 1190 * ã¯ã©ã¤ã¢ã³ã IDï¼MAC ã¢ãã¬ã¹ï¼ãè¨å®ããã 1191 * RFC2131 4.4.1 Initialization and allocation of network address åç 1192 § 1142 * クライアント ID(MAC アドレス)を設定する。 1143 * RFC2131 4.4.1 Initialization and allocation of network address 参照 1193 1144 */ 1194 1145 *(opt ++) = DHCP4_OPT_CLIENT_ID; … … 1198 1149 opt += ETHER_ADDR_LEN; 1199 1150 1200 /* ãªãã·ã§ã³ã®çµäºãè¨å®ããã*/1151 /* オプションの終了を設定する。*/ 1201 1152 *(opt ++) = DHCP4_OPT_END; 1202 1153 1203 1154 /* 1204 * ã¯ã©ã¤ã¢ã³ã IP ã¢ãã¬ã¹ï¼ciaddrï¼ãè¨å®ããã 1205 * RFC2131 4.4.1 Initialization and allocation of network address åç 1206 § 1155 * クライアント IP アドレス(ciaddr)を設定する。 1156 * RFC2131 4.4.1 Initialization and allocation of network address 参照 1207 1157 */ 1208 1158 HOST2MSG32(ct->snd_msg->msg.ciaddr, IF_GET_IFNET()->in4_ifaddr.addr); 1209 1159 1210 /* ã¡ãã»ã¼ã¸é·ãè¨å®ããã*/1160 /* メッセージ長を設定する。*/ 1211 1161 ct->snd_msg->len = sizeof(ct->snd_msg->msg) - DHCP4_DFLT_OPT_LEN 1212 1162 + (opt - (uint8_t*)&ct->snd_msg->msg.options); … … 1216 1166 1217 1167 /* 1218 * setup_request_msg -- REQUEST ã¡ãã»ã¼ã¸ãä½æããã1168 * setup_request_msg -- REQUEST メッセージを作成する。 1219 1169 */ 1220 1170 … … 1228 1178 #endif 1229 1179 1230 /* åç 1231 §ããã¡ãã»ã¼ã¸ããªããã°ã¨ã©ã¼ */ 1180 /* 参照するメッセージがなければエラー */ 1232 1181 if (ref == NULL) 1233 1182 return E_PAR; … … 1239 1188 #if defined(DHCP4_CLI_CFG_REQUIRED_OLIST) || defined(DHCP4_CLI_CFG_REQUEST_OLIST) 1240 1189 1241 /* 追å ã®ãªãã·ã§ã³ãè¨å®ããã*/1190 /* 追加のオプションを設定する。*/ 1242 1191 1243 1192 *opt = DHCP4_OPT_REQ_PARAM; … … 1246 1195 #if defined(DHCP4_CLI_CFG_REQUIRED_OLIST) 1247 1196 1248 /* è¦æ±ãªãã·ã§ã³ãªã¹ããè¨å®ããã*/1197 /* 要求オプションリストを設定する。*/ 1249 1198 if (sizeof(required_plist) > 0) { 1250 1199 memcpy(opt, required_plist, sizeof(required_plist)); … … 1257 1206 #if defined(DHCP4_CLI_CFG_REQUEST_OLIST) 1258 1207 1259 /* è¦æ±ãªãã·ã§ã³ãªã¹ããè¨å®ããã*/1208 /* 要求オプションリストを設定する。*/ 1260 1209 if (sizeof(request_plist) > 0) { 1261 1210 memcpy(opt, request_plist, sizeof(request_plist)); … … 1271 1220 1272 1221 /* 1273 * ãµã¼ã IDï¼server-ipï¼ãè¨å®ããã 1274 * RFC2131 4.4.1 Initialization and allocation of network address åç 1275 § 1222 * サーバ ID(server-ip)を設定する。 1223 * RFC2131 4.4.1 Initialization and allocation of network address 参照 1276 1224 */ 1277 1225 if (ct->fsm == DHCP4_FSM_REQUEST) { … … 1285 1233 1286 1234 /* 1287 * è¦æ± IP ã¢ãã¬ã¹ï¼requested-ipï¼ãè¨å®ããã 1288 * RFC2131 4.4.1 Initialization and allocation of network address åç 1289 § 1290 * RFC2131 ã§ã¯ãDHCP4_FSM_RENEW ã®æ MUST NOT ã«ãªã£ã¦ãããã 1291 * MUST ã®ããã§ããã 1235 * 要求 IP アドレス(requested-ip)を設定する。 1236 * RFC2131 4.4.1 Initialization and allocation of network address 参照 1237 * RFC2131 では、DHCP4_FSM_RENEW の時 MUST NOT になっているが、 1238 * MUST のようである。 1292 1239 */ 1293 1240 *(opt ++) = DHCP4_OPT_REQ_IPV4; … … 1295 1242 if (ct->fsm == DHCP4_FSM_REQUEST || ct->fsm == DHCP4_FSM_INIT_REBOOT || 1296 1243 ct->fsm == DHCP4_FSM_RENEW || ct->fsm == DHCP4_FSM_REBIND) 1297 /* åç 1298 §ã¡ãã»ã¼ã¸ã¨åã IP ã¢ãã¬ã¹ï¼requested-ipï¼ãè¦æ±ããã*/ 1244 /* 参照メッセージと同じ IP アドレス(requested-ip)を要求する。*/ 1299 1245 memcpy(opt, (uint8_t*)&ref->msg.yiaddr, sizeof(ref->msg.yiaddr)); 1300 1246 else … … 1303 1249 1304 1250 /* 1305 * ã¯ã©ã¤ã¢ã³ã IDï¼MAC ã¢ãã¬ã¹ï¼ãè¨å®ããã 1306 * RFC2131 4.4.1 Initialization and allocation of network address åç 1307 § 1251 * クライアント ID(MAC アドレス)を設定する。 1252 * RFC2131 4.4.1 Initialization and allocation of network address 参照 1308 1253 */ 1309 1254 *(opt ++) = DHCP4_OPT_CLIENT_ID; … … 1313 1258 opt += ETHER_ADDR_LEN; 1314 1259 1315 /* ãªãã·ã§ã³ã®çµäºãè¨å®ããã*/1260 /* オプションの終了を設定する。*/ 1316 1261 *(opt ++) = DHCP4_OPT_END; 1317 1262 1318 1263 /* 1319 * ã¯ã©ã¤ã¢ã³ã IP ã¢ãã¬ã¹ï¼ciaddrï¼ãè¨å®ããã 1320 * RFC2131 4.4.1 Initialization and allocation of network address åç 1321 § 1264 * クライアント IP アドレス(ciaddr)を設定する。 1265 * RFC2131 4.4.1 Initialization and allocation of network address 参照 1322 1266 */ 1323 1267 if (ct->fsm == DHCP4_FSM_RENEW || ct->fsm == DHCP4_FSM_REBIND) … … 1326 1270 HOST2MSG32(ct->snd_msg->msg.ciaddr, IPV4_ADDRANY); 1327 1271 1328 /* ã¡ãã»ã¼ã¸é·ãè¨å®ããã*/1272 /* メッセージ長を設定する。*/ 1329 1273 ct->snd_msg->len = sizeof(ct->snd_msg->msg) - DHCP4_DFLT_OPT_LEN 1330 1274 + (opt - (uint8_t*)&ct->snd_msg->msg.options); … … 1333 1277 1334 1278 /* 1335 * setup_discover_msg -- DISCOVER ã¡ãã»ã¼ã¸ãä½æããã1279 * setup_discover_msg -- DISCOVER メッセージを作成する。 1336 1280 */ 1337 1281 … … 1351 1295 #if defined(DHCP4_CLI_CFG_REQUIRED_OLIST) || defined(DHCP4_CLI_CFG_REQUEST_OLIST) 1352 1296 1353 /* 追å ã®ãªãã·ã§ã³ãè¨å®ããã*/1297 /* 追加のオプションを設定する。*/ 1354 1298 1355 1299 *opt = DHCP4_OPT_REQ_PARAM; … … 1358 1302 #if defined(DHCP4_CLI_CFG_REQUIRED_OLIST) 1359 1303 1360 /* è¦æ±ãªãã·ã§ã³ãªã¹ããè¨å®ããã*/1304 /* 要求オプションリストを設定する。*/ 1361 1305 if (sizeof(required_plist) > 0) { 1362 1306 memcpy(opt, required_plist, sizeof(required_plist)); … … 1369 1313 #if defined(DHCP4_CLI_CFG_REQUEST_OLIST) 1370 1314 1371 /* è¦æ±ãªãã·ã§ã³ãªã¹ããè¨å®ããã*/1315 /* 要求オプションリストを設定する。*/ 1372 1316 if (sizeof(request_plist) > 0) { 1373 1317 memcpy(opt, request_plist, sizeof(request_plist)); … … 1382 1326 #endif /* of #if defined(DHCP4_CLI_CFG_REQUIRED_OLIST) || defined(DHCP4_CLI_CFG_REQUEST_OLIST) */ 1383 1327 1384 /* æ¢ã«ã¢ãã¬ã¹æ 1385 å ±ããªã¼ã¹ããã¦ããã°ãåã IP ã¢ãã¬ã¹ãè¦æ±ããã*/ 1328 /* 既にアドレス情報がリースされていれば、同じ IP アドレスを要求する。*/ 1386 1329 if (ct->act_msg != NULL) { 1387 1330 *(opt ++) = DHCP4_OPT_REQ_IPV4; … … 1391 1334 } 1392 1335 1393 /* ã¯ã©ã¤ã¢ã³ã IDï¼MAC ã¢ãã¬ã¹ï¼ãè¨å®ããã*/1336 /* クライアント ID(MAC アドレス)を設定する。*/ 1394 1337 *(opt ++) = DHCP4_OPT_CLIENT_ID; 1395 1338 *(opt ++) = ETHER_ADDR_LEN + 1; … … 1398 1341 opt += ETHER_ADDR_LEN; 1399 1342 1400 /* ãªãã·ã§ã³ã®çµäºãè¨å®ããã*/1343 /* オプションの終了を設定する。*/ 1401 1344 *(opt ++) = DHCP4_OPT_END; 1402 1345 1403 /* éä¿¡å 1404 ã¢ãã¬ã¹ãè¨å®ããã*/ 1346 /* 送信先アドレスを設定する。*/ 1405 1347 ct->dst.ipaddr = IPV4_ADDRBROADCAST; 1406 1348 1407 /* ã¡ãã»ã¼ã¸é·ãè¨å®ããã*/1349 /* メッセージ長を設定する。*/ 1408 1350 ct->snd_msg->len = sizeof(ct->snd_msg->msg) - DHCP4_DFLT_OPT_LEN 1409 1351 + (opt - (uint8_t*)&ct->snd_msg->msg.options); … … 1412 1354 1413 1355 /* 1414 * ack_msg_timeout -- ACK/NAK ã¡ãã»ã¼ã¸åä¿¡ã¿ã¤ã ã¢ã¦ãå¦ç1356 * ack_msg_timeout -- ACK/NAK メッセージ受信タイムアウト処理 1415 1357 */ 1416 1358 … … 1418 1360 ack_msg_timeout (T_DHCP4_CLI_CONTEXT *ct) 1419 1361 { 1420 /* ACK ã¡ãã»ã¼ã¸ãåä¿¡ãã¦ããã°ãBOUND ç¶æ 1421 ã«é·ç§»ããã*/ 1362 /* ACK メッセージを受信していれば。BOUND 状態に遷移する。*/ 1422 1363 ct->flags &= ~DHCP4C_FLAG_TMOUT_MASK; 1423 1364 if (select_ack(ct)) { 1424 1365 1425 /* REQUEST ã¡ãã»ã¼ã¸éä¿¡ã¿ã¤ãã¼ãåæ¢ããã*/1366 /* REQUEST メッセージ送信タイマーを停止する。*/ 1426 1367 DHCP4_CLI_TIMER_LOCK(); 1427 1368 ct->timers[DHCP4C_TIMER_SND_REQ] = 0; … … 1429 1370 1430 1371 /* 1431 * ç¶æ 1432 ã REQUEST ã®æã¯ã 1433 * OFFER ã¡ãã»ã¼ã¸ãåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã«æ»ãã 1372 * 状態が REQUEST の時は、 1373 * OFFER メッセージを受信メッセージ構造体リストに戻す。 1434 1374 */ 1435 1375 if (ct->fsm == DHCP4_FSM_REQUEST && ct->off_msg != NULL) { … … 1441 1381 } 1442 1382 1443 /* BOUND ç¶æ 1444 ã«é·ç§»ããã*/ 1383 /* BOUND 状態に遷移する。*/ 1445 1384 start_bound(ct); 1446 1385 return; … … 1448 1387 else { 1449 1388 1450 /* ãªã¼ã¹æ 1451 å ±ã解æ¾ããã*/ 1389 /* リース情報を解放する。*/ 1452 1390 rel_lease(ct); 1453 1391 … … 1457 1395 1458 1396 /* 1459 * send_request_msg -- REQUEST ã¡ãã»ã¼ã¸ãéä¿¡ããã1397 * send_request_msg -- REQUEST メッセージを送信する。 1460 1398 */ 1461 1399 … … 1469 1407 uint16_t secs; 1470 1408 1471 /* ã¿ã¤ã ã¢ã¦ããã©ã°ãã¯ãªã¢ã¼ããã*/1409 /* タイムアウトフラグをクリアーする。*/ 1472 1410 ct->flags &= ~DHCP4C_FLAG_TMOUT_MASK; 1473 1411 1474 /* ACK ã¡ãã»ã¼ã¸ãåä¿¡ãã¦ããã°ãBOUND ç¶æ 1475 ã«é·ç§»ããã*/ 1412 /* ACK メッセージを受信していれば。BOUND 状態に遷移する。*/ 1476 1413 ct->flags &= ~DHCP4C_FLAG_TMOUT_MASK; 1477 1414 if (select_ack(ct)) { 1478 1415 1479 /* ACK/NAK ã¡ãã»ã¼ã¸åä¿¡ã¿ã¤ãã¼ãåæ¢ããã*/1416 /* ACK/NAK メッセージ受信タイマーを停止する。*/ 1480 1417 DHCP4_CLI_TIMER_LOCK(); 1481 1418 ct->timers[DHCP4C_TIMER_RCV_ACK] = 0; … … 1483 1420 1484 1421 /* 1485 * ç¶æ 1486 ã REQUEST ã®æã¯ã 1487 * OFFER ã¡ãã»ã¼ã¸ãåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã«æ»ãã 1422 * 状態が REQUEST の時は、 1423 * OFFER メッセージを受信メッセージ構造体リストに戻す。 1488 1424 */ 1489 1425 if (ct->fsm == DHCP4_FSM_REQUEST && ct->off_msg != NULL) { … … 1495 1431 } 1496 1432 1497 /* BOUND ç¶æ 1498 ã«é·ç§»ããã*/ 1433 /* BOUND 状態に遷移する。*/ 1499 1434 start_bound(ct); 1500 1435 return; 1501 1436 } 1502 1437 1503 /* REQUEST ã¡ãã»ã¼ã¸ãä½æããã*/1438 /* REQUEST メッセージを作成する。*/ 1504 1439 if (ct->fsm == DHCP4_FSM_REQUEST) 1505 1440 ref = ct->off_msg; … … 1512 1447 } 1513 1448 1514 /* éä¿¡ãéå§ãã¦ããã®æéãå¾ãã*/1449 /* 送信を開始してからの時間を得る。*/ 1515 1450 get_tim(&time); 1516 1451 interval = time - ct->snd_start; 1517 1452 1518 1453 /* 1519 * éä¿¡ãéå§ãã¦ããã®æéï¼ç§ï¼ãã¡ãã»ã¼ã¸ã«è¨å®ããã1520 * æ大å¤ã¯ 65535ã1454 * 送信を開始してからの時間(秒)をメッセージに設定する。 1455 * 最大値は 65535。 1521 1456 */ 1522 1457 if (ct->fsm == DHCP4_FSM_REQUEST) … … 1530 1465 HOST2MSG16(ct->snd_msg->msg.secs, secs); 1531 1466 1532 /* ãã³ããããã³ã°ã³ã¼ã«ã§ã¡ãã»ã¼ã¸ãéä¿¡ããã*/1467 /* ノンブロッキングコールでメッセージを送信する。*/ 1533 1468 error = udp_snd_dat(ct->cepid, &ct->dst, &ct->snd_msg->msg, ct->snd_msg->len, TMO_NBLK); 1534 1469 if (error != E_WBLK) { … … 1538 1473 } 1539 1474 1540 /* éä¿¡ééãè¨å®ããã*/1475 /* 送信間隔を設定する。*/ 1541 1476 if (ct->interval == 0) 1542 /* æªè¨å®*/1477 /* 未設定 */ 1543 1478 ct->interval = TMO_DHCP4C_INIT_INTVL; 1544 1479 else 1545 /* ããã¯ãªãã¢ã«ã´ãªãºã 㧠2åã«ããï¼ä¹±æ°ä½¿ç¨ï¼éä¿¡ééãå ç®ããã*/1480 /* バックオフアルゴリズムで 2倍にした(乱数使用)送信間隔を加算する。*/ 1546 1481 ct->interval += (netapp_rand() >> 2) % (ct->interval << 1); 1547 1482 1548 /* éä¿¡å¨æã®å¶éå¤ãè¶ 1549 ããªãããã«ããã*/ 1483 /* 送信周期の制限値を超えないようにする。*/ 1550 1484 if (ct->interval > TMO_DHCP4C_MAX_BACKOFF) 1551 1485 ct->interval = (TMO_DHCP4C_MAX_BACKOFF >> 1) + ((netapp_rand() >> 2) % TMO_DHCP4C_MAX_BACKOFF); 1552 1486 1553 /* ãªã¼ã¹æéã®ã¿ã¤ã ã¢ã¦ããå 1554 éãã */ 1487 /* リース時間のタイムアウト【先送り】 */ 1555 1488 if (ct->fsm != DHCP4_FSM_REQUEST && 1556 1489 TIMEC_GT(ct->interval + time, ct->expire + ct->bind_start)) 1557 1490 ct->interval = ct->expire + ct->bind_start - time + SYSTIM_HZ; 1558 1491 1559 /* åéä¿¡ã¿ã¤ã ã¢ã¦ããè¨å®ããã*/1492 /* 再送信タイムアウトを設定する。*/ 1560 1493 DHCP4_CLI_TIMER_LOCK(); 1561 1494 ct->timers[DHCP4C_TIMER_SND_REQ] = SYSTIM2TIMER(ct->interval); … … 1564 1497 1565 1498 /* 1566 * send_release_msg -- RELEASE ã¡ãã»ã¼ã¸ãéä¿¡ããã1499 * send_release_msg -- RELEASE メッセージを送信する。 1567 1500 */ 1568 1501 … … 1572 1505 ER error; 1573 1506 1574 /* ã¿ã¤ã ã¢ã¦ããã©ã°ãã¯ãªã¢ã¼ããã*/1507 /* タイムアウトフラグをクリアーする。*/ 1575 1508 ct->flags &= ~DHCP4C_FLAG_TMOUT_MASK; 1576 1509 1577 /* RELEASE ã¡ãã»ã¼ã¸ãä½æããã*/1510 /* RELEASE メッセージを作成する。*/ 1578 1511 if ((error = setup_release_msg(ct, ct->act_msg)) != E_OK) { 1579 1512 syslog(LOG_NOTICE, "[DHCP4C] error, setup release message: %s", itron_strerror(error)); … … 1582 1515 } 1583 1516 1584 /* ãªã¼ã¹æ 1585 å ±ã解æ¾ããã*/ 1517 /* リース情報を解放する。*/ 1586 1518 rel_lease(ct); 1587 1519 1588 /* ãã³ããããã³ã°ã³ã¼ã«ã§ã¡ãã»ã¼ã¸ãéä¿¡ããã*/1520 /* ノンブロッキングコールでメッセージを送信する。*/ 1589 1521 error = udp_snd_dat(ct->cepid, &ct->dst, &ct->snd_msg->msg, ct->snd_msg->len, TMO_NBLK); 1590 1522 if (error != E_WBLK) { … … 1594 1526 } 1595 1527 1596 /* ã¡ãã»ã¼ã¸éä¿¡å¾ 1597 ã¡ãè¡ãã*/ 1528 /* メッセージ送信待ちを行う。*/ 1598 1529 DHCP4_CLI_READY_WAIT(ct); 1599 1530 1600 /* SLEEP ç¶æ 1601 ã«é·ç§»ããã*/ 1531 /* SLEEP 状態に遷移する。*/ 1602 1532 ct->fsm = DHCP4_FSM_SLEEP; 1603 1533 } 1604 1534 1605 1535 /* 1606 * offer_msg_timeout -- OFFER ã¡ãã»ã¼ã¸åä¿¡ã¿ã¤ã ã¢ã¦ãå¦ç1536 * offer_msg_timeout -- OFFER メッセージ受信タイムアウト処理 1607 1537 */ 1608 1538 … … 1610 1540 offer_msg_timeout (T_DHCP4_CLI_CONTEXT *ct) 1611 1541 { 1612 /* OFFER ã¡ãã»ã¼ã¸ãåä¿¡ãã¦ããã°ãREQUEST ç¶æ 1613 ã«é·ç§»ããã*/ 1542 /* OFFER メッセージを受信していれば。REQUEST 状態に遷移する。*/ 1614 1543 ct->flags &= ~DHCP4C_FLAG_TMOUT_MASK; 1615 1544 if (select_offer(ct)) { 1616 1545 1617 /* DISCOVER ã¡ãã»ã¼ã¸éä¿¡ã¿ã¤ãã¼ãåæ¢ããã*/1546 /* DISCOVER メッセージ送信タイマーを停止する。*/ 1618 1547 DHCP4_CLI_TIMER_LOCK(); 1619 1548 ct->timers[DHCP4C_TIMER_SND_DISC] = 0; 1620 1549 DHCP4_CLI_TIMER_UNLOCK(); 1621 1550 1622 /* REQUEST ã¡ãã»ã¼ã¸ãéä¿¡ã㦠REQUEST ç¶æ 1623 ã«é·ç§»ããã*/ 1551 /* REQUEST メッセージを送信して REQUEST 状態に遷移する。*/ 1624 1552 start_send_request(ct, DHCP4_FSM_REQUEST); 1625 1553 } … … 1629 1557 1630 1558 /* 1631 * send_discover_msg -- DISCOVER ã¡ãã»ã¼ã¸ãéä¿¡ããã1559 * send_discover_msg -- DISCOVERメッセージを送信する。 1632 1560 */ 1633 1561 … … 1639 1567 RELTIM interval; 1640 1568 1641 /* ã¿ã¤ã ã¢ã¦ããã©ã°ãã¯ãªã¢ã¼ããã*/1569 /* タイムアウトフラグをクリアーする。*/ 1642 1570 ct->flags &= ~DHCP4C_FLAG_TMOUT_MASK; 1643 1571 1644 /* OFFER ã¡ãã»ã¼ã¸ãåä¿¡ãã¦ããã°ãREQUEST ç¶æ 1645 ã«é·ç§»ããã*/ 1572 /* OFFER メッセージを受信していれば。REQUEST 状態に遷移する。*/ 1646 1573 ct->flags &= ~DHCP4C_FLAG_TMOUT_MASK; 1647 1574 if (select_offer(ct)) { 1648 1575 1649 /* OFFER ã¡ãã»ã¼ã¸åä¿¡ã¿ã¤ãã¼ãåæ¢ããã*/1576 /* OFFER メッセージ受信タイマーを停止する。*/ 1650 1577 DHCP4_CLI_TIMER_LOCK(); 1651 1578 ct->timers[DHCP4C_TIMER_RCV_OFFER] = 0; 1652 1579 DHCP4_CLI_TIMER_UNLOCK(); 1653 1580 1654 /* REQUEST ã¡ãã»ã¼ã¸ãéä¿¡ã㦠REQUEST ç¶æ 1655 ã«é·ç§»ããã*/ 1581 /* REQUEST メッセージを送信して REQUEST 状態に遷移する。*/ 1656 1582 start_send_request(ct, DHCP4_FSM_REQUEST); 1657 1583 return; 1658 1584 } 1659 1585 1660 /* DISCOVER ã¡ãã»ã¼ã¸ãä½æããã*/1586 /* DISCOVER メッセージを作成する。*/ 1661 1587 if ((error = setup_discover_msg(ct)) != E_OK) { 1662 1588 syslog(LOG_NOTICE, "[DHCP4C] error, setup discover message: %s", itron_strerror(error)); … … 1665 1591 } 1666 1592 1667 /* éä¿¡ãéå§ãã¦ããã®æéãå¾ãã*/1593 /* 送信を開始してからの時間を得る。*/ 1668 1594 get_tim(&time); 1669 1595 interval = time - ct->snd_start; 1670 1596 1671 1597 /* 1672 * éä¿¡ãéå§ãã¦ããã®æéï¼ç§ï¼ãã¡ãã»ã¼ã¸ã«è¨å®ããã1673 * æ大å¤ã¯ 65535ã1598 * 送信を開始してからの時間(秒)をメッセージに設定する。 1599 * 最大値は 65535。 1674 1600 */ 1675 1601 if (SYSTIM2SEC(interval) < 65536) … … 1679 1605 HOST2MSG16(ct->snd_msg->msg.secs, ct->secs); 1680 1606 1681 /* ãã³ããããã³ã°ã³ã¼ã«ã§ã¡ãã»ã¼ã¸ãéä¿¡ããã*/1607 /* ノンブロッキングコールでメッセージを送信する。*/ 1682 1608 error = udp_snd_dat(ct->cepid, &ct->dst, &ct->snd_msg->msg, ct->snd_msg->len, TMO_NBLK); 1683 1609 if (error != E_WBLK) { … … 1687 1613 } 1688 1614 1689 /* éä¿¡ééãè¨å®ããã*/1615 /* 送信間隔を設定する。*/ 1690 1616 if (ct->interval == 0) 1691 /* æªè¨å®*/1617 /* 未設定 */ 1692 1618 ct->interval = TMO_DHCP4C_INIT_INTVL; 1693 1619 else 1694 /* ããã¯ãªãã¢ã«ã´ãªãºã 㧠2åã«ããï¼ä¹±æ°ä½¿ç¨ï¼éä¿¡ééãå ç®ããã*/1620 /* バックオフアルゴリズムで 2倍にした(乱数使用)送信間隔を加算する。*/ 1695 1621 ct->interval += (netapp_rand() >> 2) % (ct->interval << 1); 1696 1622 1697 /* éä¿¡å¨æã®å¶éå¤ãè¶ 1698 ããªãããã«ããã*/ 1623 /* 送信周期の制限値を超えないようにする。*/ 1699 1624 if (ct->interval > TMO_DHCP4C_MAX_BACKOFF) 1700 1625 ct->interval = (TMO_DHCP4C_MAX_BACKOFF >> 1) + ((netapp_rand() >> 2) % TMO_DHCP4C_MAX_BACKOFF); 1701 1626 1702 /* OFFER ã¡ãã»ã¼ã¸ã®åä¿¡ã¿ã¤ã ã¢ã¦ããè¶ 1703 ããªãããã«èª¿æ´ããã*/ 1627 /* OFFER メッセージの受信タイムアウトを超えないように調整する。*/ 1704 1628 if (TIMEC_GT(time + ct->interval, ct->snd_start + TMO_DHCP4C_OFFER)) 1705 1629 ct->interval = (TMO_DHCP4C_INIT_INTVL + TMO_DHCP4C_OFFER) - time + 1; 1706 1630 1707 /* åéä¿¡ã¿ã¤ã ã¢ã¦ããè¨å®ããã*/1631 /* 再送信タイムアウトを設定する。*/ 1708 1632 DHCP4_CLI_TIMER_LOCK(); 1709 1633 ct->timers[DHCP4C_TIMER_SND_DISC] = SYSTIM2TIMER(ct->interval); … … 1714 1638 1715 1639 /* 1716 * dhcpc_timer -- TIMER 管ç1640 * dhcpc_timer -- TIMER 管理 1717 1641 */ 1718 1642 … … 1734 1658 DHCP4_CLI_TIMER_UNLOCK(); 1735 1659 1736 /* 1 ç§æ¯ã«ã¿ã¤ã ã¢ã¦ãããã*/1660 /* 1秒毎にタイムアウトする。*/ 1737 1661 timeout((callout_func)dhcpc_timer, ct, NET_TIMER_HZ); 1738 1662 } … … 1741 1665 1742 1666 /* 1743 * expire_timeout -- EXPIRE ã¿ã¤ã ã¢ã¦ãå¦ç1667 * expire_timeout -- EXPIRE タイムアウト処理 1744 1668 */ 1745 1669 … … 1749 1673 //ER error; 1750 1674 1751 /* ã¿ã¤ã ã¢ã¦ããã©ã°ãã¯ãªã¢ã¼ããã*/1675 /* タイムアウトフラグをクリアーする。*/ 1752 1676 ct->flags &= ~DHCP4C_FLAG_TMOUT_MASK; 1753 1677 1754 /* ç¶æ 1755 ã REQUEST ã®æã¯ä½ãããªãã*/ 1678 /* 状態が REQUEST の時は何もしない。*/ 1756 1679 if (ct->fsm == DHCP4_FSM_REQUEST) 1757 1680 return; 1758 1681 1759 /* å 1760 ¨ã¦ã® TIMER ããã£ã³ã»ã«ããã*/ 1682 /* 全ての TIMER をキャンセルする。*/ 1761 1683 cancel_all_timers(ct); 1762 1684 1763 /* ãªã¼ã¹ãããæ 1764 å ±ã解æ¾ããã*/ 1685 /* リースされた情報を解放する。*/ 1765 1686 rel_lease(ct); 1766 1687 … … 1769 1690 1770 1691 /* 1771 * rebind_timeout -- REBIND ã¿ã¤ã ã¢ã¦ãå¦ç1692 * rebind_timeout -- REBIND タイムアウト処理 1772 1693 */ 1773 1694 … … 1775 1696 rebind_timeout (T_DHCP4_CLI_CONTEXT *ct) 1776 1697 { 1777 /* ã¿ã¤ã ã¢ã¦ããã©ã°ãã¯ãªã¢ã¼ããã*/1698 /* タイムアウトフラグをクリアーする。*/ 1778 1699 ct->flags &= ~DHCP4C_FLAG_TMOUT_MASK; 1779 1700 1780 /* å 1781 ¨ã¦ã® TIMER ããã£ã³ã»ã«ããã*/ 1701 /* 全ての TIMER をキャンセルする。*/ 1782 1702 cancel_all_timers(ct); 1783 1703 1784 /* REQUEST ã¡ãã»ã¼ã¸ãéä¿¡ã㦠REBIND ç¶æ 1785 ã«é·ç§»ããã*/ 1704 /* REQUEST メッセージを送信して REBIND 状態に遷移する。*/ 1786 1705 start_send_request(ct, DHCP4_FSM_REBIND); 1787 1706 } 1788 1707 1789 1708 /* 1790 * renew_timeout -- RENEW ã¿ã¤ã ã¢ã¦ãå¦ç1709 * renew_timeout -- RENEW タイムアウト処理 1791 1710 */ 1792 1711 … … 1794 1713 renew_timeout (T_DHCP4_CLI_CONTEXT *ct) 1795 1714 { 1796 /* ã¿ã¤ã ã¢ã¦ããã©ã°ãã¯ãªã¢ã¼ããã*/1715 /* タイムアウトフラグをクリアーする。*/ 1797 1716 ct->flags &= ~DHCP4C_FLAG_TMOUT_MASK; 1798 1717 1799 /* REQUEST ã¡ãã»ã¼ã¸ãéä¿¡ã㦠RENEW ç¶æ 1800 ã«é·ç§»ããã*/ 1718 /* REQUEST メッセージを送信して RENEW 状態に遷移する。*/ 1801 1719 start_send_request(ct, DHCP4_FSM_RENEW); 1802 1720 } 1803 1721 1804 1722 /* 1805 * dispatch_timeout -- ã¿ã¤ã ã¢ã¦ãããæã®å¦ç1723 * dispatch_timeout -- タイムアウトした時の処理 1806 1724 */ 1807 1725 … … 1853 1771 1854 1772 /* 1855 * dispatch_event -- ã¤ãã³ãæ¯ã®å¦ç1773 * dispatch_event -- イベント毎の処理 1856 1774 */ 1857 1775 … … 1863 1781 while (ct->fsm != DHCP4_FSM_SLEEP && error == E_OK) { 1864 1782 1865 /* ã¡ãã»ã¼ã¸ã®åä¿¡ã¨ã¿ã¤ã ã¢ã¦ããå¾ 1866 ã¤ã*/ 1783 /* メッセージの受信とタイムアウトを待つ。*/ 1867 1784 DHCP4_CLI_READY_WAIT(ct); 1868 1785 … … 1886 1803 1887 1804 /* 1888 * init_context -- DHCP ã¯ã©ã¤ã¢ã³ãã³ã³ããã¹ãæ§é ä½ãåæåããã1805 * init_context -- DHCP クライアントコンテキスト構造体を初期化する。 1889 1806 */ 1890 1807 … … 1901 1818 1902 1819 /* 1903 * rel_cli_msg -- ã¡ãã»ã¼ã¸æ§é ä½ã解æ¾ããã1820 * rel_cli_msg -- メッセージ構造体を解放する。 1904 1821 */ 1905 1822 … … 1933 1850 1934 1851 /* 1935 * init_cli_msg -- åã¡ãã»ã¼ã¸æ§é ä½ãåæåããã1852 * init_cli_msg -- 各メッセージ構造体を初期化する。 1936 1853 */ 1937 1854 … … 1943 1860 int count; 1944 1861 1945 /* éä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãç²å¾ããã*/1862 /* 送信メッセージ構造体を獲得する。*/ 1946 1863 if ((error = tget_mpf(MPF_DHCP4_CLI_MSG, (void*)&ct->snd_msg, TMO_DHCP4C_MPF_GET)) != E_OK) { 1947 1864 syslog(LOG_NOTICE, "[DHCP4C] error, tget_mpf() for send: %s.", itron_strerror(error)); … … 1950 1867 1951 1868 /* 1952 * æå¹ãªãªã¼ã¹ã»ã¡ãã»ã¼ã¸æ§é ä½ãããå ´åã¯ã1953 * ç²å¾ããåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã®æ§é ä½ã 1æ¸ããã1869 * 有効なリース・メッセージ構造体がある場合は、 1870 * 獲得する受信メッセージ構造体リストの構造体を 1減らす。 1954 1871 */ 1955 1872 if (ct->act_msg == NULL) … … 1958 1875 count = NUM_DHCP4_MSG_LIST - 1; 1959 1876 1960 /* åä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãç²å¾ããã*/1877 /* 受信メッセージ構造体を獲得する。*/ 1961 1878 while (count --> 0) { 1962 1879 if ((error = tget_mpf(MPF_DHCP4_CLI_MSG, (void*)&cell, TMO_DHCP4C_MPF_GET)) != E_OK) { … … 1972 1889 1973 1890 /* 1974 * dhcp4c_renew_info -- ãããã¯ã¼ã¯æ 1975 å ±ãååå¾ããã 1891 * dhcp4c_renew_info -- ネットワーク情報を再取得する。 1976 1892 */ 1977 1893 … … 1981 1897 if (context.fsm == DHCP4_FSM_BOUND) { 1982 1898 1983 /* REL_INFO ç¶æ 1984 ã«é·ç§»ããå¾ã« SLEEP ã解é¤ããããã«è¨å®ããã*/ 1899 /* REL_INFO 状態に遷移した後に SLEEP を解除するように設定する。*/ 1985 1900 context.flags |= DHCP4C_FLAG_RENEW; 1986 1901 start_rel_info(&context); … … 1989 1904 else if (context.fsm == DHCP4_FSM_SLEEP) { 1990 1905 1991 /* SLEEP ã解é¤ããã*/1906 /* SLEEP を解除する。*/ 1992 1907 context.fsm = DHCP4_FSM_WAKE; 1993 1908 context.timer = 0; … … 2000 1915 2001 1916 /* 2002 * dhcp4c_rel_info -- DHCP ã§è¨å®ããããããã¯ã¼ã¯æ 2003 å ±ã解æ¾ããã 1917 * dhcp4c_rel_info -- DHCP で設定されたネットワーク情報を解放する。 2004 1918 */ 2005 1919 … … 2007 1921 dhcp4c_rel_info (void) 2008 1922 { 2009 /* REL_INFO ç¶æ 2010 ã«é·ç§»ããã*/ 1923 /* REL_INFO 状態に遷移する。*/ 2011 1924 start_rel_info(&context); 2012 1925 return E_OK; … … 2014 1927 2015 1928 /* 2016 * dhcp4c_get_info -- DHCP ã§è¨å®ããããããã¯ã¼ã¯æ 2017 å ±ãè¿ãã 1929 * dhcp4c_get_info -- DHCP で設定されたネットワーク情報を返す。 2018 1930 */ 2019 1931 … … 2038 1950 2039 1951 /* 2040 * ã³ã¼ã«ããã¯é¢æ°1952 * コールバック関数 2041 1953 */ 2042 1954 … … 2049 1961 len = *(ER_UINT*)p_parblk; 2050 1962 if (len < 0 && len != E_RLWAI) { 2051 /* E_RLWAI 以å¤ã§ã0 以ä¸ã®å ´åã¯ãã¨ã©ã¼ãæå³ãã¦ããã*/1963 /* E_RLWAI 以外で、0 以下の場合は、エラーを意味している。*/ 2052 1964 syslog(LOG_NOTICE, "[DHCPC(CBR)] error: %s, fncd: %s", itron_strerror(len), in_strtfn(fncd)); 2053 1965 } … … 2055 1967 if (fncd == TEV_UDP_RCV_DAT) { 2056 1968 2057 /* åä¿¡ã¡ãã»ã¼ã¸ãªã¹ãã空ã®æã¯ãåä¿¡ããªãã§ãã¼ã¿ã°ã©ã ãæ¨ã¦ãã*/1969 /* 受信メッセージリストが空の時は、受信しないでデータグラムを捨てる。*/ 2058 1970 if (context.rcv_lst == NULL) 2059 1971 syslog(LOG_NOTICE, "[DHCP4C(CBR)] receive buffer all busy."); 2060 1972 else { 2061 /* ã¡ãã»ã¼ã¸ãåä¿¡ããã¡ãã»ã¼ã¸æ§é ä½ãæºåããã*/1973 /* メッセージを受信するメッセージ構造体を準備する。*/ 2062 1974 syscall(wai_sem(SEM_DHCP4_CLI_LOCK)); 2063 1975 msg = context.rcv_lst; … … 2065 1977 syscall(sig_sem(SEM_DHCP4_CLI_LOCK)); 2066 1978 2067 /* ã¡ãã»ã¼ã¸ãåä¿¡ããã*/1979 /* メッセージを受信する。*/ 2068 1980 len = udp_rcv_dat(context.cepid, &msg->srv, &msg->msg, sizeof(msg->msg), TMO_POL); 2069 1981 … … 2071 1983 msg->len = len; 2072 1984 if (len >= 0) { 2073 /* åä¿¡ããã¡ãã»ã¼ã¸ãæ¤è¨¼ã¡ãã»ã¼ã¸ãªã¹ãã«ç§»ãã*/1985 /* 受信したメッセージを検証メッセージリストに移す。*/ 2074 1986 msg->next = context.val_lst; 2075 1987 context.val_lst = msg; … … 2077 1989 } 2078 1990 else { 2079 /* ã¡ãã»ã¼ã¸æ§é ä½ãåä¿¡ã¡ãã»ã¼ã¸ãªã¹ãã«æ»ãã*/1991 /* メッセージ構造体を受信メッセージリストに戻す。*/ 2080 1992 context.error = len; 2081 1993 msg->next = context.rcv_lst; … … 2093 2005 2094 2006 /* 2095 * dhcp4_cli_task -- DHCP ã¯ã©ã¤ã¢ã³ãã¿ã¹ã¯2007 * dhcp4_cli_task -- DHCP クライアントタスク 2096 2008 */ 2097 2009 … … 2109 2021 ct = &context; 2110 2022 2111 /* DHCP ã¯ã©ã¤ã¢ã³ãã³ã³ããã¹ãæ§é ä½ãåæåããã*/2023 /* DHCP クライアントコンテキスト構造体を初期化する。*/ 2112 2024 init_context(ct, tskid, (ID)exinf); 2113 2025 ct->fsm = DHCP4_FSM_SLEEP; … … 2115 2027 while (true) { 2116 2028 2117 /* ãªã¼ã¹ã解æ¾å¾ãååå¾ãæå®ããã¦ããªããã°ä¼æ¢ããã*/2029 /* リースを解放後、再取得が指定されていなければ休止する。*/ 2118 2030 if (!(ct->flags & DHCP4C_FLAG_RENEW)) { 2119 2031 2120 /* ä¼æ¢ããã*/2032 /* 休止する。*/ 2121 2033 if (error == E_OK) { 2122 2034 if (ct->fsm != DHCP4_FSM_SLEEP) … … 2132 2044 ct->error = E_OK; 2133 2045 2134 /* 1 ç§æ¯ã«ã¿ã¤ã ã¢ã¦ãããããã«ã¿ã¤ãã¼ãè¨å®ããã*/2046 /* 1秒毎にタイムアウトするようにタイマーを設定する。*/ 2135 2047 timeout((callout_func)dhcpc_timer, ct, NET_TIMER_HZ / DHCP4C_TIMER_HZ); 2136 2048 2137 /* ã¡ãã»ã¼ã¸æ§é ä½ãåæåããã*/2049 /* メッセージ構造体を初期化する。*/ 2138 2050 if ((error = init_cli_msg(ct)) == E_OK) { 2139 2051 2140 /* SELECT ç¶æ 2141 ã«é·ç§»ããã*/ 2052 /* SELECT 状態に遷移する。*/ 2142 2053 start_select(ct); 2143 2054 2144 /* ã¡ã¤ã³ã«ã¼ã*/2055 /* メインループ */ 2145 2056 error = dispatch_event(ct); 2146 2057 } 2147 2058 2148 /* å 2149 ¨ã¦ã® TIMER ããã£ã³ã»ã«ããã*/ 2059 /* 全ての TIMER をキャンセルする。*/ 2150 2060 cancel_all_timers(ct); 2151 2061 2152 /* ã¿ã¤ãã¼ãåæ¢ããã*/2062 /* タイマーを停止する。*/ 2153 2063 untimeout((callout_func)dhcpc_timer, ct); 2154 2064 2155 /* ã¡ãã»ã¼ã¸æ§é ä½ã解æ¾ããã*/2065 /* メッセージ構造体を解放する。*/ 2156 2066 rel_cli_msg (ct); 2157 2067 } … … 2164 2074 { 2165 2075 T_DHCP4_CLI_CONTEXT *ct = &context; 2166 /* DHCP ã¯ã©ã¤ã¢ã³ãã³ã³ããã¹ãæ§é ä½ãåæåããã*/2076 /* DHCP クライアントコンテキスト構造体を初期化する。*/ 2167 2077 init_context(ct, tskid, cepid); 2168 2078 ct->fsm = DHCP4_FSM_SLEEP; … … 2192 2102 return; 2193 2103 2194 /* 1 ç§æ¯ã«ã¿ã¤ã ã¢ã¦ãããããã«ã¿ã¤ãã¼ãè¨å®ããã*/2104 /* 1秒毎にタイムアウトするようにタイマーを設定する。*/ 2195 2105 ct->timer = 1000 * 1000; 2196 2106 … … 2214 2124 ct->error = E_OK; 2215 2125 2216 /* ã¡ãã»ã¼ã¸æ§é ä½ãåæåããã*/2126 /* メッセージ構造体を初期化する。*/ 2217 2127 if ((ct->error = init_cli_msg(ct)) != E_OK) 2218 2128 return; … … 2220 2130 ct->timer = 1000 * 1000; 2221 2131 2222 /* SELECT ç¶æ 2223 ã«é·ç§»ããã*/ 2132 /* SELECT 状態に遷移する。*/ 2224 2133 start_select(ct); 2225 2134 } … … 2240 2149 2241 2150 if (ct->error != E_OK || ct->fsm == DHCP4_FSM_SLEEP) { 2242 /* å 2243 ¨ã¦ã® TIMER ããã£ã³ã»ã«ããã*/ 2151 /* 全ての TIMER をキャンセルする。*/ 2244 2152 cancel_all_timers(ct); 2245 2153 ct->timer = TMO_FEVR; 2246 2154 2247 /* ã¡ãã»ã¼ã¸æ§é ä½ã解æ¾ããã*/2155 /* メッセージ構造体を解放する。*/ 2248 2156 rel_cli_msg(ct); 2249 2157 2250 /* ãªã¼ã¹ã解æ¾å¾ãååå¾ãæå®ããã¦ããªããã°ä¼æ¢ããã*/2158 /* リースを解放後、再取得が指定されていなければ休止する。*/ 2251 2159 if (!(ct->flags & DHCP4C_FLAG_RENEW)) { 2252 2160 2253 /* ä¼æ¢ããã*/2161 /* 休止する。*/ 2254 2162 if (ct->error == E_OK) { 2255 2163 if (ct->fsm != DHCP4_FSM_SLEEP)
Note:
See TracChangeset
for help on using the changeset viewer.