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.
Files changed (117) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +7 -9
  3. data/lib/packetgen/capture.rb +3 -6
  4. data/lib/packetgen/config.rb +1 -1
  5. data/lib/packetgen/deprecation.rb +7 -1
  6. data/lib/packetgen/header/arp.rb +7 -8
  7. data/lib/packetgen/header/asn1_base.rb +3 -2
  8. data/lib/packetgen/header/base.rb +39 -27
  9. data/lib/packetgen/header/bootp.rb +15 -15
  10. data/lib/packetgen/header/dhcp/option.rb +9 -9
  11. data/lib/packetgen/header/dhcp/options.rb +3 -3
  12. data/lib/packetgen/header/dhcp.rb +7 -8
  13. data/lib/packetgen/header/dhcpv6/duid.rb +3 -5
  14. data/lib/packetgen/header/dhcpv6/option.rb +38 -16
  15. data/lib/packetgen/header/dhcpv6/options.rb +4 -4
  16. data/lib/packetgen/header/dhcpv6/relay.rb +2 -1
  17. data/lib/packetgen/header/dhcpv6.rb +14 -15
  18. data/lib/packetgen/header/dns/name.rb +10 -9
  19. data/lib/packetgen/header/dns/opt.rb +4 -1
  20. data/lib/packetgen/header/dns/option.rb +8 -8
  21. data/lib/packetgen/header/dns/qdsection.rb +3 -3
  22. data/lib/packetgen/header/dns/question.rb +2 -1
  23. data/lib/packetgen/header/dns/rr.rb +2 -4
  24. data/lib/packetgen/header/dns/rrsection.rb +3 -3
  25. data/lib/packetgen/header/dns.rb +77 -61
  26. data/lib/packetgen/header/dot11/control.rb +6 -6
  27. data/lib/packetgen/header/dot11/data.rb +12 -11
  28. data/lib/packetgen/header/dot11/element.rb +2 -2
  29. data/lib/packetgen/header/dot11/management.rb +19 -16
  30. data/lib/packetgen/header/dot11/sub_mngt.rb +23 -22
  31. data/lib/packetgen/header/dot11.rb +39 -39
  32. data/lib/packetgen/header/dot1q.rb +6 -5
  33. data/lib/packetgen/header/dot1x.rb +9 -9
  34. data/lib/packetgen/header/eap/fast.rb +4 -4
  35. data/lib/packetgen/header/eap/md5.rb +12 -4
  36. data/lib/packetgen/header/eap/tls.rb +10 -9
  37. data/lib/packetgen/header/eap/ttls.rb +14 -11
  38. data/lib/packetgen/header/eap.rb +59 -34
  39. data/lib/packetgen/header/eth.rb +27 -13
  40. data/lib/packetgen/header/gre.rb +27 -3
  41. data/lib/packetgen/header/http/headers.rb +7 -6
  42. data/lib/packetgen/header/http/request.rb +25 -17
  43. data/lib/packetgen/header/http/response.rb +23 -16
  44. data/lib/packetgen/header/http/verbs.rb +1 -1
  45. data/lib/packetgen/header/http.rb +1 -1
  46. data/lib/packetgen/header/icmp.rb +11 -11
  47. data/lib/packetgen/header/icmpv6.rb +11 -10
  48. data/lib/packetgen/header/igmp.rb +22 -11
  49. data/lib/packetgen/header/igmpv3/group_record.rb +8 -3
  50. data/lib/packetgen/header/igmpv3/mq.rb +2 -2
  51. data/lib/packetgen/header/igmpv3/mr.rb +2 -2
  52. data/lib/packetgen/header/igmpv3.rb +12 -11
  53. data/lib/packetgen/header/ip/addr.rb +7 -3
  54. data/lib/packetgen/header/ip/option.rb +19 -6
  55. data/lib/packetgen/header/ip/options.rb +1 -1
  56. data/lib/packetgen/header/ip.rb +53 -36
  57. data/lib/packetgen/header/ipv6/addr.rb +15 -14
  58. data/lib/packetgen/header/ipv6/extension.rb +10 -8
  59. data/lib/packetgen/header/ipv6/hop_by_hop.rb +27 -8
  60. data/lib/packetgen/header/ipv6.rb +32 -23
  61. data/lib/packetgen/header/llc.rb +21 -14
  62. data/lib/packetgen/header/mdns.rb +10 -3
  63. data/lib/packetgen/header/mld.rb +12 -10
  64. data/lib/packetgen/header/mldv2/mcast_address_record.rb +7 -2
  65. data/lib/packetgen/header/mldv2/mlq.rb +9 -9
  66. data/lib/packetgen/header/mldv2/mlr.rb +5 -5
  67. data/lib/packetgen/header/mldv2.rb +2 -2
  68. data/lib/packetgen/header/ospfv2/db_description.rb +11 -11
  69. data/lib/packetgen/header/ospfv2/hello.rb +12 -11
  70. data/lib/packetgen/header/ospfv2/ls_ack.rb +6 -7
  71. data/lib/packetgen/header/ospfv2/ls_request.rb +8 -7
  72. data/lib/packetgen/header/ospfv2/ls_update.rb +8 -8
  73. data/lib/packetgen/header/ospfv2/lsa.rb +34 -11
  74. data/lib/packetgen/header/ospfv2/lsa_header.rb +4 -3
  75. data/lib/packetgen/header/ospfv2.rb +32 -27
  76. data/lib/packetgen/header/ospfv3/db_description.rb +13 -14
  77. data/lib/packetgen/header/ospfv3/hello.rb +11 -10
  78. data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +7 -3
  79. data/lib/packetgen/header/ospfv3/ls_ack.rb +6 -7
  80. data/lib/packetgen/header/ospfv3/ls_request.rb +11 -11
  81. data/lib/packetgen/header/ospfv3/ls_update.rb +8 -8
  82. data/lib/packetgen/header/ospfv3/lsa.rb +24 -10
  83. data/lib/packetgen/header/ospfv3/lsa_header.rb +4 -3
  84. data/lib/packetgen/header/ospfv3.rb +39 -35
  85. data/lib/packetgen/header/sctp/chunk.rb +39 -18
  86. data/lib/packetgen/header/sctp/error.rb +170 -198
  87. data/lib/packetgen/header/sctp/padded32.rb +4 -4
  88. data/lib/packetgen/header/sctp/parameter.rb +86 -133
  89. data/lib/packetgen/header/sctp.rb +15 -4
  90. data/lib/packetgen/header/snmp.rb +111 -10
  91. data/lib/packetgen/header/tcp/option.rb +8 -1
  92. data/lib/packetgen/header/tcp/options.rb +12 -4
  93. data/lib/packetgen/header/tcp.rb +34 -27
  94. data/lib/packetgen/header/tftp.rb +17 -11
  95. data/lib/packetgen/header/udp.rb +16 -14
  96. data/lib/packetgen/header.rb +20 -14
  97. data/lib/packetgen/headerable.rb +10 -4
  98. data/lib/packetgen/inject.rb +1 -1
  99. data/lib/packetgen/inspect.rb +3 -8
  100. data/lib/packetgen/packet.rb +95 -37
  101. data/lib/packetgen/pcap.rb +1 -1
  102. data/lib/packetgen/pcapng/block.rb +3 -2
  103. data/lib/packetgen/pcapng/epb.rb +1 -1
  104. data/lib/packetgen/pcapng/file.rb +42 -15
  105. data/lib/packetgen/pcapng/idb.rb +3 -2
  106. data/lib/packetgen/pcapng/shb.rb +3 -2
  107. data/lib/packetgen/pcapng/spb.rb +2 -2
  108. data/lib/packetgen/pcapng/unknown_block.rb +1 -1
  109. data/lib/packetgen/pcapng.rb +3 -1
  110. data/lib/packetgen/pcaprub_wrapper.rb +1 -1
  111. data/lib/packetgen/proto.rb +5 -1
  112. data/lib/packetgen/unknown_packet.rb +4 -4
  113. data/lib/packetgen/utils/arp_spoofer.rb +1 -1
  114. data/lib/packetgen/utils.rb +4 -5
  115. data/lib/packetgen/version.rb +2 -2
  116. data/lib/packetgen.rb +9 -3
  117. 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://github.com/lemontree55/packetgen for more informations
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,16 @@ require_relative 'option'
11
11
  module PacketGen
