Index: EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/udp_input.c
===================================================================
--- EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/udp_input.c	(revision 321)
+++ EcnlProtoTool/trunk/asp3_dcre/tinet/netinet/udp_input.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
  *
@@ -72,4 +72,5 @@
 #include <sil.h>
 #include <t_syslog.h>
+#include "tinet_cfg.h"
 
 #endif	/* of #ifdef TARGET_KERNEL_ASP */
@@ -79,5 +80,5 @@
 #include <s_services.h>
 #include <t_services.h>
-#include "kernel_id.h"
+#include "tinet_id.h"
 
 #endif	/* of #ifdef TARGET_KERNEL_JSP */
@@ -92,4 +93,5 @@
 #include <net/ppp_ipcp.h>
 #include <net/net.h>
+#include <net/net_endian.h>
 #include <net/net_buf.h>
 #include <net/net_count.h>
@@ -97,14 +99,8 @@
 #include <netinet/in.h>
 #include <netinet/in_var.h>
-#include <netinet6/in6.h>
-#include <netinet6/in6_var.h>
 #include <netinet/in_itron.h>
 #include <netinet/ip.h>
 #include <netinet/ip_var.h>
-#include <netinet/ip6.h>
-#include <netinet6/ip6_var.h>
 #include <netinet/ip_icmp.h>
-#include <netinet/icmp6.h>
-
 #include <netinet/udp.h>
 #include <netinet/udp_var.h>
@@ -124,256 +120,56 @@
 #endif	/* of #ifdef SUPPORT_MIB */
 
-#if defined(SUPPORT_INET4)
-
-#ifdef DHCP_CFG
-
 /*
- *  udp_dstaddr_accept -- UDP のあて先アドレスが正しいかチェックする。
- *
- *    DHCP_CFG が定義されているときは、以下のデータグラムを受信する。
- *
- *      ・あて先アドレスがブロードキャスト
- *      ・ローカルアドレスが未定義
+ *  IPv6 と IPv4 で引数が異なる関数のコンパイル
  */
 
-static bool_t
-udp_is_dstaddr_accept (T_IN4_ADDR *myaddr, T_IN4_ADDR *dstaddr)
-{
-	T_IFNET	*ifp = IF_GET_IFNET();
+#undef	IN_COPY_TO_HOST
 
-	if (ifp->in_ifaddr.addr == IPV4_ADDRANY ||
-	    ntohl(*dstaddr) == IPV4_ADDR_BROADCAST ||
-	    ntohl(*dstaddr) == ((ifp->in_ifaddr.addr & ifp->in_ifaddr.mask) | ~ifp->in_ifaddr.mask))
-		return true;
-	else
-		return IN_IS_DSTADDR_ACCEPT(myaddr, dstaddr);
-	}
+#if defined(_IP6_CFG) && TNUM_UDP6_CEPID > 0
 
-#elif defined(ETHER_CFG_MULTICAST)
+#define UDP_INPUT		udp6_input
+#define UDP_INPUT_SELECT	udp6_input_select
+#define UDP_REPLY_NO_PORT	udp6_reply_no_port
+#define UDP_FIND_CEP		udp6_find_cep
+#define GET_UDP_CEPID		GET_UDP6_CEPID
+#define T_UDP_CEP		T_UDP6_CEP
+#define API_PROTO		API_PROTO_IPV6
 
-/*
- *  udp_dstaddr_accept -- UDP のあて先アドレスが正しいかチェックする。
- *
- *    以下の場合もデータグラムを受信する。
- *
- *      ・あて先アドレスがブロードキャスト
- */
+#if defined(_IP4_CFG)
+#define IN_COPY_TO_HOST		inn_copy_to_host
+#else
+#define IN_COPY_TO_HOST		IN6_COPY_TO_HOST
+#endif
 
-static bool_t
-udp_is_dstaddr_accept (T_IN4_ADDR *myaddr, T_IN4_ADDR *dstaddr)
-{
-	T_IFNET	*ifp = IF_GET_IFNET();
-	T_IN4_ADDR	dst = ntohl(*dstaddr);
+#include <netinet6/udp6_input.c>
+#include <netinet/udpn_input.c>
 
-	if (dst == IPV4_ADDR_BROADCAST ||
-	    dst == ((ifp->in_ifaddr.addr & ifp->in_ifaddr.mask) | ~ifp->in_ifaddr.mask) ||
-		IN4_IS_ADDR_MULTICAST(dst))
-		return true;
-	else
-		return IN_IS_DSTADDR_ACCEPT(myaddr, dstaddr);
-	}
+#undef	UDP_INPUT
+#undef	UDP_INPUT_SELECT
+#undef	UDP_REPLY_NO_PORT
+#undef	UDP_FIND_CEP
+#undef	GET_UDP_CEPID
+#undef	T_UDP_CEP
+#undef	IN_COPY_TO_HOST
+#undef  API_PROTO
 
