Class: PacketGen::Header::IP
- Inherits:
-
Base
- Object
- Types::Fields
- Base
- PacketGen::Header::IP
- Defined in:
- lib/packetgen/header/ip.rb
Overview
A IP header consists of:
-
a first byte (#u8 of Types::Int8 type) composed of:
-
a total length (#length, Types::Int16 type),
-
a ID (#id,
Int16type), -
a #frag worg (
Int16) composed of:-
a 13-bit #fragment_offset field,
-
a Time-to-Live (#ttl) field (
Int8), -
a #protocol field (
Int8), -
a #checksum field (
Int16), -
a destination IP ddress (#dst,
Addrtype), -
and a #body (Types::String type).
Create a IP header
# standalone
ip = PacketGen::Header::IP.new
# in a packet
pkt = PacketGen.gen('IP')
# access to IP header
pkt.ip # => PacketGen::Header::IP
IP attributes
ip.u8 = 0x45
# the same as
ip.version = 4
ip.ihl = 5
ip.length = 0x43
ip.id = 0x1234
ip.frag = 0x2031
# the same as:
ip.flag_mf = true
ip.fragment_offset = 0x31
ip.flag_rsv? # => Boolean
ip.flag_df? # => Boolean
ip.flag_mf? # => Boolean
ip.ttl = 0x40
ip.protocol = 6
ip.checksum = 0xffff
ip.src = '127.0.0.1'
ip.src # => "127.0.0.1"
ip[:src] # => PacketGen::Header::IP::Addr
ip.dst = '127.0.0.2'
ip.body.read 'this is a body'
Defined Under Namespace
Classes: Addr
Constant Summary collapse
- ETHERTYPE =
IP Ether type
0x0800
Instance Attribute Summary collapse
- #body ⇒ Types::String, Header::Base
-
#checksum ⇒ Integer
16-bit IP header checksum.
-
#dst ⇒ Addr
Destination IP address.
-
#flag_df ⇒ Boolean
Don’t Fragment flag.
-
#flag_mf ⇒ Boolean
More Fragment flags.
-
#flag_rsv ⇒ Boolean
Reserved bit from flags.
-
#frag ⇒ Integer
16-bit frag word.
-
#fragment_offset ⇒ Integer
13-bit fragment offset.
-
#id ⇒ Integer
16-bit ID.
-
#ihl ⇒ Integer
4-bit IP header length attribute.
-
#length ⇒ Integer
16-bit IP total length.
-
#protocol ⇒ Integer
8-bit upper protocol value.
-
#src ⇒ Addr
Source IP address.
-
#tos ⇒ Integer
8-bit Type of Service value.
-
#ttl ⇒ Integer
8-bit Time To Live value.
-
#u8 ⇒ Integer
First byte of IP header.
-
#version ⇒ Integer
4-bit version attribute.
Attributes inherited from Base
Instance Method Summary collapse
-
#calc_checksum ⇒ Integer
Compute checksum and set
checksumfield. -
#calc_length ⇒ Integer
Compute length and set
lengthfield. - #inspect ⇒ String
-
#parse? ⇒ Boolean
Check version field.
-
#pseudo_header_checksum ⇒ Integer
Get IP part of pseudo header checksum.
-
#to_w(iface = nil) ⇒ void
Send IP packet on wire.
Methods inherited from Base
bind_header, #header_id, inherited, #ip_header, known_headers, #protocol_name
Methods inherited from Types::Fields
#[], #[]=, define_bit_fields_on, define_field, define_field_after, define_field_before, #fields, #force_binary, inherited, #initialize, #read, #sz, #to_h, #to_s
Constructor Details
This class inherits a constructor from PacketGen::Types::Fields
Instance Attribute Details
#body ⇒ Types::String, Header::Base
146 |
# File 'lib/packetgen/header/ip.rb', line 146 define_field :body, Types::String |
#checksum ⇒ Integer
Returns 16-bit IP header checksum.
137 |
# File 'lib/packetgen/header/ip.rb', line 137 define_field :checksum, Types::Int16, default: 0 |
#dst ⇒ Addr
Returns destination IP address.
143 |
# File 'lib/packetgen/header/ip.rb', line 143 define_field :dst, Addr, default: '127.0.0.1' |
#flag_df ⇒ Boolean
Returns Don’t Fragment flag.
162 |
# File 'lib/packetgen/header/ip.rb', line 162 define_bit_fields_on :frag, :flag_rsv, :flag_df, :flag_mf, :fragment_offset, 13 |
#flag_mf ⇒ Boolean
Returns More Fragment flags.
162 |
# File 'lib/packetgen/header/ip.rb', line 162 define_bit_fields_on :frag, :flag_rsv, :flag_df, :flag_mf, :fragment_offset, 13 |
#flag_rsv ⇒ Boolean
Returns reserved bit from flags.
162 |
# File 'lib/packetgen/header/ip.rb', line 162 define_bit_fields_on :frag, :flag_rsv, :flag_df, :flag_mf, :fragment_offset, 13 |
#frag ⇒ Integer
Returns 16-bit frag word.
128 |
# File 'lib/packetgen/header/ip.rb', line 128 define_field :frag, Types::Int16, default: 0 |
#fragment_offset ⇒ Integer
Returns 13-bit fragment offset.
162 |
# File 'lib/packetgen/header/ip.rb', line 162 define_bit_fields_on :frag, :flag_rsv, :flag_df, :flag_mf, :fragment_offset, 13 |
#id ⇒ Integer
Returns 16-bit ID.
125 |
# File 'lib/packetgen/header/ip.rb', line 125 define_field :id, Types::Int16, default: -> { rand(65535) } |
#ihl ⇒ Integer
Returns 4-bit IP header length attribute.
152 |
# File 'lib/packetgen/header/ip.rb', line 152 define_bit_fields_on :u8, :version, 4, :ihl, 4 |
#length ⇒ Integer
Returns 16-bit IP total length.
122 |
# File 'lib/packetgen/header/ip.rb', line 122 define_field :length, Types::Int16, default: 20 |
#protocol ⇒ Integer
Returns 8-bit upper protocol value.
134 |
# File 'lib/packetgen/header/ip.rb', line 134 define_field :protocol, Types::Int8 |
#src ⇒ Addr
Returns source IP address.
140 |
# File 'lib/packetgen/header/ip.rb', line 140 define_field :src, Addr, default: '127.0.0.1' |
#tos ⇒ Integer
Returns 8-bit Type of Service value.
119 |
# File 'lib/packetgen/header/ip.rb', line 119 define_field :tos, Types::Int8, default: 0 |
#ttl ⇒ Integer
Returns 8-bit Time To Live value.
131 |
# File 'lib/packetgen/header/ip.rb', line 131 define_field :ttl, Types::Int8, default: 64 |
#u8 ⇒ Integer
116 |
# File 'lib/packetgen/header/ip.rb', line 116 define_field :u8, Types::Int8, default: 0x45 |
#version ⇒ Integer
Returns 4-bit version attribute.
152 |
# File 'lib/packetgen/header/ip.rb', line 152 define_bit_fields_on :u8, :version, 4, :ihl, 4 |
Instance Method Details
#calc_checksum ⇒ Integer
Compute checksum and set checksum field
166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
# File 'lib/packetgen/header/ip.rb', line 166 def calc_checksum checksum = (self[:u8].to_i << 8) | self.tos checksum += self.length checksum += self.id checksum += self.frag checksum += (self.ttl << 8) | self.protocol checksum += (self[:src].to_i >> 16) checksum += (self[:src].to_i & 0xffff) checksum += self[:dst].to_i >> 16 checksum += self[:dst].to_i & 0xffff checksum = (checksum & 0xffff) + (checksum >> 16) checksum = ~(checksum % 0xffff ) & 0xffff self[:checksum].value = (checksum == 0) ? 0xffff : checksum end |
#calc_length ⇒ Integer
Compute length and set length field
183 184 185 |
# File 'lib/packetgen/header/ip.rb', line 183 def calc_length self[:length].value = self.sz end |
#inspect ⇒ String
207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 |
# File 'lib/packetgen/header/ip.rb', line 207 def inspect str = Inspect.dashed_line(self.class, 2) shift = Inspect.shift_level(2) to_h.each do |attr, value| next if attr == :body str << Inspect.inspect_attribute(attr, value, 2) if attr == :u8 str << shift + Inspect::INSPECT_FMT_ATTR % ['', 'version', version] str << shift + Inspect::INSPECT_FMT_ATTR % ['', 'ihl', ihl] elsif attr == :frag flags = flag_rsv? ? %w(RSV) : [] flags << 'DF' if flag_df? flags << 'MF' if flag_mf? flags_str = flags.empty? ? 'none' : flags.join(',') str << shift + Inspect::INSPECT_FMT_ATTR % ['', 'flags', flags_str] foff = Inspect.int_dec_hex(fragment_offset, 4) str << shift + Inspect::INSPECT_FMT_ATTR % ['', 'frag_offset', foff] end end str end |
#parse? ⇒ Boolean
Check version field
231 232 233 |
# File 'lib/packetgen/header/ip.rb', line 231 def parse? version == 4 end |
#pseudo_header_checksum ⇒ Integer
Get IP part of pseudo header checksum.
189 190 191 192 |
# File 'lib/packetgen/header/ip.rb', line 189 def pseudo_header_checksum checksum = self[:src].to_i + self[:dst].to_i (checksum >> 16) + (checksum & 0xffff) end |
#to_w(iface = nil) ⇒ void
This method returns an undefined value.
Send IP packet on wire.
When sending packet at IP level, checksum and length fields are set by kernel, so bad IP packets cannot be sent this way. To do so, use Eth#to_w.
200 201 202 203 204 |
# File 'lib/packetgen/header/ip.rb', line 200 def to_w(iface=nil) sock = Socket.new(Socket::AF_INET, Socket::SOCK_RAW, Socket::IPPROTO_RAW) sockaddrin = Socket.sockaddr_in(0, dst) sock.send to_s, 0, sockaddrin end |