Index: EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/if_ether.c
===================================================================
--- EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/if_ether.c	(revision 321)
+++ EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/if_ether.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
  *
@@ -94,4 +94,5 @@
 #include <net/if_arp.h>
 #include <net/net.h>
+#include <net/net_endian.h>
 #include <net/net_buf.h>
 #include <net/net_var.h>
@@ -106,5 +107,5 @@
 #include <net/if_var.h>
 
-#if defined(SUPPORT_INET4) && defined(SUPPORT_ETHER)
+#if defined(_IP4_CFG) && defined(SUPPORT_ETHER)
 
 /*
@@ -118,9 +119,168 @@
  */
 
-static T_ARP_ENTRY *arp_lookup (T_IN4_ADDR addr, bool_t create);
 static void in_arpinput (T_IF_ADDR *ifaddr, T_NET_BUF *input);
 static void arp_timer (void *ignore);
 
 /*
+ *  in_arpinput -- TCP/IP 用 ARP の入力関数
+ */
+
+static void
+in_arpinput (T_IF_ADDR *ifaddr, T_NET_BUF *input)
+{
+	T_NET_BUF	*pending;
+	T_ETHER_HDR	*eth;
+	T_ARP_HDR	*arph;
+	T_ETHER_ARP_HDR	*et_arph;
+	T_ARP_ENTRY	*ent;
+	T_IFNET		*ifp = IF_GET_IFNET();
+	T_IN4_ADDR	saddr, taddr;
+
+	et_arph = GET_ETHER_ARP_HDR(input);
+
+	ntoahl(saddr, et_arph->sproto);		/* 送信元 IP アドレス	*/
+	ntoahl(taddr, et_arph->tproto);		/* 解決対象 IP アドレス	*/
+
+	/*
+	 *  以下の場合はエラー
+	 *    ・送信ホストの物理アドレスが自分
+	 *    ・送信ホストの物理アドレスがブロードキャスト
+	 */
+	if (memcmp(et_arph->shost, ifaddr->lladdr,        ETHER_ADDR_LEN) == 0 ||
+	    memcmp(et_arph->shost, ether_broad_cast_addr, ETHER_ADDR_LEN) == 0)
+		goto err_ret;
+
+	/*
+	 *  送信ホストの IP アドレスが自分の場合は、重複しているので
+	 *  相手にも知らせる。
+	 *  ただし、自分と相手のアドレスが未定義（IPV4_ADDRANY）の時は何もしない。
+	 */
+	if ((saddr == ifp->in4_ifaddr.addr) && (saddr != IPV4_ADDRANY)) {
+
+#ifdef ARP_CFG_CALLBACK_DUPLICATED
+
+		if (arp_callback_duplicated(et_arph->shost)) {
+			syslog(LOG_ERROR, "[ARP] IP address duplicated: %s",
+			                  ip2str(NULL, &ifp->in4_ifaddr.addr),
+			                  mac2str(NULL, et_arph->shost));
+			taddr = saddr;
+			goto reply;
+			}
+		else
+			goto buf_rel;
+
+#else	/* of #ifdef ARP_CFG_CALLBACK_DUPLICATED */
+
+		syslog(LOG_ERROR, "[ARP] IP address duplicated: %s",
+			          ip2str(NULL, &ifp->in4_ifaddr.addr),
+			          mac2str(NULL, et_arph->shost));
+		taddr = saddr;
+		goto reply;
+
+#endif	/* of #ifdef ARP_CFG_CALLBACK_DUPLICATED */
+
+		}
+
+	/*
+	 *  以下の場合は何もしない。
+	 *    ・解決対象 IP アドレスが自分ではない、注: 元の FreeBSD の
+	 *      実装では、ARP PROXY 等のため、自分以外の IP アドレスの
+	 *      解決も行っているが、本実装では、自分以外の IP
+	 *      アドレスの解決は行わない。
+	 */
+	if (taddr != ifp->in4_ifaddr.addr)
+		goto buf_rel;
+
+	/*
+	 *  送信元 IP アドレスが ARP キャッシュにあるか調べる。
+	 *  キャッシュになければ、新たにエントリを登録する。
+	 */
+	syscall(wai_sem(SEM_ARP_CACHE_LOCK));
+	ent = arp_lookup(saddr, true);
+
+	memcpy(ent->mac_addr, et_arph->shost, ETHER_ADDR_LEN);
+	ent->expire = ARP_CACHE_KEEP;
+
+	/*
+	 *  送信がペンデングされているフレームがあれば送信する。
+	 */
+	if (ent->hold) {
+
+		/* フレームの Ethernet ヘッダを設定する。*/
+		memcpy(GET_ETHER_HDR(ent->hold)->dhost, ent->mac_addr, ETHER_ADDR_LEN);
+
+		pending = ent->hold;
+		ent->hold = NULL;
+		syscall(sig_sem(SEM_ARP_CACHE_LOCK));
+
+		/* ペンディングされているフレームを送信する。*/
+		IF_RAW_OUTPUT(pending, TMO_FEVR);
+
+		}
+	else
+		syscall(sig_sem(SEM_ARP_CACHE_LOCK));
+
+reply:
+
+	arph = GET_ARP_HDR(input);
+
+	/* アドレス解決要求でなければ終了 */
+	if (ntohs(arph->opcode) != ARPOP_REQUEST)
+		goto buf_rel;
+
+	/* Ethernet ARP ヘッダを設定する。*/
+	memcpy(et_arph->thost, et_arph->shost, ETHER_ADDR_LEN);
+	memcpy(et_arph->shost, ifaddr->lladdr, ETHER_ADDR_LEN);
+	memcpy(et_arph->tproto, (uint8_t*)&et_arph->sproto, sizeof(T_IN_ADDR));
+	ahtonl(et_arph->sproto, taddr);
+
+	/* Ethernet ARP ヘッダを設定する。*/
+	arph->opcode = htons(ARPOP_REPLY);
+
+	/* Ethernet ヘッダを設定する。*/
+	eth = GET_ETHER_HDR(input);
+	memcpy(eth->dhost, eth->shost,     ETHER_ADDR_LEN);
+	memcpy(eth->shost, ifaddr->lladdr, ETHER_ADDR_LEN);
+
+	/* ARP 応答を送信する。*/
+	IF_RAW_OUTPUT(input, TMO_FEVR);
+	return;
+
+err_ret:
+	NET_COUNT_ARP(net_count_arp.in_err_packets, 1);
+buf_rel:
+	syscall(rel_net_buf(input));
+	}
+
+/*
+ *  arp_timer -- ARP キャッシュの更新
+ */
+
+static void
+arp_timer (void *ignore)
+{
+	int_t	ix;
+
+	syscall(wai_sem(SEM_ARP_CACHE_LOCK));
+
+	for (ix = NUM_ARP_ENTRY; ix -- > 0; ) {
+		if (arp_cache[ix].expire) {
+			arp_cache[ix].expire -= ARP_TIMER_TMO;
+			if (arp_cache[ix].expire == 0) {
+				/* 送信がペンデングされているフレームがあれば捨てる。*/
+				if (arp_cache[ix].hold) {
+					NET_COUNT_IP4(net_count_ip4[NC_IP4_OUT_ERR_PACKETS], 1);
+					syscall(rel_net_buf(arp_cache[ix].hold));
+					}
+				memset(&arp_cache[ix], 0, sizeof(T_ARP_ENTRY));
+				}
+			}
+		}
+
+	syscall(sig_sem(SEM_ARP_CACHE_LOCK));
+	timeout(arp_timer, NULL, ARP_TIMER_TMO);
+	}
+
+/*
  *  arp_lookup -- ARP キャッシュの探索と登録
  *
@@ -128,5 +288,5 @@
  */
 
