[Armadillo:02262] Re: Armadillo220のLANの結線状況の取得

林田 平馬 email@hidden
2007年 10月 18日 (木) 10:34:56 JST


yashiさん
お世話になります。

林田です。

やりたいこととしては、その時点(現在は起動時)で、物理的にケーブルが
ささっているかどうかの判定をしたいと考えています。

そこでeth_link_get.cをコンパイルし(実際には利用したいアプリケーションに
組み込んでサブルーチンとして実行してます)、/etc/init.d/rcにて起動時に
実行してます。この時、固定IPでIPアドレスを設定しているとケーブルを
抜いた状態(挿していない状態)の時でもLINK UPが表示されます。
DHCPに設定した場合はこの関数でうまく判定ができています。

サービス起動の前の方で行われるifup -aコマンドでは固定IPであろうが、
DHCPであろうが、関係なくLANケーブルを挿してない状況ではLink is down !
のコメントが表示されてますので、何らかの方法で確認はできるようですが、
残念ながら下記コードでは(固定アドレスの場合)、うまく判定ができていません。
また先日メーリングリストに流れてました、「[Armadillo:02206] Re: リンクアップ
/ダウンを検出する方法」にありますコードも試しましたが同様の結果で判別
できませんでした。


int Eth_Link_Get(char *iface)
{
 struct ifreq ifreq;
 int fd;
 int ret;

 memset(&ifreq, 0, sizeof(struct ifreq));

 fd = socket(PF_INET, SOCK_RAW, IPPROTO_RAW);
 if (fd < 0) {
  printf("LINK DOWN.\n");
  return 1;
 }

 strcpy(ifreq.ifr_ifrn.ifrn_name, iface);

 ret = ioctl(fd, SIOCGIFFLAGS, &ifreq);
 if (ret < 0) {
  printf("LINK DOWN.\n");
  return 1;
 }

// if(ifreq.ifr_flags & IFF_RUNNING){
 if(ifreq.ifr_flags & IFF_UP){
  if (ioctl(fd, SIOCGIFADDR, &ifreq) == 0) {
                // リンクアップ
   printf("LINK UP.\n");
   return 0; /* up */
        }
 }

 printf("LINK DOWN.\n");
 return 1; /* down */
}


>>
>> ダウンロードサイトから製品イメージLinuxカーネルv1.04をダウンロードし
>> 試しましたが、ケーブルを抜いていても「UP」が返ってきます。
>
> 「eth_link_get.cをコンパイルし、実行した状況でケーブルを抜くとupが返る」
> という認識で良いです?
> -- 
>           yashi
>




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