(toppers-users 4001) Re: TINETのマルチキャスト送受信について教えてください。

高橋和浩@nifty takahashi_kazuhiro @ nifty.com
2012年 7月 18日 (水) 13:23:49 JST


阿部先生、MLの皆様
お世話になっております。アライブビジョンソフトウエアの高橋です。

tinetのマルチキャスト受信のほうですが、少し時間がかかっていましたが、
なんとかできるようになりました。
tinetのソースを「変更部分」のように変更すれば受信可能になりました。
あまり、役に立つ情報でもないかもしれませんが、一応情報としてあげておきます。

試験環境
相手 linux fedora core5 udpIPV6マルチキャスト送信プログラム(自作)
ターゲット akih8_3069f_lan usrv6 にポート番号のみ変更(実験に特に変更は必要ないです)

変更部分---------------------------------------------------------------------------
tinet\net\ethernet.h
#define MAX_IF_MADDR_CNT	3			/* 2-->3 インタフェースのマルチキャストアドレス配列の最大サイズ	*/
#define IF_MADDR_INIT		{ { { 0, 0, 0, 0, 0, 0 } }, { { 0, 0, 0, 0, 0, 0 } }, { { 0, 0, 0, 0, 0, 0 } } }	//2-->3組

tinet\netinet6\in6.h
#define IPV6_ADDR_INT32_MDNS	ULONG_C(0x000000FB)			//Big 
#define IPV6_ADDR_INT32_MDNS	ULONG_C(0xFB000000)			//Little

tinet\netinet6\in6_var.h
#define IPV6_MADDR_IX_MDNS		2		//追加
#define IPV6_MADDR_IX_EXTRA		3		//2-->3


tinet\netinet6\in6.c in6_addr2maix () 以下のように修正
			if (addr->s6_addr8[11] == 0x01 && addr->s6_addr8[12] == 0xff)
				return IPV6_MADDR_IX_SOL_NODE;
			else {
				if (addr->s6_addr8[15] == 0xfb)
					return(IPV6_MADDR_IX_MDNS);
				else
					return IPV6_MADDR_IX_LL_ALL_NODE;
				}
			}

tinet\netinet6\in6.c in6_update_ifa ()
		/* 全ノード・リンクローカル・マルチキャストアドレスを登録する。*/
		llsol.s6_addr32[2] = 0x00000000;
//		llsol.s6_addr32[3] = IPV6_ADDR_INT32_ONE;			//削除
		llsol.s6_addr32[3] = IPV6_ADDR_INT32_MDNS;			//追加
		if ((error = in6_addmulti(ifp, &llsol)) != E_OK)
			return error;


		llsol.s6_addr32[3] = IPV6_ADDR_INT32_ONE;			//追加
		if ((error = in6_addmulti(ifp, &llsol)) != E_OK)		//追加
			return error;						//追加
--------------------------------------------------------------------------------------------
コメント等ありがとうございました。
また、お聞きしたいことがでてくると思いますので、これからもよろしく
お願いします。

---
アライブビジョンソフトウエア株式会社
高橋和浩
673-0005兵庫県明石市小久保2-2-7幹線ビル4F
Email:takahashi_kazuhiro @ nifty.com
http://homepage3.nifty.com/ALVS/