-static T_ARP_ENTRY *
+T_ARP_ENTRY *
 arp_lookup (T_IN4_ADDR addr, bool_t create)
 {
@@ -170,159 +330,4 @@
 
 /*
- *  in_arpinput -- TCP/IP 用 ARP の入力関数
- */
-
-static void
-in_arpinput (T_IF_ADDR *ifaddr, T_NET_BUF *input)
-{
-	T_NET_BUF	*pending;
-	T_ETHER_HDR	*eth;
-	T_ARP_HDR	*arph;
-	T_ETHER_ARP_HDR	*et_arph;
-	T_ARP_ENTRY	*ent;
-	T_IFNET		*ifp = IF_GET_IFNET();
-	T_IN4_ADDR	saddr, taddr;
-
-	et_arph = GET_ETHER_ARP_HDR(input);
-
-	ntoahl(saddr, et_arph->sproto);		/* 送信元 IP アドレス	*/
-	ntoahl(taddr, et_arph->tproto);		/* 解決対象 IP アドレス	*/
-
-	/*
-	 *  以下の場合はエラー
-	 *    ・送信ホストの物理アドレスが自分
-	 *    ・送信ホストの物理アドレスがブロードキャスト
-	 */
-	if (memcmp(et_arph->shost, ifaddr->lladdr,        ETHER_ADDR_LEN) == 0 ||
-	    memcmp(et_arph->shost, ether_broad_cast_addr, ETHER_ADDR_LEN) == 0)
-		goto err_ret;
-
-	/*
-	 *  送信ホストの IP アドレスが自分の場合は、重複しているので
-	 *  相手にも知らせる。
-	 */
-	if (saddr == ifp->in_ifaddr.addr) {
-
-#ifdef ARP_CFG_CALLBACK_DUPLICATED
-
-		if (arp_callback_duplicated(et_arph->shost)) {
-			syslog(LOG_ERROR, "[ARP] IP address duplicated: %s", mac2str(NULL, et_arph->shost));
-			taddr = saddr;
-			goto reply;
-			}
-		else
-			goto buf_rel;
-
-#else	/* of #ifdef ARP_CFG_CALLBACK_DUPLICATED */
-
-		syslog(LOG_ERROR, "[ARP] IP address duplicated: %s", mac2str(NULL, et_arph->shost));
-		taddr = saddr;
-		goto reply;
-
-#endif	/* of #ifdef ARP_CFG_CALLBACK_DUPLICATED */
-
-		}
-
-	/*
-	 *  以下の場合は何もしない。
-	 *    ・解決対象 IP アドレスが自分ではない、注: 元の FreeBSD の
-	 *      実装では、ARP PROXY 等のため、自分以外の IP アドレスの
-	 *      解決も行っているが、本実装では、自分以外の IP
-	 *      アドレスの解決は行わない。
-	 */
-	if (taddr != ifp->in_ifaddr.addr)
-		goto buf_rel;
-
-	/*
-	 *  送信元 IP アドレスが ARP キャッシュにあるか調べる。
-	 *  キャッシュになければ、新たにエントリを登録する。
-	 */
-	syscall(wai_sem(SEM_ARP_CACHE_LOCK));
-	ent = arp_lookup(saddr, true);
-
-	memcpy(ent->mac_addr, et_arph->shost, ETHER_ADDR_LEN);
-	ent->expire = ARP_CACHE_KEEP;
-
-	/*
-	 *  送信がペンデングされているフレームがあれば送信する。
-	 */
-	if (ent->hold) {
-
-		/* フレームの Ethernet ヘッダを設定する。*/
-		memcpy(GET_ETHER_HDR(ent->hold)->dhost, ent->mac_addr, ETHER_ADDR_LEN);
-
-		pending = ent->hold;
-		ent->hold = NULL;
-		syscall(sig_sem(SEM_ARP_CACHE_LOCK));
-
-		/* ペンディングされているフレームを送信する。*/
-		IF_RAW_OUTPUT(pending, TMO_FEVR);
-
-		}
-	else
-		syscall(sig_sem(SEM_ARP_CACHE_LOCK));
-
-reply:
-
-	arph = GET_ARP_HDR(input);
-
-	/* アドレス解決要求でなければ終了 */
-	if (ntohs(arph->opcode) != ARPOP_REQUEST)
-		goto buf_rel;
-
-	/* Ethernet ARP ヘッダを設定する。*/
-	memcpy(et_arph->thost, et_arph->shost, ETHER_ADDR_LEN);
-	memcpy(et_arph->shost, ifaddr->lladdr, ETHER_ADDR_LEN);
-	memcpy(et_arph->tproto, (uint8_t*)&et_arph->sproto, sizeof(T_IN_ADDR));
-	ahtonl(et_arph->sproto, taddr);
-
-	/* Ethernet ARP ヘッダを設定する。*/
-	arph->opcode = htons(ARPOP_REPLY);
-
-	/* Ethernet ヘッダを設定する。*/
-	eth = GET_ETHER_HDR(input);
-	memcpy(eth->dhost, eth->shost,     ETHER_ADDR_LEN);
-	memcpy(eth->shost, ifaddr->lladdr, ETHER_ADDR_LEN);
-
-	/* ARP 応答を送信する。*/
-	IF_RAW_OUTPUT(input, TMO_FEVR);
-	return;
-
-err_ret:
-	NET_COUNT_ARP(net_count_arp.in_err_packets, 1);
-buf_rel:
-	syscall(rel_net_buf(input));
-	}
-
-/*
- *  arp_timer -- ARP キャッシュの更新
- */
-
-static void
-arp_timer (void *ignore)
-{
-	int_t	ix;
-
-	syscall(wai_sem(SEM_ARP_CACHE_LOCK));
-
-	for (ix = NUM_ARP_ENTRY; ix -- > 0; ) {
-		if (arp_cache[ix].expire) {
-			arp_cache[ix].expire -= ARP_TIMER_TMO;
-			if (arp_cache[ix].expire == 0) {
-				/* 送信がペンデングされているフレームがあれば捨てる。*/
-				if (arp_cache[ix].hold) {
-					NET_COUNT_IP4(net_count_ip4[NC_IP4_OUT_ERR_PACKETS], 1);
-					syscall(rel_net_buf(arp_cache[ix].hold));
-					}
-				memset(&arp_cache[ix], 0, sizeof(T_ARP_ENTRY));
-				}
-			}
-		}
-
-	syscall(sig_sem(SEM_ARP_CACHE_LOCK));
-	timeout(arp_timer, NULL, ARP_TIMER_TMO);
-	}
-
-/*
  *  arp_request -- MAC アドレス解決要求
  */
@@ -359,5 +364,5 @@
 		/* イーサネット ARP ヘッダを設定する。*/
 		et_arph = GET_ETHER_ARP_HDR(arp_req);
-		src     = IF_GET_IFNET()->in_ifaddr.addr;
+		src     = IF_GET_IFNET()->in4_ifaddr.addr;
 		memcpy(et_arph->shost, ifaddr->lladdr, ETHER_ADDR_LEN);
 		memset(et_arph->thost, 0,              ETHER_ADDR_LEN);
@@ -444,5 +449,5 @@
 	 */
 	if (gw == IPV4_ADDR_BROADCAST ||
-	    gw == ((ifp->in_ifaddr.addr & ifp->in_ifaddr.mask) | ~ifp->in_ifaddr.mask)) {
+	    gw == ((ifp->in4_ifaddr.addr & ifp->in4_ifaddr.mask) | ~ifp->in4_ifaddr.mask)) {
 		memcpy(eth->dhost, ether_broad_cast_addr, ETHER_ADDR_LEN);
 		return true;
@@ -504,9 +509,9 @@
 	eaddr->lladdr[1] = UINT_C(0x00);
 	eaddr->lladdr[2] = UINT_C(0x5E);
-	eaddr->lladdr[3] = (maddr & 0x7F0000) >> 16;
-	eaddr->lladdr[4] = (maddr & 0xFF00) >> 8;
-	eaddr->lladdr[5] = maddr & 0xFF;
+	eaddr->lladdr[3] = (uint8_t)((maddr & 0x7F0000) >> 16);
+	eaddr->lladdr[4] = (uint8_t)((maddr & 0xFF00) >> 8);
+	eaddr->lladdr[5] = (uint8_t)(maddr & 0xFF);
 	}
 #endif	/* ETHER_CFG_MULTICAST */
 
-#endif	/* of #if defined(SUPPORT_INET4) && defined(SUPPORT_ETHER) */
+#endif	/* of #if defined(_IP4_CFG) && defined(SUPPORT_ETHER) */