12
12
  module Header
13
13
  class TCP
14
- # Container for TCP options in {TCP TCP header}.
14
+ # Container for TCP {Option options} in {TCP TCP header}.
15
15
  # @author Sylvain Daubert
16
+ # @since 1.0.0
17
+ # @since 4.1.0 +#<<+ accepts +:kind+ parameter in hash
18
+ # @example Add an option from a hash
19
+ # opts = PacketGen::Header::TCP::Options.new
20
+ # # Option kind may be set using :opt
21
+ # opts << { opt: 'MSS', value: 1250 }
22
+ # # It may aldo be set using :kind
23
+ # opts << { kind: 'EOL' }
16
24
  class Options < BinStruct::Array
17
25
  set_of Option
18
26
 
@@ -34,8 +42,8 @@ module PacketGen
34
42
  private
35
43
 
36
44
  def record_from_hash(hsh)
37
- if hsh.key? :opt
38
- klassname = hsh.delete(:opt)
45
+ if hsh.key?(:opt) || hsh.key?(:kind)
46
+ klassname = hsh.delete(:opt) || hsh.delete(:kind)
39
47
  raise ArgumentError, 'opt should be a TCP::Option subclass' unless TCP.const_defined?(klassname)
40
48
 
41
49
  klass = TCP.const_get(klassname)
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/lemontree55/packetgen for more informations
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.
@@ -29,50 +29,56 @@ module PacketGen
29
29
  # | data |
