Class: PacketGen::Header::IPv6
- Inherits:
-
Base
- Object
- Types::Fields
- Base
- PacketGen::Header::IPv6
- Defined in:
- lib/packetgen/header/ipv6.rb,
lib/packetgen/header/ipv6.rb,
lib/packetgen/header/ipv6.rb,
lib/packetgen/header/ipv6/addr.rb,
lib/packetgen/header/ipv6/extension.rb,
lib/packetgen/header/ipv6/hop_by_hop.rb
Overview
IPv6 (RFC 8200)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| Traffic Class | Flow Label |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Payload Length | Next Header | Hop Limit |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Source Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Destination Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
A IPv6 header consists of:
-
a first 32-bit word (#u32, of Types::Int32 type) composed of:
-
a 4-bit #version field,
-
a 8-bit #traffic_class field,
-
a 20-bit #flow_label field,
-
-
a payload length field (#length, Types::Int16 type}),
-
a next header field (#next, Types::Int8 type),
-
a hop-limit field (#hop,
Int8
type), -
a destination address field (#dst,
IPv6::Addr
type), -
and a #body (Types::String type).
Create a IPv6 header
# standalone
ipv6 = PacketGen::Header::IPv6.new
# in a packet
pkt = PacketGen.gen('IPv6')
# access to IPv6 header
pkt.ipv6 # => PacketGen::Header::IPv6
IPv6 attributes
ipv6.u32 = 0x60280001
# the same as
ipv6.version = 6
ipv6.traffic_class = 2
ipv6.flow_label = 0x80001
ipv6.length = 0x43
ipv6.hop = 0x40
ipv6.next = 6
ipv6.src = '::1'
ipv6.src # => "::1"
ipv6[:src] # => PacketGen::Header::IPv6::Addr
ipv6.dst = '2001:1234:5678:abcd::123'
ipv6.body.read 'this is a body'
Add IPv6 extensions
In IPv6, optional extensions are encoded in separate headers that may be placed between the IPv6 header and the upper-layer header.
In PacketGen, a IPv6 extension is processedf as a classical header:
pkt = PacketGen.gen('IPv6')
# Add a HopByHop extension
pkt.add('IPv6::HopByHop')
pkt.ipv6_hopbyhop. << { type: 'router_alert', value: [0].pack('n') }
# Add another header
pkt.add('UDP')
Defined Under Namespace
Classes: Addr, ArrayOfAddr, Extension, HopByHop, Option, Options, Pad1
Constant Summary collapse
- ETHERTYPE =
IPv6 Ether type
0x86dd
Instance Attribute Summary collapse
- #body ⇒ Types::String, Header::Base
-
#dst ⇒ Addr
IPv6 destination address.
-
#flow_label ⇒ Integer
20-bit flow_label attribute.
-
#hop ⇒ Integer
8-bit IPv6 hop limit.
-
#length ⇒ Integer
16-bit word of IPv6 payload length.
-
#next ⇒ Integer
8-bit IPv6 next payload value.
-
#src ⇒ Addr
IPv6 source address.
-
#traffic_class ⇒ Integer
8-bit traffic_class attribute.
-
#u32 ⇒ Integer
First 32-bit word of IPv6 header.
-
#version ⇒ Integer
4-bit version attribute.
Class Method Summary collapse
-
.bind(header_klass, args = {}) ⇒ Object
Bind a upper header to IPv6 and its defined extension headers.
- .old_bind ⇒ Object
Instance Method Summary collapse
-
#calc_length ⇒ Integer
Compute length and set
len
field. - #inspect ⇒ String
-
#parse? ⇒ Boolean
Check version field.
-
#pseudo_header_checksum ⇒ Integer
Get IPv6 part of pseudo header checksum.
-
#reply! ⇒ self
Invert source and destination addresses.
-
#to_w(_iface = nil) ⇒ void
Send IPv6 packet on wire.
Methods inherited from Base
calculate_and_set_length, #header_id, inherited, #initialize, #ip_header, #ll_header
Methods included from PacketGen::Headerable
#added_to_packet, included, #method_name, #packet, #packet=, #protocol_name, #read
Methods inherited from Types::Fields
#[], #[]=, #bits_on, define_bit_fields_on, define_field, define_field_after, define_field_before, #fields, fields, inherited, #initialize, #offset_of, #optional?, #optional_fields, #present?, #read, remove_bit_fields_on, remove_field, #sz, #to_h, #to_s, update_field
Constructor Details
This class inherits a constructor from PacketGen::Header::Base
Instance Attribute Details
#body ⇒ Types::String, Header::Base
121 |
# File 'lib/packetgen/header/ipv6.rb', line 121 define_field :body, Types::String |
#dst ⇒ Addr
IPv6 destination address
118 |
# File 'lib/packetgen/header/ipv6.rb', line 118 define_field :dst, Addr, default: '::1' |
#flow_label ⇒ Integer
Returns 20-bit flow_label attribute.
129 |
# File 'lib/packetgen/header/ipv6.rb', line 129 define_bit_fields_on :u32, :version, 4, :traffic_class, 8, :flow_label, 20 |
#hop ⇒ Integer
8-bit IPv6 hop limit
110 |
# File 'lib/packetgen/header/ipv6.rb', line 110 define_field :hop, Types::Int8, default: 64 |
#length ⇒ Integer
16-bit word of IPv6 payload length
102 |
# File 'lib/packetgen/header/ipv6.rb', line 102 define_field :length, Types::Int16 |
#next ⇒ Integer
8-bit IPv6 next payload value
106 |
# File 'lib/packetgen/header/ipv6.rb', line 106 define_field :next, Types::Int8 |
#src ⇒ Addr
IPv6 source address
114 |
# File 'lib/packetgen/header/ipv6.rb', line 114 define_field :src, Addr, default: '::1' |
#traffic_class ⇒ Integer
Returns 8-bit traffic_class attribute.
129 |
# File 'lib/packetgen/header/ipv6.rb', line 129 define_bit_fields_on :u32, :version, 4, :traffic_class, 8, :flow_label, 20 |
#u32 ⇒ Integer
First 32-bit word of IPv6 header
98 |
# File 'lib/packetgen/header/ipv6.rb', line 98 define_field :u32, Types::Int32, default: 0x6000_0000 |
#version ⇒ Integer
Returns 4-bit version attribute.
129 |
# File 'lib/packetgen/header/ipv6.rb', line 129 define_bit_fields_on :u32, :version, 4, :traffic_class, 8, :flow_label, 20 |
Class Method Details
.bind(header_klass, args = {}) ⇒ Object
Bind a upper header to IPv6 and its defined extension headers.
206 207 208 209 210 211 |
# File 'lib/packetgen/header/ipv6.rb', line 206 def bind(header_klass, args={}) IPv6.old_bind header_klass, args [IPv6::HopByHop].each do |klass| klass.bind header_klass, args end end |
.old_bind ⇒ Object
202 |
# File 'lib/packetgen/header/ipv6.rb', line 202 alias old_bind bind |
Instance Method Details
#calc_length ⇒ Integer
Compute length and set len
field
133 134 135 |
# File 'lib/packetgen/header/ipv6.rb', line 133 def calc_length Base.calculate_and_set_length self, header_in_size: false end |
#inspect ⇒ String
158 159 160 161 162 163 164 165 166 167 168 169 170 |
# File 'lib/packetgen/header/ipv6.rb', line 158 def inspect super do |attr| next unless attr == :u32 str = Inspect.inspect_attribute(attr, self[attr]) shift = Inspect.shift_level str << shift + Inspect::FMT_ATTR % ['', 'version', version] tclass = Inspect.int_dec_hex(traffic_class, 2) str << shift + Inspect::FMT_ATTR % ['', 'tclass', tclass] fl_value = Inspect.int_dec_hex(flow_label, 5) str << shift + Inspect::FMT_ATTR % ['', 'flow_label', fl_value] end end |
#parse? ⇒ Boolean
Check version field
174 175 176 |
# File 'lib/packetgen/header/ipv6.rb', line 174 def parse? version == 6 end |
#pseudo_header_checksum ⇒ Integer
Get IPv6 part of pseudo header checksum.
139 140 141 142 143 144 |
# File 'lib/packetgen/header/ipv6.rb', line 139 def pseudo_header_checksum sum = 0 self[:src].to_a.each { |word| sum += word.to_i } self[:dst].to_a.each { |word| sum += word.to_i } sum end |
#reply! ⇒ self
Invert source and destination addresses
181 182 183 184 |
# File 'lib/packetgen/header/ipv6.rb', line 181 def reply! self[:src], self[:dst] = self[:dst], self[:src] self end |
#to_w(_iface = nil) ⇒ void
This method returns an undefined value.
Send IPv6 packet on wire. All fields may be set (even #version).
150 151 152 153 154 155 |
# File 'lib/packetgen/header/ipv6.rb', line 150 def to_w(_iface=nil) sock = Socket.new(Socket::AF_INET6, Socket::SOCK_RAW, Socket::IPPROTO_RAW) sockaddrin = Socket.sockaddr_in(0, dst) sock.send to_s, 0, sockaddrin sock.close end |