-#else	/* of #ifdef DHCP_CFG */
+#endif	/* of #if defined(_IP6_CFG) && TNUM_UDP6_CEPID > 0 */
 
-/*
- *  udp_dstaddr_accept -- UDP のあて先アドレスが正しいかチェックする。
- *
- *    以下の場合もデータグラムを受信する。
- *
- *      ・あて先アドレスがブロードキャスト
- */
+#if defined(_IP4_CFG) && ( (TNUM_UDP4_CEPID > 0) || \
+                          ((TNUM_UDP6_CEPID > 0) && defined(API_CFG_IP4MAPPED_ADDR)))
 
-static bool_t
-udp_is_dstaddr_accept (T_IN4_ADDR *myaddr, T_IN4_ADDR *dstaddr)
-{
-	T_IFNET	*ifp = IF_GET_IFNET();
+#define UDP_INPUT		udp4_input
+#define UDP_INPUT_SELECT	udp4_input_select
+#define UDP_REPLY_NO_PORT	udp4_reply_no_port
+#define UDP_FIND_CEP		udp4_find_cep
+#define GET_UDP_CEPID		GET_UDP4_CEPID
+#define T_UDP_CEP		T_UDP4_CEP
+#define IN_COPY_TO_HOST		IN4_COPY_TO_HOST
+#define API_PROTO		API_PROTO_IPV4
 
-	if (ntohl(*dstaddr) == IPV4_ADDR_BROADCAST ||
-	    ntohl(*dstaddr) == ((ifp->in_ifaddr.addr & ifp->in_ifaddr.mask) | ~ifp->in_ifaddr.mask))
-		return true;
-	else
-		return IN_IS_DSTADDR_ACCEPT(myaddr, dstaddr);
-	}
+#include <netinet/udp4_input.c>
+#include <netinet/udpn_input.c>
 