30
30
  # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
31
31
  # A TCP header consists of:
32
- # * a source port ({#sport}, {BinStruct::Int16} type),
33
- # * a destination port ({#dport}, +Int16+ type),
34
- # * a sequence number ({#seqnum}, {BinStruct::Int32} type),
35
- # * an acknownledge number ({#acknum}, +Int32+ type),
36
- # * a 16-bit field ({#u16}, +Int16+ type) composed of:
37
- # * a 4-bit {#data_offset} self[attr],
32
+ # * a source port ({#sport}, +BinStruct::Int16+ type),
33
+ # * a destination port ({#dport}, +BinStruct::Int16+ type),
34
+ # * a sequence number ({#seqnum}, +BinStruct::Int32+ type),
35
+ # * an acknownledge number ({#acknum}, +BinStruct::Int32+ type),
36
+ # * a 16-bit field ({#u16}, +BinStruct::Int16+ type) composed of:
37
+ # * a 4-bit {#data_offset},
38
38
  # * a 3-bit {#reserved} field,
39
39
  # * a 9-bit {#flags} field,
40
- # * a {#window} field (+Int16+ type),
41
- # * a {#checksum} field (+Int16+ type),
42
- # * a urgent pointer ({#urg_pointer}, +Int16+ type),
40
+ # * a {#window} field (+BinStruct::Int16+ type),
41
+ # * a {#checksum} field (+BinStruct::Int16+ type),
42
+ # * a urgent pointer ({#urg_pointer}, +BinStruct::Int16+ type),
43
43
  # * an optional {#options} field ({Options} type),
44
- # * and a {#body} ({BinStruct::String} type).
44
+ # * and a {#body} (+BinStruct::String+ type).
45
45
  #
46
- # == Create a TCP header
46
+ # @example Create a TCP header
47
47
  # # standalone
48
48
  # tcph = PacketGen::Header::TCP.new
49
49
  # # in a IP packet
50
50
  # pkt = PacketGen.gen('IP').add('TCP')
51
51
  # # access to TCP header
