2014年1月18日土曜日

Tremaを試す ~simple-ruter その5~

今回はrouting-tableを見ていきます。
このソースは名前の通りルーティングテーブルとして動作します。

(routing-table.rb)
 1  require "ipaddr"
 2  
 3  class RoutingTable
 4    ADDR_LEN = 32
 5  
 6    def initialize route = []
 7      @db = Array.new( ADDR_LEN + 1 ) { Hash.new }
 8      route.each do | each |
 9        add( each )
10      end
11    end
12  
13    def add options
14      dest = IPAddr.new( options[ :destination ] )
15      masklen = options[ :masklen ]
16      prefix = dest.mask( masklen )
17      @db[ masklen ][ prefix.to_i ] = IPAddr.new( options[ :nexthop ] )
18    end
19  
20    def delete options
21      dest = IPAddr.new( options[ :destination ] )
22      masklen = options[ :masklen ]
23      prefix = dest.mask( masklen )
24      @db[ masklen ].delete( prefix.to_i )
25    end
26  
27    def lookup dest
28      ( 0..ADDR_LEN ).reverse_each do | masklen |
29        prefix = dest.mask( masklen )
30        entry = @db[ masklen ][ prefix.to_i ]
31        return entry if entry
32      end
33      nil
34    end
35  end

1行目
rubyの標準ライブラリのipaddrファイルを読み込み、IPAddrクラスを使えるようにします。

4行目
定数でプレフィックス長の最大値をセットしています。

6~11行目
initializeメソッドでルーティングテーブルに初期値をセットします。
RoutingTableオブジェクトが作成される時に、引数が渡されていなかったら空の配列で初期化されます。

@dbは、33個の配列を作り、空のハッシュを作成します。
引数のroute変数の値をループして、addメソッドで処理します。

13~18行目
addメソッドは引数のハッシュを@db変数に追加します。
引数にはルーティングの情報が入っています。
dest変数には、ルーティングの宛先IPアドレスをIPAddrクラスを作成してセットします。
masklen変数にはルーティングのプレフィックス長をセットします。
prefix変数には、dest変数にセットしたIPアドレスからmaskメソッドでネットワーク部のアドレスを取得してセットします。
@db変数の配列のmasklen変数の値の要素に、宛先IPアドレスのネットワーク部をハッシュキーにし、引数のoptions変数からnexthopの値を取得してセットします。

20~25行目
deleteメソッドは@adbから引数のハッシュに該当する要素を削除します。
addメソッド同様に、引数にはルーティングの情報が入っています。
dest変数には、ルーティングの宛先IPアドレスからIPAddrクラスを作成してセットします。
masklen変数にはルーティングのプレフィックス長をセットします。
prefix変数には、dest変数にセットしたIPアドレスからmaskメソッドでネットワーク部のアドレスを取得してセットします。
@db変数の配列のmasklen変数の値の要素から、宛先IPアドレスのネットワーク部のハッシュキーと一致するハッシュ要素を削除します。

27~34行目
lookupメソッドは、引数のIPアドレスに合致するルーティングエントリからネクストホップを返します。
reverse_eachでADDR_LEN変数の値から0に減らしながらループを回します。
数字の大きい方から比較することで、ルーティングのロンゲストマッチをしています。

prefix変数には、引数のIPアドレスからmaskメソッドでネットワークアドレスを取得しセットします。
entry変数には、@db変数からprefix変数をハッシュキーにして値を取得しセットします。
31行目は、entry変数に値が取得できていればentryの値であるネクストホップを返します。
31行目のifの結果、returnでメソッドから抜けない場合、メソッドは33行目のnilを返します。

今回は以上になります。

0 件のコメント:

コメントを投稿