このソースは名前の通りルーティングテーブルとして動作します。
(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メソッドで処理します。
RoutingTableオブジェクトが作成される時に、引数が渡されていなかったら空の配列で初期化されます。
@dbは、33個の配列を作り、空のハッシュを作成します。
引数のroute変数の値をループして、addメソッドで処理します。
13~18行目
addメソッドは引数のハッシュを@db変数に追加します。
引数にはルーティングの情報が入っています。
dest変数には、ルーティングの宛先IPアドレスをIPAddrクラスを作成してセットします。
masklen変数にはルーティングのプレフィックス長をセットします。
prefix変数には、dest変数にセットしたIPアドレスからmaskメソッドでネットワーク部のアドレスを取得してセットします。
@db変数の配列のmasklen変数の値の要素に、宛先IPアドレスのネットワーク部をハッシュキーにし、引数のoptions変数からnexthopの値を取得してセットします。
引数にはルーティングの情報が入っています。
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アドレスのネットワーク部のハッシュキーと一致するハッシュ要素を削除します。
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を返します。
reverse_eachでADDR_LEN変数の値から0に減らしながらループを回します。
数字の大きい方から比較することで、ルーティングのロンゲストマッチをしています。
prefix変数には、引数のIPアドレスからmaskメソッドでネットワークアドレスを取得しセットします。
entry変数には、@db変数からprefix変数をハッシュキーにして値を取得しセットします。
31行目は、entry変数に値が取得できていればentryの値であるネクストホップを返します。
31行目のifの結果、returnでメソッドから抜けない場合、メソッドは33行目のnilを返します。
今回は以上になります。
0 件のコメント:
コメントを投稿