2013年12月4日水曜日

simple-routerとARP

前回、ARPについて書きましたが、実はtremaのsimple-routerで使っているrouter-utils.rbに関係があります。
router-utils.rbのソースコードにARPPacketというクラスがあります。
以下がそのソースになります。

(router-utils.rbから抜粋)
 1  class ARPPacket
 2    attr_accessor :type, :tha, :sha, :tpa, :spa
 3  
 4    def initialize type, tha, sha, tpa, spa
 5      @type = type
 6      @tha = tha
 7      @sha = sha
 8      @tpa = tpa
 9      @spa = spa
10    end
11  
12    def pack
13      eth_header = EthernetHeader.new( @tha, @sha, 0x0806 )
14  
15      # arp
16      arp = [ 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, @type ]
17      arp += @sha.to_a + @spa.to_a + @tha.to_a + @tpa.to_a
18  
19      while arp.length < 46 do
20        arp += [ 0x00 ]
21      end
22  
23      eth_header.pack + arp.pack( "C*" )
24    end
25  end


今回は詳しく見ませんが、以下の部分はARPパケットの中身そのものです。

16      arp = [ 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, @type ]
17      arp += @sha.to_a + @spa.to_a + @tha.to_a + @tpa.to_a

16行目は、ARPパケットの制御情報と動作コードを配列にセットしています。

0x0001         ネットワーク種類(Ethernet)
0x0800         プロトコル(IP)
0x06          ハードウェアアドレス長さ
0x04          プロトコルアドレス長さ
0x0001 または 0x0002  動作コード(ARPリクエスト/ARPリプライ)

17行目はARPパケットの送信元、目標の情報をarp変数の配列に追加しています。

sha           送信元のMACアドレス
spa           送信元のIPアドレス
tha           目標のMACアドレス
tpa           目標のIPアドレス

ARPパケットについて知らずにソースを見てもよくわかりませんでしたが、ARPパケットの中身が分かってから見ると意味がわかる気がしますね。

0 件のコメント:

コメントを投稿