Changeset 389 for azure_iot_hub/trunk/asp3_dcre/tinet/netinet/if_ether.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/netinet/if_ether.c
- Property svn:keywords deleted
-
Property svn:mime-type
changed from
text/x-csrc
totext/x-csrc;charset=UTF-8
r388 r389 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * 7 * ä¸è¨èä½æ¨©è 8 ã¯ï¼ä»¥ä¸ã® (1)ï½(4) ã®æ¡ä»¶ãï¼Free Software Foundation 9 * ã«ãã£ã¦å 10 ¬è¡¨ããã¦ãã GNU General Public License ã® Version 2 ã«è¨ 11 * è¿°ããã¦ããæ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§ã¢ï¼æ¬ã½ããã¦ã§ã¢ 12 * ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹å¤ã»åé 13 å¸ï¼ä»¥ä¸ï¼ 14 * å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼ 15 * (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½ 16 * 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼ 17 * ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼ 18 * (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 19 * ç¨ã§ããå½¢ã§åé 20 å¸ããå ´åã«ã¯ï¼åé 21 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨ 22 * è 23 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ 24 * ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 25 * (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 26 * ç¨ã§ããªãå½¢ã§åé 27 å¸ããå ´åã«ã¯ï¼æ¬¡ã®æ¡ä»¶ãæºãããã¨ï¼ 28 * (a) åé 29 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è 30 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è 31 * ä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 32 * (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ 33 * 害ãããï¼ä¸è¨èä½æ¨©è 34 ããã³TOPPERSããã¸ã§ã¯ããå 35 責ãããã¨ï¼ 36 * 37 * æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 38 ã 39 * ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ãã®é©ç¨å¯è½æ§ã 40 * å«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´ 41 * æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ãã®è²¬ä»»ãè² ããªãï¼ 7 * 上記著作権者は,以下の (1)~(4) の条件か,Free Software Foundation 8 * によって公表されている GNU General Public License の Version 2 に記 9 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア 10 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, 11 * 利用と呼ぶ)することを無償で許諾する. 12 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 13 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 14 * スコード中に含まれていること. 15 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 16 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 17 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 18 * の無保証規定を掲載すること. 19 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 20 * 用できない形で再配布する場合には,次の条件を満たすこと. 21 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 22 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 23 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 24 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 25 * 26 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 27 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も 28 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 29 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. 42 30 * 43 31 * @(#) $Id$ … … 122 110 123 111 /* 124 * ARP ãã£ãã·ã¥ã¨ã³ããª112 * ARP キャッシュエントリ 125 113 */ 126 114 … … 128 116 129 117 /* 130 * é¢æ°118 * 関数 131 119 */ 132 120 … … 135 123 136 124 /* 137 * in_arpinput -- TCP/IP ç¨ ARP ã®å 138 ¥åé¢æ° 125 * in_arpinput -- TCP/IP 用 ARP の入力関数 139 126 */ 140 127 … … 152 139 et_arph = GET_ETHER_ARP_HDR(input); 153 140 154 ntoahl(saddr, et_arph->sproto); /* éä¿¡å 155 IP ã¢ãã¬ã¹ */ 156 ntoahl(taddr, et_arph->tproto); /* 解決対象 IP ã¢ãã¬ã¹ */ 157 158 /* 159 * 以ä¸ã®å ´åã¯ã¨ã©ã¼ 160 * ã»éä¿¡ãã¹ãã®ç©çã¢ãã¬ã¹ãèªå 161 * ã»éä¿¡ãã¹ãã®ç©çã¢ãã¬ã¹ãããã¼ããã£ã¹ã 141 ntoahl(saddr, et_arph->sproto); /* 送信元 IP アドレス */ 142 ntoahl(taddr, et_arph->tproto); /* 解決対象 IP アドレス */ 143 144 /* 145 * 以下の場合はエラー 146 * ・送信ホストの物理アドレスが自分 147 * ・送信ホストの物理アドレスがブロードキャスト 162 148 */ 163 149 if (memcmp(et_arph->shost, ifaddr->lladdr, ETHER_ADDR_LEN) == 0 || … … 166 152 167 153 /* 168 * éä¿¡ãã¹ãã® IP ã¢ãã¬ã¹ãèªåã®å ´åã¯ãéè¤ãã¦ããã®ã§169 * ç¸æã«ãç¥ãããã170 * ãã ããèªåã¨ç¸æã®ã¢ãã¬ã¹ãæªå®ç¾©ï¼IPV4_ADDRANYï¼ã®æã¯ä½ãããªãã154 * 送信ホストの IP アドレスが自分の場合は、重複しているので 155 * 相手にも知らせる。 156 * ただし、自分と相手のアドレスが未定義(IPV4_ADDRANY)の時は何もしない。 171 157 */ 172 158 if ((saddr == ifp->in4_ifaddr.addr) && (saddr != IPV4_ADDRANY)) { … … 197 183 198 184 /* 199 * 以ä¸ã®å ´åã¯ä½ãããªãã 200 * ã»è§£æ±ºå¯¾è±¡ IP ã¢ãã¬ã¹ãèªåã§ã¯ãªãã注: å 201 ã® FreeBSD ã® 202 * å®è£ 203 ã§ã¯ãARP PROXY çã®ãããèªå以å¤ã® IP ã¢ãã¬ã¹ã® 204 * 解決ãè¡ã£ã¦ããããæ¬å®è£ 205 ã§ã¯ãèªå以å¤ã® IP 206 * ã¢ãã¬ã¹ã®è§£æ±ºã¯è¡ããªãã 185 * 以下の場合は何もしない。 186 * ・解決対象 IP アドレスが自分ではない、注: 元の FreeBSD の 187 * 実装では、ARP PROXY 等のため、自分以外の IP アドレスの 188 * 解決も行っているが、本実装では、自分以外の IP 189 * アドレスの解決は行わない。 207 190 */ 208 191 if (taddr != ifp->in4_ifaddr.addr) … … 210 193 211 194 /* 212 * éä¿¡å 213 IP ã¢ãã¬ã¹ã ARP ãã£ãã·ã¥ã«ããã調ã¹ãã 214 * ãã£ãã·ã¥ã«ãªããã°ãæ°ãã«ã¨ã³ããªãç»é²ããã 195 * 送信元 IP アドレスが ARP キャッシュにあるか調べる。 196 * キャッシュになければ、新たにエントリを登録する。 215 197 */ 216 198 syscall(wai_sem(SEM_ARP_CACHE_LOCK)); … … 221 203 222 204 /* 223 * éä¿¡ããã³ãã³ã°ããã¦ãããã¬ã¼ã ãããã°éä¿¡ããã205 * 送信がペンデングされているフレームがあれば送信する。 224 206 */ 225 207 if (ent->hold) { 226 208 227 /* ãã¬ã¼ã ã® Ethernet ããããè¨å®ããã*/209 /* フレームの Ethernet ヘッダを設定する。*/ 228 210 memcpy(GET_ETHER_HDR(ent->hold)->dhost, ent->mac_addr, ETHER_ADDR_LEN); 229 211 … … 232 214 syscall(sig_sem(SEM_ARP_CACHE_LOCK)); 233 215 234 /* ãã³ãã£ã³ã°ããã¦ãããã¬ã¼ã ãéä¿¡ããã*/216 /* ペンディングされているフレームを送信する。*/ 235 217 IF_RAW_OUTPUT(pending, TMO_FEVR); 236 218 … … 243 225 arph = GET_ARP_HDR(input); 244 226 245 /* ã¢ãã¬ã¹è§£æ±ºè¦æ±ã§ãªããã°çµäº*/227 /* アドレス解決要求でなければ終了 */ 246 228 if (ntohs(arph->opcode) != ARPOP_REQUEST) 247 229 goto buf_rel; 248 230 249 /* Ethernet ARP ããããè¨å®ããã*/231 /* Ethernet ARP ヘッダを設定する。*/ 250 232 memcpy(et_arph->thost, et_arph->shost, ETHER_ADDR_LEN); 251 233 memcpy(et_arph->shost, ifaddr->lladdr, ETHER_ADDR_LEN); … … 253 235 ahtonl(et_arph->sproto, taddr); 254 236 255 /* Ethernet ARP ããããè¨å®ããã*/237 /* Ethernet ARP ヘッダを設定する。*/ 256 238 arph->opcode = htons(ARPOP_REPLY); 257 239 258 /* Ethernet ããããè¨å®ããã*/240 /* Ethernet ヘッダを設定する。*/ 259 241 eth = GET_ETHER_HDR(input); 260 242 memcpy(eth->dhost, eth->shost, ETHER_ADDR_LEN); 261 243 memcpy(eth->shost, ifaddr->lladdr, ETHER_ADDR_LEN); 262 244 263 /* ARP å¿çãéä¿¡ããã*/245 /* ARP 応答を送信する。*/ 264 246 IF_RAW_OUTPUT(input, TMO_FEVR); 265 247 return; … … 272 254 273 255 /* 274 * arp_timer -- ARP ãã£ãã·ã¥ã®æ´æ°256 * arp_timer -- ARP キャッシュの更新 275 257 */ 276 258 … … 286 268 arp_cache[ix].expire -= ARP_TIMER_TMO; 287 269 if (arp_cache[ix].expire == 0) { 288 /* éä¿¡ããã³ãã³ã°ããã¦ãããã¬ã¼ã ãããã°æ¨ã¦ãã*/270 /* 送信がペンデングされているフレームがあれば捨てる。*/ 289 271 if (arp_cache[ix].hold) { 290 272 NET_COUNT_IP4(net_count_ip4[NC_IP4_OUT_ERR_PACKETS], 1); … … 301 283 302 284 /* 303 * arp_lookup -- ARP ãã£ãã·ã¥ã®æ¢ç´¢ã¨ç»é² 304 * 305 * 注æ: SEM_ARP_CACHE_LOCK ãç²å¾ããç¶æ 306 ã§å¼åºãã㨠285 * arp_lookup -- ARP キャッシュの探索と登録 286 * 287 * 注意: SEM_ARP_CACHE_LOCK を獲得した状態で呼出すこと 307 288 */ 308 289 … … 318 299 } 319 300 320 /* create ãçãªããæ°ããªã¨ã³ããªãç»é²ããã*/301 /* create が真なら、新たなエントリを登録する。*/ 321 302 if (create) { 322 303 323 /* ã¾ãã空ããããã°ããã®ç©ºããå©ç¨ããã*/304 /* まず、空きがあれば、その空きを利用する。*/ 324 305 for (ix = NUM_ARP_ENTRY; ix -- > 0; ) { 325 306 if (arp_cache[ix].expire == 0) { … … 330 311 331 312 /* 332 * 空ãããªããã°ãã¿ã¤ã ã¢ã¦ãã¾ã§æéãæçã®333 * ã¨ã³ããªã¼ãç ´æ£ãã¦å©ç¨ããã313 * 空きがなければ、タイムアウトまで時間が最短の 314 * エントリーを破棄して利用する。 334 315 */ 335 316 syslog(LOG_NOTICE, "[ARP] cache busy, size=%d", NUM_ARP_ENTRY); … … 349 330 350 331 /* 351 * arp_request -- MAC ã¢ãã¬ã¹è§£æ±ºè¦æ±332 * arp_request -- MAC アドレス解決要求 352 333 */ 353 334 … … 367 348 if ((error = tget_net_buf(&arp_req, IF_ARP_ETHER_HDR_SIZE, TMO_ARP_GET_NET_BUF)) == E_OK) { 368 349 369 /* ã¤ã¼ãµãããããããè¨å®ããã*/350 /* イーサネットヘッダを設定する。*/ 370 351 eth = GET_ETHER_HDR(arp_req); 371 352 memcpy(eth->dhost, ether_broad_cast_addr, ETHER_ADDR_LEN); … … 373 354 eth->type = htons(ETHER_TYPE_ARP); 374 355 375 /* ARP ããããè¨å®ããã*/356 /* ARP ヘッダを設定する。*/ 376 357 arph = GET_ARP_HDR(arp_req); 377 358 arph->hrd_addr = htons(ARPHRD_ETHER); … … 381 362 arph->opcode = htons(ARPOP_REQUEST); 382 363 383 /* ã¤ã¼ãµããã ARP ããããè¨å®ããã*/364 /* イーサネット ARP ヘッダを設定する。*/ 384 365 et_arph = GET_ETHER_ARP_HDR(arp_req); 385 366 src = IF_GET_IFNET()->in4_ifaddr.addr; … … 389 370 ahtonl(et_arph->tproto, dst); 390 371 391 /* éä¿¡ããã*/372 /* 送信する。*/ 392 373 error = IF_RAW_OUTPUT(arp_req, TMO_ARP_OUTPUT); 393 374 } … … 398 379 399 380 /* 400 * arp_get_cache -- ARP ãã£ãã·ã¥ãç²å¾ããã381 * arp_get_cache -- ARP キャッシュを獲得する。 401 382 */ 402 383 … … 408 389 409 390 /* 410 * arp_input -- ARP ã®å 411 ¥åé¢æ° 391 * arp_input -- ARP の入力関数 412 392 */ 413 393 … … 420 400 NET_COUNT_ARP(net_count_arp.in_packets, 1); 421 401 422 /* ARP ãããã®é·ãããã§ãã¯ããã*/402 /* ARP ヘッダの長さをチェックする。*/ 423 403 if (input->len < IF_ARP_HDR_SIZE) 424 404 goto buf_rel; … … 427 407 428 408 /* 429 * ç©çã¢ãã¬ã¹ãã©ã¼ãããã Ehternet 以å¤430 * ã¾ãã¯ããããã³ã«ã IP 以å¤ã¯ã¨ã©ã¼ã409 * 物理アドレスフォーマットが Ehternet 以外 410 * または、プロトコルが IP 以外はエラー。 431 411 */ 432 412 if (ntohs(arph->hrd_addr) != ARPHRD_ETHER || … … 434 414 goto buf_rel; 435 415 436 /* ARP ããã + Ether ARP ãããã®é·ãããã§ãã¯ããã*/416 /* ARP ヘッダ + Ether ARP ヘッダの長さをチェックする。*/ 437 417 if (input->len < IF_ARP_ETHER_HDR_SIZE) 438 418 goto buf_rel; … … 447 427 448 428 /* 449 * arp_resolve -- MAC ã¢ãã¬ã¹è§£æ±º450 * 451 * ã¢ãã¬ã¹è§£æ±ºãã§ããã°ãæ»ãå¤ã¯ true ãè¿ããã§ããªããã°452 * éä¿¡ããã³ãã£ã³ã°ãã¦ãæ»ãå¤ã¯ false ãè¿ãã429 * arp_resolve -- MAC アドレス解決 430 * 431 * アドレス解決ができれば、戻り値は true を返し、できなければ 432 * 送信をペンディングして、戻り値は false を返す。 453 433 */ 454 434 … … 463 443 464 444 /* 465 * 次ã®å ´åã¯ãã¤ã¼ãµãããã®ããã¼ããã£ã¹ãã¢ãã¬ã¹ãè¿ãã445 * 次の場合は、イーサネットのブロードキャストアドレスを返す。 466 446 * 467 * ã»å 468 ¨ãããã 1 469 * ã»ãã¹ãé¨ã®å 470 ¨ãããã 1 ã§ããããã¯ã¼ã¯é¨ããã¼ã«ã«ã¢ãã¬ã¹ 447 * ・全ビットが 1 448 * ・ホスト部の全ビットが 1 で、ネットワーク部がローカルアドレス 471 449 */ 472 450 if (gw == IPV4_ADDR_BROADCAST || … … 476 454 } 477 455 478 /* éä¿¡å 479 GW ã® IP ã¢ãã¬ã¹ã ARP ãã£ãã·ã¥ã«ããã調ã¹ãã*/ 456 /* 送信先 GW の IP アドレスが ARP キャッシュにあるか調べる。*/ 480 457 syscall(wai_sem(SEM_ARP_CACHE_LOCK)); 481 458 ent = arp_lookup(gw, true); … … 486 463 } 487 464 else { 488 /* éä¿¡ããã³ãã³ã°ããã¦ãããã¬ã¼ã ãããã°æ¨ã¦ãã*/465 /* 送信がペンデングされているフレームがあれば捨てる。*/ 489 466 if (ent->hold) { 490 467 NET_COUNT_IP4(net_count_ip4[NC_IP4_OUT_ERR_PACKETS], 1); … … 493 470 494 471 /* 495 * éä¿¡ããã³ãã£ã³ã°ããã496 * IF ã§ãããã¯ã¼ã¯ãããã¡ãéæ¾ããªããã©ã°ãè¨å®ããã¦ããã¨ãã¯ã497 * éä¿¡ããã³ãã£ã³ã°ããªãã472 * 送信をペンディングする。 473 * IF でネットワークバッファを開放しないフラグが設定されているときは、 474 * 送信をペンディングしない。 498 475 */ 499 476 if ((output->flags & NB_FLG_NOREL_IFOUT) == 0) … … 505 482 syscall(sig_sem(SEM_ARP_CACHE_LOCK)); 506 483 507 /* ã¢ãã¬ã¹è§£æ±ºè¦æ±ãéä¿¡ããã*/484 /* アドレス解決要求を送信する。*/ 508 485 arp_request(ifaddr, gw); 509 486 return false; … … 512 489 513 490 /* 514 * arp_init -- ARP åæå491 * arp_init -- ARP 初期化 515 492 */ 516 493 … … 523 500 #ifdef ETHER_CFG_MULTICAST 524 501 /* 525 * ether_map_ipv4_multicast -- IPv4 ãã«ããã£ã¹ãã¢ãã¬ã¹ããã¤ã¼ãµãããã»ãã«ããã£ã¹ãã¢ãã¬ã¹ã¸ã®å¤æ502 * ether_map_ipv4_multicast -- IPv4 マルチキャストアドレスからイーサネット・マルチキャストアドレスへの変換 526 503 */ 527 504
Note:
See TracChangeset
for help on using the changeset viewer.