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 言語の基本的な扱い方