Changeset 331 for EcnlProtoTool/trunk/asp3_dcre/tinet/net/ethernet.c
- Timestamp:
- Jan 21, 2018, 12:10:09 AM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/asp3_dcre/tinet/net/ethernet.c
r321 r331 2 2 * TINET (TCP/IP Protocol Stack) 3 3 * 4 * Copyright (C) 2001-20 09by Dep. of Computer Science and Engineering4 * Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering 5 5 * Tomakomai National College of Technology, JAPAN 6 6 * … … 63 63 #include <net/if_arp.h> 64 64 #include <net/net.h> 65 #include <net/net_endian.h> 65 66 #include <net/net_var.h> 66 67 #include <net/net_buf.h> … … 71 72 #include <netinet/in_var.h> 72 73 #include <netinet/if_ether.h> 74 73 75 #include <netinet6/if6_ether.h> 74 76 #include <netinet6/nd6.h> 75 77 76 78 #include <net/if_var.h> 77 #include <net/if6_var.h>78 79 79 80 #ifdef SUPPORT_ETHER … … 83 84 */ 84 85 85 #if defined( SUPPORT_INET4)86 #if defined(_IP4_CFG) 86 87 87 88 const uint8_t ether_broad_cast_addr[ETHER_ADDR_LEN] = { … … 90 91 }; 91 92 92 #endif /* of #if defined( SUPPORT_INET4) */93 #endif /* of #if defined(_IP4_CFG) */ 93 94 94 95 /* … … 98 99 /* ネットワークインタフェース構造体 */ 99 100 100 #if defined(SUPPORT_INET4) 101 102 static T_IFNET ether_ifnet = { 103 NULL, /* ネットワークインタフェースのソフトウェア情報 */ 104 { 105 IPV4_ADDR_LOCAL, /* IPv4 アドレス */ 106 IPV4_ADDR_LOCAL_MASK, /* サブネットマスク */ 107 }, 108 }; 109 110 #endif /* of #if defined(SUPPORT_INET4) */ 111 112 #if defined(SUPPORT_INET6) 113 114 static T_IFNET ether_ifnet = { 115 NULL, /* ネットワークインタフェースのソフトウェア情報 */ 116 {0}, /* IPv6 アドレス情報 */ 117 {0}, /* マルチキャスト IPv6 アドレス */ 118 0, /* フラグ */ 119 }; 120 121 #endif /* of #if defined(SUPPORT_INET6) */ 101 static T_IFNET ether_ifnet; 122 102 123 103 #ifdef SUPPORT_MIB 124 104 125 /* 126 * SNMP の 管理情報ベース (MIB) 127 */ 105 /* SNMP の 管理情報ベース (MIB) */ 128 106 129 107 T_IF_STATS if_stats; … … 158 136 159 137 /* 138 * ether_srand -- 乱数を初期値を返す。 139 */ 140 141 uint32_t 142 ether_srand (void) 143 { 144 T_IF_SOFTC *ic; 145 uint32_t rval; 146 147 ic = IF_ETHER_NIC_GET_SOFTC(); 148 rval = (ic->ifaddr.lladdr[2] << 24) 149 + (ic->ifaddr.lladdr[3] << 16) 150 + (ic->ifaddr.lladdr[4] << 8) 151 + (ic->ifaddr.lladdr[5] ); 152 153 #ifdef ETHER_CFG_COLLECT_ADDR 154 155 rval += (ether_collect_addr.lladdr[2] << 24) 156 + (ether_collect_addr.lladdr[3] << 16) 157 + (ether_collect_addr.lladdr[4] << 8) 158 + (ether_collect_addr.lladdr[5] ); 159 160 #endif /* of #ifdef ETHER_CFG_COLLECT_ADDR */ 161 162 return rval; 163 } 164 165 /* 160 166 * ether_get_ifnet -- ネットワークインタフェース構造体を返す。 161 167 */ … … 167 173 } 168 174 169 #if defined( SUPPORT_INET6)175 #if defined(_IP6_CFG) 170 176 171 177 /* … … 174 180 175 181 ER 176 ether_in6_resolve_multicast (T_ETHER_ADDR *ifaddr, T_IN6_ADDR *maddr)182 ether_in6_resolve_multicast (T_ETHER_ADDR *ifaddr, const T_IN6_ADDR *maddr) 177 183 { 178 184 /* マルチキャストアドレスかチェックする。*/ … … 186 192 } 187 193 188 #endif /* of #if defined( SUPPORT_INET6) */194 #endif /* of #if defined(_IP6_CFG) */ 189 195 190 196 /** … … 203 209 } 204 210 #endif /* LWIP_ARP */ 211 212 #if LWIP_IGMP 213 /* resend IGMP memberships */ 214 if (ether->_flags & IF_FLAG_IGMP) { 215 igmp_report_groups(ether); 216 } 217 #endif /* LWIP_IGMP */ 205 218 } 206 219 if (ether->link_callback) { … … 262 275 263 276 ER 264 ether_output (T_NET_BUF *output, void *dst, T_IF_ADDR *gw, TMO tmout)277 ether_output (T_NET_BUF *output, const void *dst, T_IF_ADDR *gw, TMO tmout) 265 278 { 266 279 T_IF_SOFTC *ic; … … 275 288 switch(ntohs(eth->type)) { 276 289 277 #if defined( SUPPORT_INET4)290 #if defined(_IP4_CFG) 278 291 279 292 case ETHER_TYPE_IP: /* IPv4 */ … … 292 305 break; 293 306 294 #endif /* of #if defined( SUPPORT_INET4) */295 296 #if defined( SUPPORT_INET6)307 #endif /* of #if defined(_IP4_CFG) */ 308 309 #if defined(_IP6_CFG) 297 310 298 311 case ETHER_TYPE_IPV6: /* IPv6 */ 299 error = nd6_storelladdr((T_ETHER_ADDR*) GET_ETHER_HDR(output)->dhost,300 ( T_IN6_ADDR*)dst, gw);312 error = nd6_storelladdr((T_ETHER_ADDR*)eth->dhost, 313 (const T_IN6_ADDR*)dst, gw); 301 314 if (error == E_OK) 302 315 error = ether_raw_output(output, tmout); … … 311 324 break; 312 325 313 #endif /* of #if defined( SUPPORT_INET6) */326 #endif /* of #if defined(_IP6_CFG) */ 314 327 315 328 default: … … 398 411 ID tskid; 399 412 uint16_t proto; 413 uint8_t rcount = 0; 400 414 401 415 /* ネットワークインタフェース管理を初期化する。*/ 402 416 ifinit(); 417 418 /* イーサネットネットワークインタフェース管理を初期化する。*/ 419 420 #if defined(_IP4_CFG) 421 422 ether_ifnet.in4_ifaddr.addr = IPV4_ADDR_LOCAL; /* IPv4 アドレス */ 423 ether_ifnet.in4_ifaddr.mask = IPV4_ADDR_LOCAL_MASK; /* サブネットマスク */ 424 425 #endif /* of #if defined(_IP4_CFG) */ 403 426 404 427 /* NIC を初期化する。*/ … … 418 441 tskid, mac2str(NULL, ic->ifaddr.lladdr)); 419 442 420 #if defined( SUPPORT_INET4)443 #if defined(_IP4_CFG) 421 444 422 445 /* ARP を初期化する。*/ 423 446 arp_init(); 424 447 425 #endif /* of #if defined( SUPPORT_INET4) */448 #endif /* of #if defined(_IP4_CFG) */ 426 449 427 450 ether_ifnet.ic = ic; 451 452 /* 乱数生成を初期化する。*/ 453 net_srand(0); 428 454 429 455 while (true) { 430 456 syscall(wai_sem(ic->semid_rxb_ready)); 431 457 if ((input = IF_ETHER_NIC_READ(ic)) != NULL) { 432 NET_COUNT_ETHER(net_count_ether.in_octets, input->len);458 NET_COUNT_ETHER(net_count_ether.in_octets, input->len); 433 459 NET_COUNT_MIB(if_stats.ifInOctets, input->len + 8); 434 460 NET_COUNT_ETHER(net_count_ether.in_packets, 1); … … 436 462 proto = ntohs(eth->type); 437 463 464 /* 乱数生成を初期化する。*/ 465 if (rcount == 0) { 466 467 #ifdef ETHER_CFG_COLLECT_ADDR 468 memcpy(ether_collect_addr.lladdr, eth->shost, 469 sizeof(ether_collect_addr.lladdr)); 470 #endif /* of #ifdef ETHER_CFG_COLLECT_ADDR */ 471 472 net_srand(0); 473 } 474 rcount ++; 475 476 438 477 #ifdef SUPPORT_MIB 439 478 if ((*eth->dhost & ETHER_MCAST_ADDR) == 0) { … … 445 484 #endif /* of #ifdef SUPPORT_MIB */ 446 485 447 #if defined( SUPPORT_INET4) && defined(ETHER_CFG_ACCEPT_ALL)486 #if defined(_IP4_CFG) && defined(ETHER_CFG_ACCEPT_ALL) 448 487 449 488 if ((*eth->dhost & ETHER_MCAST_ADDR) && *eth->dhost != 0xff) { … … 464 503 } 465 504 466 #endif /* of #if defined( SUPPORT_INET4) && defined(ETHER_CFG_ACCEPT_ALL) */505 #endif /* of #if defined(_IP4_CFG) && defined(ETHER_CFG_ACCEPT_ALL) */ 467 506 468 507 switch(proto) { 469 508 470 #if defined( SUPPORT_INET4)509 #if defined(_IP4_CFG) 471 510 472 511 case ETHER_TYPE_IP: /* IP */ … … 478 517 break; 479 518 480 #endif /* of #if defined( SUPPORT_INET4) */481 482 #if defined( SUPPORT_INET6)519 #endif /* of #if defined(_IP4_CFG) */ 520 521 #if defined(_IP6_CFG) 483 522 484 523 case ETHER_TYPE_IPV6: /* IPv6 */ … … 486 525 break; 487 526 488 #endif /* of #if defined( SUPPORT_INET6) */527 #endif /* of #if defined(_IP6_CFG) */ 489 528 490 529 default:
Note:
See TracChangeset
for help on using the changeset viewer.