Index: EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/ip_icmp.c
===================================================================
--- EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/ip_icmp.c	(revision 321)
+++ EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/ip_icmp.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
  *
@@ -76,4 +76,5 @@
 #include <t_syslog.h>
 #include "kernel_cfg.h"
+#include "tinet_cfg.h"
 
 #endif	/* of #ifdef TARGET_KERNEL_ASP */
@@ -83,4 +84,5 @@
 #include <s_services.h>
 #include <t_services.h>
+#include "tinet_id.h"
 
 #endif	/* of #ifdef TARGET_KERNEL_JSP */
@@ -95,4 +97,5 @@
 #include <net/ppp_ipcp.h>
 #include <net/net.h>
+#include <net/net_endian.h>
 #include <net/net_buf.h>
 #include <net/net_timer.h>
@@ -106,6 +109,10 @@
 #include <netinet/icmp_var.h>
 #include <netinet/tcp.h>
-#include <netinet/tcp_timer.h>
 #include <netinet/tcp_var.h>
+#include <netinet/udp_var.h>
+
+#include <net/if_var.h>
+
+#if defined(_IP4_CFG)
 
 /*
@@ -130,4 +137,5 @@
 static void icmp_unreach (T_NET_BUF *input, uint_t ihoff);
 
+#if defined(NUM_REDIRECT_ROUTE_ENTRY)
 #if NUM_REDIRECT_ROUTE_ENTRY > 0
 
@@ -135,4 +143,5 @@
 
 #endif	/* of #if NUM_REDIRECT_ROUTE_ENTRY > 0 */
+#endif	/* of #if defined(NUM_REDIRECT_ROUTE_ENTRY) */
 
 /*
@@ -147,32 +156,40 @@
 	T_IP4_HDR	*ip4h;
 	T_ICMP4_HDR	*icmp4h;
-	T_IN4_ADDR	addr;
+	T_IFNET		*ifp = IF_GET_IFNET();
 
 	NET_COUNT_MIB(icmp_stats.icmpInEchos, 1);
 
-	/* メッセージの型をエコー要求 (8) から エコー応答 (0) に	*/
-	/* 変更して送り返す。					*/
-
-	icmp4h = GET_ICMP4_HDR(input, ihoff);
-	icmp4h->type = ICMP4_ECHO_REPLY;
-
-	/* IP ヘッダの宛先と発信元を交換する。*/
-	ip4h      = GET_IP4_HDR(input);
-	addr      = ip4h->src;
-	ip4h->src = ip4h->dst;
-	ip4h->dst = addr;
-
-	/* チェックサムを計算する。*/
-	icmp4h->sum = 0;
-	icmp4h->sum = in_cksum(icmp4h,
-	                       (uint_t)(((input->len - GET_IF_IP4_HDR_SIZE(input)) + 3) >> 2 << 2));
-
-	/* 送信する。*/
-	NET_COUNT_ICMP4(net_count_icmp4.out_octets,
-	               input->len - GET_IF_IP4_HDR_SIZE(input));
-	NET_COUNT_ICMP4(net_count_icmp4.out_packets, 1);
-	NET_COUNT_MIB(icmp_stats.icmpOutMsgs, 1);
-	NET_COUNT_MIB(icmp_stats.icmpOutEchoReps, 1);
-	ip_output(input, TMO_ICMP_OUTPUT);
+	/* IPv4 アドレスが未定義の時は応答しない。*/
+	if (!IN4_IS_ADDR_ANY(&ifp->in4_ifaddr.addr)) {
+
+		/*
+		 *  メッセージの型をエコー要求 (8) から
+		 *  エコー応答 (0) に変更して送り返す。
+		 */
+
+		icmp4h = GET_ICMP4_HDR(input, ihoff);
+		icmp4h->type = ICMP4_ECHO_REPLY;
+
+		/*
+		 *  宛先アドレスは受信したメッセージの送信元アドレス。
+		 *  送信元アドレスは自 IPv4 アドレス。
+		 */
+		ip4h      = GET_IP4_HDR(input);
+		ip4h->dst = ip4h->src;
+		ip4h->src = htonl(ifp->in4_ifaddr.addr);
+
+		/* チェックサムを計算する。*/
+		icmp4h->sum = 0;
+		icmp4h->sum = in_cksum(icmp4h,
+		                       (uint_t)(((input->len - GET_IF_IP4_HDR_SIZE(input)) + 3) >> 2 << 2));
+
+		/* 送信する。*/
+		NET_COUNT_ICMP4(net_count_icmp4.out_octets,
+		               input->len - GET_IF_IP4_HDR_SIZE(input));
+		NET_COUNT_ICMP4(net_count_icmp4.out_packets, 1);
+		NET_COUNT_MIB(icmp_stats.icmpOutMsgs, 1);
+		NET_COUNT_MIB(icmp_stats.icmpOutEchoReps, 1);
+		ip_output(input, TMO_ICMP_OUTPUT);
+		}
 	}
 
