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リクエストのパケットを返します。
メソッドの結果はARPリクエストのパケットを返します。
145~148行目
ARPリプライをするメソッドです。
メソッドの結果は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変数の値をバイナリにしてくっつけます。
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 件のコメント:
コメントを投稿