バックナンバーはこちら。
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)がデータリンク層。
- 余談的にリンクローカルアドレスの説明。
バックナンバーはこちら。
コメント