【Ethernet】車載ネットワーク その33【lwIP⑨】

車載ネットワーク

バックナンバーはこちら。
https://www.simulationroom999.com/blog/In-vehicle-network-backnumber/

はじめに

lwIPのリンクアップについて。

登場人物

博識フクロウのフクさん

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1

エンジニア歴8年の太郎くん

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1

リンクアップ

フクさん
フクさん

今回はlwIPのリンクアップについて。

  • lwIP自身の初期化
  • ネットワークインターフェースの追加
  • マルチキャストグループの参加
  • ネットワークインターフェースの初期化
  • リンクアップ ← これ
  • UDP Socket生成
  • IPアドレス、ポートへのBind
  • UDP受信待ち
  • EthnertFrameの疑似受信
太郎くん
太郎くん

リンクアップっなんだっけ?

フクさん
フクさん

IT用語辞典e-Wordsから引っ張ってきた。

リンクアップとは、コンピュータや通信機器(および内部のポートやコネクタ、アダプタ)がケーブルや無線などで別の装置と接続され、通信可能な状態になること。また、そのような状態。物理的に電気信号や電波の送受信が可能な状態か、いわゆるデータリンク層(リンク層/第2層)の通信規格に則ってフレームやデータグラムといった基礎的な送受信単位での通信が可能な状態を指す。一般的には後者を意味することが多い。

IT用語辞典e-Wordsより
太郎くん
太郎くん

そういえば、前回出てきた用語で「ネットワークインターフェースのUP」ってのがあったね?
前回のが物理層の話で、
今回のリンクアップがデータリンク層の話なのかな?

フクさん
フクさん

そうだね。
ネットワークインターフェースのUP

データリンクのUP
の2段階があると思えばOKだよ。

リンクアップ時に呼び出す関数(netif_set_link_up)

太郎くん
太郎くん

で、今回のAPIは?

フクさん
フクさん

netif_set_link_upって関数になるね。
引数は一個だけで、初期化済みのnetif構造体。
事前にインターフェースUPを済ませることを求められる。
まぁ、インターフェースUPは無くても動くこと多いけど。

太郎くん
太郎くん

これも中身はフラグを書き換えてるだけだったり。

netif_set_link_upの中身

フクさん
フクさん

一応、コードを張っておこう。

/**
 * @ingroup netif
 * Called by a driver when its link goes up
 */
void
netif_set_link_up(struct netif *netif)
{
  LWIP_ASSERT_CORE_LOCKED();

  LWIP_ERROR("netif_set_link_up: invalid netif", netif != NULL, return);

  if (!(netif->flags & NETIF_FLAG_LINK_UP)) {
    netif_set_flags(netif, NETIF_FLAG_LINK_UP);

#if LWIP_DHCP
    dhcp_network_changed(netif);
#endif /* LWIP_DHCP */

#if LWIP_AUTOIP
    autoip_network_changed(netif);
#endif /* LWIP_AUTOIP */

    netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV4 | NETIF_REPORT_TYPE_IPV6);
#if LWIP_IPV6
    nd6_restart_netif(netif);
#endif /* LWIP_IPV6 */

    NETIF_LINK_CALLBACK(netif);
#if LWIP_NETIF_EXT_STATUS_CALLBACK
    {
      netif_ext_callback_args_t args;
      args.link_changed.state = 1;
      netif_invoke_ext_callback(netif, LWIP_NSC_LINK_CHANGED, &args);
    }
#endif
  }
}
太郎くん
太郎くん

netif_set_flags(netif, NETIF_FLAG_LINK_UP);
でフラグを切り替えてるのは予想通りだけど、
DHCPでIPアドレスの取得もやってるのかな?

フクさん
フクさん

そうだね。
この段階ではまだIPアドレスは割り振られないけど、
DHCPサーバへのリクエストが発行される。
まぁ今回は使わないけどね。

太郎くん
太郎くん

あと、AUTOIPってなんだろ?

フクさん
フクさん

あー。
リンクローカルアドレスの割り振りだねー。

リンクローカルアドレス

太郎くん
太郎くん

リンクローカルアドレス???

フクさん
フクさん

Wikipediaから持ってきたよ。

コンピュータネットワークにおいて、リンクローカルアドレス(英語: link-local address)とは、ホストが接続されているネットワークセグメント(リンク)またはブロードキャストドメイン内の通信に対してのみ有効なネットワークのアドレスである。リンクローカルアドレスは、ネットワークセグメントを超えてユニークであることが保証されていない。そのため、ルーターはリンクローカルアドレスを使用したパケットを転送しない。リンクローカルアドレスのみを持つプロトコル(イーサネットなど)では、ベンダーIDとシリアルIDで構成されたハードウェアアドレスがネットワーク機器の製造元によって割り当てられており、これはユニークである。IPv4のリンクローカルアドレスは、アドレスブロック 169.254.0.0/16(CIDR表記)で定義されている。 IPv6では、ブロック fe80::/10 として定義され、プリフィックス fe80::/64 が割り当てられている。

Wikipediaより
太郎くん
太郎くん

169.254.0.0/16?
なんか見覚えがあるような???

フクさん
フクさん

DHCPサーバが見つからなかった場合にWindowsで勝手に割り当てられるIPアドレスのこと?

太郎くん
太郎くん

あーそれそれ!

太郎くん
太郎くん

あれがリンクローカルアドレスなの??

フクさん
フクさん

うん。そうだよ。

太郎くん
太郎くん

ちゃんと意味のあるIPアドレスだったんかーー?!
てっきりWindows側で適当な不定値が入ってて、たまたま毎回似たような数値になっているだけかと思ってた!!

フクさん
フクさん

まぁ、そこを気にする人もあんまり居ないよねー。

太郎くん
太郎くん

今回は予想以上に勉強になった!

まとめ

フクさん
フクさん

まとめだよ。

  • lwIPのリンクアップについて説明。
    • アップ(UP)が物理層。
    • リンクアップ(link-up)がデータリンク層。
  • 余談的にリンクローカルアドレスの説明。

バックナンバーはこちら。

コメント

タイトルとURLをコピーしました