Transcript route コマンド
route コマンド
tomine@sing (B1)
<[email protected]>
親:yasu
目的
プログラミングに関する経験と知識の向上
C 言語に対する知識や経験を深める
題材として、route コマンド
なぜ、route コマンド?
ルーティングに興味があった
route コマンドは C 言語の機能を多用する
ソケット
ポインタ
構造体
route コマンドとは
UNIX OS に実装されている
IPルーティングテーブルを手動で操作
ルーティングの基礎
静的なルーティング
動的ルーティングの場合は、
ルーティングプロトコルデーモンが
自動的に変更
今回は
route コマンドではなく…
netstat –rn –f inet のような出力をするもの
ネットワークアドレスとサブネット長を引数にす
ると、その引数にマッチする経路を表示する
このようなものを作っていきます
route_more
機能は2つ
どちらもsysctl関数を使う
route_more show
route_more match
カーネルの持っているルーティングテーブル
の全ての内容を取ってくる
実装環境
FreeBSD 5.0-RELEASE
sysctl() 関数
どのようなプロセスでもルーティングテーブ
ルとインターフェースリストを取得できる
スーパーユーザの権限不要
与える引数によって返ってくる内容が違う
int 型の配列の中に欲しいものの情報を書く
今回はAF_ROUTEを渡す
route_more show
route_show()
sysctlでルーティングテーブルをすべて引き
出す
for 文でひとつずつルーティング情報のエント
リを読み出す
ネットマスクの値からプレフィックス長を調べる
netstat –rn のように表の形式で表示
route_more match
route_match()
引数として渡されたネットワークアドレスとサブ
ネット長を文字列処理をする
/ を境にネットワークアドレスとプレフィックス長に
分ける
ネットワークアドレスは inet_aton() をして構造体
に入れる
プレフィックス長は atoi() で int 型変数へ入れる
route_more match
route_match() (つづき)
sysctlでルーティングテーブルをすべて引き
出す
for 文でひとつずつルーティング情報のエント
リを読み出す
ネットマスクの値からプレフィックス長を調べる
引数として与えられたプレフィックス長と比較する
引数より小さかったら表示しない
route_more match
route_match() (つづき)
プレフィックス長からアドレスのネットワーク部
を抜き出す
引数のアドレスとルーティングテーブルのエントリ
のネットワーク部を排他的論理和(XOR)演算する
演算の結果が0以外なら表示しない
netstat –rn のように表の形式で表示
デモ
今後の課題
今回はルーティングソケットを自分では操
作しなかった
ソケットの操作も大切なので追って勉強する
AP などへのルートのエントリの Gateway
にインターフェースのインデックスや MAC
アドレスを表示できなかった
今後、実装する
まとめ
今回のタームプロジェクトを通じて学習した
もの
論理演算やポインタなどの新しい知識
ルーティングの基本概念
ルーティングテーブルの内容
マッチ …など
C 言語の基本的な扱い方