Index: EcnlProtoTool/trunk/asp3_dcre/tinet/net/ethernet.c
===================================================================
--- EcnlProtoTool/trunk/asp3_dcre/tinet/net/ethernet.c	(revision 321)
+++ EcnlProtoTool/trunk/asp3_dcre/tinet/net/ethernet.c	(revision 331)
@@ -2,5 +2,5 @@
  *  TINET (TCP/IP Protocol Stack)
  * 
- *  Copyright (C) 2001-2009 by Dep. of Computer Science and Engineering
+ *  Copyright (C) 2001-2017 by Dep. of Computer Science and Engineering
  *                   Tomakomai National College of Technology, JAPAN
  *
@@ -63,4 +63,5 @@
 #include <net/if_arp.h>
 #include <net/net.h>
+#include <net/net_endian.h>
 #include <net/net_var.h>
 #include <net/net_buf.h>
@@ -71,9 +72,9 @@
 #include <netinet/in_var.h>
 #include <netinet/if_ether.h>
+
 #include <netinet6/if6_ether.h>
 #include <netinet6/nd6.h>
 
 #include <net/if_var.h>
-#include <net/if6_var.h>
 
 #ifdef SUPPORT_ETHER
@@ -83,5 +84,5 @@
  */
 
-#if defined(SUPPORT_INET4)
+#if defined(_IP4_CFG)
 
 const uint8_t ether_broad_cast_addr[ETHER_ADDR_LEN] = {
@@ -90,5 +91,5 @@
 	};
 
-#endif	/* of #if defined(SUPPORT_INET4) */
+#endif	/* of #if defined(_IP4_CFG) */
 
 /*
@@ -98,32 +99,9 @@
 /* ネットワークインタフェース構造体 */
 
-#if defined(SUPPORT_INET4)
-
-static T_IFNET ether_ifnet = {
-	NULL,			/* ネットワークインタフェースのソフトウェア情報	*/
-	{
-		IPV4_ADDR_LOCAL,	/* IPv4 アドレス		*/
-		IPV4_ADDR_LOCAL_MASK,	/* サブネットマスク		*/
-		},
-	};
-
-#endif	/* of #if defined(SUPPORT_INET4) */
-
-#if defined(SUPPORT_INET6)
-
-static T_IFNET ether_ifnet = {
-	NULL,			/* ネットワークインタフェースのソフトウェア情報	*/
-	{0},			/* IPv6 アドレス情報				*/
-	{0},			/* マルチキャスト IPv6 アドレス			*/
-	0,				/* フラグ					*/
-	};
-
-#endif	/* of #if defined(SUPPORT_INET6) */
+static T_IFNET ether_ifnet;
 
 #ifdef SUPPORT_MIB
 
-/*
- *  SNMP の 管理情報ベース (MIB)
- */
+/*  SNMP の 管理情報ベース (MIB) */
 
 T_IF_STATS if_stats;
@@ -158,4 +136,32 @@
 
 /*
+ *  ether_srand -- 乱数を初期値を返す。
+ */
+
+uint32_t
+ether_srand (void)
+{
+	T_IF_SOFTC	*ic;
+	uint32_t	rval;
+
+	ic = IF_ETHER_NIC_GET_SOFTC();
+	rval  = (ic->ifaddr.lladdr[2] << 24)
+	      + (ic->ifaddr.lladdr[3] << 16)
+	      + (ic->ifaddr.lladdr[4] <<  8)
+	      + (ic->ifaddr.lladdr[5]      );
+
+#ifdef ETHER_CFG_COLLECT_ADDR
+
+	rval += (ether_collect_addr.lladdr[2] << 24)
+	      + (ether_collect_addr.lladdr[3] << 16)
+	      + (ether_collect_addr.lladdr[4] <<  8)
+	      + (ether_collect_addr.lladdr[5]      );
+
+#endif	/* of #ifdef ETHER_CFG_COLLECT_ADDR */
+
+	return rval;
+	}
+
+/*
  *  ether_get_ifnet -- ネットワークインタフェース構造体を返す。
  */
@@ -167,5 +173,5 @@
 	}
 
-#if defined(SUPPORT_INET6)
+#if defined(_IP6_CFG)
 
 /*
@@ -174,5 +180,5 @@
 
 ER
-ether_in6_resolve_multicast (T_ETHER_ADDR *ifaddr, T_IN6_ADDR *maddr)
+ether_in6_resolve_multicast (T_ETHER_ADDR *ifaddr, const T_IN6_ADDR *maddr)
 {
 	/* マルチキャストアドレスかチェックする。*/
@@ -186,5 +192,5 @@
 	}
 
-#endif	/* of #if defined(SUPPORT_INET6) */
+#endif	/* of #if defined(_IP6_CFG) */
 
 /**
@@ -203,4 +209,11 @@
       }
 #endif /* LWIP_ARP */
