(toppers-users 4112) ICMP エラーメッセージの宛先 IP アドレスのバイトオーダーについて

Shigenori Kimura skimura @ mvd.biglobe.ne.jp
2013年 7月 2日 (火) 12:54:25 JST


 ASP用 TINET 1.5.2 (2011-05-11) を、Renesas の RX62N (Little 
Endian, IPV4, ethernet) に移植しています。

 現在のところ、DHCP、DNS、HTTP の各クライアントと、FTP の
サーバが動作しています。

 最近気付いたのですが、Destination Port Unreachable 
(ICMP4_UNREACH_PORT) の ICMP エラーメッセージを送信する際、
IP ヘッダ内の宛先 IP アドレスが、ホストバイトオーダーで出力さ
れているようです。

 私なりに原因を探ったところ、netinet/ip_icmp.c 内の関数 
icmp_error () 内の処理にて、関数 in4_get_datagram () を呼び
出す際の引数 T_IN4_ADDR *dstaddr に対応するものとして、受信
した IPv4 データグラム内の送信元アドレス &ip4h->src をそのま
ま、即ち、ネットワークバイトオーダーで渡しているのが理由では
ないかと推測しています。

 ip4h->src をコピーして、ntohl() したアドレスを、上述の関数
 in4_get_datagram () に渡すように変更してみたところ、ICMP エ
ラーメッセージの IP ヘッダ内宛先 IP アドレスが、期待の値にな
ることを確認しました。この変更部分コードは、おおよそ下記のよ
うな感じです。

    T_IN4_ADDR	addr;

    addr = ntohl(ip4h->src);
    in4_get_datagram(..., &addr, ...);

 但し、icmp_error () が呼び出される全ての状況を考慮したもの
ではないため、自信がありません。

 アドバイスを頂ければ幸いです。

 よろしくお願い申し上げます。