[Armadillo:01760] Re: Armadillo-210のdhcpdでのエラー

林田 平馬 email@hidden
2007年 7月 17日 (火) 04:20:26 JST


林田です。

上記タイトルのエラーですが何とか解決できました。
小俣さんに提供していただいたdhcpdumpのおかげで、問題をカーネルと切り離す
ことができたので、ISC-DHCPのバグと決め打ちし、ソースとにらめっこしました。
ソース中のエラーを吐いていた関数(decode_udp_ip_header)をgrepで特定し、再度
ググリ直し、ISC-DHCP 3.0.3で修正された下記の問題を見つけました。

decode_udp_ip_header was changed so that the IP address was copied out to a 
variable,
rather than referenced by a pointer. This enforces 4-byte alignment of the 
32-bit IP
address value. Thanks to a patch from Dr. Peter Poeml.
詳細はわかりませんが、カーネルから渡されたパケットのヘッダデータを配列(構造体) 

に格納(decode_udp_ip_headerの仕事)する際に、ずれて、値が壊れていただけのようです。


そこで最新版である3.0.6のソースを参考に、Atmark-dist付属(バージョン2.5)版の
decode_udp_ip_header関数の入れ替えを行いました。

行った作業としては

1、DISTROOT/user/dhcp-isc/common/packet.c内にあるdecode_udp_ip_header関数
  を3.0.6版のものにコピペ。

2、decode_udp_ip_header関数の引数が少し変更されているので、プロトタイプ宣言部分
  (〜/dhcp-isc/includes/dhcpd.h内)の変更。これも3.0.6版からコピペ。

3、decode_udp_ip_header関数が呼び出される〜/dhcp-isc/common/nit.c , lpf.c , 
dlpi.c ,
    upf.c , bpf.cのそれぞれの該当部分(grepで確認してください)を3.0.6版を参考に修正。
    エラーログを吐く部分の変数の扱いなどは、適当にながしました。

恐らくこれで動くようになると思います。
もしダメなら、3.0.6版の〜/dhcp-isc/common/bpf.c内にあるBPF-WORDALIGNで処理し
ている部分を参考に、現行版の〜/dhcp-isc/common/bpf.cを修正してみてください。
上記の作業をする前に、この作業を行ってうまくいかず、そのまま続けて上記の作業を 

行いうまくいったので、必須かどうかわからなくなりました。

以上です。

何とか動いてくれて、ホッとしました。
小俣さんの手厚いサポートが無ければ、見つけきれなかったと思います。
本当にありがとうございました。

同時に行っていた、pppdのオンデマンドダイヤルの方も、Armadillo210で動いてくれまし
た(auの携帯モデムと接続)ので、初期の目標であったダイヤルアップサーバとしての
機能を持たせることはできました。引続き200シリーズ(Atmark-dist)で用意されている 

他の機能を検証しながら、小型で低消費電力な特徴を活かし、遠隔無人監視システム
などへの応用を目指したいと思います。






armadillo メーリングリストの案内