+
+#if LWIP_IGMP
+      /* resend IGMP memberships */
+      if (ether->_flags & IF_FLAG_IGMP) {
+        igmp_report_groups(ether);
+      }
+#endif /* LWIP_IGMP */
     }
     if (ether->link_callback) {
@@ -262,5 +275,5 @@
 
 ER
-ether_output (T_NET_BUF *output, void *dst, T_IF_ADDR *gw, TMO tmout)
+ether_output (T_NET_BUF *output, const void *dst, T_IF_ADDR *gw, TMO tmout)
 {
 	T_IF_SOFTC	*ic;
@@ -275,5 +288,5 @@
 	switch(ntohs(eth->type)) {
 
-#if defined(SUPPORT_INET4)
+#if defined(_IP4_CFG)
 
 	case ETHER_TYPE_IP:		/* IPv4	*/
@@ -292,11 +305,11 @@
 		break;
 
-#endif	/* of #if defined(SUPPORT_INET4) */
-
-#if defined(SUPPORT_INET6)
+#endif	/* of #if defined(_IP4_CFG) */
+
+#if defined(_IP6_CFG)
 
 	case ETHER_TYPE_IPV6:		/* IPv6	*/
-		error = nd6_storelladdr((T_ETHER_ADDR*)GET_ETHER_HDR(output)->dhost,
-		                        (T_IN6_ADDR*)dst, gw);
+		error = nd6_storelladdr((T_ETHER_ADDR*)eth->dhost,
+		                        (const T_IN6_ADDR*)dst, gw);
 		if (error == E_OK)
 			error = ether_raw_output(output, tmout);
@@ -311,5 +324,5 @@
 		break;
 
-#endif	/* of #if defined(SUPPORT_INET6) */
+#endif	/* of #if defined(_IP6_CFG) */
 
 	default:
@@ -398,7 +411,17 @@
 	ID		tskid;
 	uint16_t	proto;
+	uint8_t		rcount = 0;
 
 	/* ネットワークインタフェース管理を初期化する。*/
 	ifinit();
+
+	/* イーサネットネットワークインタフェース管理を初期化する。*/
+
+#if defined(_IP4_CFG)
+
+	ether_ifnet.in4_ifaddr.addr = IPV4_ADDR_LOCAL;		/* IPv4 アドレス		*/
+	ether_ifnet.in4_ifaddr.mask = IPV4_ADDR_LOCAL_MASK;	/* サブネットマスク		*/
+
+#endif	/* of #if defined(_IP4_CFG) */
 
 	/* NIC を初期化する。*/
@@ -418,17 +441,20 @@
 	                   tskid, mac2str(NULL, ic->ifaddr.lladdr));
 
-#if defined(SUPPORT_INET4)
+#if defined(_IP4_CFG)
 
 	/* ARP を初期化する。*/
 	arp_init();
 
-#endif	/* of #if defined(SUPPORT_INET4) */
+#endif	/* of #if defined(_IP4_CFG) */
 
 	ether_ifnet.ic = ic;
+
+	/* 乱数生成を初期化する。*/
+	net_srand(0);
 
 	while (true) {
 		syscall(wai_sem(ic->semid_rxb_ready));
 		if ((input = IF_ETHER_NIC_READ(ic)) != NULL) {
-			NET_COUNT_ETHER(net_count_ether.in_octets, input->len);
+			NET_COUNT_ETHER(net_count_ether.in_octets,  input->len);
 			NET_COUNT_MIB(if_stats.ifInOctets, input->len + 8);
 			NET_COUNT_ETHER(net_count_ether.in_packets, 1);
@@ -436,4 +462,17 @@
 			proto = ntohs(eth->type);
 
+			/* 乱数生成を初期化する。*/
+			if (rcount == 0) {
+
+#ifdef ETHER_CFG_COLLECT_ADDR
+				memcpy(ether_collect_addr.lladdr, eth->shost, 
+				sizeof(ether_collect_addr.lladdr));
+#endif	/* of #ifdef ETHER_CFG_COLLECT_ADDR */
+
+				net_srand(0);
+				}
+			rcount ++;
+
+
 #ifdef SUPPORT_MIB
 			if ((*eth->dhost & ETHER_MCAST_ADDR) == 0) {
@@ -445,5 +484,5 @@
 #endif	/* of #ifdef SUPPORT_MIB */
 
-#if defined(SUPPORT_INET4) && defined(ETHER_CFG_ACCEPT_ALL)
+#if defined(_IP4_CFG) && defined(ETHER_CFG_ACCEPT_ALL)
 
 			if ((*eth->dhost & ETHER_MCAST_ADDR) && *eth->dhost != 0xff) {
@@ -464,9 +503,9 @@
 				}
 
-#endif	/* of #if defined(SUPPORT_INET4) && defined(ETHER_CFG_ACCEPT_ALL) */
+#endif	/* of #if defined(_IP4_CFG) && defined(ETHER_CFG_ACCEPT_ALL) */
 
 			switch(proto) {
 
-#if defined(SUPPORT_INET4)
+#if defined(_IP4_CFG)
 
 			case ETHER_TYPE_IP:		/* IP	*/
@@ -478,7 +517,7 @@
 				break;
 
-#endif	/* of #if defined(SUPPORT_INET4) */
-
-#if defined(SUPPORT_INET6)
+#endif	/* of #if defined(_IP4_CFG) */
+
+#if defined(_IP6_CFG)
 
 			case ETHER_TYPE_IPV6:		/* IPv6	*/
@@ -486,5 +525,5 @@
 				break;
 
-#endif	/* of #if defined(SUPPORT_INET6) */
+#endif	/* of #if defined(_IP6_CFG) */
 
 			default:
