Changeset 389 for azure_iot_hub/trunk/asp3_dcre/tinet/netapp/dhcp6_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/dhcp6_cli.c
- Property svn:keywords deleted
-
Property svn:mime-type
changed from
text/x-csrc
totext/x-csrc;charset=UTF-8
r388 r389 70 70 * Tomakomai National College of Technology, JAPAN 71 71 * 72 * ä¸è¨èä½æ¨©è 73 ã¯ï¼ä»¥ä¸ã® (1)ï½(4) ã®æ¡ä»¶ãï¼Free Software Foundation 74 * ã«ãã£ã¦å 75 ¬è¡¨ããã¦ãã GNU General Public License ã® Version 2 ã«è¨ 76 * è¿°ããã¦ããæ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§ã¢ï¼æ¬ã½ããã¦ã§ã¢ 77 * ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹å¤ã»åé 78 å¸ï¼ä»¥ä¸ï¼ 79 * å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼ 80 * (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½ 81 * 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼ 82 * ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼ 83 * (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 84 * ç¨ã§ããå½¢ã§åé 85 å¸ããå ´åã«ã¯ï¼åé 86 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨ 87 * è 88 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ 89 * ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 90 * (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 91 * ç¨ã§ããªãå½¢ã§åé 92 å¸ããå ´åã«ã¯ï¼æ¬¡ã®ããããã®æ¡ä»¶ãæºããã 93 * ã¨ï¼ 94 * (a) åé 95 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è 96 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è 97 * ä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 98 * (b) åé 99 å¸ã®å½¢æ 100 ãï¼å¥ã«å®ããæ¹æ³ã«ãã£ã¦ï¼TOPPERSããã¸ã§ã¯ãã« 101 * å ±åãããã¨ï¼ 102 * (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ 103 * 害ãããï¼ä¸è¨èä½æ¨©è 104 ããã³TOPPERSããã¸ã§ã¯ããå 105 責ãããã¨ï¼ 72 * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation 73 * によって公表されている GNU General Public License の Version 2 に記 74 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア 75 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, 76 * 利用と呼ぶ)することを無償で許諾する. 77 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 78 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 79 * スコード中に含まれていること. 80 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 81 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 82 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 83 * の無保証規定を掲載すること. 84 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 85 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 86 * と. 87 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 88 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 89 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 90 * 報告すること. 91 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 92 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 106 93 * 107 * æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 108 ã 109 * ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ãã®é©ç¨å¯è½æ§ã 110 * å«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´ 111 * æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ãã®è²¬ä»»ãè² ããªãï¼ 94 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 95 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も 96 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 97 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. 112 98 * 113 99 * @(#) $Id$ … … 156 142 157 143 /* 158 * DHCPv6 ã¯ã©ã¤ã¢ã³ãã¿ã¹ã¯144 * DHCPv6 クライアントタスク 159 145 */ 160 146 … … 162 148 163 149 /* 164 * DHCP åä½ã¢ã¼ã150 * DHCP 動作モード 165 151 * 166 * #define DHCP6_CLI_CFG_MODE ã§æå®ããã152 * #define DHCP6_CLI_CFG_MODE で指定する。 167 153 * 168 154 */ … … 173 159 174 160 /* 175 * å¤æ°161 * 変数 176 162 */ 177 163 178 164 static const T_IN6_ADDR in6_addr_all_DHCP_relay_servers = 179 IPV6_ADDR_ALL_DHCP_RELAY_SERVERS_INIT; /* ãªã¬ã¼ã»ãµã¼ãã® IPv6 ã¢ãã¬ã¹*/180 static T_DHCP6_CLI_CONTEXT context; /* ã¯ã©ã¤ã¢ã³ãã³ã³ããã¹ã*/165 IPV6_ADDR_ALL_DHCP_RELAY_SERVERS_INIT; /* リレー・サーバの IPv6 アドレス */ 166 static T_DHCP6_CLI_CONTEXT context; /* クライアントコンテキスト */ 181 167 182 168 #ifdef DHCP6_CLI_CFG_REQUIRED_OLIST 183 static uint8_t required_plist[] = DHCP6_CLI_CFG_REQUIRED_OLIST; /* å¿ 184 é ãªãã·ã§ã³ãªã¹ã */ 169 static uint8_t required_plist[] = DHCP6_CLI_CFG_REQUIRED_OLIST; /* 必須オプションリスト */ 185 170 #endif 186 171 187 172 #ifdef DHCP6_CLI_CFG_REQUEST_OLIST 188 static uint8_t request_plist[] = DHCP6_CLI_CFG_REQUEST_OLIST; /* è¦æ±ãªãã·ã§ã³ãªã¹ã*/173 static uint8_t request_plist[] = DHCP6_CLI_CFG_REQUEST_OLIST; /* 要求オプションリスト */ 189 174 #endif 190 175 191 176 /* 192 * dhcp6_rand -- RFC3315 ã«è¦å®ãããä¹±æ°ãçºçããã177 * dhcp6_rand -- RFC3315 に規定された乱数を発生する。 193 178 */ 194 179 … … 209 194 210 195 /* 211 * init_duid -- ã¯ã©ã¤ã¢ã³ãã® DUID ãè¨å®ããã196 * init_duid -- クライアントの DUID を設定する。 212 197 */ 213 198 … … 218 203 #if DHCP6_CLI_CFG_MODE == DHCP6_CLI_CFG_STATELESS 219 204 220 /* åä½ã¢ã¼ãã« STATELESS ãæå®ãããæ㯠LL å½¢å¼ã«ããã*/205 /* 動作モードに STATELESS が指定された時は LL 形式にする。*/ 221 206 222 207 T_DHCP6_DUID_LL_HDR *ll; … … 226 211 HOST2MSG16(ll->type, DHCP6_HWA_TYPE_ETHER); 227 212 memcpy(&ct->duid[sizeof(*ll)], &ct->sc->ifaddr.lladdr, sizeof(ct->sc->ifaddr.lladdr)); 228 ct->duid_len = sizeof(*ll) + sizeof(ct->sc->ifaddr.lladdr); /* DIUD é·ãè¨é²ããã*/213 ct->duid_len = sizeof(*ll) + sizeof(ct->sc->ifaddr.lladdr); /* DIUD 長を記録する。*/ 229 214 230 215 #elif DHCP6_CLI_CFG_MODE == DHCP6_CLI_CFG_STATEFULL 231 216 232 217 /* 233 * åä½ã¢ã¼ãã« DHCP6_CLI_CFG_STATEFULL ãæå®ãããæ㯠LLT å½¢å¼ã«ããã234 * time ã¡ã³ãã¼ã«ã¯ç¾å¨ã®æé[s]ãè¨å®ããã235 * 注æ: æ«å®çã« get_tim() ã®å¤ã使ãããè¦æ¤è¨218 * 動作モードに DHCP6_CLI_CFG_STATEFULL が指定された時は LLT 形式にする。 219 * time メンバーには現在の時間[s]を設定する。 220 * 注意: 暫定的に get_tim() の値を使うが、要検討 236 221 */ 237 222 … … 246 231 HOST2MSG32(llt->time, time); 247 232 memcpy(&ct->duid[sizeof(*llt)], &ct->sc->ifaddr.lladdr, sizeof(ct->sc->ifaddr.lladdr)); 248 ct->duid_len = sizeof(*llt) + sizeof(ct->sc->ifaddr.lladdr); /* DIUD é·ãè¨é²ããã*/233 ct->duid_len = sizeof(*llt) + sizeof(ct->sc->ifaddr.lladdr); /* DIUD 長を記録する。*/ 249 234 250 235 #else /* of #if DHCP6_CLI_CFG_MODE == DHCP6_CLI_CFG_STATELESS */ … … 255 240 256 241 /* 257 * cancel_all_timers -- å 258 ¨ã¦ã® TIMER ããã£ã³ã»ã«ããã 242 * cancel_all_timers -- 全ての TIMER をキャンセルする。 259 243 */ 260 244 … … 271 255 272 256 /* 273 * dhcpc_timer -- TIMER 管ç257 * dhcpc_timer -- TIMER 管理 274 258 */ 275 259 … … 291 275 syscall(sig_sem(SEM_DHCP6_CLI_TIMER)); 292 276 293 /* 1 ç§æ¯ã«ã¿ã¤ã ã¢ã¦ãããã*/277 /* 1秒毎にタイムアウトする。*/ 294 278 timeout((callout_func)dhcpc_timer, ct, NET_TIMER_HZ / DHCP6C_TIMER_HZ); 295 279 } 296 280 297 281 /* 298 * find_option -- æå®ãããªãã·ã§ã³ãæ¢ç´¢ããã282 * find_option -- 指定したオプションを探索する。 299 283 * 300 * 注æ: å¼æ° len ã 0 ã®æã¯ãªãã·ã§ã³ãµã¤ãºãæ¤è¨¼ããªãã 301 * å¼æ° len ã«ã¯ãªãã·ã§ã³å 302 ¨ä½ã®ãµã¤ãºãæå®ãããã¨ã 284 * 注意: 引数 len が 0 の時はオプションサイズを検証しない。 285 * 引数 len にはオプション全体のサイズを指定すること。 303 286 */ 304 287 … … 321 304 322 305 /* 323 * find_msg_option -- æå®ãããªãã·ã§ã³ãæ¢ç´¢ããã306 * find_msg_option -- 指定したオプションを探索する。 324 307 * 325 * 注æ: å¼æ° len ã 0 ã®æã¯ãªãã·ã§ã³ãµã¤ãºãæ¤è¨¼ããªãã 326 * å¼æ° len ã«ã¯ãªãã·ã§ã³å 327 ¨ä½ã®ãµã¤ãºãæå®ãããã¨ã 308 * 注意: 引数 len が 0 の時はオプションサイズを検証しない。 309 * 引数 len にはオプション全体のサイズを指定すること。 328 310 */ 329 311 … … 335 317 336 318 /* 337 * is_equal_sid -- ã¡ãã»ã¼ã¸å 338 ã® SERVER ID ãæ¯è¼ããã 319 * is_equal_sid -- メッセージ内の SERVER ID を比較する。 339 320 */ 340 321 … … 357 338 358 339 /* 359 * validate_iaaddrs -- ã¢ãã¬ã¹æ 360 å ±ï¼IAADDRï¼ãæ¤è¨¼ããã 340 * validate_iaaddrs -- アドレス情報(IAADDR)を検証する。 361 341 */ 362 342 … … 366 346 T_DHCP6_OPT_IAADDR *iaa; 367 347 368 /* ãªãã·ã§ã³ã IAADDR ã§ãããã¨ãæ¤è¨¼ããã*/348 /* オプションが IAADDR であることを検証する。*/ 369 349 iaa = (T_DHCP6_OPT_IAADDR*)opt; 370 350 if (MSG2HOST16(iaa->code) != DHCP6_OPT_IAADDR) … … 372 352 373 353 while (len > 0) { 374 /* ãªãã·ã§ã³é·ãæ¤è¨¼ããã*/354 /* オプション長を検証する。*/ 375 355 if (len < sizeof(*iaa)) 376 356 return E_PAR; 377 357 378 /* ãªãã·ã§ã³é·ã T_DHCP6_OPT_IAADDR ã®ãµã¤ãºã¨ä¸è´ãã¦ããªããã°ã¨ã©ã¼*/358 /* オプション長が T_DHCP6_OPT_IAADDR のサイズと一致していなければエラー */ 379 359 iaa = (T_DHCP6_OPT_IAADDR*)opt; 380 360 if ((MSG2HOST16(iaa->len) & ~DHCP6C_IAA_FLAG_MASK) < (sizeof(*iaa) - sizeof(T_DHCP6_OPTION))) … … 382 362 383 363 /* 384 * perferred-lifetime 㨠valid-lifetime ã®å¤ãçç¾ãã¦ããã¨ãã¯ã¨ã©ã¼ 385 * ãRFC3315 (22.6) åç 386 §ã 364 * perferred-lifetime と valid-lifetime の値が矛盾しているときはエラー 365 * 【RFC3315 (22.6) 参照】 387 366 */ 388 367 if (MSG2HOST32(iaa->prefer) > MSG2HOST32(iaa->valid)) … … 397 376 398 377 /* 399 * validate_ia_na_pd -- IA_NA/IA_PD ãªãã·ã§ã³ãæ¤è¨¼ããã378 * validate_ia_na_pd -- IA_NA/IA_PD オプションを検証する。 400 379 */ 401 380 … … 406 385 uint8_t *opt; 407 386 408 /* IA_NA/IA_PD ãç¡ããã°æ¤è¨¼ããªãã*/387 /* IA_NA/IA_PD が無ければ検証しない。*/ 409 388 if ((opt = find_msg_option(msg, code, 0)) == NULL) 410 389 return E_OK; 411 390 412 /* ãªãã·ã§ã³é·ãæ¤è¨¼ããã*/391 /* オプション長を検証する。*/ 413 392 na = (T_DHCP6_OPT_IA_NA_PD*)opt; 414 393 if (!(msg->len >= (opt - (uint8_t*)&msg->msg) + sizeof(*na) && … … 417 396 418 397 /* 419 * T1 㨠T2 ã®å¤ãçç¾ãã¦ããæãã¾ãã¯ã¢ãã¬ã¹æ 420 å ±ã誤ã£ã¦ããæã¯ã¨ã©ã¼ 421 * ãRFC3315 (22.4) åç 422 §ã 398 * T1 と T2 の値が矛盾している時、またはアドレス情報が誤っている時はエラー 399 * 【RFC3315 (22.4) 参照】 423 400 */ 424 401 if (MSG2HOST32(na->renew) > 0 && MSG2HOST32(na->rebind) > 0 && … … 433 410 434 411 /* 435 * validate_ia_ta -- IA_TA ãªãã·ã§ã³ãæ¤è¨¼ããã412 * validate_ia_ta -- IA_TA オプションを検証する。 436 413 */ 437 414 … … 442 419 uint8_t *opt; 443 420 444 /* IA_TA ãç¡ããã°æ¤è¨¼ããªãã*/421 /* IA_TA が無ければ検証しない。*/ 445 422 if ((opt = find_msg_option(msg, DHCP6_OPT_IA_TA, 0)) == NULL) 446 423 return E_OK; 447 424 448 /* ãªãã·ã§ã³é·ãæ¤è¨¼ããã*/425 /* オプション長を検証する。*/ 449 426 ta = (T_DHCP6_OPT_IA_TA *)opt; 450 427 if (!(msg->len >= (opt - (uint8_t*)&msg->msg) + sizeof(*ta) && … … 453 430 454 431 /* 455 * ã¢ãã¬ã¹æ 456 å ±ã誤ã£ã¦ããæã¯ã¨ã©ã¼ãRFC3315 (22.4) åç 457 §ã 432 * アドレス情報が誤っている時はエラー【RFC3315 (22.4) 参照】 458 433 */ 459 434 if (validate_iaaddrs(opt + sizeof(*ta), (MSG2HOST16(ta->len) & ~DHCP6C_IAA_FLAG_MASK) - (sizeof(*ta) - sizeof(T_DHCP6_OPTION))) != E_OK) … … 463 438 } 464 439 /* 465 * classify_reply -- å¿çã¡ãã»ã¼ã¸ãåé¡ããã440 * classify_reply -- 応答メッセージを分類する。 466 441 */ 467 442 … … 471 446 ER error; 472 447 473 /* IA_NA ãªãã·ã§ã³ãæ¤è¨¼ããã*/448 /* IA_NA オプションを検証する。*/ 474 449 if ((error = validate_ia_na_pd(msg, DHCP6_OPT_IA_NA)) != E_OK) 475 450 return error; 476 451 477 /* IA_TA ãªãã·ã§ã³ãæ¤è¨¼ããã*/452 /* IA_TA オプションを検証する。*/ 478 453 if ((error = validate_ia_ta(msg)) != E_OK) 479 454 return error; 480 455 481 /* IA_PD ãªãã·ã§ã³ãæ¤è¨¼ããã*/456 /* IA_PD オプションを検証する。*/ 482 457 if ((error = validate_ia_na_pd(msg, DHCP6_OPT_IA_PD)) != E_OK) 483 458 return error; 484 459 485 /* ãµã¼ã DUID ããããã¨ãæ¤è¨¼ããã*/460 /* サーバ DUID があることを検証する。*/ 486 461 if (find_msg_option(msg, DHCP6_OPT_SERVERID, 0) == NULL) 487 462 return E_PAR; … … 491 466 492 467 /* 493 * validate_reply -- å¿çã¡ãã»ã¼ã¸ãæ¤è¨¼ããã468 * validate_reply -- 応答メッセージを検証する。 494 469 */ 495 470 … … 500 475 uint8_t *opt; 501 476 502 /* ãµã¼ã DUID ããããã¨ãæ¤è¨¼ããã*/477 /* サーバ DUID があることを検証する。*/ 503 478 if (find_msg_option(msg, DHCP6_OPT_SERVERID, 0) == NULL) 504 479 return E_PAR; 505 480 506 /* ã¯ã©ã¤ã¢ã³ã DUID ããããèªåã®ã¯ã©ã¤ã¢ã³ã DUID ã¨åããã¨ãæ¤è¨¼ããã*/481 /* クライアント DUID があり、自分のクライアント DUID と同じことを検証する。*/ 507 482 if ((opt = find_msg_option(msg, DHCP6_OPT_CLIENTID, 0)) == NULL) 508 483 return E_PAR; … … 518 493 519 494 /* 520 * get_status_code -- STATUS ãªãã·ã§ã³ã®çµæã³ã¼ããç²å¾ããã495 * get_status_code -- STATUS オプションの結果コードを獲得する。 521 496 */ 522 497 … … 527 502 uint8_t *opt; 528 503 529 /* STATUS ãªãã·ã§ã³ãç¡ããã°æ¤è¨¼ããªãã*/504 /* STATUS オプションが無ければ検証しない。*/ 530 505 if ((opt = find_option(msg, msg_len, DHCP6_OPT_STATUS_CODE, 0)) == NULL) 531 506 return DHCP6_STAT_SUCCESS; 532 507 533 /* ãªãã·ã§ã³é·ãæ¤è¨¼ããã*/508 /* オプション長を検証する。*/ 534 509 status = (T_DHCP6_OPT_STATUS_CODE*)opt; 535 510 if (msg_len < sizeof(*status)) … … 542 517 543 518 /* 544 * get_msg_status_code -- STATUS ãªãã·ã§ã³ã®çµæã³ã¼ããç²å¾ããã519 * get_msg_status_code -- STATUS オプションの結果コードを獲得する。 545 520 */ 546 521 … … 598 573 599 574 /* 600 * validate_rcv_msg -- åä¿¡ã¡ãã»ã¼ã¸ãæ¤è¨¼ããã575 * validate_rcv_msg -- 受信メッセージを検証する。 601 576 */ 602 577 … … 607 582 uint_t code; 608 583 609 /* ã¡ãã»ã¼ã¸ã®ã¿ã¤ããä¸è´ãã¦ãããã¨ãæ¤è¨¼ããã*/584 /* メッセージのタイプが一致していることを検証する。*/ 610 585 switch (ct->fsm) { 611 586 … … 649 624 } 650 625 651 /* åä¿¡ã¡ãã»ã¼ã¸ãæ¤è¨¼ããã*/626 /* 受信メッセージを検証する。*/ 652 627 if ((error = validate_reply(ct, msg)) != E_OK) 653 628 return error; 654 629 655 /* åä¿¡ã¡ãã»ã¼ã¸ãåé¡ããã*/630 /* 受信メッセージを分類する。*/ 656 631 if ((error = classify_reply(msg)) != E_OK) 657 632 return error; 658 633 659 /* åä¿¡ããã¡ãã»ã¼ã¸å 660 ã® STATUS CODE ãªãã·ã§ã³ãæ¤è¨¼ããã*/ 634 /* 受信したメッセージ内の STATUS CODE オプションを検証する。*/ 661 635 error = get_msg_status_code(msg, &code); 662 636 if (error != E_OK) … … 667 641 668 642 /* 669 * eval_ia_prefer -- IA_NA/IA_TA/IA_PD ã®æ¨å¥¨åº¦ãè©ä¾¡ããã643 * eval_ia_prefer -- IA_NA/IA_TA/IA_PD の推奨度を評価する。 670 644 */ 671 645 … … 680 654 uint_t aoff, asize; 681 655 682 /* ç¡å¹ã®å ´åã¯çµäºããã*/656 /* 無効の場合は終了する。*/ 683 657 if (cli_msg == NULL) 684 658 return; … … 721 695 722 696 /* 723 * eval_prefer -- åä¿¡ã¡ãã»ã¼ã¸ã®æ¨å¥¨åº¦ãè©ä¾¡ããã697 * eval_prefer -- 受信メッセージの推奨度を評価する。 724 698 */ 725 699 … … 730 704 int ix; 731 705 732 /* ç¡å¹ã®å ´åã¯çµäºããã*/706 /* 無効の場合は終了する。*/ 733 707 if (msg == NULL) 734 708 return; 735 709 736 /* PREFERENCE ãªãã·ã§ã³ãè©ä¾¡ããã*/710 /* PREFERENCE オプションを評価する。*/ 737 711 if ((opt = find_msg_option(msg, DHCP6_OPT_PREFERENCE, sizeof(T_DHCP6_OPT_PREFERENCE))) != NULL) 738 712 msg->prefer = MSG2HOST16(((T_DHCP6_OPT_PREFERENCE*)opt)->prefer) | DHCP6_ClI_MSG_PREFER_OPTION; … … 742 716 #if defined(DHCP6_CLI_CFG_REQUIRED_OLIST) 743 717 744 /* å¿ 745 é ãªãã·ã§ã³ãæ¤è¨¼ããã*/ 718 /* 必須オプションを検証する。*/ 746 719 for (ix = sizeof(required_plist); ix -- > 0; ) { 747 720 if (find_msg_option(msg, required_plist[ix], 0) == NULL) … … 754 727 #if defined(DHCP6_CLI_CFG_REQUEST_OLIST) 755 728 756 /* è¦æ±ãªãã·ã§ã³ãæ¤è¨¼ããã*/729 /* 要求オプションを検証する。*/ 757 730 for (ix = sizeof(request_plist); ix -- > 0; ) { 758 731 if (find_msg_option(msg, request_plist[ix], 0) != NULL) … … 764 737 765 738 /* 766 * eval_rcv_msg -- åä¿¡ã¡ãã»ã¼ã¸ãè©ä¾¡ããã739 * eval_rcv_msg -- 受信メッセージを評価する。 767 740 */ 768 741 … … 773 746 SYSTIM time; 774 747 775 /* ã¡ãã»ã¼ã¸ãåä¿¡ãã¦ããªããã°ä¸æ¢ããã*/748 /* メッセージを受信していなければ中止する。*/ 776 749 syscall(wai_sem(SEM_DHCP6_CLI_LOCK)); 777 750 if (ct->val_lst == NULL) { … … 780 753 } 781 754 782 /* æ¤è¨¼ã¡ãã»ã¼ã¸ãªã¹ãããè©ä¾¡ã¡ãã»ã¼ã¸ãåãåºãã*/755 /* 検証メッセージリストから評価メッセージを取り出す。*/ 783 756 evl = ct->val_lst; 784 757 ct->val_lst = ct->val_lst->next; … … 786 759 syscall(sig_sem(SEM_DHCP6_CLI_LOCK)); 787 760 788 /* åä¿¡æéãè¨å®ããã*/761 /* 受信時間を設定する。*/ 789 762 get_tim(&time); 790 763 evl->rcv_time = time; 791 764 792 /* è©ä¾¡ã¡ãã»ã¼ã¸ãæ¤è¨¼ããã*/765 /* 評価メッセージを検証する。*/ 793 766 if (validate_rcv_msg(ct, evl) != E_OK) { 794 767 795 /* ã¨ã©ã¼ãçºçããè©ä¾¡ã¡ãã»ã¼ã¸ãåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã«æ»ãã*/768 /* エラーが発生した評価メッセージを受信メッセージ構造体リストに戻す。*/ 796 769 goto rcv_ret; 797 770 } 798 771 799 /* REL_INFO ç¶æ 800 ã®æã®å¦ç */ 772 /* REL_INFO 状態の時の処理 */ 801 773 if (ct->fsm == DHCP6_FSM_REL_INFO) { 802 774 syscall(wai_sem(SEM_DHCP6_CLI_LOCK)); 803 775 if (evl->status == DHCP6_STAT_SUCCESS) { 804 776 /* 805 * STATUS CODE ã DHCP6_STAT_SUCCESS ãªãã806 * è©ä¾¡ã¡ãã»ã¼ã¸ãæ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ãã«è¨å®ãã¦çµäºããã777 * STATUS CODE が DHCP6_STAT_SUCCESS なら、 778 * 評価メッセージを推奨メッセージリストに設定して終了する。 807 779 */ 808 780 evl->next = ct->prf_lst; … … 810 782 } 811 783 else { 812 /* è©ä¾¡ã¡ãã»ã¼ã¸ãåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã«æ»ãã¦çµäºããã*/784 /* 評価メッセージを受信メッセージ構造体リストに戻して終了する。*/ 813 785 evl->next = ct->rcv_lst; 814 786 ct->rcv_lst = evl; … … 818 790 } 819 791 820 /* è©ä¾¡ã¡ãã»ã¼ã¸ã®æ¨å¥¨åº¦ãè©ä¾¡ããã*/792 /* 評価メッセージの推奨度を評価する。*/ 821 793 eval_prefer(evl); 822 794 eval_ia_prefer(evl); 823 795 824 /* æ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ãã空ãªãè©ä¾¡ã¡ãã»ã¼ã¸ã移ãã¦çµäºããã*/796 /* 推奨メッセージリストが空なら評価メッセージを移して終了する。*/ 825 797 if (ct->prf_lst == NULL) { 826 798 ct->max_prefer = evl->prefer & DHCP6_ClI_MSG_PREFER_VALUE_MASK; … … 829 801 } 830 802 831 /* è©ä¾¡ã¡ãã»ã¼ã¸ã®æ¨å¥¨åº¦ã¨æ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ãã®æ大æ¨å¥¨åº¦ãæ¯è¼ããã*/803 /* 評価メッセージの推奨度と推奨メッセージリストの最大推奨度を比較する。*/ 832 804 if ((evl->prefer & DHCP6_ClI_MSG_PREFER_VALUE_MASK) > ct->max_prefer) { 833 805 834 806 /* 835 * è©ä¾¡ã¡ãã»ã¼ã¸ã®æ¨å¥¨åº¦ãæ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ãã®æ大æ¨å¥¨åº¦ããé«ããã°ã836 * æ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ããåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã«æ»ãã837 * è©ä¾¡ã¡ãã»ã¼ã¸ãæ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ãã«ç§»ãã807 * 評価メッセージの推奨度が推奨メッセージリストの最大推奨度より高ければ、 808 * 推奨メッセージリストを受信メッセージ構造体リストに戻し、 809 * 評価メッセージを推奨メッセージリストに移す。 838 810 */ 839 811 ct->max_prefer = evl->prefer & DHCP6_ClI_MSG_PREFER_VALUE_MASK; … … 856 828 857 829 /* 858 * æ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ãã«åã DHCP6_OPT_SERVERID ã®ã¡ãã»ã¼ã¸ãããã°ã859 * è©ä¾¡ã¡ãã»ã¼ã¸ãåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã«æ»ãã830 * 推奨メッセージリストに同じ DHCP6_OPT_SERVERID のメッセージがあれば、 831 * 評価メッセージを受信メッセージ構造体リストに戻す。 860 832 */ 861 833 goto rcv_ret; … … 864 836 865 837 /* 866 * è©ä¾¡ã¡ãã»ã¼ã¸ãæ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ãã«ç§»ãã838 * 評価メッセージを推奨メッセージリストに移す。 867 839 */ 868 840 evl->next = ct->prf_lst; … … 873 845 /*else */ 874 846 /* 875 * è©ä¾¡ã¡ãã»ã¼ã¸ã®æ¨å¥¨åº¦ãæ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ãã®æ大æ¨å¥¨åº¦ããä½ããã°ã876 * è©ä¾¡ã¡ãã»ã¼ã¸ãåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã«æ»ãã847 * 評価メッセージの推奨度が推奨メッセージリストの最大推奨度より低ければ、 848 * 評価メッセージを受信メッセージ構造体リストに戻す。 877 849 */ 878 850 … … 886 858 887 859 /* 888 * select_msg -- æ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ãã®å 889 é ã®ã¡ãã»ã¼ã¸ãé¸æããã 860 * select_msg -- 推奨メッセージリストの先頭のメッセージを選択する。 890 861 */ 891 862 … … 897 868 syscall(wai_sem(SEM_DHCP6_CLI_LOCK)); 898 869 if (ct->prf_lst == NULL) { 899 /* ã¡ãã»ã¼ã¸ãåä¿¡ãã¦ããªããã°ä¸æ¢ããã*/870 /* メッセージを受信していなければ中止する。*/ 900 871 syscall(sig_sem(SEM_DHCP6_CLI_LOCK)); 901 872 return NULL; … … 907 878 908 879 if ((select->prefer & DHCP6_ClI_MSG_PREFER_REQUIRED) == 0) { 909 /* å¿ 910 é ãªãã·ã§ã³ãç¡ããã°é¸æããªãã*/ 880 /* 必須オプションが無ければ選択しない。*/ 911 881 syscall(sig_sem(SEM_DHCP6_CLI_LOCK)); 912 882 return NULL; … … 917 887 if (((select->prefer & DHCP6_ClI_MSG_PREFER_REQUIRED) == 0) || 918 888 ((select->prefer & DHCP6_ClI_MSG_PREFER_ADDR) == 0)) { 919 /* å¿ 920 é ãªãã·ã§ã³ã¨ã¢ãã¬ã¹ãç¡ããã°é¸æããªãã*/ 889 /* 必須オプションとアドレスが無ければ選択しない。*/ 921 890 syscall(sig_sem(SEM_DHCP6_CLI_LOCK)); 922 891 return NULL; … … 927 896 #endif /* of #if DHCP6_CLI_CFG_MODE == DHCP6_CLI_CFG_STATELESS */ 928 897 929 /* æ¨å¥¨ã¡ãã»ã¼ã¸ãªã¹ãã®å 930 é ã®ã¡ãã»ã¼ã¸ãé¸æããã*/ 898 /* 推奨メッセージリストの先頭のメッセージを選択する。*/ 931 899 ct->prf_lst = ct->prf_lst->next; 932 900 select->next = NULL; 933 901 934 /* é¸æãããªãã£ãæ¤è¨¼ã¡ãã»ã¼ã¸ãåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã«æ»ãã*/902 /* 選択されなかった検証メッセージを受信メッセージ構造体リストに戻す。*/ 935 903 if (ct->rcv_lst == NULL) 936 904 ct->rcv_lst = ct->prf_lst; … … 945 913 946 914 /* 947 * advance_retrans -- åéä¿¡ã¿ã¤ã ã¢ã¦ããæ´æ°ããã915 * advance_retrans -- 再送信タイムアウトを更新する。 948 916 */ 949 917 … … 952 920 { 953 921 /* 954 * åéä¿¡ééï¼RTï¼ãæ´æ°ããã 955 * åéä¿¡æ¯ã«ç´ 2åãããã 956 * æ大éä¿¡ééï¼MRTï¼ãè¶ 957 ããªãããã«ããã 922 * 再送信間隔(RT)を更新する。 923 * 再送信毎に約 2倍するが、 924 * 最大送信間隔(MRT)を超えないようにする。 958 925 */ 959 926 ct->RT += ct->RT + dhcp6_rand(ct->RT); … … 961 928 ct->RT = ct->MRT + dhcp6_rand(ct->MRT); 962 929 963 /* åéä¿¡åæ°ãæ´æ°ããã*/930 /* 再送信回数を更新する。*/ 964 931 ct->txcount ++; 965 932 } 966 933 967 934 /* 968 * init_retrans -- åéä¿¡åæ°ããã©ã³ã¶ã¯ã·ã§ã³ IDããã®ä»ãè¨å®ããã935 * init_retrans -- 再送信回数、トランザクション ID、その他を設定する。 969 936 */ 970 937 … … 972 939 init_retrans (T_DHCP6_CLI_CONTEXT *ct) 973 940 { 974 /* éä¿¡åæ°ããªã»ããããã*/941 /* 送信回数をリセットする。*/ 975 942 ct->txcount = 0; 976 943 977 /* åéä¿¡ééãè¨å®ããã*/944 /* 再送信間隔を設定する。*/ 978 945 ct->RT = ct->IRT + dhcp6_rand(ct->IRT); 979 946 980 /* ãã©ã³ã¶ã¯ã·ã§ã³ ID ãè¨å®ããã*/947 /* トランザクション ID を設定する。*/ 981 948 ct->xid = netapp_rand() % 0x00ffffff; 982 949 983 /* åä¿¡ã¡ãã»ã¼ã¸ã®æ大æ¨å¥¨åº¦ããªã»ããããã*/950 /* 受信メッセージの最大推奨度をリセットする。*/ 984 951 ct->max_prefer = 0; 985 952 } 986 953 987 954 /* 988 * setup_msg_header -- ã¡ãã»ã¼ã¸ã®ãããé¨åãä½æããã955 * setup_msg_header -- メッセージのヘッダ部分を作成する。 989 956 */ 990 957 … … 995 962 ct->snd_msg->len = sizeof(ct->snd_msg->msg); 996 963 997 /* ãããé¨ãè¨å®ããã*/964 /* ヘッダ部を設定する。*/ 998 965 ct->snd_msg->msg.hdr.type = type; 999 966 ct->snd_msg->msg.hdr.xid[0] = (ct->xid >> 16) & 0xff; … … 1005 972 1006 973 /* 1007 * common_options -- æ¨æºãªãã·ã§ã³ã追å ããã974 * common_options -- 標準オプションを追加する。 1008 975 */ 1009 976 … … 1024 991 #if defined(DHCP6_CLI_CFG_RAPID_COMMIT) 1025 992 1026 /* Rapid-commit ã®æå®*/993 /* Rapid-commit の指定 */ 1027 994 if (type == DHCP6_SOLICIT) 1028 995 ; … … 1030 997 #endif /* of #if defined(DHCP6_CLI_CFG_RAPID_COMMIT) */ 1031 998 1032 /* ã¯ã©ã¤ã¢ã³ã DUID ã追å ããã*/999 /* クライアント DUID を追加する。*/ 1033 1000 cid = (T_DHCP6_OPT_CLIENTID*)msg; 1034 1001 HOST2MSG16(cid->code, DHCP6_OPT_CLIENTID); … … 1037 1004 msg += ct->duid_len + sizeof(T_DHCP6_OPT_CLIENTID); 1038 1005 1039 /* ãµã¼ã DUID ã追å ããã*/1006 /* サーバ DUID を追加する。*/ 1040 1007 if (lease == NULL) { 1041 1008 if (!(type == DHCP6_SOLICIT || type == DHCP6_INFO_REQ)) … … 1053 1020 #if defined(DHCP6_CLI_CFG_REQUIRED_OLIST) || defined(DHCP6_CLI_CFG_REQUEST_OLIST) 1054 1021 1055 /* å¿ 1056 é ã»è¦æ±ãªãã·ã§ã³ã追å ããã*/ 1022 /* 必須・要求オプションを追加する。*/ 1057 1023 oro = (T_DHCP6_OPT_ORO*)msg; 1058 1024 HOST2MSG16(oro->code, DHCP6_OPT_ORO); … … 1062 1028 #if defined(DHCP6_CLI_CFG_REQUIRED_OLIST) 1063 1029 1064 /* å¿ 1065 é ãªãã·ã§ã³ã追å ããã*/ 1030 /* 必須オプションを追加する。*/ 1066 1031 HOST2MSG16(oro->len, MSG2HOST16(oro->len) + sizeof(required_plist) * 2); 1067 1032 for (ix = sizeof(required_plist); ix -- > 0; ) { … … 1074 1039 #if defined(DHCP6_CLI_CFG_REQUEST_OLIST) 1075 1040 1076 /* è¦æ±ãªãã·ã§ã³ã追å ããã*/1041 /* 要求オプションを追加する。*/ 1077 1042 HOST2MSG16(oro->len, MSG2HOST16(oro->len) + sizeof(request_plist) * 2); 1078 1043 for (ix = sizeof(request_plist); ix -- > 0; ) { … … 1089 1054 1090 1055 /* 1091 * rel_lease -- ãªã¼ã¹ããããªãã·ã§ã³ã解æãã¦å¤ã解æ¾ããã1056 * rel_lease -- リースされたオプションを解析して値を解放する。 1092 1057 */ 1093 1058 … … 1106 1071 uint8_t *opt, *last; 1107 1072 1108 /* æå¹ãªãªã¼ã¹ã»ã¡ãã»ã¼ã¸æ§é ä½ãç¡ããã°ä½ãããªãã*/1073 /* 有効なリース・メッセージ構造体が無ければ何もしない。*/ 1109 1074 if (ct->act_msg == NULL) 1110 1075 return; … … 1154 1119 1155 1120 /* 1156 * set_lease -- ãªã¼ã¹ããããªãã·ã§ã³ã解æãã¦å¤ãè¨å®ããã1121 * set_lease -- リースされたオプションを解析して値を設定する。 1157 1122 */ 1158 1123 … … 1231 1196 1232 1197 /* 1233 * start_req_info -- INFO-REQUEST ãéå§ããã1198 * start_req_info -- INFO-REQUEST を開始する。 1234 1199 * 1235 * 注æ: DHCPv6 ã® RFC3315 ã«ã¯ç¡ã1200 * 注意: DHCPv6 の RFC3315 には無い 1236 1201 */ 1237 1202 … … 1239 1204 start_req_info (T_DHCP6_CLI_CONTEXT *ct) 1240 1205 { 1241 /* ã¿ã¤ã ã¢ã¦ããè¨å®ããããRFC3315 (18.1.5) åç 1242 §ã*/ 1206 /* タイムアウトを設定する。【RFC3315 (18.1.5) 参照】*/ 1243 1207 ct->IRT = TMO_INF_TIMEOUT; 1244 1208 ct->MRT = TMO_INF_MAX_RT; 1245 1209 ct->MRC = 0; 1246 1210 1247 /* DHCP6_CLI_CFG_ONE_TRY ãæå®ããã¦ããªããã°æ¨æºã¿ã¤ã ã¢ã¦ãã¾ã§åéããã*/1211 /* DHCP6_CLI_CFG_ONE_TRYが指定されていなければ標準タイムアウトまで再送する。*/ 1248 1212 #if defined(DHCP6_CLI_CFG_ONE_TRY) 1249 1213 ct->MRD = 0; … … 1252 1216 #endif 1253 1217 1254 /* åéåæ°ã¨ãã©ã³ã¶ã¯ã·ã§ã³ ID ãè¨å®ããã*/1218 /* 再送回数とトランザクション ID を設定する。*/ 1255 1219 init_retrans(ct); 1256 1220 1257 /* REPLY ã¡ãã»ã¼ã¸ã®åä¿¡ã¿ã¤ã ã¢ã¦ããè¨å®ããã*/1221 /* REPLY メッセージの受信タイムアウトを設定する。*/ 1258 1222 syscall(wai_sem(SEM_DHCP6_CLI_TIMER)); 1259 1223 ct->timers[DHCP6C_TIMER_RCV_REPLY] = SYSTIM2TIMER(ct->MRD); … … 1261 1225 1262 1226 /* 1263 * INFO-REQUEST ã¡ãã»ã¼ã¸éä¿¡é 1264 延æéãè¨å®ããã 1265 * ãã ããTMO_INF_MAX_DELAY ã 1[s]ãªã®ã§ãdly_tsk()ã使ç¨ããã 1227 * INFO-REQUEST メッセージ送信遅延時間を設定する。 1228 * ただし、TMO_INF_MAX_DELAY が 1[s]なので、dly_tsk()を使用する。 1266 1229 */ 1267 1230 dly_tsk(netapp_rand() % TMO_INF_MAX_DELAY); 1268 1231 1269 /* SELECT ç¶æ 1270 ã«é·ç§»ããã*/ 1232 /* SELECT 状態に遷移する。*/ 1271 1233 ct->fsm = DHCP6_FSM_SELECT; 1272 1234 1273 /* INFO-REQUEST ã¡ãã»ã¼ã¸ãéä¿¡ããã*/1235 /* INFO-REQUEST メッセージを送信する。*/ 1274 1236 ct->flags |= DHCP6C_FLAG_TMOUT_SND_IREQ; 1275 1237 syscall(sig_sem(SEM_DHCP6_CLI_READY)); … … 1277 1239 1278 1240 /* 1279 * start_informed -- INFORMED ç¶æ 1280 ã«é·ç§»ããã 1241 * start_informed -- INFORMED 状態に遷移する。 1281 1242 * 1282 * 注æ: DHCPv6 ã® RFC3315 ã«ã¯ç¡ã1243 * 注意: DHCPv6 の RFC3315 には無い 1283 1244 */ 1284 1245 … … 1286 1247 start_informed (T_DHCP6_CLI_CONTEXT *ct) 1287 1248 { 1288 /* æå¹ãªãªã¼ã¹æ 1289 å ±ãç¡ããã° SLEEP ã«é·ç§»ããã*/ 1249 /* 有効なリース情報が無ければ SLEEP に遷移する。*/ 1290 1250 if (ct->act_msg == NULL) { 1291 1251 ct->fsm = DHCP6_FSM_SLEEP; … … 1293 1253 } 1294 1254 1295 /* ãªã¼ã¹æ 1296 å ±ãè¨å®ããã*/ 1255 /* リース情報を設定する。*/ 1297 1256 set_lease(ct); 1298 1257 1299 /* INFORMED ç¶æ 1300 ã«é·ç§»ããã*/ 1258 /* INFORMED 状態に遷移する。*/ 1301 1259 ct->fsm = DHCP6_FSM_INFORMED; 1302 1260 … … 1305 1263 1306 1264 /* 1307 * start_rel_info -- ã¢ãã¬ã¹æ 1308 å ±ã解æ¾ããã 1265 * start_rel_info -- アドレス情報を解放する。 1309 1266 * 1310 * 注æ: DHCPv6 ã® RFC3315 ã«ã¯ç¡ã1267 * 注意: DHCPv6 の RFC3315 には無い 1311 1268 */ 1312 1269 … … 1314 1271 start_rel_info (T_DHCP6_CLI_CONTEXT *ct) 1315 1272 { 1316 /* ãªã¼ã¹æ 1317 å ±ã解æ¾ããã*/ 1273 /* リース情報を解放する。*/ 1318 1274 rel_lease(ct); 1319 1275 1320 /* SLEEP ã«é·ç§»ããã*/1276 /* SLEEP に遷移する。*/ 1321 1277 ct->fsm = DHCP6_FSM_SLEEP; 1322 1278 syscall(sig_sem(SEM_DHCP6_CLI_READY)); … … 1324 1280 1325 1281 /* 1326 * select_info_reply -- æé©ãª REPLY (INFO-REQUEST ã¸ã®å¿ç) ã¡ãã»ã¼ã¸ãé¸æããã1282 * select_info_reply -- 最適な REPLY (INFO-REQUEST への応答) メッセージを選択する。 1327 1283 */ 1328 1284 … … 1332 1288 T_DHCP6_CLI_MSG *msg; 1333 1289 1334 /* æé©ãª REPLY ã¡ãã»ã¼ã¸ãé¸æããã*/1290 /* 最適な REPLY メッセージを選択する。*/ 1335 1291 if ((msg = select_msg(ct)) == NULL) 1336 1292 return false; … … 1341 1297 1342 1298 /* 1343 * setup_info_req_msg -- INFO-REQUEST ã¡ãã»ã¼ã¸ãä½æããã1299 * setup_info_req_msg -- INFO-REQUEST メッセージを作成する。 1344 1300 */ 1345 1301 … … 1349 1305 uint8_t *msg; 1350 1306 1351 /* ã¡ãã»ã¼ã¸ã®ãããé¨åãä½æããã*/1307 /* メッセージのヘッダ部分を作成する。*/ 1352 1308 if ((msg = setup_msg_header(ct, DHCP6_INFO_REQ)) == NULL) 1353 1309 return E_PAR; … … 1356 1312 return E_PAR; 1357 1313 1358 /* ã¡ãã»ã¼ã¸æ§é ä½é·ãè¨å®ããã*/1314 /* メッセージ構造体長を設定する。*/ 1359 1315 ct->snd_msg->len = msg - (uint8_t*)&ct->snd_msg->msg; 1360 1316 1361 /* éä¿¡å 1362 ã¢ãã¬ã¹ãè¨å®ããã*/ 1317 /* 送信先アドレスを設定する。*/ 1363 1318 ct->dst.ipaddr = in6_addr_all_DHCP_relay_servers; 1364 1319 return E_OK; … … 1366 1321 1367 1322 /* 1368 * send_info_req_msg -- INFO-REQUEST ã¡ãã»ã¼ã¸ãéä¿¡ããã1323 * send_info_req_msg -- INFO-REQUEST メッセージを送信する。 1369 1324 */ 1370 1325 … … 1375 1330 1376 1331 1377 /* REPLY ã¡ãã»ã¼ã¸ã®é¸æãçµäºãã¦ããã°ãBOUND ç¶æ 1378 ã«é·ç§»ããã*/ 1332 /* REPLY メッセージの選択が終了していれば、BOUND 状態に遷移する。*/ 1379 1333 ct->flags &= ~DHCP6C_FLAG_TMOUT_MASK; 1380 1334 if (select_info_reply(ct)) { 1381 1335 1382 /* REPLY ã¡ãã»ã¼ã¸åä¿¡ã¿ã¤ãã¼ãåæ¢ããã*/1336 /* REPLY メッセージ受信タイマーを停止する。*/ 1383 1337 syscall(wai_sem(SEM_DHCP6_CLI_TIMER)); 1384 1338 ct->timers[DHCP6C_TIMER_RCV_REPLY] = 0; 1385 1339 syscall(sig_sem(SEM_DHCP6_CLI_TIMER)); 1386 1340 1387 /* INFORMED ç¶æ 1388 ã«é·ç§»ããã*/ 1341 /* INFORMED 状態に遷移する。*/ 1389 1342 start_informed(ct); 1390 1343 return; 1391 1344 } 1392 1345 1393 /* åéä¿¡åæ°ã確èªããã*/1346 /* 再送信回数を確認する。*/ 1394 1347 if ((ct->MRC != 0) && (ct->txcount > ct->MRC)) { 1395 1348 ct->error = E_TMOUT; … … 1397 1350 } 1398 1351 1399 /* INFO-REQUEST ã¡ãã»ã¼ã¸ãä½æããã*/1352 /* INFO-REQUEST メッセージを作成する。*/ 1400 1353 if ((error = setup_info_req_msg(ct)) != E_OK) { 1401 1354 syslog(LOG_NOTICE, "[DHCP6C] error, setup request message: %s.", itron_strerror(error)); … … 1404 1357 } 1405 1358 1406 /* INFO-REQUEST ã¡ãã»ã¼ã¸ãéä¿¡ããã*/1359 /* INFO-REQUEST メッセージを送信する。*/ 1407 1360 error = UDP_SND_DAT(ct->cepid, &ct->dst, &ct->snd_msg->msg, ct->snd_msg->len, TMO_NBLK); 1408 1361 if (error != E_WBLK) { … … 1412 1365 } 1413 1366 1414 /* åéä¿¡ã¿ã¤ã ã¢ã¦ããè¨å®ããã*/1367 /* 再送信タイムアウトを設定する。*/ 1415 1368 syscall(wai_sem(SEM_DHCP6_CLI_TIMER)); 1416 1369 ct->timers[DHCP6C_TIMER_SND_IREQ] = SYSTIM2TIMER(ct->RT); 1417 1370 syscall(sig_sem(SEM_DHCP6_CLI_TIMER)); 1418 1371 1419 /* åéä¿¡ã¿ã¤ã ã¢ã¦ããæ´æ°ããã*/1372 /* 再送信タイムアウトを更新する。*/ 1420 1373 advance_retrans(ct); 1421 1374 } … … 1426 1379 1427 1380 /* 1428 * select_reply -- æé©ãª REPLY ã¡ãã»ã¼ã¸ãé¸æããã1381 * select_reply -- 最適な REPLY メッセージを選択する。 1429 1382 */ 1430 1383 … … 1434 1387 T_DHCP6_CLI_MSG *msg; 1435 1388 1436 /* æé©ãª REPLY ã¡ãã»ã¼ã¸ãé¸æããã*/1389 /* 最適な REPLY メッセージを選択する。*/ 1437 1390 if ((msg = select_msg(ct)) == NULL) 1438 1391 return false; … … 1444 1397 1445 1398 /* 1446 * æé©ãª REPLY ã¡ãã»ã¼ã¸ã®æ¨å¥¨åº¦ã ADVERTISE ã¡ãã»ã¼ã¸æ¨å¥¨åº¦ã®1447 * 1/2 以ä¸ã®æã¯åä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã«æ»ãã1399 * 最適な REPLY メッセージの推奨度が ADVERTISE メッセージ推奨度の 1400 * 1/2 以下の時は受信メッセージ構造体リストに戻す。 1448 1401 */ 1449 1402 if ((ct->adv_msg != NULL) && (ct->max_prefer < (ct->adv_msg->prefer & DHCP6_ClI_MSG_PREFER_VALUE_MASK) / 2)) { … … 1456 1409 1457 1410 /* 1458 * ct->act_msg ã«ããæå¹ãªå 1459 REPLY ã¡ãã»ã¼ã¸ã 1460 * åä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã«æ»ãã¦ã 1461 * æé©ãª REPLY ã¡ãã»ã¼ã¸ã act ã«ç§»ãã 1411 * ct->act_msg にある有効な元 REPLY メッセージを 1412 * 受信メッセージ構造体リストに戻して、 1413 * 最適な REPLY メッセージを act に移す。 1462 1414 */ 1463 1415 if (ct->act_msg != NULL) { … … 1474 1426 1475 1427 /* 1476 * select_adv -- æé©ãª ADVERTISE ã¡ãã»ã¼ã¸ãé¸æããã1428 * select_adv -- 最適な ADVERTISE メッセージを選択する。 1477 1429 */ 1478 1430 … … 1480 1432 select_adv (T_DHCP6_CLI_CONTEXT *ct) 1481 1433 { 1482 /* æé©ãª ADVERTISE ã¡ãã»ã¼ã¸ã adv ã«ç§»ãã*/1434 /* 最適な ADVERTISE メッセージを adv に移す。*/ 1483 1435 if ((ct->adv_msg = select_msg(ct)) != NULL) { 1484 1436 1485 1437 /* 1486 * æé©ãª ADVERTISE ã¡ãã»ã¼ã¸ã®ãµã¼ãã® IPv6 ã¢ãã¬ã¹ã1487 * 次ããéä¿¡ããã¢ãã¬ã¹ã«è¨å®ããã1438 * 最適な ADVERTISE メッセージのサーバの IPv6 アドレスを 1439 * 次から送信するアドレスに設定する。 1488 1440 */ 1489 1441 ct->dst = ct->adv_msg->srv; … … 1495 1447 1496 1448 /* 1497 * eval_expire -- æ¨å¥¨æå¹æéã¨æå¹æéã決å®ããã1449 * eval_expire -- 推奨有効時間と有効時間を決定する。 1498 1450 */ 1499 1451 … … 1511 1463 uint_t aoff, asize, addrs; 1512 1464 1513 /* ã¿ã¤ãã¼ãåæ¢ããã*/1465 /* タイマーを停止する。*/ 1514 1466 syscall(wai_sem(SEM_DHCP6_CLI_TIMER)); 1515 1467 ct->timers[DHCP6C_TIMER_RENEW] = 0; … … 1528 1480 opt = (T_DHCP6_OPTION*)msg; 1529 1481 1530 /* IA_NA/IA_PD ãªãã·ã§ã³ã§ããã°ãæå¹æéãæ´æ°ããã*/1482 /* IA_NA/IA_PD オプションであれば、有効時間を更新する。*/ 1531 1483 if (MSG2HOST16(opt->code) == DHCP6_OPT_IA_NA || MSG2HOST16(opt->code) == DHCP6_OPT_IA_PD) { 1532 1484 … … 1540 1492 while (aoff < asize) { 1541 1493 1542 /* æçã®æ¨å¥¨æå¹æéãæ´æ°ããã*/1494 /* 最短の推奨有効時間を更新する。*/ 1543 1495 iaa = (T_DHCP6_OPT_IAADDR*)((uint8_t*)opt + aoff); 1544 1496 //dump_msg_option("evl_depref1", (uint8_t*)iaa); … … 1552 1504 } 1553 1505 1554 /* IAADDR ã®æå¹æéãæ´æ°ããã*/1506 /* IAADDR の有効時間を更新する。*/ 1555 1507 iaa = (T_DHCP6_OPT_IAADDR*)((uint8_t*)opt + aoff); 1556 1508 if (!(MSG2HOST16(iaa->len) & DHCP6C_IAA_FLAG_EXPIRED)) { … … 1570 1522 } 1571 1523 1572 /* iaa_low 㨠iaa_high/2 ã®æé·ã®æ¹ãæå¹æéã¨ãã¦é¸æããã*/1524 /* iaa_low と iaa_high/2 の最長の方を有効時間として選択する。*/ 1573 1525 if (iaa_low <= (iaa_high / 2)) 1574 1526 expire = iaa_high; … … 1576 1528 expire = iaa_low; 1577 1529 1578 /* expire ã æ大å¤ï¼ç¡å¶éï¼ã 1 以ä¸ãªãæ¢å®å¤ã«è¨å®ããã*/1530 /* expire が 最大値(無制限)か 1 以下なら既定値に設定する。*/ 1579 1531 if ((expire == DHCP6_MAX_TIME) || (expire <= 1)) 1580 1532 expire = SYSTIM2SEC(TMO_DHCP6C_REQ_LEASE) / 2; … … 1582 1534 expire /= 2; 1583 1535 1584 /* renew ã決å®ããã*/1536 /* renew を決定する。*/ 1585 1537 if (MSG2HOST32(ia->renew) == 0) 1586 1538 tval = expire + SYSTIM2SEC(ct->act_msg->rcv_time); … … 1592 1544 renew = tval; 1593 1545 1594 /* rebind ã決å®ããã*/1546 /* rebind を決定する。*/ 1595 1547 if (MSG2HOST32(ia->rebind) == 0) 1596 1548 tval = (expire + expire / 2) + SYSTIM2SEC(ct->act_msg->rcv_time); … … 1602 1554 rebind = tval; 1603 1555 1604 /* æçæå¹æéã¨æé·æå¹æéãæ´æ°ããã*/1556 /* 最短有効時間と最長有効時間を更新する。*/ 1605 1557 iaa_low += SYSTIM2SEC(ct->act_msg->rcv_time); 1606 1558 iaa_high += SYSTIM2SEC(ct->act_msg->rcv_time); … … 1614 1566 } 1615 1567 1616 /* ã¢ãã¬ã¹ãéããã¦ããªããã°ãSLEEP ç¶æ 1617 ã«é·ç§»ããã*/ 1568 /* アドレスが送られていなければ、SLEEP 状態に遷移する。*/ 1618 1569 if (addrs == 0) { 1619 1570 ct->fsm = DHCP6_FSM_SLEEP; 1620 1571 } 1621 1572 1622 /* ç¶æ 1623 ã«ä¾åããå¦ç */ 1573 /* 状態に依存する処理 */ 1624 1574 switch (ct->fsm) { 1625 1575 1626 1576 case DHCP6_FSM_BOUND: 1627 1577 1628 /* RENEW ã¿ã¤ã ã¢ã¦ãã®è¨å®*/1578 /* RENEW タイムアウトの設定 */ 1629 1579 if ((rebind > SYSTIM2SEC(time)) && (renew < rebind)) { 1630 1580 ct->next_MRD = SEC2SYSTIM(rebind) - time; … … 1634 1584 break; 1635 1585 } 1636 /* break; */ /* ä¸ã«æããã*/1586 /* break; */ /* 下に抜ける。*/ 1637 1587 1638 1588 case DHCP6_FSM_RENEW: 1639 1589 1640 /* REBIND ã¿ã¤ã ã¢ã¦ãã®è¨å®*/1590 /* REBIND タイムアウトの設定 */ 1641 1591 ct->MRD = SEC2SYSTIM(rebind); 1642 1592 if (rebind != DHCP6_MAX_TIME) { … … 1657 1607 } 1658 1608 1659 /* DEPREF ã¿ã¤ã ã¢ã¦ãã®è¨å®*/1609 /* DEPREF タイムアウトの設定 */ 1660 1610 if (depref != DHCP6_MAX_TIME) { 1661 1611 syscall(wai_sem(SEM_DHCP6_CLI_TIMER)); … … 1664 1614 } 1665 1615 1666 /* EXPIRE ã¿ã¤ã ã¢ã¦ãã®è¨å®*/1616 /* EXPIRE タイムアウトの設定 */ 1667 1617 if (low != DHCP6_MAX_TIME) { 1668 1618 syscall(wai_sem(SEM_DHCP6_CLI_TIMER)); … … 1673 1623 1674 1624 /* 1675 * start_init -- INIT ç¶æ 1676 ã«é·ç§»ããã 1625 * start_init -- INIT 状態に遷移する。 1677 1626 */ 1678 1627 … … 1680 1629 start_init (T_DHCP6_CLI_CONTEXT *ct) 1681 1630 { 1682 /* ã¿ã¤ã ã¢ã¦ããè¨å®ããããRFC3315 (17.1.2) åç 1683 §ã*/ 1631 /* タイムアウトを設定する。【RFC3315 (17.1.2) 参照】*/ 1684 1632 ct->IRT = TMO_SOL_TIMEOUT; 1685 1633 ct->MRT = TMO_SOL_MAX_RT; 1686 1634 ct->MRC = 0; 1687 1635 1688 /* DHCP6_CLI_CFG_ONE_TRY ãæå®ããã¦ããªããã°æ¨æºã¿ã¤ã ã¢ã¦ãã¾ã§åéããã*/1636 /* DHCP6_CLI_CFG_ONE_TRYが指定されていなければ標準タイムアウトまで再送する。*/ 1689 1637 #if defined(DHCP6_CLI_CFG_ONE_TRY) 1690 1638 ct->MRD = 0; … … 1693 1641 #endif 1694 1642 1695 /* åéåæ°ã¨ãã©ã³ã¶ã¯ã·ã§ã³ ID ãè¨å®ããã*/1643 /* 再送回数とトランザクション ID を設定する。*/ 1696 1644 init_retrans(ct); 1697 1645 1698 /* RFC3315 (17.1.2) ã®è¦å®ã«å¾ã£ã¦ã¿ã¤ã ã¢ã¦ãã調æ´ããã*/1646 /* RFC3315 (17.1.2) の規定に従ってタイムアウトを調整する。*/ 1699 1647 if (ct->RT <= ct->IRT) 1700 1648 ct->RT = ct->IRT + (ct->IRT - ct->RT); … … 1702 1650 ct->RT = ct->IRT + SEC2SYSTIM(1); 1703 1651 1704 /* ADVERTISE ã¡ãã»ã¼ã¸ã®åä¿¡ã¿ã¤ã ã¢ã¦ããè¨å®ããã*/1652 /* ADVERTISE メッセージの受信タイムアウトを設定する。*/ 1705 1653 syscall(wai_sem(SEM_DHCP6_CLI_TIMER)); 1706 1654 ct->timers[DHCP6C_TIMER_RCV_ADV] = SYSTIM2TIMER(ct->MRD); … … 1708 1656 1709 1657 /* 1710 * SOLICIT ã¡ãã»ã¼ã¸éä¿¡é 1711 延æéãè¨å®ããã 1712 * ãã ããTMO_SOL_MAX_DELAY ã 1[s]ãªã®ã§ãdly_tsk()ã使ç¨ããã 1658 * SOLICIT メッセージ送信遅延時間を設定する。 1659 * ただし、TMO_SOL_MAX_DELAY が 1[s]なので、dly_tsk()を使用する。 1713 1660 */ 1714 1661 dly_tsk(netapp_rand() % TMO_SOL_MAX_DELAY); 1715 1662 1716 /* INIT ç¶æ 1717 ã«é·ç§»ããã*/ 1663 /* INIT 状態に遷移する。*/ 1718 1664 ct->fsm = DHCP6_FSM_INIT; 1719 1665 1720 /* SOLICIT ã¡ãã»ã¼ã¸ãéä¿¡ããã*/1666 /* SOLICIT メッセージを送信する。*/ 1721 1667 ct->flags |= DHCP6C_FLAG_TMOUT_SND_SOL; 1722 1668 syscall(sig_sem(SEM_DHCP6_CLI_READY)); … … 1724 1670 1725 1671 /* 1726 * start_select -- REQUEST ã¡ãã»ã¼ã¸ãéä¿¡ã㦠SELECT ç¶æ 1727 ã«é·ç§»ããã 1672 * start_select -- REQUEST メッセージを送信して SELECT 状態に遷移する。 1728 1673 */ 1729 1674 … … 1731 1676 start_select (T_DHCP6_CLI_CONTEXT *ct) 1732 1677 { 1733 /* æå¹ãª ADVERTISE ã¡ãã»ã¼ã¸ãåä¿¡ãã¦ããªããã° SLEEP ç¶æ 1734 ã«é·ç§»ããã*/ 1678 /* 有効な ADVERTISE メッセージを受信していなければ SLEEP 状態に遷移する。*/ 1735 1679 if (ct->adv_msg == NULL) { 1736 1680 ct->fsm = DHCP6_FSM_SLEEP; … … 1738 1682 } 1739 1683 1740 /* ã¿ã¤ã ã¢ã¦ããè¨å®ããããRFC3315 (18.1.1) åç 1741 §ã*/ 1684 /* タイムアウトを設定する。【RFC3315 (18.1.1) 参照】*/ 1742 1685 ct->IRT = TMO_REQ_TIMEOUT; 1743 1686 ct->MRT = TMO_REQ_MAX_RT; … … 1745 1688 ct->MRD = 0; 1746 1689 1747 /* åéåæ°ã¨ãã©ã³ã¶ã¯ã·ã§ã³ ID ãè¨å®ããã*/1690 /* 再送回数とトランザクション ID を設定する。*/ 1748 1691 init_retrans(ct); 1749 1692 1750 /* REPLY ã¡ãã»ã¼ã¸ã®åä¿¡ã¿ã¤ã ã¢ã¦ããè¨å®ããã*/1693 /* REPLY メッセージの受信タイムアウトを設定する。*/ 1751 1694 syscall(wai_sem(SEM_DHCP6_CLI_TIMER)); 1752 1695 ct->timers[DHCP6C_TIMER_RCV_REPLY] = SYSTIM2TIMER(ct->MRD); 1753 1696 syscall(sig_sem(SEM_DHCP6_CLI_TIMER)); 1754 1697 1755 /* SELECT ç¶æ 1756 ã«é·ç§»ããã*/ 1698 /* SELECT 状態に遷移する。*/ 1757 1699 ct->fsm = DHCP6_FSM_SELECT; 1758 1700 1759 /* REQUEST ã¡ãã»ã¼ã¸ãéä¿¡ããã*/1701 /* REQUEST メッセージを送信する。*/ 1760 1702 ct->flags |= DHCP6C_FLAG_TMOUT_SND_REQ; 1761 1703 syscall(sig_sem(SEM_DHCP6_CLI_READY)); … … 1763 1705 1764 1706 /* 1765 * start_bound -- BOUND ç¶æ 1766 ã«é·ç§»ããã 1707 * start_bound -- BOUND 状態に遷移する。 1767 1708 */ 1768 1709 … … 1770 1711 start_bound (T_DHCP6_CLI_CONTEXT *ct) 1771 1712 { 1772 /* æå¹ãªãªã¼ã¹æ 1773 å ±ãç¡ããã° SLEEP ã«é·ç§»ããã*/ 1713 /* 有効なリース情報が無ければ SLEEP に遷移する。*/ 1774 1714 if (ct->act_msg == NULL) 1775 1715 ct->fsm = DHCP6_FSM_SLEEP; 1776 1716 1777 /* BOUND ç¶æ 1778 ã«é·ç§»ããã*/ 1717 /* BOUND 状態に遷移する。*/ 1779 1718 ct->fsm = DHCP6_FSM_BOUND; 1780 1719 1781 /* ãªã¼ã¹æ 1782 å ±ãè¨å®ããã*/ 1720 /* リース情報を設定する。*/ 1783 1721 set_lease(ct); 1784 1722 1785 /* æå¹æéã決å®ããã*/1723 /* 有効時間を決定する。*/ 1786 1724 eval_expire(ct); 1787 1725 1788 1726 } 1789 1727 /* 1790 * start_renew -- RENEW ç¶æ 1791 ã«é·ç§»ããã 1728 * start_renew -- RENEW 状態に遷移する。 1792 1729 */ 1793 1730 … … 1795 1732 start_renew (T_DHCP6_CLI_CONTEXT *ct) 1796 1733 { 1797 /* æå¹ãªãªã¼ã¹æ 1798 å ±ãç¡ããã° SLEEP ã«é·ç§»ããã*/ 1734 /* 有効なリース情報が無ければ SLEEP に遷移する。*/ 1799 1735 if (ct->act_msg == NULL) { 1800 1736 ct->fsm = DHCP6_FSM_SLEEP; … … 1802 1738 } 1803 1739 1804 /* ã¿ã¤ã ã¢ã¦ããè¨å®ããããRFC3315 (18.1.3) åç 1805 §ã*/ 1740 /* タイムアウトを設定する。【RFC3315 (18.1.3) 参照】*/ 1806 1741 ct->IRT = TMO_REN_TIMEOUT; 1807 1742 ct->MRT = TMO_REN_MAX_RT; … … 1809 1744 ct->MRD = ct->next_MRD; 1810 1745 1811 /* åéåæ°ã¨ãã©ã³ã¶ã¯ã·ã§ã³ ID ãè¨å®ããã*/1746 /* 再送回数とトランザクション ID を設定する。*/ 1812 1747 init_retrans(ct); 1813 1748 1814 /* REFRESH ã¡ãã»ã¼ã¸ã¿ã¤ããè¨å®ããã*/1749 /* REFRESH メッセージタイプを設定する。*/ 1815 1750 ct->refresh_type = DHCP6_RENEW; 1816 1751 1817 /* REPLY ã¡ãã»ã¼ã¸ã®åä¿¡ã¿ã¤ã ã¢ã¦ããè¨å®ããã*/1752 /* REPLY メッセージの受信タイムアウトを設定する。*/ 1818 1753 syscall(wai_sem(SEM_DHCP6_CLI_TIMER)); 1819 1754 ct->timers[DHCP6C_TIMER_RCV_REPLY] = SYSTIM2TIMER(ct->MRD); 1820 1755 syscall(sig_sem(SEM_DHCP6_CLI_TIMER)); 1821 1756 1822 /* RENEW ç¶æ 1823 ã«é·ç§»ããã*/ 1757 /* RENEW 状態に遷移する。*/ 1824 1758 ct->fsm = DHCP6_FSM_RENEW; 1825 1759 1826 /* REFRESH ã¡ãã»ã¼ã¸ãéä¿¡ããã*/1760 /* REFRESH メッセージを送信する。*/ 1827 1761 ct->flags |= DHCP6C_FLAG_TMOUT_SND_REF; 1828 1762 syscall(sig_sem(SEM_DHCP6_CLI_READY)); … … 1830 1764 1831 1765 /* 1832 * start_rebind -- REBIND ç¶æ 1833 ã«é·ç§»ããã 1766 * start_rebind -- REBIND 状態に遷移する。 1834 1767 */ 1835 1768 … … 1837 1770 start_rebind (T_DHCP6_CLI_CONTEXT *ct) 1838 1771 { 1839 /* æå¹ãªãªã¼ã¹æ 1840 å ±ãç¡ããã° SLEEP ã«é·ç§»ããã*/ 1772 /* 有効なリース情報が無ければ SLEEP に遷移する。*/ 1841 1773 if (ct->act_msg == NULL) { 1842 1774 ct->fsm = DHCP6_FSM_SLEEP; … … 1844 1776 } 1845 1777 1846 /* ã¿ã¤ã ã¢ã¦ããè¨å®ããããRFC3315 (18.1.4) åç 1847 §ã*/ 1778 /* タイムアウトを設定する。【RFC3315 (18.1.4) 参照】*/ 1848 1779 ct->IRT = TMO_REB_TIMEOUT; 1849 1780 ct->MRT = TMO_REB_MAX_RT; … … 1851 1782 ct->MRD = ct->next_MRD; 1852 1783 1853 /* åéåæ°ã¨ãã©ã³ã¶ã¯ã·ã§ã³ ID ãè¨å®ããã*/1784 /* 再送回数とトランザクション ID を設定する。*/ 1854 1785 init_retrans(ct); 1855 1786 1856 /* REFRESH ã¡ãã»ã¼ã¸ã¿ã¤ããè¨å®ããã*/1787 /* REFRESH メッセージタイプを設定する。*/ 1857 1788 ct->refresh_type = DHCP6_REBIND; 1858 1789 1859 /* REPLY ã¡ãã»ã¼ã¸ã®åä¿¡ã¿ã¤ã ã¢ã¦ããè¨å®ããã*/1790 /* REPLY メッセージの受信タイムアウトを設定する。*/ 1860 1791 syscall(wai_sem(SEM_DHCP6_CLI_TIMER)); 1861 1792 ct->timers[DHCP6C_TIMER_RCV_REPLY] = SYSTIM2TIMER(ct->MRD); 1862 1793 syscall(sig_sem(SEM_DHCP6_CLI_TIMER)); 1863 1794 1864 /* éä¿¡å 1865 ã¢ãã¬ã¹ãè¨å®ããã*/ 1795 /* 送信先アドレスを設定する。*/ 1866 1796 ct->dst.ipaddr = in6_addr_all_DHCP_relay_servers; 1867 1797 1868 /* REBIND ç¶æ 1869 ã«é·ç§»ããã*/ 1798 /* REBIND 状態に遷移する。*/ 1870 1799 ct->fsm = DHCP6_FSM_REBIND; 1871 1800 1872 /* REFRESH ã¡ãã»ã¼ã¸ãéä¿¡ããã*/1801 /* REFRESH メッセージを送信する。*/ 1873 1802 ct->flags |= DHCP6C_FLAG_TMOUT_SND_REF; 1874 1803 syscall(sig_sem(SEM_DHCP6_CLI_READY)); … … 1876 1805 1877 1806 /* 1878 * start_rel_info -- ã¢ãã¬ã¹æ 1879 å ±ã解æ¾ããã 1807 * start_rel_info -- アドレス情報を解放する。 1880 1808 * 1881 * 注æ: DHCPv6 ã® RFC3315 ã«ã¯ç¡ã1809 * 注意: DHCPv6 の RFC3315 には無い 1882 1810 */ 1883 1811 … … 1885 1813 start_rel_info (T_DHCP6_CLI_CONTEXT *ct) 1886 1814 { 1887 /* å 1888 ¨ã¦ã® TIMER ããã£ã³ã»ã«ããã*/ 1815 /* 全ての TIMER をキャンセルする。*/ 1889 1816 cancel_all_timers(ct); 1890 1817 1891 /* ãªã¼ã¹æ 1892 å ±ã解æ¾ããã*/ 1818 /* リース情報を解放する。*/ 1893 1819 rel_lease(ct); 1894 1820 1895 /* æå¹ãªãªã¼ã¹æ 1896 å ±ãç¡ããã° SLEEP ã«é·ç§»ããã*/ 1821 /* 有効なリース情報が無ければ SLEEP に遷移する。*/ 1897 1822 if (ct->act_msg == NULL) { 1898 1823 ct->fsm = DHCP6_FSM_SLEEP; … … 1900 1825 } 1901 1826 1902 /* ã¿ã¤ã ã¢ã¦ããè¨å®ããããRFC3315 (18.1.1) åç 1903 §ã*/ 1827 /* タイムアウトを設定する。【RFC3315 (18.1.1) 参照】*/ 1904 1828 ct->IRT = TMO_REL_TIMEOUT; 1905 1829 ct->MRT = 0; … … 1907 1831 ct->MRD = 0; 1908 1832 1909 /* åéåæ°ã¨ãã©ã³ã¶ã¯ã·ã§ã³ ID ãè¨å®ããã*/1833 /* 再送回数とトランザクション ID を設定する。*/ 1910 1834 init_retrans(ct); 1911 1835 1912 /* REL_INFO ç¶æ 1913 ã«é·ç§»ããã*/ 1836 /* REL_INFO 状態に遷移する。*/ 1914 1837 ct->fsm = DHCP6_FSM_REL_INFO; 1915 1838 1916 /* RELEASE ã¡ãã»ã¼ã¸ãéä¿¡ããã*/1839 /* RELEASE メッセージを送信する。*/ 1917 1840 ct->flags |= DHCP6C_FLAG_TMOUT_SND_REL; 1918 1841 syscall(sig_sem(SEM_DHCP6_CLI_READY)); … … 1922 1845 1923 1846 /* 1924 * solicit_ia_option -- SOLICIT ã¡ãã»ã¼ã¸ã® IA_NA/IA_TA/IA_PD ãªãã·ã§ã³ã®å 1925 ±éé¨åã追å ããã 1847 * solicit_ia_option -- SOLICIT メッセージの IA_NA/IA_TA/IA_PD オプションの共通部分を追加する。 1926 1848 */ 1927 1849 … … 1932 1854 uint_t off, len; 1933 1855 1934 /* ãªãã·ã§ã³ã³ã¼ããè¨å®ããã*/1856 /* オプションコードを設定する。*/ 1935 1857 ia = (T_DHCP6_OPT_IA_TA*)msg; 1936 1858 HOST2MSG16(ia->code, code); 1937 1859 1938 /* IAID ãè¨å®ããã*/1860 /* IAID を設定する。*/ 1939 1861 if (sizeof(ct->sc->ifaddr.lladdr) > sizeof(uint32_t)) { 1940 1862 off = sizeof(ct->sc->ifaddr.lladdr) - 4; … … 1949 1871 1950 1872 /* 1951 * solicit_iaaddr_option -- SOLICIT ã¡ãã»ã¼ã¸ã® IAADDR ãªãã·ã§ã³ã追å ããã1873 * solicit_iaaddr_option -- SOLICIT メッセージの IAADDR オプションを追加する。 1952 1874 */ 1953 1875 … … 1961 1883 1962 1884 /* 1963 * æå¹ãªãªã¼ã¹ã»ã¡ãã»ã¼ã¸ãæ®ã£ã¦ãã¦ã1964 * æå®ããããªãã·ã§ã³ï¼IA_NA/IA_TA/IA_PDï¼ãããå ´åã¯1965 * åãã¢ãã¬ã¹ãè¦æ±ããã1885 * 有効なリース・メッセージが残っていて、 1886 * 指定されたオプション(IA_NA/IA_TA/IA_PD)がある場合は 1887 * 同じアドレスを要求する。 1966 1888 */ 1967 1889 if ((ct->act_msg == NULL) || (opt = find_msg_option(ct->act_msg, code, 0)) == NULL) 1968 1890 return 0; 1969 1891 1970 /* ãªãã·ã§ã³ã³ã¼ããè¨å®ããã*/1892 /* オプションコードを設定する。*/ 1971 1893 iaa = (T_DHCP6_OPT_IAADDR*)msg; 1972 1894 HOST2MSG16(iaa->code, DHCP6_OPT_IAADDR); 1973 1895 1974 /* IAADDR ãªãã·ã§ã³ãé¤ãããªãã·ã§ã³é·ãè¨å®ããã*/1896 /* IAADDR オプションを除いたオプション長を設定する。*/ 1975 1897 HOST2MSG16(iaa->len, sizeof(*iaa) - sizeof(T_DHCP6_OPTION)); 1976 1898 1977 /* ã¢ãã¬ã¹ãè¨å®ããã*/1899 /* アドレスを設定する。*/ 1978 1900 len = code == DHCP6_OPT_IA_TA ? sizeof(T_DHCP6_OPT_IA_TA) 1979 1901 : sizeof(T_DHCP6_OPT_IA_NA_PD); 1980 1902 memcpy(&iaa->addr, opt + sizeof(T_DHCP6_OPTION) + len, sizeof(iaa->addr)); 1981 1903 1982 /* T1 ãT2 ãè¨å®ããã*/1904 /* T1、T2 を設定する。*/ 1983 1905 t1 = TMO_DHCP6C_REQ_LEASE / 2; 1984 1906 t2 = t1 + (t1 / 2); … … 1992 1914 1993 1915 /* 1994 * solicit_ia_na_pd -- SOLICIT ã¡ãã»ã¼ã¸ã® IA_NA/IA_PD ãªãã·ã§ã³ã追å ããã1916 * solicit_ia_na_pd -- SOLICIT メッセージの IA_NA/IA_PD オプションを追加する。 1995 1917 */ 1996 1918 … … 2004 1926 uint_t len; 2005 1927 2006 /* IA_NA/IA_TA/IA_PD ãªãã·ã§ã³ã®å 2007 ±éé¨åã追å ããã*/ 1928 /* IA_NA/IA_TA/IA_PD オプションの共通部分を追加する。*/ 2008 1929 solicit_ia_option(ct, msg, code); 2009 1930 ia = (T_DHCP6_OPT_IA_NA_PD*)msg; 2010 1931 2011 /* T1 ãT2 ãè¨å®ããã*/1932 /* T1、T2 を設定する。*/ 2012 1933 t1 = TMO_DHCP6C_REQ_LEASE / 2; 2013 1934 t2 = t1 + (t1 / 2); … … 2016 1937 2017 1938 /* 2018 * æå¹ãªãªã¼ã¹ã»ã¡ãã»ã¼ã¸ãæ®ã£ã¦ãã¦ã2019 * æå®ããããªãã·ã§ã³ï¼IA_NA/IA_PDï¼ãããå ´åã¯2020 * åãã¢ãã¬ã¹ãè¦æ±ããã1939 * 有効なリース・メッセージが残っていて、 1940 * 指定されたオプション(IA_NA/IA_PD)がある場合は 1941 * 同じアドレスを要求する。 2021 1942 */ 2022 1943 msg += sizeof(*ia); 2023 1944 len = solicit_iaaddr_option(ct, msg, code); 2024 1945 2025 /* IA_NAIA_TA/IA_PD ãªãã·ã§ã³ãé¤ãããªãã·ã§ã³é·ãè¨å®ããã*/1946 /* IA_NAIA_TA/IA_PD オプションを除いたオプション長を設定する。*/ 2026 1947 HOST2MSG16(ia->len, (sizeof(*ia) + len) - sizeof(T_DHCP6_OPTION)); 2027 1948 … … 2032 1953 2033 1954 /* 2034 * solicit_ia_ta -- SOLICIT ã¡ãã»ã¼ã¸ã® IA_TA ãªãã·ã§ã³ã追å ããã1955 * solicit_ia_ta -- SOLICIT メッセージの IA_TA オプションを追加する。 2035 1956 */ 2036 1957 … … 2042 1963 T_DHCP6_OPT_IA_TA *ia; 2043 1964 2044 /* IA_NA/IA_TA/IA_PD ãªãã·ã§ã³ã®å 2045 ±éé¨åã追å ããã*/ 1965 /* IA_NA/IA_TA/IA_PD オプションの共通部分を追加する。*/ 2046 1966 solicit_ia_option(ct, msg, DHCP6_OPT_IA_TA); 2047 1967 2048 /* IA_NAIA_TA/IA_PD ãªãã·ã§ã³ãé¤ãããªãã·ã§ã³é·ãè¨å®ããã*/1968 /* IA_NAIA_TA/IA_PD オプションを除いたオプション長を設定する。*/ 2049 1969 ia = (T_DHCP6_OPT_IA_TA*)msg; 2050 1970 HOST2MSG16(ia->len, sizeof(*ia) - sizeof(T_DHCP6_OPTION)); 2051 1971 2052 1972 /* 2053 * æå¹ãªãªã¼ã¹ã»ã¡ãã»ã¼ã¸ãæ®ã£ã¦ãã¦ã2054 * æå®ããããªãã·ã§ã³ï¼IA_TAï¼ãããå ´åã¯2055 * åãã¢ãã¬ã¹ãè¦æ±ããã1973 * 有効なリース・メッセージが残っていて、 1974 * 指定されたオプション(IA_TA)がある場合は 1975 * 同じアドレスを要求する。 2056 1976 */ 2057 1977 msg += sizeof(*ia); … … 2062 1982 2063 1983 /* 2064 * setup_solicit_msg -- SOLICIT ã¡ãã»ã¼ã¸ãä½æããã1984 * setup_solicit_msg -- SOLICIT メッセージを作成する。 2065 1985 */ 2066 1986 … … 2070 1990 uint8_t *head, *msg; 2071 1991 2072 /* ã¡ãã»ã¼ã¸ã®ãããé¨åãä½æããã*/1992 /* メッセージのヘッダ部分を作成する。*/ 2073 1993 if ((head = setup_msg_header(ct, DHCP6_SOLICIT)) == NULL) 2074 1994 return E_PAR; … … 2079 1999 #if defined(DHCP6_CLI_CFG_IA_NA) 2080 2000 2081 /* IA_NA ã追å ããã*/2001 /* IA_NA を追加する。*/ 2082 2002 msg = solicit_ia_na_pd(ct, msg, DHCP6_OPT_IA_NA); 2083 2003 #endif … … 2085 2005 #if defined(DHCP6_CLI_CFG_IA_TA) 2086 2006 2087 /* IA_TA ã追å ããã*/2007 /* IA_TA を追加する。*/ 2088 2008 msg = solicit_ia_ta(ct, msg); 2089 2009 #endif … … 2091 2011 #if defined(DHCP6_CLI_CFG_IA_PD) 2092 2012 2093 /* IA_PD ã追å ããã*/2013 /* IA_PD を追加する。*/ 2094 2014 msg = solicit_ia_na_pd(ct, msg, DHCP6_OPT_IA_PD); 2095 2015 #endif 2096 2016 2097 /* ã¡ãã»ã¼ã¸æ§é ä½é·ãè¨å®ããã*/2017 /* メッセージ構造体長を設定する。*/ 2098 2018 ct->snd_msg->len = msg - (uint8_t*)&ct->snd_msg->msg; 2099 2019 2100 /* éä¿¡å 2101 ã¢ãã¬ã¹ãè¨å®ããã*/ 2020 /* 送信先アドレスを設定する。*/ 2102 2021 ct->dst.ipaddr = in6_addr_all_DHCP_relay_servers; 2103 2022 return E_OK; … … 2105 2024 2106 2025 /* 2107 * send_solicit_msg -- SOLICIT ã¡ãã»ã¼ã¸ãéä¿¡ããã2026 * send_solicit_msg -- SOLICIT メッセージを送信する。 2108 2027 */ 2109 2028 … … 2116 2035 ct->error = E_OK; 2117 2036 2118 /* ADVERTISE ã¡ãã»ã¼ã¸ã®é¸æãçµäºãã¦ããã°ãSELECT ç¶æ 2119 ã«é·ç§»ããã*/ 2037 /* ADVERTISE メッセージの選択が終了していれば、SELECT 状態に遷移する。*/ 2120 2038 if (select_adv(ct)) { 2121 2039 2122 /* ADVERTISE ã¡ãã»ã¼ã¸åä¿¡ã¿ã¤ãã¼ãåæ¢ããã*/2040 /* ADVERTISE メッセージ受信タイマーを停止する。*/ 2123 2041 syscall(wai_sem(SEM_DHCP6_CLI_TIMER)); 2124 2042 ct->timers[DHCP6C_TIMER_RCV_ADV] = 0; 2125 2043 syscall(sig_sem(SEM_DHCP6_CLI_TIMER)); 2126 2044 2127 /* REQUEST ã¡ãã»ã¼ã¸ãéä¿¡ã㦠SELECT ç¶æ 2128 ã«é·ç§»ããã*/ 2045 /* REQUEST メッセージを送信して SELECT 状態に遷移する。*/ 2129 2046 start_select(ct); 2130 2047 return; 2131 2048 } 2132 2049 2133 /* åéä¿¡åæ°ã確èªããã*/2050 /* 再送信回数を確認する。*/ 2134 2051 if ((ct->MRC != 0) && (ct->txcount > ct->MRC)) { 2135 2052 ct->error = E_TMOUT; … … 2137 2054 } 2138 2055 2139 /* SOLICIT ã¡ãã»ã¼ã¸ãä½æããã*/2056 /* SOLICIT メッセージを作成する。*/ 2140 2057 if ((error = setup_solicit_msg(ct, NULL)) != E_OK) { 2141 2058 syslog(LOG_NOTICE, "[DHCP6C] error, setup solicit message: %s.", itron_strerror(error)); … … 2144 2061 } 2145 2062 2146 /* SOLICIT ã¡ãã»ã¼ã¸ãéä¿¡ããã*/2063 /* SOLICIT メッセージを送信する。*/ 2147 2064 error = UDP_SND_DAT(ct->cepid, &ct->dst, &ct->snd_msg->msg, ct->snd_msg->len, TMO_NBLK); 2148 2065 if (error != E_WBLK) { … … 2152 2069 } 2153 2070 2154 /* åéä¿¡ã¿ã¤ã ã¢ã¦ããè¨å®ããã*/2071 /* 再送信タイムアウトを設定する。*/ 2155 2072 syscall(wai_sem(SEM_DHCP6_CLI_TIMER)); 2156 2073 ct->timers[DHCP6C_TIMER_SND_SOL] = SYSTIM2TIMER(ct->RT); 2157 2074 syscall(sig_sem(SEM_DHCP6_CLI_TIMER)); 2158 2075 2159 /* åéä¿¡ã¿ã¤ã ã¢ã¦ããæ´æ°ããã*/2076 /* 再送信タイムアウトを更新する。*/ 2160 2077 advance_retrans(ct); 2161 2078 } 2162 2079 2163 2080 /* 2164 * request_ia_option -- REQUEST ã¡ãã»ã¼ã¸ã® IA_NA/IA_TA/IA_PD ãªãã·ã§ã³ã®å 2165 ±éé¨åã追å ããã 2081 * request_ia_option -- REQUEST メッセージの IA_NA/IA_TA/IA_PD オプションの共通部分を追加する。 2166 2082 */ 2167 2083 … … 2176 2092 src = (T_DHCP6_OPT_IA_NA_PD*)lease; 2177 2093 2178 /* ãªãã·ã§ã³ã³ã¼ããè¨å®ããã*/2094 /* オプションコードを設定する。*/ 2179 2095 HOST2MSG16(dst->code, code); 2180 2096 2181 /* IA_NAIA_TA/IA_PD ãªãã·ã§ã³ãé¤ãããªãã·ã§ã³é·ãè¨å®ããã*/2097 /* IA_NAIA_TA/IA_PD オプションを除いたオプション長を設定する。*/ 2182 2098 HOST2MSG16(dst->len, sizeof(*dst) - (sizeof(dst->code) + sizeof(dst->len))); 2183 2099 2184 /* ADVERTISE ã¡ãã»ã¼ã¸ãã IA ID ãã³ãã¼ããã*/2100 /* ADVERTISE メッセージから IA ID をコピーする。*/ 2185 2101 memcpy(&dst->iaid, &src->iaid, sizeof(src->iaid)); 2186 2102 … … 2191 2107 2192 2108 /* 2193 * request_ia_na_pd -- REQUEST ã¡ãã»ã¼ã¸ã® IA_NA/IA_PD ãªãã·ã§ã³ã追å ããã2109 * request_ia_na_pd -- REQUEST メッセージの IA_NA/IA_PD オプションを追加する。 2194 2110 */ 2195 2111 … … 2205 2121 uint_t ix, nsiaa; 2206 2122 2207 /* ADVERTISE ã¡ãã»ã¼ã¸ã«æå®ããããªãã·ã§ã³ããããã¨ã確èªããã*/2123 /* ADVERTISE メッセージに指定されたオプションがあることを確認する。*/ 2208 2124 if ((opt = find_msg_option(lease, opt_code, 0)) == NULL) 2209 2125 return msg; 2210 2126 2211 /* IA_NA/IA_TA/IA_PD ãªãã·ã§ã³ã®å 2212 ±éé¨åã追å ããã*/ 2127 /* IA_NA/IA_TA/IA_PD オプションの共通部分を追加する。*/ 2213 2128 dia = (T_DHCP6_OPT_IA_NA_PD*)msg; 2214 2129 sia = (T_DHCP6_OPT_IA_NA_PD*)opt; 2215 2130 msg = request_ia_option(ct, msg, opt_code, opt); 2216 2131 2217 /* T1 ãT2 ã決å®ããã*/2132 /* T1、T2 を決定する。*/ 2218 2133 switch (msg_type) { 2219 2134 case DHCP6_REQUEST: … … 2236 2151 } 2237 2152 2238 /* T1 ãT2 ãè¨å®ããã*/2153 /* T1、T2 を設定する。*/ 2239 2154 HOST2MSG32(dia->renew, t1); 2240 2155 HOST2MSG32(dia->rebind, t2); 2241 2156 msg += sizeof(dia->renew) + sizeof(dia->rebind); 2242 2157 2243 /* IAADDR ãªãã·ã§ã³ãè¨å®ããã*/2158 /* IAADDR オプションを設定する。*/ 2244 2159 nsiaa = ((MSG2HOST16(sia->len) & ~DHCP6C_IAA_FLAG_MASK) - (sizeof(*sia) - (sizeof(sia->code) + sizeof(sia->len)))) / sizeof(*siaa); 2245 2160 … … 2248 2163 siaa = (T_DHCP6_OPT_IAADDR*)((opt + sizeof(*sia)) + sizeof(*siaa) * ix); 2249 2164 2250 /* ã¢ãã¬ã¹ã®æå¹æéãåãã¦ããã°ã¹ãããããã*/2165 /* アドレスの有効期限が切れていればスキップする。*/ 2251 2166 if (MSG2HOST16(siaa->len) & DHCP6C_IAA_FLAG_EXPIRED) 2252 2167 continue; 2253 2168 2254 /* ã³ã¼ãã¨é·ããè¨å®ããã*/2169 /* コードと長さを設定する。*/ 2255 2170 memcpy(&diaa->code, &siaa->code, sizeof(siaa->code)); 2256 2171 HOST2MSG16(diaa->len, MSG2HOST16(siaa->len) & ~DHCP6C_IAA_FLAG_MASK); 2257 2172 msg += sizeof(dia->code) + sizeof(dia->len); 2258 2173 2259 /* IPv6 ã¢ãã¬ã¹ãã³ãã¼ããã*/2174 /* IPv6 アドレスをコピーする。*/ 2260 2175 memcpy(&diaa->addr, &siaa->addr, sizeof(siaa->addr)); 2261 2176 msg += sizeof(diaa->addr); 2262 2177 2263 /* T1 ãT2 ã決å®ããã*/2178 /* T1、T2 を決定する。*/ 2264 2179 switch (msg_type) { 2265 2180 case DHCP6_REQUEST: … … 2282 2197 } 2283 2198 2284 /* T1 ãT2 ãè¨å®ããã*/2199 /* T1、T2 を設定する。*/ 2285 2200 HOST2MSG32(diaa->prefer, t1); 2286 2201 HOST2MSG32(diaa->valid, t2); 2287 2202 msg += sizeof(diaa->prefer) + sizeof(diaa->valid); 2288 2203 2289 /* IAADDR ã«ä»å ãªãã·ã§ã³ã追å ãããå 2290 éããã*/ 2204 /* IAADDR に付加オプションを追加する【先送り】。*/ 2291 2205 } 2292 2206 … … 2299 2213 2300 2214 /* 2301 * request_ia_ta -- REQUEST ã¡ãã»ã¼ã¸ã® IA_TA ãªãã·ã§ã³ã追å ããã2215 * request_ia_ta -- REQUEST メッセージの IA_TA オプションを追加する。 2302 2216 */ 2303 2217 … … 2313 2227 uint_t ix, nsiaa; 2314 2228 2315 /* ADVERTISE ã¡ãã»ã¼ã¸ã« IA_TA ãªãã·ã§ã³ããããã¨ã確èªããã*/2229 /* ADVERTISE メッセージに IA_TA オプションがあることを確認する。*/ 2316 2230 if ((opt = find_msg_option(lease, DHCP6_OPT_IA_TA, 0)) == NULL) 2317 2231 return msg; 2318 2232 2319 /* IA_NA/IA_TA/IA_PD ãªãã·ã§ã³ã®å 2320 ±éé¨åã追å ããã*/ 2233 /* IA_NA/IA_TA/IA_PD オプションの共通部分を追加する。*/ 2321 2234 dia = (T_DHCP6_OPT_IA_TA*)msg; 2322 2235 sia = (T_DHCP6_OPT_IA_TA*)opt; 2323 2236 msg = request_ia_option(ct, msg, DHCP6_OPT_IA_TA, opt); 2324 2237 2325 /* IAADDR ãªãã·ã§ã³ãè¨å®ããã*/2238 /* IAADDR オプションを設定する。*/ 2326 2239 nsiaa = ((MSG2HOST16(sia->len) & ~DHCP6C_IAA_FLAG_MASK) - (sizeof(*sia) - (sizeof(sia->code) + sizeof(sia->len)))) / sizeof(*siaa); 2327 2240 … … 2330 2243 siaa = (T_DHCP6_OPT_IAADDR*)((opt + sizeof(*sia)) + sizeof(*siaa) * ix); 2331 2244 2332 /* ã¢ãã¬ã¹ã®æå¹æéãåãã¦ããã°ã¹ãããããã*/2245 /* アドレスの有効期限が切れていればスキップする。*/ 2333 2246 if (MSG2HOST16(siaa->len) & DHCP6C_IAA_FLAG_EXPIRED) 2334 2247 continue; 2335 2248 2336 /* ã³ã¼ãã¨é·ããè¨å®ããã*/2249 /* コードと長さを設定する。*/ 2337 2250 memcpy(diaa->code, siaa->code, sizeof(siaa->code)); 2338 2251 diaa->len = HOST2MSG16(MSG2HOST16(siaa->len) & ~DHCP6C_IAA_FLAG_MASK); 2339 2252 msg += sizeof(dia->code) + sizeof(dia->len); 2340 2253 2341 /* IPv6 ã¢ãã¬ã¹ãã³ãã¼ããã*/2254 /* IPv6 アドレスをコピーする。*/ 2342 2255 memcpy(diaa->addr, siaa->addr, sizeof(siaa->addr)); 2343 2256 msg += sizeof(diaa->addr); 2344 2257 2345 /* T1 ãT2 ã決å®ããã*/2258 /* T1、T2 を決定する。*/ 2346 2259 switch (msg_type) { 2347 2260 case DHCP6_REQUEST: … … 2364 2277 } 2365 2278 2366 /* T1 ãT2 ãè¨å®ããã*/2279 /* T1、T2 を設定する。*/ 2367 2280 HOST2MSG32(diaa->prefer, t1); 2368 2281 HOST2MSG32(diaa->valid, t2); 2369 2282 msg += sizeof(diaa->prefer) + sizeof(diaa->valid); 2370 2283 2371 /* IAADDR ã«ä»å ãªãã·ã§ã³ã追å ãããå 2372 éããã*/ 2284 /* IAADDR に付加オプションを追加する【先送り】。*/ 2373 2285 } 2374 2286 … … 2379 2291 2380 2292 /* 2381 * setup_request_msg -- REQUEST ã¡ãã»ã¼ã¸ãä½æããã2293 * setup_request_msg -- REQUEST メッセージを作成する。 2382 2294 */ 2383 2295 … … 2387 2299 uint8_t *msg; 2388 2300 2389 /* ã¡ãã»ã¼ã¸ã®ãããé¨åãä½æããã*/2301 /* メッセージのヘッダ部分を作成する。*/ 2390 2302 if ((msg = setup_msg_header(ct, type)) == NULL) 2391 2303 return E_PAR; … … 2396 2308 #if defined(DHCP6_CLI_CFG_IA_NA) 2397 2309 2398 /* IA_NA ã追å ããã*/2310 /* IA_NA を追加する。*/ 2399 2311 msg = request_ia_na_pd(ct, msg, type, DHCP6_OPT_IA_NA, lease); 2400 2312 #endif … … 2402 2314 #if defined(DHCP6_CLI_CFG_IA_TA) 2403 2315 2404 /* IA_TA ã追å ããã*/2316 /* IA_TA を追加する。*/ 2405 2317 msg = request_ia_ta(ct, msg, type, lease); 2406 2318 #endif … … 2408 2320 #if defined(DHCP6_CLI_CFG_IA_PD) 2409 2321 2410 /* IA_PD ã追å ããã*/2322 /* IA_PD を追加する。*/ 2411 2323 msg = request_ia_na_pd(ct, msg, type, DHCP6_OPT_IA_PD, lease); 2412 2324 #endif 2413 2325 2414 /* ã¡ãã»ã¼ã¸æ§é ä½é·ãè¨å®ããã*/2326 /* メッセージ構造体長を設定する。*/ 2415 2327 ct->snd_msg->len = msg - (uint8_t*)&ct->snd_msg->msg; 2416 2328 return E_OK; … … 2418 2330 2419 2331 /* 2420 * send_request_msg -- REQUEST ã¡ãã»ã¼ã¸ãéä¿¡ããã2332 * send_request_msg -- REQUEST メッセージを送信する。 2421 2333 */ 2422 2334 … … 2429 2341 ct->flags &= ~DHCP6C_FLAG_TMOUT_MASK; 2430 2342 2431 /* ADVERTISE ã¡ãã»ã¼ã¸ãåä¿¡ãã¦ããªããã°ã¨ã©ã¼*/2343 /* ADVERTISE メッセージを受信していなければエラー */ 2432 2344 if (ct->adv_msg == NULL) { 2433 2345 ct->error = E_OBJ; … … 2435 2347 } 2436 2348 2437 /* REPLY ã¡ãã»ã¼ã¸ã®é¸æãçµäºãã¦ããã°ãBOUND ç¶æ 2438 ã«é·ç§»ããã*/ 2349 /* REPLY メッセージの選択が終了していれば、BOUND 状態に遷移する。*/ 2439 2350 if (select_reply(ct)) { 2440 2351 2441 /* REPLY ã¡ãã»ã¼ã¸åä¿¡ã¿ã¤ãã¼ãåæ¢ããã*/2352 /* REPLY メッセージ受信タイマーを停止する。*/ 2442 2353 syscall(wai_sem(SEM_DHCP6_CLI_TIMER)); 2443 2354 ct->timers[DHCP6C_TIMER_RCV_REPLY] = 0; 2444 2355 syscall(sig_sem(SEM_DHCP6_CLI_TIMER)); 2445 2356 2446 /* ADVERTISE ã¡ãã»ã¼ã¸ãåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã«æ»ãã*/2357 /* ADVERTISE メッセージを受信メッセージ構造体リストに戻す。*/ 2447 2358 syscall(wai_sem(SEM_DHCP6_CLI_LOCK)); 2448 2359 ct->adv_msg->next = ct->rcv_lst; … … 2451 2362 syscall(sig_sem(SEM_DHCP6_CLI_LOCK)); 2452 2363 2453 /* BOUND ç¶æ 2454 ã«é·ç§»ããã*/ 2364 /* BOUND 状態に遷移する。*/ 2455 2365 start_bound(ct); 2456 2366 return; 2457 2367 } 2458 2368 2459 /* åéä¿¡åæ°ã確èªããã*/2369 /* 再送信回数を確認する。*/ 2460 2370 if ((ct->MRC != 0) && (ct->txcount > ct->MRC)) { 2461 2371 ct->error = E_TMOUT; … … 2463 2373 } 2464 2374 2465 /* REQUEST ã¡ãã»ã¼ã¸ãä½æããã*/2375 /* REQUEST メッセージを作成する。*/ 2466 2376 if ((error = setup_request_msg(ct, ct->adv_msg, DHCP6_REQUEST)) != E_OK) { 2467 2377 syslog(LOG_NOTICE, "[DHCP6C] error, setup request message: %s.", itron_strerror(error)); … … 2470 2380 } 2471 2381 2472 /* REQUEST ã¡ãã»ã¼ã¸ãéä¿¡ããã*/2382 /* REQUEST メッセージを送信する。*/ 2473 2383 error = UDP_SND_DAT(ct->cepid, &ct->dst, &ct->snd_msg->msg, ct->snd_msg->len, TMO_NBLK); 2474 2384 if (error != E_WBLK) { … … 2478 2388 } 2479 2389 2480 /* åéä¿¡ã¿ã¤ã ã¢ã¦ããè¨å®ããã*/2390 /* 再送信タイムアウトを設定する。*/ 2481 2391 syscall(wai_sem(SEM_DHCP6_CLI_TIMER)); 2482 2392 ct->timers[DHCP6C_TIMER_SND_REQ] = SYSTIM2TIMER(ct->RT); 2483 2393 syscall(sig_sem(SEM_DHCP6_CLI_TIMER)); 2484 2394 2485 /* åéä¿¡ã¿ã¤ã ã¢ã¦ããæ´æ°ããã*/2395 /* 再送信タイムアウトを更新する。*/ 2486 2396 advance_retrans(ct); 2487 2397 } 2488 2398 2489 2399 /* 2490 * send_refresh_msg -- REFRESH ã¡ãã»ã¼ã¸ãéä¿¡ããã2400 * send_refresh_msg -- REFRESH メッセージを送信する。 2491 2401 */ 2492 2402 … … 2498 2408 uint8_t *opt; 2499 2409 2500 /* æå¹ãªãªã¼ã¹æ 2501 å ±ããªããã°ã¨ã©ã¼ */ 2410 /* 有効なリース情報がなければエラー */ 2502 2411 ct->flags &= ~DHCP6C_FLAG_TMOUT_MASK; 2503 2412 if (ct->act_msg == NULL) 2504 2413 ct->error = E_OBJ; 2505 2414 2506 /* REFRESH ã¿ã¤ãã RENEW ã¾ã㯠REBIND ã§ãªããã°ã¨ã©ã¼*/2415 /* REFRESH タイプが RENEW または REBIND でなければエラー */ 2507 2416 if (!((ct->refresh_type == DHCP6_RENEW) || (ct->refresh_type == DHCP6_REBIND))) 2508 2417 ct->error = E_PAR; 2509 2418 2510 /* REPLY ã¡ãã»ã¼ã¸ã®é¸æãçµäºãã¦ããã°ãBOUND ç¶æ 2511 ã«é·ç§»ããã*/ 2419 /* REPLY メッセージの選択が終了していれば、BOUND 状態に遷移する。*/ 2512 2420 if (select_reply(ct)) { 2513 2421 2514 /* REPLY ã¡ãã»ã¼ã¸åä¿¡ã¿ã¤ãã¼ãåæ¢ããã*/2422 /* REPLY メッセージ受信タイマーを停止する。*/ 2515 2423 syscall(wai_sem(SEM_DHCP6_CLI_TIMER)); 2516 2424 ct->timers[DHCP6C_TIMER_RCV_REPLY] = 0; 2517 2425 syscall(sig_sem(SEM_DHCP6_CLI_TIMER)); 2518 2426 2519 /* ãªã¼ã¹æ 2520 å ±ã解æ¾ããã*/ 2427 /* リース情報を解放する。*/ 2521 2428 rel_lease(ct); 2522 2429 2523 /* BOUND ç¶æ 2524 ã«é·ç§»ããã*/ 2430 /* BOUND 状態に遷移する。*/ 2525 2431 start_bound(ct); 2526 2432 return; 2527 2433 } 2528 2434 2529 /* åéä¿¡åæ°ã確èªããã*/2435 /* 再送信回数を確認する。*/ 2530 2436 if ((ct->MRC != 0) && (ct->txcount > ct->MRC)) { 2531 2437 eval_expire(ct); … … 2534 2440 2535 2441 /* 2536 * ãµã¼ããã UNICAST ãªãã·ã§ã³ãåä¿¡ããã¨ã㯠2537 * æå®ããã¢ãã¬ã¹ãéä¿¡å 2538 ã¢ãã¬ã¹ã«è¨å®ããã 2442 * サーバから UNICAST オプションを受信したときは 2443 * 指定したアドレスを送信先アドレスに設定する。 2539 2444 */ 2540 2445 if ((opt = find_msg_option(ct->act_msg, DHCP6_OPT_UNICAST, sizeof(T_DHCP6_OPT_UNICAST))) != NULL) { … … 2543 2448 } 2544 2449 2545 /* REFRESH (REQUEST) ã¡ãã»ã¼ã¸ãä½æããã*/2450 /* REFRESH (REQUEST) メッセージを作成する。*/ 2546 2451 if ((error = setup_request_msg(ct, ct->act_msg, ct->refresh_type)) != E_OK) { 2547 2452 syslog(LOG_NOTICE, "[DHCP6C] error, setup refresh message: %s.", itron_strerror(error)); … … 2550 2455 } 2551 2456 2552 /* REFRESH ã¡ãã»ã¼ã¸ãéä¿¡ããã*/2457 /* REFRESH メッセージを送信する。*/ 2553 2458 error = UDP_SND_DAT(ct->cepid, &ct->dst, &ct->snd_msg->msg, ct->snd_msg->len, TMO_NBLK); 2554 2459 if (error != E_WBLK) { … … 2558 2463 } 2559 2464 2560 /* åéä¿¡ã¿ã¤ã ã¢ã¦ããè¨å®ããã*/2465 /* 再送信タイムアウトを設定する。*/ 2561 2466 syscall(wai_sem(SEM_DHCP6_CLI_TIMER)); 2562 2467 ct->timers[DHCP6C_TIMER_SND_REF] = SYSTIM2TIMER(ct->RT); 2563 2468 syscall(sig_sem(SEM_DHCP6_CLI_TIMER)); 2564 2469 2565 /* åéä¿¡ã¿ã¤ã ã¢ã¦ããæ´æ°ããã*/2470 /* 再送信タイムアウトを更新する。*/ 2566 2471 advance_retrans(ct); 2567 2472 } 2568 2473 2569 2474 /* 2570 * setup_release_msg -- RELEASE ã¡ãã»ã¼ã¸ãä½æããã2475 * setup_release_msg -- RELEASE メッセージを作成する。 2571 2476 */ 2572 2477 … … 2576 2481 uint8_t *msg; 2577 2482 2578 /* ã¡ãã»ã¼ã¸ã®ãããé¨åãä½æããã*/2483 /* メッセージのヘッダ部分を作成する。*/ 2579 2484 if ((msg = setup_msg_header(ct, type)) == NULL) 2580 2485 return E_PAR; … … 2585 2490 #if defined(DHCP6_CLI_CFG_IA_NA) 2586 2491 2587 /* IA_NA ã追å ããã*/2492 /* IA_NA を追加する。*/ 2588 2493 msg = request_ia_na_pd(ct, msg, type, DHCP6_OPT_IA_NA, lease); 2589 2494 #endif … … 2591 2496 #if defined(DHCP6_CLI_CFG_IA_PD) 2592 2497 2593 /* IA_PD ã追å ããã*/2498 /* IA_PD を追加する。*/ 2594 2499 msg = request_ia_na_pd(ct, msg, type, DHCP6_OPT_IA_PD, lease); 2595 2500 #endif 2596 2501 2597 /* ã¡ãã»ã¼ã¸æ§é ä½é·ãè¨å®ããã*/2502 /* メッセージ構造体長を設定する。*/ 2598 2503 ct->snd_msg->len = msg - (uint8_t*)&ct->snd_msg->msg; 2599 2504 return E_OK; … … 2601 2506 2602 2507 /* 2603 * send_release_msg -- RELEASE ã¡ãã»ã¼ã¸ãéä¿¡ããã2508 * send_release_msg -- RELEASE メッセージを送信する。 2604 2509 */ 2605 2510 … … 2609 2514 ER error; 2610 2515 2611 /* æå¹ãª REPLY ã¡ãã»ã¼ã¸ãåä¿¡ãã¦ããªããã°ã¨ã©ã¼*/2516 /* 有効な REPLY メッセージを受信していなければエラー */ 2612 2517 ct->flags &= ~DHCP6C_FLAG_TMOUT_MASK; 2613 2518 if (ct->act_msg == NULL) 2614 2519 ct->error = E_OBJ; 2615 2520 2616 /* æå¹ãª REPLY ã¡ãã»ã¼ã¸ãåä¿¡ãã¦ããã°ãSLEEP ç¶æ 2617 ã«é·ç§»ããã*/ 2521 /* 有効な REPLY メッセージを受信していれば、SLEEP 状態に遷移する。*/ 2618 2522 syscall(wai_sem(SEM_DHCP6_CLI_LOCK)); 2619 2523 if (ct->prf_lst != NULL) { 2620 2524 2621 /* åéä¿¡ã¿ã¤ãã¼ãåæ¢ããã*/2525 /* 再送信タイマーを停止する。*/ 2622 2526 syscall(wai_sem(SEM_DHCP6_CLI_TIMER)); 2623 2527 ct->timers[DHCP6C_TIMER_RCV_REPLY] = 0; 2624 2528 syscall(sig_sem(SEM_DHCP6_CLI_TIMER)); 2625 2529 2626 /* æå¹ãªãªã¼ã¹ã»ã¡ãã»ã¼ã¸æ§é ä½ã解æ¾ããã*/2530 /* 有効なリース・メッセージ構造体を解放する。*/ 2627 2531 if (ct->act_msg != NULL) { 2628 2532 syscall(rel_mpf(MPF_DHCP6_CLI_MSG, (void*)ct->act_msg)); … … 2630 2534 } 2631 2535 2632 /* SLEEP ç¶æ 2633 ã«é·ç§»ããã*/ 2536 /* SLEEP 状態に遷移する。*/ 2634 2537 ct->fsm = DHCP6_FSM_SLEEP; 2635 2538 syscall(sig_sem(SEM_DHCP6_CLI_LOCK)); … … 2638 2541 syscall(sig_sem(SEM_DHCP6_CLI_LOCK)); 2639 2542 2640 /* åéä¿¡åæ°ã確èªããã*/2543 /* 再送信回数を確認する。*/ 2641 2544 if ((ct->MRC != 0) && (ct->txcount > ct->MRC)) { 2642 2545 ct->error = E_TMOUT; … … 2644 2547 } 2645 2548 2646 /* RELEASE ã¡ãã»ã¼ã¸ãä½æããã*/2549 /* RELEASE メッセージを作成する。*/ 2647 2550 if ((error = setup_release_msg(ct, ct->act_msg, DHCP6_RELEASE)) != E_OK) { 2648 2551 syslog(LOG_NOTICE, "[DHCP6C] error, setup release message: %s.", itron_strerror(error)); … … 2651 2554 } 2652 2555 2653 /* RELEASE ã¡ãã»ã¼ã¸ãéä¿¡ããã*/2556 /* RELEASE メッセージを送信する。*/ 2654 2557 error = UDP_SND_DAT(ct->cepid, &ct->dst, &ct->snd_msg->msg, ct->snd_msg->len, TMO_NBLK); 2655 2558 if (error != E_WBLK) { … … 2659 2562 } 2660 2563 2661 /* åéä¿¡ã¿ã¤ã ã¢ã¦ããè¨å®ããã*/2564 /* 再送信タイムアウトを設定する。*/ 2662 2565 syscall(wai_sem(SEM_DHCP6_CLI_TIMER)); 2663 2566 ct->timers[DHCP6C_TIMER_SND_REL] = SYSTIM2TIMER(ct->RT); 2664 2567 syscall(sig_sem(SEM_DHCP6_CLI_TIMER)); 2665 2568 2666 /* åéä¿¡ã¿ã¤ã ã¢ã¦ããæ´æ°ããã*/2569 /* 再送信タイムアウトを更新する。*/ 2667 2570 advance_retrans(ct); 2668 2571 } 2669 2572 2670 2573 /* 2671 * advertise_msg_timeout -- ADVERTISE ã¡ãã»ã¼ã¸ã®ã¿ã¤ã ã¢ã¦ãå¦ç2574 * advertise_msg_timeout -- ADVERTISE メッセージのタイムアウト処理 2672 2575 */ 2673 2576 … … 2675 2578 advertise_msg_timeout (T_DHCP6_CLI_CONTEXT *ct) 2676 2579 { 2677 /* SOLICIT ã¡ãã»ã¼ã¸éä¿¡ã¿ã¤ãã¼ãåæ¢ããã*/2580 /* SOLICIT メッセージ送信タイマーを停止する。*/ 2678 2581 ct->flags &= ~DHCP6C_FLAG_TMOUT_MASK; 2679 2582 syscall(wai_sem(SEM_DHCP6_CLI_TIMER)); … … 2683 2586 if (select_adv(ct)) { 2684 2587 /* 2685 * ADVERTISE ã¡ãã»ã¼ã¸ã®é¸æãçµäºãã¦ããã°ã 2686 * REQUEST ã¡ãã»ã¼ã¸ãéä¿¡ã㦠SELECT ç¶æ 2687 ã«é·ç§»ããã 2588 * ADVERTISE メッセージの選択が終了していれば、 2589 * REQUEST メッセージを送信して SELECT 状態に遷移する。 2688 2590 */ 2689 2591 start_select(ct); … … 2694 2596 2695 2597 /* 2696 * renew_timeout -- RENEW ã¿ã¤ã ã¢ã¦ãå¦ç2598 * renew_timeout -- RENEW タイムアウト処理 2697 2599 */ 2698 2600 … … 2700 2602 renew_timeout (T_DHCP6_CLI_CONTEXT *ct) 2701 2603 { 2702 /* RENEW ç¶æ 2703 ã«é·ç§»ããã*/ 2604 /* RENEW 状態に遷移する。*/ 2704 2605 ct->flags &= ~DHCP6C_FLAG_TMOUT_MASK; 2705 2606 start_renew(ct); … … 2707 2608 2708 2609 /* 2709 * rebind_timeout -- REBIND ã¿ã¤ã ã¢ã¦ãå¦ç2610 * rebind_timeout -- REBIND タイムアウト処理 2710 2611 */ 2711 2612 … … 2713 2614 rebind_timeout (T_DHCP6_CLI_CONTEXT *ct) 2714 2615 { 2715 /* REBIND ç¶æ 2716 ã«é·ç§»ããã*/ 2616 /* REBIND 状態に遷移する。*/ 2717 2617 ct->flags &= ~DHCP6C_FLAG_TMOUT_MASK; 2718 2618 start_rebind(ct); … … 2720 2620 2721 2621 /* 2722 * depref_timeout -- DEPREF ã¿ã¤ã ã¢ã¦ãå¦ç2622 * depref_timeout -- DEPREF タイムアウト処理 2723 2623 */ 2724 2624 … … 2733 2633 uint_t aoff, asize; 2734 2634 2735 /* æå¹ãªãªã¼ã¹ãç¡ããã°å¦ççµäº*/2635 /* 有効なリースが無ければ処理終了 */ 2736 2636 ct->flags &= ~DHCP6C_FLAG_TMOUT_MASK; 2737 2637 if (ct->act_msg == NULL) { … … 2744 2644 while (msg < last) { 2745 2645 2746 /* IA_NA/IA_PD ãªãã·ã§ã³ã§ããã°ãæ¨å¥¨æå¹æéã確èªããã*/2646 /* IA_NA/IA_PD オプションであれば、推奨有効時間を確認する。*/ 2747 2647 opt = (T_DHCP6_OPTION*)msg; 2748 2648 if (MSG2HOST16(opt->code) == DHCP6_OPT_IA_NA || MSG2HOST16(opt->code) == DHCP6_OPT_IA_PD) { … … 2753 2653 aoff += (MSG2HOST16(iaa->len) & ~DHCP6C_IAA_FLAG_MASK) + sizeof(*iaa)) { 2754 2654 2755 /* ãã§ã«æ¨å¥¨æå¹æéãçµéãã¦ããã°å¦çããªãã*/2655 /* すでに推奨有効時間を経過していれば処理しない。*/ 2756 2656 iaa = (T_DHCP6_OPT_IAADDR*)((uint8_t*)opt + aoff); 2757 2657 if ((MSG2HOST16(iaa->len) & DHCP6C_IAA_FLAG_DEPREFERD)) 2758 2658 continue; 2759 2659 2760 /* æ¨å¥¨æå¹æéçµéãã¦ããã° FLAG ãè¨å®ããã*/2660 /* 推奨有効時間経過していれば FLAG を設定する。*/ 2761 2661 if (TIMEC_GE(time, ct->act_msg->rcv_time + MSG2HOST32(iaa->prefer))) { 2762 2662 HOST2MSG16(iaa->len, MSG2HOST16(iaa->len) | DHCP6C_IAA_FLAG_DEPREFERD); … … 2766 2666 syslog(LOG_NOTICE, "[DHCP6C] prefix depreferd: %s.", ipv62str(NULL, &iaa->addr)); 2767 2667 2768 /*ãDNS ã®å¦çãå¿ 2769 è¦ã*/ 2668 /*【DNS の処理が必要】*/ 2770 2669 } 2771 2670 } … … 2778 2677 2779 2678 /* 2780 * expire_timeout -- EXPIRE ã¿ã¤ã ã¢ã¦ãå¦ç2679 * expire_timeout -- EXPIRE タイムアウト処理 2781 2680 */ 2782 2681 … … 2791 2690 uint_t aoff, asize, addrs = 0; 2792 2691 2793 /* æå¹ãªãªã¼ã¹ãç¡ããã°å¦ççµäº*/2692 /* 有効なリースが無ければ処理終了 */ 2794 2693 ct->flags &= ~DHCP6C_FLAG_TMOUT_MASK; 2795 2694 if (ct->act_msg == NULL) { … … 2802 2701 while (msg < last) { 2803 2702 2804 /* IA_NA/IA_PD ãªãã·ã§ã³ã§ããã°ãæå¹æéã確èªããã*/2703 /* IA_NA/IA_PD オプションであれば、有効時間を確認する。*/ 2805 2704 opt = (T_DHCP6_OPTION*)msg; 2806 2705 if (MSG2HOST16(opt->code) == DHCP6_OPT_IA_NA || MSG2HOST16(opt->code) == DHCP6_OPT_IA_PD) { … … 2811 2710 aoff += (MSG2HOST16(iaa->len) & ~DHCP6C_IAA_FLAG_MASK) + sizeof(*iaa)) { 2812 2711 2813 /* ãã§ã«æå¹æéãçµéãã¦ããã°å¦çããªãã*/2712 /* すでに有効時間を経過していれば処理しない。*/ 2814 2713 iaa = (T_DHCP6_OPT_IAADDR*)((uint8_t*)opt + aoff); 2815 2714 if ((MSG2HOST16(iaa->len) & DHCP6C_IAA_FLAG_EXPIRED)) 2816 2715 continue; 2817 2716 2818 /* æå¹æéçµéãã¦ããã° FLAG ãè¨å®ããã*/2717 /* 有効時間経過していれば FLAG を設定する。*/ 2819 2718 if (TIMEC_GE(time, ct->act_msg->rcv_time + MSG2HOST32(iaa->valid))) { 2820 2719 HOST2MSG16(iaa->len, MSG2HOST16(iaa->len) | DHCP6C_IAA_FLAG_EXPIRED); … … 2824 2723 syslog(LOG_NOTICE, "[DHCP6C] prefix expired: %s.", ipv62str(NULL, &iaa->addr)); 2825 2724 2826 /*ãDNS ã®å¦çãå¿ 2827 è¦ã*/ 2725 /*【DNS の処理が必要】*/ 2828 2726 continue; 2829 2727 } … … 2834 2732 } 2835 2733 2836 /* æå¹ãªã¢ãã¬ã¹ãå 2837 ¨ã¦ç¡ããªã£ãæ㯠INIT ç¶æ 2838 ã«é·ç§»ããã*/ 2734 /* 有効なアドレスが全て無くなった時は INIT 状態に遷移する。*/ 2839 2735 if (addrs == 0) { 2840 2736 2841 /* ACTIVE ãªã¼ã¹ãåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã«æ»ãã*/2737 /* ACTIVE リースを受信メッセージ構造体リストに戻す。*/ 2842 2738 syslog(LOG_NOTICE, "[DHCP6C] all address expired."); 2843 2739 syscall(wai_sem(SEM_DHCP6_CLI_LOCK)); … … 2847 2743 syscall(sig_sem(SEM_DHCP6_CLI_LOCK)); 2848 2744 2849 /* å 2850 ¨ã¦ã® TIMER ããã£ã³ã»ã«ããã*/ 2745 /* 全ての TIMER をキャンセルする。*/ 2851 2746 cancel_all_timers(ct); 2852 2747 2853 /* INIT ç¶æ 2854 ã«é·ç§»ããã*/ 2748 /* INIT 状態に遷移する。*/ 2855 2749 start_init(ct); 2856 2750 return; … … 2863 2757 2864 2758 /* 2865 * reply_msg_timeout -- REPLY ã¡ãã»ã¼ã¸ã®ã¿ã¤ã ã¢ã¦ãå¦ç2759 * reply_msg_timeout -- REPLY メッセージのタイムアウト処理 2866 2760 */ 2867 2761 … … 2869 2763 reply_msg_timeout (T_DHCP6_CLI_CONTEXT *ct) 2870 2764 { 2871 /* SOLICIT ã¡ãã»ã¼ã¸éä¿¡ã¿ã¤ãã¼ãåæ¢ããã*/2765 /* SOLICIT メッセージ送信タイマーを停止する。*/ 2872 2766 ct->flags &= ~DHCP6C_FLAG_TMOUT_MASK; 2873 2767 syscall(wai_sem(SEM_DHCP6_CLI_TIMER)); … … 2878 2772 #if DHCP6_CLI_CFG_MODE == DHCP6_CLI_CFG_STATELESS || DHCP6_CLI_CFG_MODE == DHCP6_CLI_CFG_RA 2879 2773 2880 /* STATELES ã¢ã¼ãã§ã¯SLEEP ã«é·ç§»ããã*/2774 /* STATELES モードではSLEEP に遷移する。*/ 2881 2775 ct->error = E_TMOUT; 2882 2776 ct->fsm = DHCP6_FSM_SLEEP; … … 2886 2780 #if DHCP6_CLI_CFG_MODE == DHCP6_CLI_CFG_STATEFULL || DHCP6_CLI_CFG_MODE == DHCP6_CLI_CFG_RA 2887 2781 2888 /* RENEW ã¡ãã»ã¼ã¸ã®é¸æãçµäºãã¦ããã°ãBOUND ç¶æ 2889 ã«é·ç§»ããã*/ 2782 /* RENEW メッセージの選択が終了していれば、BOUND 状態に遷移する。*/ 2890 2783 if (select_reply(ct)) { 2891 2784 2892 /* ãªã¼ã¹æ 2893 å ±ã解æ¾ããã*/ 2785 /* リース情報を解放する。*/ 2894 2786 rel_lease(ct); 2895 2787 2896 /* BOUND ç¶æ 2897 ã«é·ç§»ããã*/ 2788 /* BOUND 状態に遷移する。*/ 2898 2789 start_bound(ct); 2899 2790 } … … 2901 2792 eval_expire(ct); 2902 2793 else { 2903 /* SLEEP ã«é·ç§»ããã*/2794 /* SLEEP に遷移する。*/ 2904 2795 ct->error = E_TMOUT; 2905 2796 ct->fsm = DHCP6_FSM_SLEEP; … … 2910 2801 2911 2802 /* 2912 * dispatch_timeout -- ã¿ã¤ã ã¢ã¦ãããæã®å¦ç2803 * dispatch_timeout -- タイムアウトした時の処理 2913 2804 */ 2914 2805 … … 2980 2871 2981 2872 /* 2982 * dispatch_event -- ã¤ãã³ãæ¯ã®å¦ç2873 * dispatch_event -- イベント毎の処理 2983 2874 */ 2984 2875 … … 2990 2881 while (ct->fsm != DHCP6_FSM_SLEEP && error == E_OK) { 2991 2882 2992 /* ã¡ãã»ã¼ã¸ã®éåä¿¡ã¨ã¿ã¤ã ã¢ã¦ããå¾ 2993 ã¤ã*/ 2883 /* メッセージの送受信とタイムアウトを待つ。*/ 2994 2884 syscall(wai_sem(SEM_DHCP6_CLI_READY)); 2995 2885 … … 3012 2902 3013 2903 /* 3014 * init_context -- DHCPv6 ã¯ã©ã¤ã¢ã³ãã³ã³ããã¹ãæ§é ä½ãåæåããã2904 * init_context -- DHCPv6 クライアントコンテキスト構造体を初期化する。 3015 2905 */ 3016 2906 … … 3025 2915 3026 2916 /* 3027 * rel_cli_msg -- ã¡ãã»ã¼ã¸æ§é ä½ã解æ¾ããã2917 * rel_cli_msg -- メッセージ構造体を解放する。 3028 2918 */ 3029 2919 … … 3060 2950 #if DHCP6_CLI_CFG_MODE == DHCP6_CLI_CFG_STATELESS 3061 2951 3062 /* ã¹ãã¼ãã¬ã¹ã®æã¯æå¹ãªãªã¼ã¹ã»ã¡ãã»ã¼ã¸æ§é ä½ã解æ¾ããã*/2952 /* ステートレスの時は有効なリース・メッセージ構造体も解放する。*/ 3063 2953 if (ct->act_msg != NULL) { 3064 2954 syscall(rel_mpf(MPF_DHCP6_CLI_MSG, (void*)ct->act_msg)); … … 3072 2962 3073 2963 /* 3074 * init_cli_msg -- åã¡ãã»ã¼ã¸æ§é ä½ãåæåããã2964 * init_cli_msg -- 各メッセージ構造体を初期化する。 3075 2965 */ 3076 2966 … … 3082 2972 int count; 3083 2973 3084 /* éä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãç²å¾ããã*/2974 /* 送信メッセージ構造体を獲得する。*/ 3085 2975 if ((error = tget_mpf(MPF_DHCP6_CLI_MSG, (void*)&ct->snd_msg, TMO_DHCP6C_MPF_GET)) != E_OK) { 3086 2976 syslog(LOG_NOTICE, "[DHCP6C] error, tget_mpf() for send: %s.", itron_strerror(error)); … … 3089 2979 3090 2980 /* 3091 * æå¹ãªãªã¼ã¹ã»ã¡ãã»ã¼ã¸æ§é ä½ãããå ´åã¯ã3092 * ç²å¾ããåä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãªã¹ãã®æ§é ä½ã 1æ¸ããã2981 * 有効なリース・メッセージ構造体がある場合は、 2982 * 獲得する受信メッセージ構造体リストの構造体を 1減らす。 3093 2983 */ 3094 2984 if (ct->act_msg == NULL) … … 3097 2987 count = NUM_DHCP6_CLI_MSG_LIST - 1; 3098 2988 3099 /* åä¿¡ã¡ãã»ã¼ã¸æ§é ä½ãç²å¾ããã*/2989 /* 受信メッセージ構造体を獲得する。*/ 3100 2990 syscall(wai_sem(SEM_DHCP6_CLI_LOCK)); 3101 2991 while (count --> 0) { … … 3113 3003 3114 3004 /* 3115 * dhcp6c_renew_info -- ãããã¯ã¼ã¯æ 3116 å ±ãååå¾ããã 3005 * dhcp6c_renew_info -- ネットワーク情報を再取得する。 3117 3006 */ 3118 3007 … … 3125 3014 if (context.fsm == DHCP6_FSM_INFORMED) { 3126 3015 3127 /* REL_INFO ç¶æ 3128 ã«é·ç§»ããå¾ã« SLEEP ã解é¤ããããã«è¨å®ããã*/ 3016 /* REL_INFO 状態に遷移した後に SLEEP を解除するように設定する。*/ 3129 3017 context.flags |= DHCP6C_FLAG_RENEW; 3130 3018 start_rel_info(&context); … … 3133 3021 else if (context.fsm == DHCP6_FSM_SLEEP) { 3134 3022 3135 /* SLEEP ã解é¤ããã*/3023 /* SLEEP を解除する。*/ 3136 3024 wup_tsk(DHCP6_CLI_TASK); 3137 3025 return E_OK; … … 3144 3032 if (context.fsm == DHCP6_FSM_BOUND) { 3145 3033 3146 /* RENEW ç¶æ 3147 ã«é·ç§»ããã*/ 3034 /* RENEW 状態に遷移する。*/ 3148 3035 start_renew(&context); 3149 3036 return E_OK; … … 3151 3038 else if (context.fsm == DHCP6_FSM_SLEEP) { 3152 3039 3153 /* SLEEP ã解é¤ããã*/3040 /* SLEEP を解除する。*/ 3154 3041 wup_tsk(DHCP6_CLI_TASK); 3155 3042 return E_OK; … … 3165 3052 3166 3053 /* 3167 * dhcp6c_rel_info -- DHCP ã§è¨å®ããããããã¯ã¼ã¯æ 3168 å ±ã解æ¾ããã 3054 * dhcp6c_rel_info -- DHCP で設定されたネットワーク情報を解放する。 3169 3055 */ 3170 3056 … … 3172 3058 dhcp6c_rel_info (void) 3173 3059 { 3174 /* REL_INFO ç¶æ 3175 ã«é·ç§»ããã*/ 3060 /* REL_INFO 状態に遷移する。*/ 3176 3061 start_rel_info(&context); 3177 3062 return E_OK; … … 3179 3064 3180 3065 /* 3181 * dhcp6c_get_info -- DHCP ã§è¨å®ããããããã¯ã¼ã¯æ 3182 å ±ãè¿ãã 3066 * dhcp6c_get_info -- DHCP で設定されたネットワーク情報を返す。 3183 3067 */ 3184 3068 … … 3209 3093 3210 3094 /* 3211 * ã³ã¼ã«ããã¯é¢æ°3095 * コールバック関数 3212 3096 */ 3213 3097 … … 3220 3104 len = *(ER_UINT*)p_parblk; 3221 3105 if (len < 0 && len != E_RLWAI) { 3222 /* E_RLWAI 以å¤ã§ã0 以ä¸ã®å ´åã¯ãã¨ã©ã¼ã³ã¼ã*/3106 /* E_RLWAI 以外で、0 以下の場合は、エラーコード */ 3223 3107 syslog(LOG_NOTICE, "[DHCP6C(CBR)] error: %s, fncd: %s.", itron_strerror(len), in_strtfn(fncd)); 3224 3108 } … … 3226 3110 if (fncd == TEV_UDP_RCV_DAT) { 3227 3111 3228 /* åä¿¡ã¡ãã»ã¼ã¸ãªã¹ãã空ã®æã¯ãåä¿¡ããªãã§ãã¼ã¿ã°ã©ã ãæ¨ã¦ãã*/3112 /* 受信メッセージリストが空の時は、受信しないでデータグラムを捨てる。*/ 3229 3113 if (context.rcv_lst == NULL) 3230 3114 syslog(LOG_NOTICE, "[DHCP6C(CBR)] receive buffer all busy."); 3231 3115 else { 3232 /* ã¡ãã»ã¼ã¸ãåä¿¡ããã¡ãã»ã¼ã¸æ§é ä½ãæºåããã*/3116 /* メッセージを受信するメッセージ構造体を準備する。*/ 3233 3117 syscall(wai_sem(SEM_DHCP6_CLI_LOCK)); 3234 3118 msg = context.rcv_lst; … … 3236 3120 syscall(sig_sem(SEM_DHCP6_CLI_LOCK)); 3237 3121 3238 /* ã¡ãã»ã¼ã¸ãåä¿¡ããã*/3122 /* メッセージを受信する。*/ 3239 3123 len = UDP_RCV_DAT(context.cepid, &msg->srv, &msg->msg, sizeof(msg->msg), TMO_POL); 3240 3124 … … 3242 3126 msg->len = len; 3243 3127 if (len >= 0) { 3244 /* åä¿¡ããã¡ãã»ã¼ã¸ãæ¤è¨¼ã¡ãã»ã¼ã¸ãªã¹ãã«ç§»ãã*/3128 /* 受信したメッセージを検証メッセージリストに移す。*/ 3245 3129 msg->next = context.val_lst; 3246 3130 context.val_lst = msg; … … 3248 3132 } 3249 3133 else { 3250 /* ã¡ãã»ã¼ã¸æ§é ä½ãåä¿¡ã¡ãã»ã¼ã¸ãªã¹ãã«æ»ãã*/3134 /* メッセージ構造体を受信メッセージリストに戻す。*/ 3251 3135 context.error = len; 3252 3136 msg->next = context.rcv_lst; … … 3261 3145 } 3262 3146 /* 3263 * dhcp6_cli_task -- DHCPv6 ã¯ã©ã¤ã¢ã³ãã¿ã¹ã¯3147 * dhcp6_cli_task -- DHCPv6 クライアントタスク 3264 3148 */ 3265 3149 … … 3284 3168 ct = &context; 3285 3169 3286 /* DHCP ã¯ã©ã¤ã¢ã³ãã³ã³ããã¹ãæ§é ä½ãåæåããã*/3170 /* DHCP クライアントコンテキスト構造体を初期化する。*/ 3287 3171 init_context(ct, (ID)exinf); 3288 3172 3289 3173 while (true) { 3290 3174 3291 /* 1 ç§æ¯ã«ã¿ã¤ã ã¢ã¦ãããããã«ã¿ã¤ãã¼ãè¨å®ããã*/3175 /* 1秒毎にタイムアウトするようにタイマーを設定する。*/ 3292 3176 timeout((callout_func)dhcpc_timer, ct, NET_TIMER_HZ / DHCP6C_TIMER_HZ); 3293 3177 3294 /* ã¯ã©ã¤ã¢ã³ã DUID ãè¨å®ããã*/3178 /* クライアント DUID を設定する。*/ 3295 3179 init_duid(ct); 3296 3180 3297 /* ã¡ãã»ã¼ã¸æ§é ä½ãåæåããã*/3181 /* メッセージ構造体を初期化する。*/ 3298 3182 if ((error = init_cli_msg(ct)) == E_OK) { 3299 3183 … … 3305 3189 #endif 3306 3190 3307 /* ã¡ã¤ã³ã«ã¼ã*/3191 /* メインループ */ 3308 3192 error = dispatch_event(ct); 3309 3193 } 3310 3194 3311 /* å 3312 ¨ã¦ã® TIMER ããã£ã³ã»ã«ããã*/ 3195 /* 全ての TIMER をキャンセルする。*/ 3313 3196 cancel_all_timers(ct); 3314 3197 3315 /* ã¿ã¤ãã¼ãåæ¢ããã*/3198 /* タイマーを停止する。*/ 3316 3199 untimeout((callout_func)dhcpc_timer, ct); 3317 3200 3318 /* ã¡ãã»ã¼ã¸æ§é ä½ã解æ¾ããã*/3201 /* メッセージ構造体を解放する。*/ 3319 3202 rel_cli_msg(ct); 3320 3203 3321 /* ãªã¼ã¹ã解æ¾å¾ãååå¾ãæå®ããã¦ããªããã°ä¼æ¢ããã*/3204 /* リースを解放後、再取得が指定されていなければ休止する。*/ 3322 3205 if (!(ct->flags & DHCP6C_FLAG_RENEW)) { 3323 3206 3324 /* ä¼æ¢ããã*/3207 /* 休止する。*/ 3325 3208 if (error == E_OK) 3326 3209 syslog(LOG_NOTICE, "[DHCP6C] lease released, go to sleep.");
Note:
See TracChangeset
for help on using the changeset viewer.