@@ -212,13 +229,24 @@
 	code  = GET_ICMP4_HDR(input, ihoff)->code;
 	error = code2error[code];
-	if (ip4h->proto == IPPROTO_TCP) {
-
-#ifdef SUPPORT_TCP
+
+	/* 最終ヘッダが TCP/UDP のみ対応する。*/
+	if (ip4h->proto == IPPROTO_TCP || ip4h->proto == IPPROTO_UDP) {
 
 		memcpy(GET_IP4_HDR(input), ip4h, input->len - (IP4_HDR_SIZE + ICMP4_HDR_SIZE));
 		input->len -= IP4_HDR_SIZE + ICMP4_HDR_SIZE;
-		tcp_notify(input, error);
-
-#endif	/* of #ifdef SUPPORT_TCP */
+
+#if defined(SUPPORT_TCP)
+
+		if (ip4h->proto == IPPROTO_TCP)
+			tcp_notify(input, error);
+
+#endif	/* of #if defined(SUPPORT_TCP) */
+
+#if defined(SUPPORT_UDP) && TNUM_UDP4_CEPID > 0
+
+		if (ip4h->proto == IPPROTO_UDP)
+			udp4_notify(input, error);
+
+#endif	/* of #if defined(SUPPORT_UDP) && TNUM_UDP4_CEPID > 0 */
 
 		}
@@ -227,4 +255,5 @@
 	}
 
+#if defined(NUM_REDIRECT_ROUTE_ENTRY)
 #if NUM_REDIRECT_ROUTE_ENTRY > 0
 
@@ -264,4 +293,5 @@
 
 #endif	/* of #if NUM_REDIRECT_ROUTE_ENTRY > 0 */
+#endif	/* of #if defined(NUM_REDIRECT_ROUTE_ENTRY) */
 
 /*
@@ -314,9 +344,9 @@
 	case ICMP4_ECHO_REPLY:
 
-#ifdef ICMP_CFG_CALLBACK_ECHO_REPLY
+#if defined(SUPPORT_INET4) && defined(ICMP_CFG_CALLBACK_ECHO_REPLY)
 
 		icmp_echo_reply(input, *offp);
 
-#endif	/* of #ifdef ICMP_CFG_CALLBACK_ECHO_REPLY */
+#endif	/* of #if defined(SUPPORT_INET4) && defined(ICMP_CFG_CALLBACK_ECHO_REPLY) */
 
 		break;
@@ -326,4 +356,5 @@
 	case ICMP4_REDIRECT:
 
+#if defined(NUM_REDIRECT_ROUTE_ENTRY)
 #if NUM_REDIRECT_ROUTE_ENTRY > 0
 
@@ -338,4 +369,10 @@
 
 #endif	/* of #if NUM_REDIRECT_ROUTE_ENTRY > 0 */
+#else	/* of #if defined(NUM_REDIRECT_ROUTE_ENTRY) */
+
+		addr = ntohl(icmp4h->data.addr);
+		syslog(LOG_INFO, "[ICMP] redirect ignored, addr: %s.", ip2str(NULL, &addr));
+
+#endif	/* of #if defined(NUM_REDIRECT_ROUTE_ENTRY) */
 
 		break;
@@ -371,5 +408,5 @@
 
 	ip4h  = GET_IP4_HDR(input);
-	ip4hl = GET_IP4_HDR_SIZE(ip4h);
+	ip4hl = GET_IP4_HDR_SIZE(input);
 
 	/* 送信用の IP データグラムを獲得する。*/
@@ -378,5 +415,5 @@
 	else
 		len = 8;
-
+	
 	saddr = ntohl(ip4h->src);
 	if (in4_get_datagram(&output, (uint_t)(ICMP4_HDR_SIZE + ip4hl + len), 0,
@@ -417,2 +454,4 @@
 
 #endif	/* of #ifdef ICMP_REPLY_ERROR */
+
+#endif	/* of #if defined(_IP4_CFG) */
