楽墨堂ソフトウェア研究室:Digi Connect ME:IPのリアルタイム設定
 

コモンライブラリを使用してIP情報を設定するためのテストプログラム。
設定はリセットが必要なくリアルタイムで反映される。
以下のソースコードを/netos63_gnu/src/apps/に展開。
ipset_test.zip

ビルド方法:
NET+Works 6.3 Build Enviromentを起動
$ cd src/apps/ipset_test/32b
$ make PLATFORM=connectme clean all

プログラムの説明:
  NAsetSysAccess(NASYSACC_ADD, "user", "pass", NASYSACC_LEVEL_HTTP_R1 | NASYSACC_LEVEL_RW, NULL);
  flashftp_start("ipset_test");
ユーザ名とパスワードを設定しフラッシュ書込み用ftpサーバを起動。
userとpassは自由に変更しても良い。
ここで指定されるものを使ってftpクライアントはftpサーバに接続できる。

  char s[64];
  printf ("[d]hcp or [s]tatic or [c]urrent [r]estart? ");
  int slen = getline(s, sizeof(s), ebtNormal);
コマンドプロンプトを表示し文字列を1行(リターンが押されるまで)入力。
リターンキーコードは含まれない。
第1引数は文字列の返されるバッファへのポインタを指定。
第2引数で文字列の長さを指定。この長さより長い文字列入力を抑制する。
文字列最後は必ず0なので入力出来る文字列の最大サイズはこの値から1を引いたものとなる。
第3引数でエコーバックはノーマル指定。(入力文字がそのまま表示される)
ebtNoneを指定すればエコーバック無し。
ebtSecretを指定すればエコーバックは必ず*と表示される。
戻り値は入力された文字列のサイズ。すなわち strlen(s) と同様の値となる。

  aceAddrInfo addr_info;
  customizeAceGetInterfaceAddrInfo(BP_ETH_INTERFACE, &addr_info);
aceAddrInfo構造体の変数addr_infoに現在設定されている情報を取得する。
これは様々なIP関連の現状情報を含んでいる。

  static devBoardParamsType nvParams;
  static aceConfigInterfaceInfo* eth_config;
  eth_config = get_board_params_type(&nvParams);
devBoardParamsType構造体の変数であるnvParamsにボード関連設定情報を得る。
またaceConfigInterfaceInfo構造体へのポインタ変数であるeth_configに有効値を設定。
以下に示すように各IP関連の設定値はeth_configを使って取得する。
補足:devBoardParamsType構造体への変数はこの例のようにstaticで確保すること。
   これはdevBoardParamsType構造体のサイズが大きく、通常のスタックサイズでは問題を起こすためである。

  configAceStaticInfo* config = &eth_config->static_config;
  aceProtoStartInfo* startInfo = &config->startInfo;
スタティックIP関連の設定値を示すconfigAceStaticInfo構造体へのポインタを得る。
ここで &eth_config->static_config は &(eth_config->static_config) の意なので注意。
また起動情報を示すaceProtoStartInfo構造体へのポイントも得る。

  configAceDhcpInfo* config = &eth_config->dhcp_config;
DHCP関連の設定値を示すconfigAceDhcpInfo構造体へのポインタを得る。

  configAceBootpInfo* config = &eth_config->bootp_config;
  configAceAutoipInfo* config = &eth_config->autoip_config;
  configAceRarpInfo* config = &eth_config->rarp_config;
  configAcePingArpInfo* config = &eth_config->ping_arp_config;
BOOTP関連の設定値を示すconfigAceBootpInfo構造体へのポインタを得る。
AUTOIP関連の設定値を示すconfigAceAutoipInfo構造体へのポインタを得る。
RARP関連の設定値を示すconfigAceRarpInfo構造体へのポインタを得る。
PingArp関連の設定値を示すconfigAcePingArpInfo構造体へのポインタを得る。

  printf("DHCP selected\n");
  if (is_network_linking()) {
    printf("wait...\n");
    set_dhcp_ip();
    if (wait_until_network_ip_configured(NABspTicksPerSecond * 60) == 0)	{
      printf("ok\n");
    }
    else {
      printf("time out (not founded dhcp server)\n");
    }
  }
  else {
    printf("please connect network cable.\n");
  }
