(toppers-users 4192) Re: TINET リリース 1.5.3 と 1.4.5 の配布のお知らせ

長島 宏明 nagasima @ core-s.co.jp
2013年 12月 11日 (水) 14:33:03 JST


阿部先生

お世話になります。
長島と申します。

ASP用TINETを使用させていただいております。

> 皆様から、問題点だけではなく、ご要望もお待ちしております。
ということなので、1つ要望があります。
IPv4でもマルチキャストに対応していただけないでしょうか。

こちらでも処理を盛り込んでみましたが、
今後のバージョンに機能を盛り込んでいただければ幸いです。

参考になるわかりませんが、差分を添付いたしました。

よろしくお願いします。

(2013/12/10 13:01), 阿部 司 wrote:
> TOPPERS ユーザの皆様
> 
> 苫小牧高専、情報工学科の阿部です。
> TOPPERS プロジェクト様のホームページから、
> TINET リリース 1.5.3 と TINET リリース 1.4.5 の配布を開始しました。
> URL は、
> 
>    TINETとは(TOPPERS プロジェクト)
>      http://www.toppers.jp/tinet.html
> 
>    ダウンロード(TOPPERS プロジェクト)
>      http://www.toppers.jp/tinet-download.html
> 
> となっております。
> 
> 変更内容に関しては、tinet_chg.pdf(tinet_chg.txt)を参照してください。
> 
> 皆様から、問題点だけではなく、ご要望もお待ちしております。
> それでは、今後ともよろしくお願いいたします。
> 