52
- # pkt.tcp # => PacketGen::Header::TCP
52
+ # pkt.tcp.class # => PacketGen::Header::TCP
53
53
  #
54
- # == TCP attributes
54
+ # @example TCP attributes
55
+ # tcph = PacketGen::Header::TCP.new
55
56
  # tcph.sport = 4500
56
57
  # tcph.dport = 80
57
58
  # tcph.seqnum = 43
58
59
  # tcph.acknum = 0x45678925
59
60
  # tcph.wsize = 0x240
60
61
  # tcph.urg_pointer = 0x40
61
- # tcph.body.read 'this is a body'
62
+ # tcph.body = 'this is a body'
62
63
  #
63
- # == Flags
64
- # TCP flags may be accesed as a 9-bit integer:
64
+ # @example TCP Flags
65
+ # tcph = PacketGen::Header::TCP.new
66
+ # # TCP flags may be accesed as a 9-bit integer:
65
67
  # tcph.flags = 0x1002
66
- # Each flag may be accessed independently:
67
- # tcph.flag_syn? # => Boolean
68
+ # # Each flag may be accessed independently:
69
+ # tcph.flag_syn? # => true
68
70
  # tcph.flag_rst = true
69
71
  #
70
- # == Options
71
- # {#options} TCP attribute is a {Options}. {Option} may added to it:
72
- # tcph.options << PacketGen::Header::TCP::MSS.new(1250)
73
- # or:
74
- # tcph.options << { opt: 'MSS', self[attr]: 1250 }
72
+ # @example TCP Options
73
+ # tcph = PacketGen::Header::TCP.new
74
+ # # options TCP attribute is a PacketGen::Header::TCP::Options.
75
+ # # PacketGen::Header::TCP::Option may added to it:
76
+ # tcph.options << PacketGen::Header::TCP::MSS.new(value: 1250)
77
+ # # or
78
+ # tcph.options << { kind: 'MSS', value: 1250 }
79
+ # tcph.options.last.class #=> PacketGen::Header::TCP::MSS
75
80
  # @author Sylvain Daubert
81
+ # @author LemonTree55
76
82
  class TCP < Base
77
83
  end
78
84
  end
@@ -151,7 +157,8 @@ module PacketGen
151
157
  # @return [Options]
152
158
  define_attr :options, TCP::Options, builder: ->(h, t) { t.new(length_from: -> { h.data_offset > 5 ? (h.data_offset - 5) * 4 : 0 }) }
153
159
  # @!attribute body
154
- # @return [BinStruct::String,Header::Base]
160
+ # TCP body
161
+ # @return [BinStruct::String,Headerable]
155
162
  define_attr :body, BinStruct::String
156
163
 
157
164
  alias source_port sport
@@ -181,7 +188,7 @@ module PacketGen
181
188
  # @option options [Integer] :window
182
189
  # @option options [Integer] :checksum
183
190
  # @option options [Integer] :urg_pointer
184
- # @option options [String] :body
191
+ # @option options [String, Headerable] :body
185
192
  def initialize(options={})
186
193
  opts = { data_offset: 5 }.merge!(options)
187
194
  super(opts)
@@ -195,7 +202,7 @@ module PacketGen
195
202
  end
196
203
 
197
204
  # Set all flags at once
198
- # @parameter [Integer] value
205
+ # @param [Integer] value
199
206
  # @return [Integer]
200
207
  def flags=(value)
201
208
  new_u16 = (self.u16 & 0xfe00) | (value & 0x1ff)
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/lemontree55/packetgen for more informations
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.
@@ -10,25 +10,26 @@ module PacketGen
10
10
  module Header
11
11
  # A TFTP (Trivial File Transfer Protocol,
12
12
  # {https://tools.ietf.org/html/rfc1350 RFC 1350}) header consists of:
13
- # * a {#opcode} ({BinStruct::Int16Enum}),
13
+ # * an {#opcode} (+BinStruct::Int16Enum+),
14
14
  # * and a body. Its content depends on opcode.
15
15
  #