-#endif	/* of #ifdef DHCP_CFG */
-
-#endif	/* of #if defined(SUPPORT_INET4) */
-
-#if defined(SUPPORT_INET6)
-
-/*
- *  udp_dstaddr_accept -- UDP のあて先アドレスが正しいかチェックする。
- *
- *    以下の場合もデータグラムを受信する。
- *
- *      ・あて先アドレスがマルチキャスト
- */
-
-static bool_t
-udp_is_dstaddr_accept (T_IN6_ADDR *myaddr, T_IN6_ADDR *dstaddr)
-{
-	if (IN6_IS_ADDR_MULTICAST(dstaddr))
-		return true;
-	else
-		return IN_IS_DSTADDR_ACCEPT(myaddr, dstaddr);
-	}
-
-#endif	/* of #if defined(SUPPORT_INET6) */
-
-/*
- *  udp_input -- UDP の入力関数
- */
-
-uint_t
-udp_input (T_NET_BUF **inputp, uint_t *offp, uint_t *nextp)
-{
-	T_NET_BUF	*input = *inputp;
-	T_UDP_CEP	*cep;
-	T_UDP_HDR	*udph;
-	T_IP_HDR	*iph;
-	int_t		ix;
-	uint_t		len, hlen, ulen;
-
-	hlen = (uint_t)GET_IF_IP_HDR_SIZE(input);
-
-	NET_COUNT_UDP(net_count_udp.in_octets,  input->len - hlen);
-	NET_COUNT_UDP(net_count_udp.in_packets, 1);
-	NET_COUNT_MIB(udp_stats.udpInDatagrams, 1);
-
-	/* ヘッダ長をチェックする。*/
-	if (input->len < hlen + UDP_HDR_SIZE)
-		goto buf_rel;
-
-	udph = (T_UDP_HDR *)(input->buf + *offp);
-
-	/* データグラム長をチェックする */
-	ulen  = ntohs(udph->ulen);
-	if (ulen != input->len - hlen)
-		goto buf_rel;
-
-	/* 宛先ポートが 0 のデータグラムは破棄する。RFC768 */
-	if (udph->dport == 0)
-		goto buf_rel;
-
-#ifdef UDP_CFG_IN_CHECKSUM
-
-	/* チェックサムをチェックする */
-	if (udph->sum && IN_CKSUM(input, IPPROTO_UDP, *offp, ulen) != 0)
-		goto buf_rel;
-
-#endif	/* of #ifdef UDP_CFG_IN_CHECKSUM */
-
-	iph = GET_IP_HDR(input);
-
-	/* 宛先アドレスとポートをチェックする */
-	for (ix = tmax_udp_ccepid; ix -- > 0; ) {
-		cep = &udp_cep[ix];
-		if (VALID_UDP_CEP(cep) &&
-		    udp_is_dstaddr_accept(&cep->myaddr.ipaddr, &iph->dst) &&
-		    ntohs(udph->dport) == cep->myaddr.portno) {
-			len = (uint_t)(ntohs(udph->ulen) - UDP_HDR_SIZE);
-
-			if (cep->rcv_tskid != TA_NULL) {	/* 非ノンブロッキングコールでペンディング中 */
-				if (psnd_dtq(cep->rcvqid, (intptr_t)input) != E_OK)
-					goto buf_rel;
-				}
-
-#ifdef UDP_CFG_NON_BLOCKING
-
-			else if (cep->rcv_p_dstaddr != NULL) {	/* ノンブロッキングコールでペンディング中 */
-
-				/* p_dstaddr を設定する。*/
-				cep->rcv_p_dstaddr->portno = ntohs(udph->sport);
-				IN_COPY_TO_HOST(&cep->rcv_p_dstaddr->ipaddr, &GET_IP_HDR(input)->src);
-
-				/* データをバッファに移す。*/
-				memcpy(cep->rcv_data, GET_UDP_SDU(input, *offp),
-				       (size_t)(len < cep->rcv_len ? len : cep->rcv_len));
-				syscall(rel_net_buf(input));
-
-				if (IS_PTR_DEFINED(cep->callback))
-
-#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
-
-					(*cep->callback)(GET_UDP_CEPID(cep), TFN_UDP_RCV_DAT, (void*)(uint32_t)len);
-
-#else	/* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
-
-					(*cep->callback)(GET_UDP_CEPID(cep), TFN_UDP_RCV_DAT, (void*)&len);
-
-#endif	/* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
-
-				else
-					syslog(LOG_WARNING, "[UDP] no call back, CEP: %d.", GET_UDP_CEPID(cep));
-				cep->rcv_p_dstaddr = NULL;
-				}
-
-#endif	/* of #ifdef UDP_CFG_NON_BLOCKING */
-
-			else if (IS_PTR_DEFINED(cep->callback)) {
-
-				/* コールバック関数を呼び出す。*/
-				cep->cb_netbuf = input;
-
-#ifdef TCP_CFG_NON_BLOCKING_COMPAT14
-
-				(*cep->callback)(GET_UDP_CEPID(cep), TEV_UDP_RCV_DAT, (void*)(uint32_t)len);
-
-#else	/* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
-
-				(*cep->callback)(GET_UDP_CEPID(cep), TEV_UDP_RCV_DAT, (void*)&len);
-
-#endif	/* of #ifdef TCP_CFG_NON_BLOCKING_COMPAT14 */
-
-				/*
-				 *  ネットワークバッファがそのままであれば、コールバック関数内で
-				 *  データを読み出さなかったことになるので、捨てる。
-				 */
-				if (cep->cb_netbuf != NULL)
-					syscall(rel_net_buf(cep->cb_netbuf));
-				}
-			else
-				goto buf_rel;
-
-			return IPPROTO_DONE;
-			}
-		}
-
-	NET_COUNT_MIB(udp_stats.udpNoPorts, 1);
-
-#if defined(SUPPORT_INET4)
-
-	/* ローカル IP アドレスに届いたデータグラムのみ ICMP エラーを通知する。*/
-	if (ntohl(iph->dst) == IF_GET_IFNET()->in_ifaddr.addr) {
-		syslog(LOG_INFO, "[UDP] unexp port: %d.", ntohs(udph->dport));
-
-		icmp_error(ICMP4_UNREACH_PORT, input);
-		/* icmp_error では、ネットワークバッファ input を返却しないので下へ抜ける。*/
-		}
-
-#endif	/* of #if defined(SUPPORT_INET4) */
-
-#if defined(SUPPORT_INET6)
-
-	/* マルチキャストアドレスに届いたデータグラムは ICMP エラーを通知しない。*/
-	if (!IN6_IS_ADDR_MULTICAST(&iph->dst)) {
-		syslog(LOG_INFO, "[UDP] unexp port: %d.", ntohs(udph->dport));
-
-		/* icmp6_error で、ネットワークバッファ input を返却する。*/
-		icmp6_error(input, ICMP6_DST_UNREACH, ICMP6_DST_UNREACH_NOPORT, 0);
-
-		NET_COUNT_UDP(net_count_udp.in_err_packets, 1);
-		NET_COUNT_MIB(udp_stats.udpInErrors, 1);
-		return IPPROTO_DONE;
-		}
-
-#endif	/* of #if defined(SUPPORT_INET6) */
-
-buf_rel:
-	NET_COUNT_UDP(net_count_udp.in_err_packets, 1);
-	NET_COUNT_MIB(udp_stats.udpInErrors, 1);
-	syscall(rel_net_buf(input));
-	return IPPROTO_DONE;
-	}
+#endif	/* of #if defined(_IP4_CFG) && TNUM_UDP4_CEPID > 0 */
 
 #endif	/* of #ifdef SUPPORT_UDP */
