Class: 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 BinStruct::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, BinStruct::Int16 type}),
-
a next header field (#next, BinStruct::Int8 type),
-
a hop-limit field (#hop,
Int8
type), -
a destination address field (#dst,
IPv6::Addr
type), -
and a #body (BinStruct::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 ⇒ BinStruct::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, #to_s
Constructor Details
This class inherits a constructor from PacketGen::Header::Base
Instance Attribute Details
#body ⇒ BinStruct::String, Header::Base
127 |
# File 'lib/packetgen/header/ipv6.rb', line 127 define_attr :body, BinStruct::String |
#dst ⇒ Addr
IPv6 destination address
124 |
# File 'lib/packetgen/header/ipv6.rb', line 124 define_attr :dst, Addr, default: '::1' |
#flow_label ⇒ Integer
Returns 20-bit flow_label attribute.
104 |
# File 'lib/packetgen/header/ipv6.rb', line 104 define_bit_attr :u32, default: 0x60000000, version: 4, traffic_class: 8, flow_label: 20 |
#hop ⇒ Integer
8-bit IPv6 hop limit
116 |
# File 'lib/packetgen/header/ipv6.rb', line 116 define_attr :hop, BinStruct::Int8, default: 64 |
#length ⇒ Integer
16-bit word of IPv6 payload length
108 |
# File 'lib/packetgen/header/ipv6.rb', line 108 define_attr :length, BinStruct::Int16 |
#next ⇒ Integer
8-bit IPv6 next payload value
112 |
# File 'lib/packetgen/header/ipv6.rb', line 112 define_attr :next, BinStruct::Int8 |
#src ⇒ Addr
IPv6 source address
120 |
# File 'lib/packetgen/header/ipv6.rb', line 120 define_attr :src, Addr, default: '::1' |
#traffic_class ⇒ Integer
Returns 8-bit traffic_class attribute.
104 |
# File 'lib/packetgen/header/ipv6.rb', line 104 define_bit_attr :u32, default: 0x60000000, version: 4, traffic_class: 8, flow_label: 20 |
#u32 ⇒ Integer
First 32-bit word of IPv6 header
104 |
# File 'lib/packetgen/header/ipv6.rb', line 104 define_bit_attr :u32, default: 0x60000000, version: 4, traffic_class: 8, flow_label: 20 |
#version ⇒ Integer
Returns 4-bit version attribute.
104 |
# File 'lib/packetgen/header/ipv6.rb', line 104 define_bit_attr :u32, default: 0x60000000, 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.
204 205 206 207 208 209 |
# File 'lib/packetgen/header/ipv6.rb', line 204 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
200 |
# File 'lib/packetgen/header/ipv6.rb', line 200 alias old_bind bind |
Instance Method Details
#calc_length ⇒ Integer
Compute length and set len
field
131 132 133 |
# File 'lib/packetgen/header/ipv6.rb', line 131 def calc_length Base.calculate_and_set_length self, header_in_size: false end |
#inspect ⇒ String
156 157 158 159 160 161 162 163 164 165 166 167 168 |
# File 'lib/packetgen/header/ipv6.rb', line 156 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
172 173 174 |
# File 'lib/packetgen/header/ipv6.rb', line 172 def parse? version == 6 end |
#pseudo_header_checksum ⇒ Integer
Get IPv6 part of pseudo header checksum.
137 138 139 140 141 142 |
# File 'lib/packetgen/header/ipv6.rb', line 137 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
179 180 181 182 |
# File 'lib/packetgen/header/ipv6.rb', line 179 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 attributes.may be set (even #version).
148 149 150 151 152 153 |
# File 'lib/packetgen/header/ipv6.rb', line 148 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 |