16
16
  # Specialized subclasses exists to handle {TFTP::RRQ Read Request},
17
17
  # {TFTP::WRQ Write Request}, {TFTP::DATA DATA}, {TFTP::ACK ACK} and
18
18
  # {TFTP::ERROR ERROR} packets.
19
19
  #
20
- # == Create a TFTP header
20
+ # @example Create a TFTP header
21
21
  # # standalone
22
22
  # tftp = PacketGen::Header::TFTP.new
23
23
  # # in a packet
24
24
  # pkt = PacketGen.gen('IP').add('UDP').add('TFTP')
25
25
  # # access to TFTP header
26
- # pkt.tftp # => PacketGen::Header::TFTP
26
+ # pkt.tftp.class # => PacketGen::Header::TFTP
27
27
  #
28
- # == TFTP attributes
28
+ # @example TFTP attributes
29
+ # tftp = PacketGen::Header::TFTP.new
29
30
  # tftp.opcode = 'RRQ'
30
31
  # tftp.opcode = 1
31
- # tftp.body.read 'this is a body'
32
+ # tftp.body = 'this is a body'
32
33
  #
33
34
  # == TFTP parsing
34
35
  # When parsing, only first packet (read or write request) should be decoded
@@ -46,6 +47,7 @@ module PacketGen
46
47
  # packets[0].tftp.decode!(packets[1..-1])
47
48
  # packets.map { |pkt| pkt.headers.last.class.to_s }.join(',') # => TFTP::RRQ,TFTP::DATA,UDP,TFTP::ACK
48
49
  # @author Sylvain Daubert
50
+ # @author LemonTree55
49
51
  # @since 2.3.0
50
52
  class TFTP < Base
51
53
  # Known opcodes
@@ -63,7 +65,8 @@ module PacketGen
63
65
  define_attr :opcode, BinStruct::Int16Enum, enum: OPCODES
64
66
 
65
67
  # @!attribute body
66
- # @return [String]
68
+ # TFTP body, if opcode is unknown
69
+ # @return [String,Headerable]
67
70
  define_attr :body, BinStruct::String
68
71
 
69
72
  def initialize(options={})
@@ -85,7 +88,7 @@ module PacketGen
85
88
  def read(str)
86
89
  if self.instance_of? TFTP
87
90
  super
88
- if OPCODES.value? opcode
91
+ if OPCODES.value?(opcode)
89
92
  TFTP.const_get(human_opcode).new.read(str)
90
93
  else
91
94
  self
@@ -145,7 +148,8 @@ module PacketGen
145
148
  pkt.udp.dport = udp_dport
146
149
  end
147
150
 
148
- # TFTP Read Request header
151
+ # TFTP Read Request header.
152
+ # This header remove {#body} attribute and repalces it with {#filename} and {#mode}.
149
153
  class RRQ < TFTP
150
154
  remove_attr :body
151
155
 
@@ -171,7 +175,8 @@ module PacketGen
171
175
  define_attr_before :body, :block_num, BinStruct::Int16
172
176
  end
173
177
 
174
- # TFTP ACK header
178
+ # TFTP ACK header.
179
+ # This header remove {#body} attribute and repalces it with {#block_num}.
175
180
  class ACK < TFTP
176
181
  remove_attr :body
177
182
 
@@ -181,7 +186,8 @@ module PacketGen
181
186
  define_attr :block_num, BinStruct::Int16
182
187
  end
183
188
 
184
- # TFTP ERROR header
189
+ # TFTP ERROR header.
190
+ # This header remove {#body} attribute and repalces it with {#error_code} and {#error_msg}.
185
191
  class ERROR < TFTP
186
192
  remove_attr :body
187
193
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/lemontree55/packetgen for more informations
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.
@@ -17,28 +17,30 @@ module PacketGen
17
17
  # | Length | Checksum |
18
18
  # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
19
19
  # A UDP header consists of:
