(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 *)ð->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 */
/*