packetgen 4.0.0 → 4.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +7 -9
- data/lib/packetgen/capture.rb +3 -6
- data/lib/packetgen/config.rb +1 -1
- data/lib/packetgen/deprecation.rb +7 -1
- data/lib/packetgen/header/arp.rb +7 -8
- data/lib/packetgen/header/asn1_base.rb +3 -2
- data/lib/packetgen/header/base.rb +39 -27
- data/lib/packetgen/header/bootp.rb +15 -15
- data/lib/packetgen/header/dhcp/option.rb +9 -9
- data/lib/packetgen/header/dhcp/options.rb +3 -3
- data/lib/packetgen/header/dhcp.rb +7 -8
- data/lib/packetgen/header/dhcpv6/duid.rb +3 -5
- data/lib/packetgen/header/dhcpv6/option.rb +38 -16
- data/lib/packetgen/header/dhcpv6/options.rb +4 -4
- data/lib/packetgen/header/dhcpv6/relay.rb +2 -1
- data/lib/packetgen/header/dhcpv6.rb +14 -15
- data/lib/packetgen/header/dns/name.rb +10 -9
- data/lib/packetgen/header/dns/opt.rb +4 -1
- data/lib/packetgen/header/dns/option.rb +8 -8
- data/lib/packetgen/header/dns/qdsection.rb +3 -3
- data/lib/packetgen/header/dns/question.rb +2 -1
- data/lib/packetgen/header/dns/rr.rb +2 -4
- data/lib/packetgen/header/dns/rrsection.rb +3 -3
- data/lib/packetgen/header/dns.rb +77 -61
- data/lib/packetgen/header/dot11/control.rb +6 -6
- data/lib/packetgen/header/dot11/data.rb +12 -11
- data/lib/packetgen/header/dot11/element.rb +2 -2
- data/lib/packetgen/header/dot11/management.rb +19 -16
- data/lib/packetgen/header/dot11/sub_mngt.rb +23 -22
- data/lib/packetgen/header/dot11.rb +39 -39
- data/lib/packetgen/header/dot1q.rb +6 -5
- data/lib/packetgen/header/dot1x.rb +9 -9
- data/lib/packetgen/header/eap/fast.rb +4 -4
- data/lib/packetgen/header/eap/md5.rb +12 -4
- data/lib/packetgen/header/eap/tls.rb +10 -9
- data/lib/packetgen/header/eap/ttls.rb +14 -11
- data/lib/packetgen/header/eap.rb +59 -34
- data/lib/packetgen/header/eth.rb +27 -13
- data/lib/packetgen/header/gre.rb +27 -3
- data/lib/packetgen/header/http/headers.rb +7 -6
- data/lib/packetgen/header/http/request.rb +25 -17
- data/lib/packetgen/header/http/response.rb +23 -16
- data/lib/packetgen/header/http/verbs.rb +1 -1
- data/lib/packetgen/header/http.rb +1 -1
- data/lib/packetgen/header/icmp.rb +11 -11
- data/lib/packetgen/header/icmpv6.rb +11 -10
- data/lib/packetgen/header/igmp.rb +22 -11
- data/lib/packetgen/header/igmpv3/group_record.rb +8 -3
- data/lib/packetgen/header/igmpv3/mq.rb +2 -2
- data/lib/packetgen/header/igmpv3/mr.rb +2 -2
- data/lib/packetgen/header/igmpv3.rb +12 -11
- data/lib/packetgen/header/ip/addr.rb +7 -3
- data/lib/packetgen/header/ip/option.rb +19 -6
- data/lib/packetgen/header/ip/options.rb +1 -1
- data/lib/packetgen/header/ip.rb +53 -36
- data/lib/packetgen/header/ipv6/addr.rb +15 -14
- data/lib/packetgen/header/ipv6/extension.rb +10 -8
- data/lib/packetgen/header/ipv6/hop_by_hop.rb +27 -8
- data/lib/packetgen/header/ipv6.rb +32 -23
- data/lib/packetgen/header/llc.rb +21 -14
- data/lib/packetgen/header/mdns.rb +10 -3
- data/lib/packetgen/header/mld.rb +12 -10
- data/lib/packetgen/header/mldv2/mcast_address_record.rb +7 -2
- data/lib/packetgen/header/mldv2/mlq.rb +9 -9
- data/lib/packetgen/header/mldv2/mlr.rb +5 -5
- data/lib/packetgen/header/mldv2.rb +2 -2
- data/lib/packetgen/header/ospfv2/db_description.rb +11 -11
- data/lib/packetgen/header/ospfv2/hello.rb +12 -11
- data/lib/packetgen/header/ospfv2/ls_ack.rb +6 -7
- data/lib/packetgen/header/ospfv2/ls_request.rb +8 -7
- data/lib/packetgen/header/ospfv2/ls_update.rb +8 -8
- data/lib/packetgen/header/ospfv2/lsa.rb +34 -11
- data/lib/packetgen/header/ospfv2/lsa_header.rb +4 -3
- data/lib/packetgen/header/ospfv2.rb +32 -27
- data/lib/packetgen/header/ospfv3/db_description.rb +13 -14
- data/lib/packetgen/header/ospfv3/hello.rb +11 -10
- data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +7 -3
- data/lib/packetgen/header/ospfv3/ls_ack.rb +6 -7
- data/lib/packetgen/header/ospfv3/ls_request.rb +11 -11
- data/lib/packetgen/header/ospfv3/ls_update.rb +8 -8
- data/lib/packetgen/header/ospfv3/lsa.rb +24 -10
- data/lib/packetgen/header/ospfv3/lsa_header.rb +4 -3
- data/lib/packetgen/header/ospfv3.rb +39 -35
- data/lib/packetgen/header/sctp/chunk.rb +39 -18
- data/lib/packetgen/header/sctp/error.rb +170 -198
- data/lib/packetgen/header/sctp/padded32.rb +4 -4
- data/lib/packetgen/header/sctp/parameter.rb +86 -133
- data/lib/packetgen/header/sctp.rb +15 -4
- data/lib/packetgen/header/snmp.rb +111 -10
- data/lib/packetgen/header/tcp/option.rb +8 -1
- data/lib/packetgen/header/tcp/options.rb +12 -4
- data/lib/packetgen/header/tcp.rb +34 -27
- data/lib/packetgen/header/tftp.rb +17 -11
- data/lib/packetgen/header/udp.rb +16 -14
- data/lib/packetgen/header.rb +20 -14
- data/lib/packetgen/headerable.rb +10 -4
- data/lib/packetgen/inject.rb +1 -1
- data/lib/packetgen/inspect.rb +3 -8
- data/lib/packetgen/packet.rb +95 -37
- data/lib/packetgen/pcap.rb +1 -1
- data/lib/packetgen/pcapng/block.rb +3 -2
- data/lib/packetgen/pcapng/epb.rb +1 -1
- data/lib/packetgen/pcapng/file.rb +42 -15
- data/lib/packetgen/pcapng/idb.rb +3 -2
- data/lib/packetgen/pcapng/shb.rb +3 -2
- data/lib/packetgen/pcapng/spb.rb +2 -2
- data/lib/packetgen/pcapng/unknown_block.rb +1 -1
- data/lib/packetgen/pcapng.rb +3 -1
- data/lib/packetgen/pcaprub_wrapper.rb +1 -1
- data/lib/packetgen/proto.rb +5 -1
- data/lib/packetgen/unknown_packet.rb +4 -4
- data/lib/packetgen/utils/arp_spoofer.rb +1 -1
- data/lib/packetgen/utils.rb +4 -5
- data/lib/packetgen/version.rb +2 -2
- data/lib/packetgen.rb +9 -3
- metadata +8 -9
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# This file is part of PacketGen
|
4
|
-
# See https://
|
4
|
+
# See https://codeberg.org/lemontree55/packetgen for more informations
|
5
5
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
6
6
|
# Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
|
7
7
|
# This program is published under MIT license.
|
@@ -11,8 +11,8 @@ module PacketGen
|
|
11
11
|
class DHCPv6
|
12
12
|
# Container class for DHCPv6 {Option options}.
|
13
13
|
#
|
14
|
-
#
|
15
|
-
# options = PacketGen::Header::
|
14
|
+
# @example Add DHCPv6 options to an +Options+ instance
|
15
|
+
# options = PacketGen::Header::DHCPv6::Options.new
|
16
16
|
# # Add an ElapsedTime option
|
17
17
|
# options << { type: 'ElapsedTime', value: 3600 }
|
18
18
|
# # Add a ClientID. Here, use integer type
|
@@ -22,7 +22,7 @@ module PacketGen
|
|
22
22
|
class Options < BinStruct::Array
|
23
23
|
set_of DHCPv6::Option
|
24
24
|
|
25
|
-
# Separator used in
|
25
|
+
# Separator used in +#to_human+.
|
26
26
|
HUMAN_SEPARATOR = ';'
|
27
27
|
|
28
28
|
private
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# This file is part of PacketGen
|
4
|
-
# See https://
|
4
|
+
# See https://codeberg.org/lemontree55/packetgen for more informations
|
5
5
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
6
6
|
# Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
|
7
7
|
# This program is published under MIT license.
|
@@ -38,6 +38,7 @@ module PacketGen
|
|
38
38
|
# @return [IPv6::Addr]
|
39
39
|
define_attr :peer, IPv6::Addr
|
40
40
|
# @!attribute options
|
41
|
+
# Set of {Option}s
|
41
42
|
# @return [DHCPv6::Options]
|
42
43
|
define_attr :options, DHCPv6::Options
|
43
44
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# This file is part of PacketGen
|
4
|
-
# See https://
|
4
|
+
# See https://codeberg.org/lemontree55/packetgen for more informations
|
5
5
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
6
6
|
# Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
|
7
7
|
# This program is published under MIT license.
|
@@ -22,22 +22,20 @@ module PacketGen
|
|
22
22
|
# | |
|
23
23
|
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
24
24
|
# A DHCPv6 header is made of:
|
25
|
-
# * a {#msg_type} field (
|
26
|
-
# * a {#transaction_id} field (
|
27
|
-
# * and an {#options} field ({DHCPv6::Options}).
|
25
|
+
# * a {#msg_type} field (+BinStruct::Int8Enum+),
|
26
|
+
# * a {#transaction_id} field (+BinStruct::Int24+),
|
27
|
+
# * and an {#options} field ({DHCPv6::Options}). This field is a container for {DHCPv6::Option} objects.
|
28
28
|
#
|
29
|
-
#
|
29
|
+
# @example Create a DHCPv6 header
|
30
30
|
# # standalone
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
34
|
-
#
|
35
|
-
#
|
36
|
-
#
|
37
|
-
# == Add options
|
38
|
-
# DHCPv6 options are defined by subclasses of {DHCPv6::Option}.
|
31
|
+
# dhcpv6 = PacketGen::Header::DHCPv6.new(msg_type: 'SOLLICIT')
|
32
|
+
# # in a packet
|
33
|
+
# pkt = PacketGen.gen('IPv6').add('UDP').add('DHCPv6', msg_type: 'SOLLICIT')
|
34
|
+
# # access to DHCPv6 header from packet
|
35
|
+
# pkt.dhcpv6.class #=> PacketGen::Header::DHCPv6
|
39
36
|
#
|
40
|
-
#
|
37
|
+
# @example Add options
|
38
|
+
# # Options may be added by pushing a hash to #options:
|
41
39
|
# dhcpv6 = PacketGen::Header::DHCPv6.new(msg_type: 'SOLLICIT')
|
42
40
|
# dhcpv6.options << { type: 'Preference', value: 1 }
|
43
41
|
# @author Sylvain Daubert
|
@@ -75,9 +73,10 @@ module PacketGen
|
|
75
73
|
define_attr :msg_type, BinStruct::Int8Enum, enum: MESSAGE_TYPES
|
76
74
|
# @!attribute transaction_id
|
77
75
|
# 24-bit transaction ID
|
78
|
-
#
|
76
|
+
# @return [Integer]
|
79
77
|
define_attr :transaction_id, BinStruct::Int24
|
80
78
|
# @!attribute options
|
79
|
+
# Set of {Option}s
|
81
80
|
# @return [DHCPv6::Options]
|
82
81
|
define_attr :options, DHCPv6::Options
|
83
82
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# This file is part of PacketGen
|
4
|
-
# See https://
|
4
|
+
# See https://codeberg.org/lemontree55/packetgen for more informations
|
5
5
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
6
6
|
# Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
|
7
7
|
# This program is published under MIT license.
|
@@ -9,13 +9,14 @@
|
|
9
9
|
module PacketGen
|
10
10
|
module Header
|
11
11
|
class DNS
|
12
|
-
# DNS Name, defined as a suite of labels. A label is of type
|
12
|
+
# DNS Name, defined as a suite of labels. A label is of type +BinStruct::IntString+.
|
13
13
|
# @author Sylvain Daubert
|
14
14
|
# @author LemonTree55
|
15
15
|
class Name < BinStruct::Array
|
16
16
|
# Mask to decode a pointer on another label
|
17
17
|
POINTER_MASK = 0xc000
|
18
18
|
|
19
|
+
# DNS message to which this name is attached. Used to decode compressed names
|
19
20
|
# @return [DNS]
|
20
21
|
attr_accessor :dns
|
21
22
|
|
@@ -49,32 +50,32 @@ module PacketGen
|
|
49
50
|
end
|
50
51
|
|
51
52
|
# Clear name
|
52
|
-
#
|
53
|
+
# @return [void]
|
53
54
|
def clear
|
54
55
|
super
|
55
56
|
@pointer = nil
|
56
57
|
@pointer_name = nil
|
57
58
|
end
|
58
59
|
|
59
|
-
# Read a sequence of label from a string
|
60
|
+
# Read a sequence of label from a binary string
|
60
61
|
# @param [String] str binary string
|
61
62
|
# @return [Name] self
|
62
63
|
def read(str)
|
63
64
|
clear
|
64
65
|
return self if str.nil?
|
65
66
|
|
66
|
-
|
67
|
+
strb = str.to_s.b
|
67
68
|
start = 0
|
68
69
|
loop do
|
69
|
-
index =
|
70
|
+
index = strb[start, 2].unpack1('n')
|
70
71
|
if pointer?(index)
|
71
72
|
# Pointer on another label
|
72
|
-
@pointer =
|
73
|
+
@pointer = strb[start, 2]
|
73
74
|
break
|
74
75
|
else
|
75
|
-
label = add_label_from(
|
76
|
+
label = add_label_from(strb[start..])
|
76
77
|
start += label.sz
|
77
|
-
break if label.empty? ||
|
78
|
+
break if label.empty? || strb[start..].empty?
|
78
79
|
end
|
79
80
|
end
|
80
81
|
# force resolution of compressed names
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# This file is part of PacketGen
|
4
|
-
# See https://
|
4
|
+
# See https://codeberg.org/lemontree55/packetgen for more informations
|
5
5
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
6
6
|
# Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
|
7
7
|
# This program is published under MIT license.
|
@@ -15,6 +15,7 @@ module PacketGen
|
|
15
15
|
#
|
16
16
|
# a OPT record may contain zero or more {Option options} in its {#rdata}.
|
17
17
|
# @author Sylvain Daubert
|
18
|
+
# @author LemonTree55
|
18
19
|
# @since 1.3.0
|
19
20
|
# @since 3.1.1 {#options} is a {ArrayOfOptions}
|
20
21
|
class OPT < RR
|
@@ -118,11 +119,13 @@ module PacketGen
|
|
118
119
|
alias udp_size rrclass
|
119
120
|
alias udp_size= rrclass=
|
120
121
|
|
122
|
+
# Get human-readable string for flags
|
121
123
|
# @return [String]
|
122
124
|
def human_flags
|
123
125
|
do? ? 'do' : 'none'
|
124
126
|
end
|
125
127
|
|
128
|
+
# Get human-readable string for this OPT
|
126
129
|
# @return [String]
|
127
130
|
def to_human
|
128
131
|
"#{name} #{human_type} UDPsize:#{udp_size} " \
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# This file is part of PacketGen
|
4
|
-
# See https://
|
4
|
+
# See https://codeberg.org/lemontree55/packetgen for more informations
|
5
5
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
6
6
|
# Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
|
7
7
|
# This program is published under MIT license.
|
@@ -11,18 +11,18 @@ module PacketGen
|
|
11
11
|
class DNS
|
12
12
|
# @!parse
|
13
13
|
# # DNS option is a TLV object:
|
14
|
-
# # * {#code} is a
|
15
|
-
# # *
|
16
|
-
# # * {#data} is a
|
14
|
+
# # * {#code} is a BinStruct::Int16,
|
15
|
+
# # * +#length+ is a BinStruct::Int16,
|
16
|
+
# # * {#data} is a BinStruct::String.
|
17
17
|
# #
|
18
18
|
# # @since 1.3.0
|
19
|
-
# # @since 3.1.0 defined with
|
19
|
+
# # @since 3.1.0 defined with BinStruct::AbstractTLV
|
20
20
|
# # @!parse class Option < BinStruct::AbstractTLV; end
|
21
21
|
# # @!attribute code
|
22
|
-
# # Alias for
|
22
|
+
# # Alias for +#type+
|
23
23
|
# # @return [Integer]
|
24
24
|
# # @!attribute data
|
25
|
-
# # Alias for
|
25
|
+
# # Alias for +#value+
|
26
26
|
# # @return [BinStruct::String]
|
27
27
|
# class Option < BinStruct::AbstractTLV; end
|
28
28
|
# @private
|
@@ -30,7 +30,7 @@ module PacketGen
|
|
30
30
|
length_class: BinStruct::Int16,
|
31
31
|
aliases: { code: :type, data: :value })
|
32
32
|
|
33
|
-
# Array of {Option}.
|
33
|
+
# Array of {Option}s.
|
34
34
|
# @since 3.1.1
|
35
35
|
class ArrayOfOptions < BinStruct::Array
|
36
36
|
set_of Option
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# This file is part of PacketGen
|
4
|
-
# See https://
|
4
|
+
# See https://codeberg.org/lemontree55/packetgen for more informations
|
5
5
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
6
6
|
# Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
|
7
7
|
# This program is published under MIT license.
|
@@ -25,14 +25,14 @@ module PacketGen
|
|
25
25
|
# @param [Question] q
|
26
26
|
# @return [Question]
|
27
27
|
|
28
|
-
# Read Question section from a string
|
28
|
+
# Read Question section from a binary string
|
29
29
|
# @param [String] str binary string
|
30
30
|
# @return [QDSection] self
|
31
31
|
def read(str)
|
32
32
|
clear
|
33
33
|
return self if str.nil?
|
34
34
|
|
35
|
-
|
35
|
+
str = str.b unless str.encoding == Encoding::ASCII_8BIT
|
36
36
|
while !str.empty? && (self.size < @counter.to_i)
|
37
37
|
question = Question.new(@dns).read(str)
|
38
38
|
str.slice!(0, question.sz)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# This file is part of PacketGen
|
4
|
-
# See https://
|
4
|
+
# See https://codeberg.org/lemontree55/packetgen for more informations
|
5
5
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
6
6
|
# Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
|
7
7
|
# This program is published under MIT license.
|
@@ -120,6 +120,7 @@ module PacketGen
|
|
120
120
|
end
|
121
121
|
end
|
122
122
|
|
123
|
+
# Human-readable string for this question
|
123
124
|
# @return [String]
|
124
125
|
def to_human
|
125
126
|
if self[:name].dns.is_a? MDNS
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# This file is part of PacketGen
|
4
|
-
# See https://
|
4
|
+
# See https://codeberg.org/lemontree55/packetgen for more informations
|
5
5
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
6
6
|
# Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
|
7
7
|
# This program is published under MIT license.
|
@@ -87,9 +87,7 @@ module PacketGen
|
|
87
87
|
self[:rdata].read(data)
|
88
88
|
end
|
89
89
|
|
90
|
-
|
91
|
-
|
92
|
-
# Get human readable rdata
|
90
|
+
# Get human readable rdata
|
93
91
|
# @return [String]
|
94
92
|
def human_rdata
|
95
93
|
str = human_ip_rdata || self[:rdata].inspect
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# This file is part of PacketGen
|
4
|
-
# See https://
|
4
|
+
# See https://codeberg.org/lemontree55/packetgen for more informations
|
5
5
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
6
6
|
# Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
|
7
7
|
# This program is published under MIT license.
|
@@ -21,13 +21,13 @@ module PacketGen
|
|
21
21
|
end
|
22
22
|
|
23
23
|
# Read RR section from a string
|
24
|
-
# @param [String] str binary string
|
24
|
+
# @param [String] str binary binary string
|
25
25
|
# @return [RRSection] self
|
26
26
|
def read(str)
|
27
27
|
clear
|
28
28
|
return self if str.nil?
|
29
29
|
|
30
|
-
|
30
|
+
str = str.b unless str.encoding == Encoding::BINARY
|
31
31
|
while !str.empty? && (self.size < @counter.to_i)
|
32
32
|
rr = RR.new(@dns).read(str)
|
33
33
|
rr = OPT.new(@dns).read(str) if rr.type?('OPT')
|
data/lib/packetgen/header/dns.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
# This file is part of PacketGen
|
5
|
-
# See https://
|
5
|
+
# See https://codeberg.org/lemontree55/packetgen for more informations
|
6
6
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
7
7
|
# Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
|
8
8
|
# This program is published under MIT license.
|
@@ -33,70 +33,77 @@ module PacketGen
|
|
33
33
|
# * {#ns}, authoritary section,
|
34
34
|
# * {#ar}, additional information section.
|
35
35
|
#
|
36
|
-
#
|
37
|
-
#
|
38
|
-
#
|
39
|
-
#
|
40
|
-
#
|
41
|
-
#
|
42
|
-
#
|
36
|
+
# @example Create a DNS header
|
37
|
+
# # standalone
|
38
|
+
# dns = PacketGen::Header::DNS.new
|
39
|
+
# # in a IP packet
|
40
|
+
# pkt = PacketGen.gen('IP').add('UDP').add('DNS')
|
41
|
+
# # access to DNS header
|
42
|
+
# pkt.dns.class # => PacketGen::Header::DNS
|
43
43
|
#
|
44
|
-
#
|
45
|
-
#
|
46
|
-
#
|
47
|
-
#
|
48
|
-
#
|
49
|
-
#
|
50
|
-
#
|
51
|
-
#
|
52
|
-
#
|
53
|
-
#
|
54
|
-
#
|
55
|
-
#
|
56
|
-
#
|
57
|
-
#
|
58
|
-
#
|
59
|
-
#
|
60
|
-
#
|
61
|
-
#
|
62
|
-
#
|
63
|
-
#
|
64
|
-
#
|
44
|
+
# @example DNS attributes
|
45
|
+
# dns = PacketGen::Header::DNS.new
|
46
|
+
# dns.id = 0x1234
|
47
|
+
# dns.qr = false
|
48
|
+
# # opcode may be set as an Integer (all values are possible)
|
49
|
+
# # or as a String (only keys from PacketGen::Header::DNS::OPCODES)
|
50
|
+
# dns.opcode = 0xe # set as integer, value not defined in standard
|
51
|
+
# dns.opcode = 'query' # set as string
|
52
|
+
# # Set flags
|
53
|
+
# dns.aa = dns.tc = dns.rd = dns.ra = false
|
54
|
+
# # rcode may be set as an Integer (all values are possible)
|
55
|
+
# # or as a String (only keys from PacketGen::Header::DNS::RCODES)
|
56
|
+
# dns.rcode = 11
|
57
|
+
# dns.rcode = 'refused'
|
58
|
+
# # Section counts may be set by hand. They also be set automatically when adding
|
59
|
+
# # an element to a section.
|
60
|
+
# dns.qdcount = 123
|
61
|
+
# dns.ancount = 0x1234
|
62
|
+
# dns.nscount = 1
|
63
|
+
# dns.arcount = 0
|
64
|
+
# # Access to DNS sections:
|
65
|
+
# dns.qd.class # => PacketGen::Header::DNS::QDSection
|
66
|
+
# dns.an.class # => PacketGen::Header::DNS::RRSection
|
67
|
+
# dns.ns.class # => PacketGen::Header::DNS::RRSection
|
68
|
+
# dns.ar.class # => PacketGen::Header::DNS::RRSection
|
65
69
|
#
|
66
|
-
#
|
67
|
-
#
|
68
|
-
#
|
69
|
-
#
|
70
|
-
#
|
71
|
-
#
|
72
|
-
#
|
73
|
-
#
|
74
|
-
#
|
75
|
-
#
|
76
|
-
#
|
70
|
+
# @example Add a question to DNS question section
|
71
|
+
# dns = PacketGen::Header::DNS.new
|
72
|
+
# # add a question about example.net IP address. Increment qdcount
|
73
|
+
# dns.qd << PacketGen::Header::DNS::Question.new(dns, name: 'example.net')
|
74
|
+
# # or
|
75
|
+
# dns.qd << { rtype: 'Question', name: 'example.net' }
|
76
|
+
# dns.qdcount #=> 2
|
77
|
+
# # add a question about example.net IPv6 address. Dot not modify qdcount
|
78
|
+
# dns.qd.push(PacketGen::Header::DNS::Question.new(dns, name: 'example.net', type: 'AAAA'))
|
79
|
+
# # or
|
80
|
+
# dns.qd.push(rtype: 'Question', name: 'example.net', type: 'AAAA')
|
81
|
+
# dns.qdcount #=> 2
|
77
82
|
#
|
78
|
-
#
|
79
|
-
#
|
80
|
-
#
|
81
|
-
#
|
82
|
-
#
|
83
|
-
#
|
84
|
-
#
|
85
|
-
#
|
86
|
-
#
|
87
|
-
#
|
88
|
-
#
|
89
|
-
#
|
83
|
+
# @example Add a ressource record to a DNS section
|
84
|
+
# dns = PacketGen::Header::DNS.new
|
85
|
+
# # add a RR to answer section. Increment ancount
|
86
|
+
# dns.an << PacketGen::Header::DNS::RR.new(dns, name: 'example.net', rdata: IPAddr.new('1.2.3.4').hton)
|
87
|
+
# # or
|
88
|
+
# dns.an << { rtype: 'RR', name: 'example.net', rdata: IPAddr.new('1.2.3.4').hton }
|
89
|
+
# dns.ancount #=> 2
|
90
|
+
# # add a RR to NS section. Dot not modify nscount
|
91
|
+
# rdata = PacketGen::Header::DNS::Name.new(dns: dns).from_human('dns.net')
|
92
|
+
# dns.ns.push(PacketGen::Header::DNS::RR.new(dns, name: 'example.net', type: 'NS', rdata: rdata))
|
93
|
+
# # or
|
94
|
+
# dns.ns.push(rtype: 'RR', name: 'example.net', type: 'NS', rdata: rdata)
|
95
|
+
# dns.nscount #=> 0
|
90
96
|
#
|
91
|
-
#
|
92
|
-
#
|
93
|
-
#
|
94
|
-
#
|
95
|
-
#
|
96
|
-
#
|
97
|
-
#
|
98
|
-
#
|
99
|
-
#
|
97
|
+
# @example Extended DNS (EDNS(0)) options
|
98
|
+
# dns = PacketGen::Header::DNS.new
|
99
|
+
# # Add an OPT to ar section
|
100
|
+
# dns.ar << PacketGen::Header::DNS::OPT.new(dns, udp_size: 4096, ext_rcode: 43)
|
101
|
+
# # or
|
102
|
+
# dns.ar << { rtype: 'OPT', udp_size: 4096, ext_rcode: 43 }
|
103
|
+
# # add an option to OPT record
|
104
|
+
# dns.ar.last.options << PacketGen::Header::DNS::Option.new(code: 48, data: '12')
|
105
|
+
# # or
|
106
|
+
# dns.ar.last.options << { code: 48, data: '12' }
|
100
107
|
# @author Sylvain Daubert
|
101
108
|
# @since 1.3.0
|
102
109
|
class DNS < Base
|
@@ -140,6 +147,7 @@ module PacketGen
|
|
140
147
|
}.freeze
|
141
148
|
|
142
149
|
# @!attribute id
|
150
|
+
# 16-bit identifier to match up replies and queries
|
143
151
|
# @return [Integer]
|
144
152
|
define_attr :id, BinStruct::Int16
|
145
153
|
# @!attribute u16
|
@@ -166,27 +174,35 @@ module PacketGen
|
|
166
174
|
undef opcode=, rcode=
|
167
175
|
|
168
176
|
# @!attribute qdcount
|
177
|
+
# Number of entries in {#qd question section}
|
169
178
|
# @return [Integer]
|
170
179
|
define_attr :qdcount, BinStruct::Int16
|
171
180
|
# @!attribute ancount
|
181
|
+
# Number of ressource recors in {#an answer section}
|
172
182
|
# @return [Integer]
|
173
183
|
define_attr :ancount, BinStruct::Int16
|
174
184
|
# @!attribute nscount
|
185
|
+
# Number of name resource recors in {#ns authority records section}
|
175
186
|
# @return [Integer]
|
176
187
|
define_attr :nscount, BinStruct::Int16
|
177
188
|
# @!attribute arcount
|
189
|
+
# Number of ressources recors in {#ar additional records section}
|
178
190
|
# @return [Integer]
|
179
191
|
define_attr :arcount, BinStruct::Int16
|
180
192
|
# @!attribute qd
|
193
|
+
# Question section
|
181
194
|
# @return [QDSection]
|
182
195
|
define_attr :qd, QDSection, builder: ->(h, t) { t.new(h, h[:qdcount]) }
|
183
196
|
# @!attribute an
|
197
|
+
# Answer section
|
184
198
|
# @return [RRSection]
|
185
199
|
define_attr :an, RRSection, builder: ->(h, t) { t.new(h, h[:ancount]) }
|
186
200
|
# @!attribute ns
|
201
|
+
# Authority records section
|
187
202
|
# @return [RRSection]
|
188
203
|
define_attr :ns, RRSection, builder: ->(h, t) { t.new(h, h[:nscount]) }
|
189
204
|
# @!attribute ar
|
205
|
+
# Additional record section
|
190
206
|
# @return [RRSection]
|
191
207
|
define_attr :ar, RRSection, builder: ->(h, t) { t.new(h, h[:arcount]) }
|
192
208
|
|
@@ -2,7 +2,7 @@
|
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
# This file is part of PacketGen
|
5
|
-
# See https://
|
5
|
+
# See https://codeberg.org/lemontree55/packetgen for more informations
|
6
6
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
7
7
|
# Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
|
8
8
|
# This program is published under MIT license.
|
@@ -12,16 +12,16 @@ module PacketGen
|
|
12
12
|
class Dot11
|
13
13
|
# IEEE 802.11 control frame header
|
14
14
|
#
|
15
|
-
# This class
|
15
|
+
# This class makes a {Dot11} header with {#type} set to +1+
|
16
16
|
# (control frame).
|
17
17
|
#
|
18
18
|
# A IEEE 802.11 control header consists of:
|
19
|
-
# * a {#frame_ctrl} (
|
20
|
-
# * a {#id}/duration (
|
19
|
+
# * a {#frame_ctrl} (+BinStruct::Int16+),
|
20
|
+
# * a {#id}/duration (+BinStruct::Int16le+),
|
21
21
|
# * a {#mac1} ({Eth::MacAddr}).
|
22
22
|
# * sometimes a {#mac2} ({Eth::MacAddr}),
|
23
|
-
# * a {#body} (a
|
24
|
-
# * and a Frame check sequence ({#fcs}, of type
|
23
|
+
# * a {#body} (a +BinStruct::String+ or another {Headerable} class),
|
24
|
+
# * and a Frame check sequence ({#fcs}, of type +BinStruct::Int32le+).
|
25
25
|
# @author Sylvain Daubert
|
26
26
|
class Control < Dot11
|
27
27
|
# Control subtypes
|
@@ -2,7 +2,7 @@
|
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
# This file is part of PacketGen
|
5
|
-
# See https://
|
5
|
+
# See https://codeberg.org/lemontree55/packetgen for more informations
|
6
6
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
7
7
|
# Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
|
8
8
|
# This program is published under MIT license.
|
@@ -16,15 +16,16 @@ module PacketGen
|
|
16
16
|
# (data frame).
|
17
17
|
#
|
18
18
|
# A IEEE 802.11 data header consists of:
|
19
|
-
# * a {#frame_ctrl} (
|
20
|
-
# * a {#id}/duration (
|
19
|
+
# * a {#frame_ctrl} (+BinStruct::Int16+),
|
20
|
+
# * a {#id}/duration (+BinStruct::Int16le+),
|
21
|
+
# * a {#mac1} ({Eth::MacAddr}),
|
21
22
|
# * a {#mac2} ({Eth::MacAddr}),
|
22
23
|
# * a {#mac3} ({Eth::MacAddr}),
|
23
|
-
# * a {#sequence_ctrl} (
|
24
|
+
# * a {#sequence_ctrl} (+BinStruct::Int16+),
|
24
25
|
# * sometimes a {#mac4} ({Eth::MacAddr}),
|
25
|
-
# * sometimes a {#qos_ctrl} (
|
26
|
-
# * a {#body} (a
|
27
|
-
# * and a Frame check sequence ({#fcs}, of type
|
26
|
+
# * sometimes a {#qos_ctrl} (+BinStruct::Int16+),
|
27
|
+
# * a {#body} (a +BinStruct::String+ or another {Headerable} class),
|
28
|
+
# * and a Frame check sequence ({#fcs}, of type +BinStruct::Int32le+).
|
28
29
|
# @author Sylvain Daubert
|
29
30
|
class Data < Dot11
|
30
31
|
# @param [Hash] options
|
@@ -65,14 +66,14 @@ module PacketGen
|
|
65
66
|
self
|
66
67
|
end
|
67
68
|
|
68
|
-
# Get destination MAC address
|
69
|
+
# Get destination MAC address. {#from_ds} and {#to_ds} must be set before using these method.
|
69
70
|
# @return [String]
|
70
71
|
def dst
|
71
72
|
_src_mac, dst_mac = src_dst_from_mac
|
72
73
|
self.send(dst_mac)
|
73
74
|
end
|
74
75
|
|
75
|
-
# Set destination MAC address
|
76
|
+
# Set destination MAC address. {#from_ds} and {#to_ds} must be set before using these method.
|
76
77
|
# @param [String] mac MAC address to set
|
77
78
|
# @return [String]
|
78
79
|
def dst=(mac)
|
@@ -80,14 +81,14 @@ module PacketGen
|
|
80
81
|
self.send(:"#{dst_mac}=", mac)
|
81
82
|
end
|
82
83
|
|
83
|
-
# Get source MAC address
|
84
|
+
# Get source MAC address. {#from_ds} and {#to_ds} must be set before using these method.
|
84
85
|
# @return [String]
|
85
86
|
def src
|
86
87
|
src_mac, = src_dst_from_mac
|
87
88
|
self.send(src_mac)
|
88
89
|
end
|
89
90
|
|
90
|
-
# Set source MAC address
|
91
|
+
# Set source MAC address. {#from_ds} and {#to_ds} must be set before using these method.
|
91
92
|
# @param [String] mac MAC address to set
|
92
93
|
# @return [String]
|
93
94
|
def src=(mac)
|
@@ -2,7 +2,7 @@
|
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
# This file is part of PacketGen
|
5
|
-
# See https://
|
5
|
+
# See https://codeberg.org/lemontree55/packetgen for more informations
|
6
6
|
# Copyright (C) 2016 Sylvain Daubert <sylvain.daubert@laposte.net>
|
7
7
|
# Copyright (C) 2024 LemonTree55 <lenontree@proton.me>
|
8
8
|
# This program is published under MIT license.
|
@@ -15,7 +15,7 @@ module PacketGen
|
|
15
15
|
# #
|
16
16
|
# # An {Element} is a piece of data contained in a Dot11 management frame.
|
17
17
|
# # @since 1.4.0
|
18
|
-
# # @since 3.1.0 subclass of
|
18
|
+
# # @since 3.1.0 subclass of +BinStruct::AbstractTLV+
|
19
19
|
# class Element < BinStruct::AbstractTLV; end
|
20
20
|
# @private
|
21
21
|
Element = BinStruct::AbstractTLV.create
|