20
- # * a source port field ({#sport}, {BinStruct::Int16} type),
21
- # * a destination port field ({#dport}, +Int16+ type),
22
- # * a UDP length field ({#length}, +Int16+ type),
23
- # * a {#checksum} field (+Int16+ type),
20
+ # * a source port field ({#sport}, +BinStruct::Int16+ type),
21
+ # * a destination port field ({#dport}, +BinStruct:Int16+ type),
22
+ # * a UDP length field ({#length}, +BinStruct:Int16+ type),
23
+ # * a {#checksum} field (+BinStruct:Int16+ type),
24
24
  # * and a {#body}.
25
25
  #
26
- # == Create a UDP header
26
+ # @example Create a UDP header
27
27
  # # standalone
28
28
  # udp = PacketGen::Header::UDP.new
29
29
  # # in a packet
30
- # pkt = PAcketGen.gen('IP').eadd('UDP')
30
+ # pkt = PacketGen.gen('IP').add('UDP')
31
31
  # # access to IP header
32
- # pkt.udp # => PacketGen::Header::UDP
32
+ # pkt.udp.class # => PacketGen::Header::UDP
33
33
  #
34
- # == UDP attributes
34
+ # @example UDP attributes
35
+ # udp = PacketGen::Header::UDP.new
35
36
  # udp.sport = 65432
36
37
  # udp.dport = 53
37
38
  # udp.length = 43
38
39
  # udp.checksum = 0xffff
39
- # udp.body.read 'this is a UDP body'
40
+ # udp.body = 'this is a UDP body'
40
41
  #
41
42
  # @author Sylvain Daubert
43
+ # @author LemonTree55
42
44
  class UDP < Base
43
45
  # IP protocol number for UDP
44
46
  IP_PROTOCOL = 17
@@ -60,7 +62,8 @@ module PacketGen
60
62
  # @return [Integer]
61
63
  define_attr :checksum, BinStruct::Int16
62
64
  # @!attribute body
63
- # @return [BinStruct::String,Header::Base]
65
+ # UDP body
66
+ # @return [BinStruct::String,Headerable]
64
67
  define_attr :body, BinStruct::String
65
68
 
66
69
  alias source_port sport
@@ -75,7 +78,7 @@ module PacketGen
75
78
  self.length += self[:body].sz if self[:body].sz.positive?
76
79
  end
77
80
 
78
- # Compute checksum and set +checksum+ field
81
+ # Compute checksum and set {#checksum} field
79
82
  # @return [Integer]
80
83
  def calc_checksum
81
84
  ip = ip_header(self)
@@ -86,7 +89,7 @@ module PacketGen
86
89
  self.checksum = IP.reduce_checksum(sum)
87
90
  end
88
91
 
89
- # Compute length and set +length+ field
92
+ # Compute length and set {#length} field
90
93
  # @return [Integer]
91
94
  def calc_length
92
95
  Base.calculate_and_set_length(self)
@@ -100,7 +103,6 @@ module PacketGen
100
103
  self
101
104
  end
102
105
  end
103
-
104
106
  self.add_class UDP
105
107
 
106
108
  IP.bind UDP, protocol: UDP::IP_PROTOCOL
@@ -2,7 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  # This file is part of PacketGen
5
- # See https://github.com/lemontree55/packetgen for more informations
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.
@@ -14,21 +14,27 @@ module PacketGen
14
14
  #
15
15
  # == Add a foreign header class
16
16
  # PacketGen permits adding your own header classes.
17
- # First, define the new header class. By example:
18
- # module MyModule
19
- # class MyHeader < PacketGen::Header::Base
20
- # define_attr :field1, BinStruct::Int32
21
- # define_attr :field2, BinStruct::Int32
22
- # end
17
+ # First, define the new header class. Then, this class must be declared to PacketGen using {Header.add_class}.
18
+ # Finally, bindings must be declared.
19
+ #
20
+ # @example Foreign header class
21
+ # # Define a new header
22
+ # module MyModule
23
+ # class MyHeader < PacketGen::Header::Base
24
+ # define_attr :field1, BinStruct::Int32
25
+ # define_attr :field2, BinStruct::Int32
26
+ # end
23
27
  # end