-------------- next part --------------
--- tinet/net/ethernet.c	Tue Dec 10 09:02:17 2013
+++ tinet/net/ethernet.c	Wed Dec 11 13:45:39 2013
@@ -222,16 +222,27 @@
 {
 	T_IF_SOFTC	*ic;
 	ER		error = E_OK;
+	T_ETHER_HDR *eth;
 
 	/* ????? MAC ???????????熙????*/
 	ic = IF_ETHER_NIC_GET_SOFTC();
-	memcpy(GET_ETHER_HDR(output)->shost, ic->ifaddr.lladdr, ETHER_ADDR_LEN);
+	eth = GET_ETHER_HDR(output);
+	memcpy(eth->shost, ic->ifaddr.lladdr, ETHER_ADDR_LEN);
 
-	switch(ntohs(GET_ETHER_HDR(output)->type)) {
+	switch(ntohs(eth->type)) {
 
 #if defined(SUPPORT_INET4)
 
 	case ETHER_TYPE_IP:		/* IPv4	*/
+#ifdef ETHER_CFG_MULTICAST
+		/* ????????罕???????????????*/
+		if(IN4_IS_ADDR_MULTICAST(*(uint32_t*)dst)){
+			/* ??????????????????????罕?????????????????? */
+			ether_map_ipv4_multicast((T_ETHER_ADDR *)&eth->dhost, *(T_IN4_ADDR*)dst);
+			error = ether_raw_output(output, tmout);
+			break;
+			}
+#endif
 		if (arp_resolve(&ic->ifaddr, output, *(uint32_t*)dst)) {	/* true ???鬣????????霄? */
 			error = ether_raw_output(output, tmout);
 			}
@@ -375,7 +386,7 @@
 	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);
 			eth = GET_ETHER_HDR(input);
--- tinet/netinet/if_ether.c	Tue Dec 10 09:02:36 2013
+++ tinet/netinet/if_ether.c	Wed Dec 11 13:45:42 2013
@@ -492,4 +492,21 @@
 	timeout(arp_timer, NULL, ARP_TIMER_TMO);
 	}
 
+#ifdef ETHER_CFG_MULTICAST
+/*
+ *  ether_map_ipv4_multicast -- IPv4 ????????罕?????????????鬣?????????????????????罕??????????????????
+ */
+
+void
+ether_map_ipv4_multicast (T_ETHER_ADDR *eaddr, T_IN4_ADDR maddr)
+{
+	eaddr->lladdr[0] = UINT_C(0x01);
+	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;
+	}
+#endif	/* ETHER_CFG_MULTICAST */
+
 #endif	/* of #if defined(SUPPORT_INET4) && defined(SUPPORT_ETHER) */
--- tinet/netinet/if_ether.h	Tue Dec 10 09:02:42 2013
+++ tinet/netinet/if_ether.h	Wed Dec 11 13:45:44 2013
@@ -111,6 +111,10 @@
 extern void arp_init (void);
 extern const T_ARP_ENTRY *arp_get_cache (void);
 
+#ifdef ETHER_CFG_MULTICAST
+extern void ether_map_ipv4_multicast (T_ETHER_ADDR *eaddr, T_IN4_ADDR maddr);
+#endif /* ETHER_CFG_MULTICAST */
+
 /*
  *  TINET ???? API
  */
--- tinet/netinet/in_rename.h	Tue Dec 10 09:02:43 2013
+++ tinet/netinet/in_rename.h	Wed Dec 11 13:45:46 2013
@@ -210,6 +210,8 @@
 #define arp_init		_tinet_arp_init
 #define arp_get_cache		_tinet_arp_get_cache
 
+#define ether_map_ipv4_multicast	_tinet_ether_map_ipv4_multicast
+
 /* netinet6/icmp6.c */
 
 #define icmp6_input		_tinet_icmp6_input
--- tinet/netinet/ip_input.c	Tue Dec 10 09:02:37 2013
+++ tinet/netinet/ip_input.c	Wed Dec 11 13:45:49 2013
@@ -468,12 +468,22 @@
 
 #else	/* of #ifdef DHCP_CFG */
 
+#if defined(ETHER_CFG_MULTICAST)
+	if (!(dst == ifp->in_ifaddr.addr || dst == bc ||
+		  dst == IPV4_ADDR_BROADCAST || dst == IPV4_ADDRANY ||
+		  IN4_IS_ADDR_MULTICAST(dst))) {
+		NET_COUNT_IP4(net_count_ip4[NC_IP4_IN_ERR_ADDR], 1);
+		NET_COUNT_MIB(ip_stats.ipInAddrErrors, 1);
+		goto buf_rel;
+		}
+#else
 	if (!(dst == ifp->in_ifaddr.addr || dst == bc ||
 	      dst == IPV4_ADDR_BROADCAST || dst == IPV4_ADDRANY)) {
 		NET_COUNT_IP4(net_count_ip4[NC_IP4_IN_ERR_ADDR], 1);
 		NET_COUNT_MIB(ip_stats.ipInAddrErrors, 1);
 		goto buf_rel;
 		}
+#endif
 
 #endif	/* of #ifdef DHCP_CFG */
 
--- tinet/netinet/ip_output.c	Tue Dec 10 09:02:38 2013
+++ tinet/netinet/ip_output.c	Wed Dec 11 13:45:50 2013
@@ -106,7 +106,7 @@
 
 static uint16_t frag_id = 0;
 
-/*
+ /*
  *  IP output -- IP ??????????
  *
  *    ???: ???????逾?????????????蟆????????熙????
@@ -305,7 +305,14 @@
 	NET_COUNT_IP4(net_count_ip4[NC_IP4_OUT_OCTETS], ntohs(ip4h->len));
 	NET_COUNT_IP4(net_count_ip4[NC_IP4_OUT_PACKETS], 1);
 
+#ifdef ETHER_CFG_MULTICAST
+	/* ????????罕??????????????遉?IP????????????????? */
+	gw = ntohl(ip4h->dst);
+	if(!IN4_IS_ADDR_MULTICAST(gw))
+		gw = in4_rtalloc(gw);
+#else
 	gw = in4_rtalloc(ntohl(ip4h->dst));
+#endif
 	IF_SET_PROTO(output, IF_PROTO_IP);
 	if ((error = IF_OUTPUT(output, &gw, NULL, tmout)) != E_OK)
 		NET_COUNT_IP4(net_count_ip4[NC_IP4_OUT_ERR_PACKETS], 1);
--- tinet/netinet/udp_input.c	Tue Dec 10 09:02:41 2013
+++ tinet/netinet/udp_input.c	Wed Dec 11 13:45:53 2013
@@ -149,6 +149,30 @@
 		return IN_IS_DSTADDR_ACCEPT(myaddr, dstaddr);
 	}
 
+#elif defined(ETHER_CFG_MULTICAST)
+
+/*
+ *  udp_dstaddr_accept -- UDP ???????隘?????????????????????????????
+ *
+ *    ????????遉筵????????鬣爨????????
+ *
+ *      ???????隘??????????????????罕???
+ */
+
+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);
+
+	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);
+	}
+
 #else	/* of #ifdef DHCP_CFG */
 
 /*