ネットワークエンジニアから着物屋さんとして独立しました。ネットショップのIT面を中心にお伝えします

TremaでL2~L4ヘッダの長さを取得する

»

 Class: Trema::PacketIn によると、L2~L4のヘッダの長さを取得するための値が無いようです。IP total length や UDPヘッダ長はありますが、イーサネットヘッダ長、IPヘッダ長、TCPヘッダ長の取得ができません。それらを取得するためのメソッドをそろえたモジュールを作ってみましたので、よければコピペしてお使いください。

 以下が各メソッドの役割です。

  • データリンク層ヘッダ長を取得:get_l2_hdr_len( message )
  • ネットワーク層ヘッダ長を取得:get_l3_hdr_len( message )
  • TCPヘッダ長を取得:get_l4_hdr_len( message )
  • データリンク層~TCPのヘッダ長合計を取得:get_l24_len( message )
  • TCPデータ長を取得:get_sgmt_len( message )
  • TCPデータを16進数で取得:get_l7_hex( message )

 以下がソースコードです。

module PacketInfo
	def get_l2_hdr_len( message )
		l2_len = message.total_len - message.ipv4_tot_len
		#info "l2_len: " + l2_len.to_s
		return l2_len
	end

	def get_l3_hdr_len( message )
		l3_len = message.ipv4_ihl * 4
		#info "l3_len: " + l3_len.to_s
		return l3_len
	end
def get_l4_hdr_len( message ) l2_len = get_l2_hdr_len message l3_len = get_l3_hdr_len message msg_data_s = message.data.unpack("H*").to_s; #info "msg_data_s: " + msg_data_s
l4_len = (msg_data_s.slice(( l2_len + l3_len + 12 ) * 2, 1)).hex * 4 #info "l4_len: " + l4_len.to_s return l4_len end
def get_l24_len( message ) l2_len = get_l2_hdr_len message l3_len = get_l3_hdr_len message l4_len = get_l4_hdr_len message l4_tot_len = l2_len + l3_len + l4_len return l4_tot_len end
def get_sgmt_len( message ) return message.total_len - (get_l24_len message) end
def get_l7_hex( message ) l4_tot_len = get_l24_len message msg_data_s = message.data.unpack("H*").to_s; sgmt_data = msg_data_s.slice(l4_tot_len*2..-1) return sgmt_data end end
Comment(0)

コメント

コメントを投稿する