Changeset 321 for EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/if_ether.c
- Timestamp:
- Aug 23, 2017, 9:27:43 AM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/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
r270 r321 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$ … … 121 109 122 110 /* 123 * ARP ãã£ãã·ã¥ã¨ã³ããª111 * ARP キャッシュエントリ 124 112 */ 125 113 … … 127 115 128 116 /* 129 * é¢æ°117 * 関数 130 118 */ 131 119 … … 135 123 136 124 /* 137 * arp_lookup -- ARP ãã£ãã·ã¥ã®æ¢ç´¢ã¨ç»é² 138 * 139 * 注æ: SEM_ARP_CACHE_LOCK ãç²å¾ããç¶æ 140 ã§å¼åºãã㨠125 * arp_lookup -- ARP キャッシュの探索と登録 126 * 127 * 注意: SEM_ARP_CACHE_LOCK を獲得した状態で呼出すこと 141 128 */ 142 129 … … 152 139 } 153 140 154 /* create ãçãªããæ°ããªã¨ã³ããªãç»é²ããã*/141 /* create が真なら、新たなエントリを登録する。*/ 155 142 if (create) { 156 143 157 /* ã¾ãã空ããããã°ããã®ç©ºããå©ç¨ããã*/144 /* まず、空きがあれば、その空きを利用する。*/ 158 145 for (ix = NUM_ARP_ENTRY; ix -- > 0; ) { 159 146 if (arp_cache[ix].expire == 0) { … … 164 151 165 152 /* 166 * 空ãããªããã°ãã¿ã¤ã ã¢ã¦ãã¾ã§æéãæçã®167 * ã¨ã³ããªã¼ãç ´æ£ãã¦å©ç¨ããã153 * 空きがなければ、タイムアウトまで時間が最短の 154 * エントリーを破棄して利用する。 168 155 */ 169 156 syslog(LOG_NOTICE, "[ARP] cache busy, size=%d", NUM_ARP_ENTRY); … … 183 170 184 171 /* 185 * in_arpinput -- TCP/IP ç¨ ARP ã®å 186 ¥åé¢æ° 172 * in_arpinput -- TCP/IP 用 ARP の入力関数 187 173 */ 188 174 … … 200 186 et_arph = GET_ETHER_ARP_HDR(input); 201 187 202 ntoahl(saddr, et_arph->sproto); /* éä¿¡å 203 IP ã¢ãã¬ã¹ */ 204 ntoahl(taddr, et_arph->tproto); /* 解決対象 IP ã¢ãã¬ã¹ */ 205 206 /* 207 * 以ä¸ã®å ´åã¯ã¨ã©ã¼ 208 * ã»éä¿¡ãã¹ãã®ç©çã¢ãã¬ã¹ãèªå 209 * ã»éä¿¡ãã¹ãã®ç©çã¢ãã¬ã¹ãããã¼ããã£ã¹ã 188 ntoahl(saddr, et_arph->sproto); /* 送信元 IP アドレス */ 189 ntoahl(taddr, et_arph->tproto); /* 解決対象 IP アドレス */ 190 191 /* 192 * 以下の場合はエラー 193 * ・送信ホストの物理アドレスが自分 194 * ・送信ホストの物理アドレスがブロードキャスト 210 195 */ 211 196 if (memcmp(et_arph->shost, ifaddr->lladdr, ETHER_ADDR_LEN) == 0 || … … 214 199 215 200 /* 216 * éä¿¡ãã¹ãã® IP ã¢ãã¬ã¹ãèªåã®å ´åã¯ãéè¤ãã¦ããã®ã§217 * ç¸æã«ãç¥ãããã201 * 送信ホストの IP アドレスが自分の場合は、重複しているので 202 * 相手にも知らせる。 218 203 */ 219 204 if (saddr == ifp->in_ifaddr.addr) { … … 240 225 241 226 /* 242 * 以ä¸ã®å ´åã¯ä½ãããªãã 243 * ã»è§£æ±ºå¯¾è±¡ IP ã¢ãã¬ã¹ãèªåã§ã¯ãªãã注: å 244 ã® FreeBSD ã® 245 * å®è£ 246 ã§ã¯ãARP PROXY çã®ãããèªå以å¤ã® IP ã¢ãã¬ã¹ã® 247 * 解決ãè¡ã£ã¦ããããæ¬å®è£ 248 ã§ã¯ãèªå以å¤ã® IP 249 * ã¢ãã¬ã¹ã®è§£æ±ºã¯è¡ããªãã 227 * 以下の場合は何もしない。 228 * ・解決対象 IP アドレスが自分ではない、注: 元の FreeBSD の 229 * 実装では、ARP PROXY 等のため、自分以外の IP アドレスの 230 * 解決も行っているが、本実装では、自分以外の IP 231 * アドレスの解決は行わない。 250 232 */ 251 233 if (taddr != ifp->in_ifaddr.addr) … … 253 235 254 236 /* 255 * éä¿¡å 256 IP ã¢ãã¬ã¹ã ARP ãã£ãã·ã¥ã«ããã調ã¹ãã 257 * ãã£ãã·ã¥ã«ãªããã°ãæ°ãã«ã¨ã³ããªãç»é²ããã 237 * 送信元 IP アドレスが ARP キャッシュにあるか調べる。 238 * キャッシュになければ、新たにエントリを登録する。 258 239 */ 259 240 syscall(wai_sem(SEM_ARP_CACHE_LOCK)); … … 264 245 265 246 /* 266 * éä¿¡ããã³ãã³ã°ããã¦ãããã¬ã¼ã ãããã°éä¿¡ããã247 * 送信がペンデングされているフレームがあれば送信する。 267 248 */ 268 249 if (ent->hold) { 269 250 270 /* ãã¬ã¼ã ã® Ethernet ããããè¨å®ããã*/251 /* フレームの Ethernet ヘッダを設定する。*/ 271 252 memcpy(GET_ETHER_HDR(ent->hold)->dhost, ent->mac_addr, ETHER_ADDR_LEN); 272 253 … … 275 256 syscall(sig_sem(SEM_ARP_CACHE_LOCK)); 276 257 277 /* ãã³ãã£ã³ã°ããã¦ãããã¬ã¼ã ãéä¿¡ããã*/258 /* ペンディングされているフレームを送信する。*/ 278 259 IF_RAW_OUTPUT(pending, TMO_FEVR); 279 260 … … 286 267 arph = GET_ARP_HDR(input); 287 268 288 /* ã¢ãã¬ã¹è§£æ±ºè¦æ±ã§ãªããã°çµäº*/269 /* アドレス解決要求でなければ終了 */ 289 270 if (ntohs(arph->opcode) != ARPOP_REQUEST) 290 271 goto buf_rel; 291 272 292 /* Ethernet ARP ããããè¨å®ããã*/273 /* Ethernet ARP ヘッダを設定する。*/ 293 274 memcpy(et_arph->thost, et_arph->shost, ETHER_ADDR_LEN); 294 275 memcpy(et_arph->shost, ifaddr->lladdr, ETHER_ADDR_LEN); … … 296 277 ahtonl(et_arph->sproto, taddr); 297 278 298 /* Ethernet ARP ããããè¨å®ããã*/279 /* Ethernet ARP ヘッダを設定する。*/ 299 280 arph->opcode = htons(ARPOP_REPLY); 300 281 301 /* Ethernet ããããè¨å®ããã*/282 /* Ethernet ヘッダを設定する。*/ 302 283 eth = GET_ETHER_HDR(input); 303 284 memcpy(eth->dhost, eth->shost, ETHER_ADDR_LEN); 304 285 memcpy(eth->shost, ifaddr->lladdr, ETHER_ADDR_LEN); 305 286 306 /* ARP å¿çãéä¿¡ããã*/287 /* ARP 応答を送信する。*/ 307 288 IF_RAW_OUTPUT(input, TMO_FEVR); 308 289 return; … … 315 296 316 297 /* 317 * arp_timer -- ARP ãã£ãã·ã¥ã®æ´æ°298 * arp_timer -- ARP キャッシュの更新 318 299 */ 319 300 … … 329 310 arp_cache[ix].expire -= ARP_TIMER_TMO; 330 311 if (arp_cache[ix].expire == 0) { 331 /* éä¿¡ããã³ãã³ã°ããã¦ãããã¬ã¼ã ãããã°æ¨ã¦ãã*/312 /* 送信がペンデングされているフレームがあれば捨てる。*/ 332 313 if (arp_cache[ix].hold) { 333 314 NET_COUNT_IP4(net_count_ip4[NC_IP4_OUT_ERR_PACKETS], 1); … … 344 325 345 326 /* 346 * arp_request -- MAC ã¢ãã¬ã¹è§£æ±ºè¦æ±327 * arp_request -- MAC アドレス解決要求 347 328 */ 348 329 … … 362 343 if ((error = tget_net_buf(&arp_req, IF_ARP_ETHER_HDR_SIZE, TMO_ARP_GET_NET_BUF)) == E_OK) { 363 344 364 /* ã¤ã¼ãµãããããããè¨å®ããã*/345 /* イーサネットヘッダを設定する。*/ 365 346 eth = GET_ETHER_HDR(arp_req); 366 347 memcpy(eth->dhost, ether_broad_cast_addr, ETHER_ADDR_LEN); … … 368 349 eth->type = htons(ETHER_TYPE_ARP); 369 350 370 /* ARP ããããè¨å®ããã*/351 /* ARP ヘッダを設定する。*/ 371 352 arph = GET_ARP_HDR(arp_req); 372 353 arph->hrd_addr = htons(ARPHRD_ETHER); … … 376 357 arph->opcode = htons(ARPOP_REQUEST); 377 358 378 /* ã¤ã¼ãµããã ARP ããããè¨å®ããã*/359 /* イーサネット ARP ヘッダを設定する。*/ 379 360 et_arph = GET_ETHER_ARP_HDR(arp_req); 380 361 src = IF_GET_IFNET()->in_ifaddr.addr; … … 384 365 ahtonl(et_arph->tproto, dst); 385 366 386 /* éä¿¡ããã*/367 /* 送信する。*/ 387 368 error = IF_RAW_OUTPUT(arp_req, TMO_ARP_OUTPUT); 388 369 } … … 393 374 394 375 /* 395 * arp_get_cache -- ARP ãã£ãã·ã¥ãç²å¾ããã376 * arp_get_cache -- ARP キャッシュを獲得する。 396 377 */ 397 378 … … 403 384 404 385 /* 405 * arp_input -- ARP ã®å 406 ¥åé¢æ° 386 * arp_input -- ARP の入力関数 407 387 */ 408 388 … … 415 395 NET_COUNT_ARP(net_count_arp.in_packets, 1); 416 396 417 /* ARP ãããã®é·ãããã§ãã¯ããã*/397 /* ARP ヘッダの長さをチェックする。*/ 418 398 if (input->len < IF_ARP_HDR_SIZE) 419 399 goto buf_rel; … … 422 402 423 403 /* 424 * ç©çã¢ãã¬ã¹ãã©ã¼ãããã Ehternet 以å¤425 * ã¾ãã¯ããããã³ã«ã IP 以å¤ã¯ã¨ã©ã¼ã404 * 物理アドレスフォーマットが Ehternet 以外 405 * または、プロトコルが IP 以外はエラー。 426 406 */ 427 407 if (ntohs(arph->hrd_addr) != ARPHRD_ETHER || … … 429 409 goto buf_rel; 430 410 431 /* ARP ããã + Ether ARP ãããã®é·ãããã§ãã¯ããã*/411 /* ARP ヘッダ + Ether ARP ヘッダの長さをチェックする。*/ 432 412 if (input->len < IF_ARP_ETHER_HDR_SIZE) 433 413 goto buf_rel; … … 442 422 443 423 /* 444 * arp_resolve -- MAC ã¢ãã¬ã¹è§£æ±º445 * 446 * ã¢ãã¬ã¹è§£æ±ºãã§ããã°ãæ»ãå¤ã¯ true ãè¿ããã§ããªããã°447 * éä¿¡ããã³ãã£ã³ã°ãã¦ãæ»ãå¤ã¯ false ãè¿ãã424 * arp_resolve -- MAC アドレス解決 425 * 426 * アドレス解決ができれば、戻り値は true を返し、できなければ 427 * 送信をペンディングして、戻り値は false を返す。 448 428 */ 449 429 … … 458 438 459 439 /* 460 * 次ã®å ´åã¯ãã¤ã¼ãµãããã®ããã¼ããã£ã¹ãã¢ãã¬ã¹ãè¿ãã440 * 次の場合は、イーサネットのブロードキャストアドレスを返す。 461 441 * 462 * ã»å 463 ¨ãããã 1 464 * ã»ãã¹ãé¨ã®å 465 ¨ãããã 1 ã§ããããã¯ã¼ã¯é¨ããã¼ã«ã«ã¢ãã¬ã¹ 442 * ・全ビットが 1 443 * ・ホスト部の全ビットが 1 で、ネットワーク部がローカルアドレス 466 444 */ 467 445 if (gw == IPV4_ADDR_BROADCAST || … … 471 449 } 472 450 473 /* éä¿¡å 474 GW ã® IP ã¢ãã¬ã¹ã ARP ãã£ãã·ã¥ã«ããã調ã¹ãã*/ 451 /* 送信先 GW の IP アドレスが ARP キャッシュにあるか調べる。*/ 475 452 syscall(wai_sem(SEM_ARP_CACHE_LOCK)); 476 453 ent = arp_lookup(gw, true); … … 481 458 } 482 459 else { 483 /* éä¿¡ããã³ãã³ã°ããã¦ãããã¬ã¼ã ãããã°æ¨ã¦ãã*/460 /* 送信がペンデングされているフレームがあれば捨てる。*/ 484 461 if (ent->hold) { 485 462 NET_COUNT_IP4(net_count_ip4[NC_IP4_OUT_ERR_PACKETS], 1); … … 488 465 489 466 /* 490 * éä¿¡ããã³ãã£ã³ã°ããã491 * IF ã§ãããã¯ã¼ã¯ãããã¡ãéæ¾ããªããã©ã°ãè¨å®ããã¦ããã¨ãã¯ã492 * éä¿¡ããã³ãã£ã³ã°ããªãã467 * 送信をペンディングする。 468 * IF でネットワークバッファを開放しないフラグが設定されているときは、 469 * 送信をペンディングしない。 493 470 */ 494 471 if ((output->flags & NB_FLG_NOREL_IFOUT) == 0) … … 500 477 syscall(sig_sem(SEM_ARP_CACHE_LOCK)); 501 478 502 /* ã¢ãã¬ã¹è§£æ±ºè¦æ±ãéä¿¡ããã*/479 /* アドレス解決要求を送信する。*/ 503 480 arp_request(ifaddr, gw); 504 481 return false; … … 507 484 508 485 /* 509 * arp_init -- ARP åæå486 * arp_init -- ARP 初期化 510 487 */ 511 488 … … 518 495 #ifdef ETHER_CFG_MULTICAST 519 496 /* 520 * ether_map_ipv4_multicast -- IPv4 ãã«ããã£ã¹ãã¢ãã¬ã¹ããã¤ã¼ãµãããã»ãã«ããã£ã¹ãã¢ãã¬ã¹ã¸ã®å¤æ497 * ether_map_ipv4_multicast -- IPv4 マルチキャストアドレスからイーサネット・マルチキャストアドレスへの変換 521 498 */ 522 499
Note:
See TracChangeset
for help on using the changeset viewer.