24
- # Then, class must be declared to PacketGen:
25
- # PacketGen::Header.add_class(MyModule::MyHeader)
26
- # Finally, bindings must be declared:
27
- # # bind MyHeader as IP protocol number 254 (needed by Packet#parse and Packet#add)
28
- # PacketGen::Header::IP.bind_header(MyModule::MyHeader, protocol: 254)
29
- # And use it:
30
- # pkt = Packet.gen('IP').add('MyHeader', field1: 0x12345678, field3: 0x87654321)
28
+ #
29
+ # # Declare the new header to PacketGen
30
+ # PacketGen::Header.add_class(MyModule::MyHeader)
31
+ # # bind it as IP protocol number 254 (needed by Packet#parse and Packet#add)
32
+ # PacketGen::Header::IP.bind(MyModule::MyHeader, protocol: 254)
33
+ #
34
+ # # Use it
35
+ # pkt = PacketGen.gen('IP').add('MyModule::MyHeader', field1: 0x12345678, field3: 0x87654321)
31
36
  # @author Sylvain Daubert
37
+ # @author LemonTree55
32
38
  module Header
33
39
  @added_header_classes = {}
34
40
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/lemontree55/packetgen for more informations
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,7 +9,13 @@
9
9
  module PacketGen
10
10
  # This mixin module defines minimal API for a class to act as a header
11
11
  # in {Packet}.
12
+ #
13
+ # Some others methods may optionally be defined by a {Headerable} object:
14
+ # * +#calc_length+ to calculate length from content. It should be defined if header as a length attribute.
15
+ # * +#calc_checksum+ to calculate checksum. It should be defined if header as a checksum attriibute.
16
+ # * +#reply+ to invert fields in header for a reply.
12
17
  # @author Sylvain Daubert
18
+ # @author LemonTree55
13
19
  # @since 3.0.2
14
20
  module Headerable
15
21
  # This modules handles class methods for {Headerable headerable classes}.
@@ -51,7 +57,7 @@ module PacketGen
51
57
  end
52
58
 
53
59
  # @abstract Should be redefined by subclasses. This method should check invariant
54
- # attributes.from header.
60
+ # attributes from header.
55
61
  # Called by {Packet#parse} when guessing first header to check if header is correct
56
62
  # @return [Boolean]
57
63
  def parse?
@@ -74,8 +80,8 @@ module PacketGen
74
80
  @packet
75
81
  end
76
82
 
77
- # @abstract This method is called when a header is added to a packet.
78
- # This base method does nothing but may be overriden by subclasses.
83
+ # @abstract This base method does nothing but may be overriden by subclasses.
84
+ # This method is called when a header is added to a packet.
79
85
  # @param [Packet] packet packet to which self is added
80
86
  # @return [void]
81
87
  def added_to_packet(packet) end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/lemontree55/packetgen for more informations
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.
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # This file is part of PacketGen
4
- # See https://github.com/lemontree55/packetgen for more informations
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.
@@ -61,18 +61,13 @@ module PacketGen
61
61
  str << Inspect::FMT_ATTR % [type, attr, value]
62
62
  end
63
63
 
64
- # Format an attribute for +#inspect+.
65
- # 3 cases are handled:
66
- # * attribute value is a {BinStruct::Int}: show value as integer and in
67
- # hexdecimal format,
68
- # * attribute value responds to +#to_human+: call it,
69
- # * else, +#to_s+ is used to format attribute value.
64
+ # Format an attribute for +#inspect+. Call +#format_inspect} on +value+.
70
65
  # @param [Symbol] attr attribute name
71
66
  # @param [Object] value attribute value
72
67
  # @param [Integer] level
73
68
  # @return [String]
74
69
  def self.inspect_attribute(attr, value, level=1)
75
- type = value.class.to_s.sub(/.*::/, '')
70
+ type = value.type_name
76
71
  self.format(type, attr, value.format_inspect, level)
77
72
  end
78
73