DHCPによるIP設定を行う部分。
まず is_network_linking() でLANケーブルが接続されているか調べる。
接続されているならば set_dhcp_ip() でDHCPによるIP取得をするように設定。
wait_until_network_ip_configured(NABspTicksPerSecond * 60) で60秒まで設定完了を待つ。
この関数の戻り値が非0である場合はDHCPによるIP取得が指定時間で完了していないこと(タイムアウト)を示す。

  printf("Static selected\n");
  unsigned long	addr, mask, gateway, dns0, dns1, dns2;
  get_static_ip(&addr, &mask, &gateway, &dns0, &dns1, &dns2);
  NAInet_toa(addr, s);
  printf("ip_addr     [%s]: ", s); getline(s, sizeof(s), ebtNormal);
  if (s[0] != 0) addr = NAInet_addr(s);
  NAInet_toa(mask, s);
  printf("subnet_mask [%s]: ", s); getline(s, sizeof(s), ebtNormal);
  if (s[0] != 0) mask = NAInet_addr(s);
  NAInet_toa(gateway, s);
  printf("gateway     [%s]: ", s); getline(s, sizeof(s), ebtNormal);
  if (s[0] != 0) gateway = NAInet_addr(s);
  NAInet_toa(dns0, s);
  printf("dns0        [%s]: ", s); getline(s, sizeof(s), ebtNormal);
  if (s[0] != 0) dns0 = NAInet_addr(s);
  NAInet_toa(dns1, s);
  printf("dns1        [%s]: ", s); getline(s, sizeof(s), ebtNormal);
  if (s[0] != 0) dns1 = NAInet_addr(s);
  NAInet_toa(dns2, s);
  printf("dns2        [%s]: ", s); getline(s, sizeof(s), ebtNormal);
  if (s[0] != 0) dns2 = NAInet_addr(s);

  printf("wait...\n");
  set_static_ip(addr, mask, gateway, dns0, dns1, dns2);
  if (wait_until_network_ip_configured(NABspTicksPerSecond * 60) == 0) {
    printf("ok\n");
  }
  else {
    printf("time out\n");
  }
スタティックIP設定を行う部分。
unsigned long addr, mask, gateway, dns0, dns1, dns2;
設定する値を入力保持する変数。
get_static_ip(&addr, &mask, &gateway, &dns0, &dns1, &dns2);
にて現在の設定値を取得しておく。
NAInet_toa(addr, s);
addrの内容を文字列にする。strcpy(s, ip2a(addr)); としても良い。
printf("ip_addr [%s]: ", s); getline(s, sizeof(s), ebtNormal);
現在のaddrの内容を表示し、設定値の入力をする。
if (s[0] != 0) addr = NAInet_addr(s);
リターンのみの入力(文字列は空となる)でない場合は入力された文字列を変換してaddrに入れる。
不正な入力の場合はaddrは 0 となる。
以下同様に mask, gateway, dns0, dns1, dns2 の値を決めていく。
次に
set_static_ip(addr, mask, gateway, dns0, dns1, dns2);
でスタティックIPを設定する。
wait_until_network_ip_configured(NABspTicksPerSecond * 60) で60秒まで設定完了を待つ。
この関数の戻り値が非0である場合はIP設定が指定時間で完了していないこと(タイムアウト)を示す。
補足:スタティックIPの設定の場合、ここでタイムアウトになることは通常では考えられない。

32b/makefileには
ROM用ファイルを作成しない指定:
 BUILD_ROM_IMAGE= 0
コモンライブラリファイル(flashftp.c,nvram.c,net.c,serial.c)の追加:
 APP_C_FILES=root.c \
  flashftp.c \
  nvram.c \
  net.c \
  serial.c
コモンライブラリへのソース検索パスの追加:
 vpath %.c ../../common
コモンライブラリへのインクルード検索パスの追加:
 APP_INCDIRS= -I.. -I../../common
を設定している。コモンライブラリを使う場合には同様の設定がmakefileに必要となるので覚えておくこと。


補足:
起動するとコマンドプロンプトが表示されるのでコマンド頭文字(小文字)を入力しリターンキーを押すことで実行される。
cコマンドで最初に表示される情報のうち protocol は何によって現在のIPが得られたかを示している。
この値が2であればDHCP、6であればスタティックにてIPが設定されていることを示す。
その他、スタティックIP情報とDHCP関連情報は常に表示される。
BOOTP,AUTOIP,RARP,PingArpに関する情報はそれぞれがイネーブルの時のみ表示する。
スタティックIPを設定したい場合はsコマンドを入れ表示される項目に従い設定値を入れる。
表示されるディフォルト値のままで良ければリターンのみ入力すれば良い。
DHCPによるIP設定をしたい場合はdコマンドを入力。
この時、LANケーブルが接続されていない場合はメッセージを出してコマンドがキャンセルされる。
接続されている場合でも60秒の間にDHCPサーバからの反応が無い場合はタイムアウトを表示する。


 
Copyright© 2006 Laksmi-Do Corp. All rights reserved.
連絡先(@を半角に) develop@laksmido.com