2014年1月23日木曜日

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

今回もrouter-utilsのソースを続きから見ていきます。
router-utilsは今回で最後です。

139  module RouterUtils
140    def create_arp_request_from interface, addr
141      arp = ARPRequest.new( interface.hwaddr, addr, interface.ipaddr )
142      arp.pack
143    end
144  
145    def create_arp_reply_from message, replyaddr
146      arp = ARPReply.new( message.macsa, replyaddr, message.arp_spa, message.arp_tpa )
147      arp.pack
148    end
149  
150    def create_icmpv4_reply entry, interface, message
151      offset = 14 + 20 + 4
152      payload = message.data.unpack( "C*" )[ offset .. message.data.length - 1 ]
153      icmp = ICMPEchoReply.new( payload )
154      ip_packet = IPPacket.new( :id => message.ipv4_id,
155                                :protocol => message.ipv4_protocol,
156                                :ttl => message.ipv4_ttl,
157                                :daddr => message.ipv4_saddr,
158                                :saddr => message.ipv4_daddr,
159                                :payload => icmp )
160      eth_header = EthernetHeader.new( entry.hwaddr, interface.hwaddr, 0x0800 )
161  
162      eth_header.pack + ip_packet.pack
163    end
164  end

139行目
モジュールの定義をしています。

140~143行目
ARPリクエストをするメソッドです。
メソッドの結果はARPリクエストのパケットを返します。

145~148行目
ARPリプライをするメソッドです。
メソッドの結果はARPリプライのパケットを返します。

150~163行目
ICMPの応答を返すメソッドです。
offset変数にはイーサネットヘッダー、IPヘッダー、ICMPヘッダーのバイト長を足した値が入ります。
payload変数にはパケットのペイロード部分を取り出します。
icmp変数には、ICMPEchoReplyクラスがセットされます。

ip_packet変数には、IPPacketクラスがセットされます。
引数にはIPヘッダの項目と、ICMPパケットが渡されています。

eth_header変数には、宛先のmacアドレスと送信元のmacアドレスと、IPv4を意味する0x0800が入ります。

162行目でeth_header変数の値とip_packet変数の値をバイナリにしてくっつけます。

これでrouter-utilsのソースは終わりです。

0 件のコメント:

コメントを投稿