今日の進捗

  • TCP/IP Illustrated Volume 2: The Implementation

今日の進捗というか、今週の進捗になりつつあるかも。家帰って書くより研究室で書いた方がいいかな。それから、1週間に1章のペースがまだ保たれている。つまり1ヶ月続いた。自分にしてはかなり珍しい気がする。このまま32章まで続けばいいなぁ。


自分用に4章まとめ。後から読み返して思い出せればいいので適当。

  • Ethernet(LANCE Ethernet Card: le)がフレームを送受信するときにどんな挙動をするか?
    • 受信
      • フレーム受信→割り込み発生→leintr呼び出し
      • lereadを呼び出してleintrから渡されたフレームからデータを読み込む
      • ether_inputを呼び出して、ブロードキャストかマルチキャストかどうかを判定する
      • 直後、フレームヘッダに応じたインプットキュー(IPキューとかARPキューとかOSIキューとか)にフレームをエンキューする

input queue
   ↑
ether_input
   ↑
  leread
   ↑
  leintr
   ↑
packet receive

    • 送信
      • 上のレイヤでif_outputが呼ばれ、その流れでether_outputが呼ばれる。
      • ether_outputでは、送信したいデータの宛先IPアドレス対していくつかの処理が行われる(ルーティングテーブルの参照、Gatewayを通すか否か、ARP解決など)
      • lestartを呼び出してアウトプットキューからフレームをデキュー→インターフェース上のキューにフレームを渡す(この辺自信ない…)
      • フレーム送信

ether_output
   ↓
output queue
   ↓
  lestart
   ↓
packet send

書式:ioctl(int fd, unsigned long com, ...);

    • インターフェースのリストとそのアドレスを取得すること
      • ioctl(int fd, SIOCGIFCONF, struct ifconf* ifc)
      • ifconfという関数がメイン
    • インターフェースのフラグ情報とメトリック情報を読み書きすること
      • ioctl(int fd, SIOCGIFCONF, struct ifreq* ifr)
      • ioctl(int fd, SIOCSIFCONF, struct ifreq* ifr)
      • ioctl(int fd, SIOCGIFMETRIC, struct ifreq* ifr)
      • ioctl(int fd, SIOCSIFMETRIC, struct ifreq* ifr)
      • これら4つはifioctlという関数がメイン