packetgen 3.3.3 → 4.1.0

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 (128) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +38 -22
  3. data/lib/packetgen/capture.rb +2 -2
  4. data/lib/packetgen/config.rb +0 -1
  5. data/lib/packetgen/deprecation.rb +14 -8
  6. data/lib/packetgen/header/arp.rb +17 -18
  7. data/lib/packetgen/header/asn1_base.rb +2 -1
  8. data/lib/packetgen/header/base.rb +42 -40
  9. data/lib/packetgen/header/bootp.rb +35 -37
  10. data/lib/packetgen/header/dhcp/option.rb +21 -21
  11. data/lib/packetgen/header/dhcp/options.rb +3 -3
  12. data/lib/packetgen/header/dhcp.rb +8 -9
  13. data/lib/packetgen/header/dhcpv6/duid.rb +16 -16
  14. data/lib/packetgen/header/dhcpv6/option.rb +83 -61
  15. data/lib/packetgen/header/dhcpv6/options.rb +4 -4
  16. data/lib/packetgen/header/dhcpv6/relay.rb +6 -5
  17. data/lib/packetgen/header/dhcpv6.rb +17 -18
  18. data/lib/packetgen/header/dns/name.rb +21 -16
  19. data/lib/packetgen/header/dns/opt.rb +5 -2
  20. data/lib/packetgen/header/dns/option.rb +14 -14
  21. data/lib/packetgen/header/dns/qdsection.rb +3 -3
  22. data/lib/packetgen/header/dns/question.rb +7 -8
  23. data/lib/packetgen/header/dns/rr.rb +56 -43
  24. data/lib/packetgen/header/dns/rrsection.rb +6 -6
  25. data/lib/packetgen/header/dns.rb +103 -90
  26. data/lib/packetgen/header/dot11/control.rb +12 -12
  27. data/lib/packetgen/header/dot11/data.rb +25 -24
  28. data/lib/packetgen/header/dot11/element.rb +4 -4
  29. data/lib/packetgen/header/dot11/management.rb +21 -18
  30. data/lib/packetgen/header/dot11/sub_mngt.rb +40 -53
  31. data/lib/packetgen/header/dot11.rb +117 -122
  32. data/lib/packetgen/header/dot1q.rb +12 -13
  33. data/lib/packetgen/header/dot1x.rb +13 -13
  34. data/lib/packetgen/header/eap/fast.rb +4 -4
  35. data/lib/packetgen/header/eap/md5.rb +16 -8
  36. data/lib/packetgen/header/eap/tls.rb +18 -19
  37. data/lib/packetgen/header/eap/ttls.rb +22 -21
  38. data/lib/packetgen/header/eap.rb +73 -48
  39. data/lib/packetgen/header/eth.rb +41 -27
  40. data/lib/packetgen/header/gre.rb +33 -11
  41. data/lib/packetgen/header/http/headers.rb +7 -6
  42. data/lib/packetgen/header/http/request.rb +38 -29
  43. data/lib/packetgen/header/http/response.rb +35 -27
  44. data/lib/packetgen/header/http/verbs.rb +1 -3
  45. data/lib/packetgen/header/icmp.rb +14 -14
  46. data/lib/packetgen/header/icmpv6.rb +10 -9
  47. data/lib/packetgen/header/igmp.rb +26 -15
  48. data/lib/packetgen/header/igmpv3/group_record.rb +18 -13
  49. data/lib/packetgen/header/igmpv3/mq.rb +16 -18
  50. data/lib/packetgen/header/igmpv3/mr.rb +5 -5
  51. data/lib/packetgen/header/igmpv3.rb +12 -11
  52. data/lib/packetgen/header/ip/addr.rb +19 -15
  53. data/lib/packetgen/header/ip/option.rb +47 -36
  54. data/lib/packetgen/header/ip/options.rb +1 -1
  55. data/lib/packetgen/header/ip.rb +77 -95
  56. data/lib/packetgen/header/ipv6/addr.rb +28 -27
  57. data/lib/packetgen/header/ipv6/extension.rb +13 -11
  58. data/lib/packetgen/header/ipv6/hop_by_hop.rb +32 -13
  59. data/lib/packetgen/header/ipv6.rb +42 -35
  60. data/lib/packetgen/header/llc.rb +28 -21
  61. data/lib/packetgen/header/mdns.rb +10 -3
  62. data/lib/packetgen/header/mld.rb +15 -13
  63. data/lib/packetgen/header/mldv2/mcast_address_record.rb +17 -12
  64. data/lib/packetgen/header/mldv2/mlq.rb +22 -24
  65. data/lib/packetgen/header/mldv2/mlr.rb +8 -8
  66. data/lib/packetgen/header/mldv2.rb +1 -1
  67. data/lib/packetgen/header/ospfv2/db_description.rb +17 -18
  68. data/lib/packetgen/header/ospfv2/hello.rb +18 -17
  69. data/lib/packetgen/header/ospfv2/ls_ack.rb +6 -7
  70. data/lib/packetgen/header/ospfv2/ls_request.rb +14 -13
  71. data/lib/packetgen/header/ospfv2/ls_update.rb +9 -9
  72. data/lib/packetgen/header/ospfv2/lsa.rb +79 -60
  73. data/lib/packetgen/header/ospfv2/lsa_header.rb +12 -11
  74. data/lib/packetgen/header/ospfv2.rb +49 -46
  75. data/lib/packetgen/header/ospfv3/db_description.rb +20 -22
  76. data/lib/packetgen/header/ospfv3/hello.rb +17 -16
  77. data/lib/packetgen/header/ospfv3/ipv6_prefix.rb +22 -20
  78. data/lib/packetgen/header/ospfv3/ls_ack.rb +7 -8
  79. data/lib/packetgen/header/ospfv3/ls_request.rb +18 -18
  80. data/lib/packetgen/header/ospfv3/ls_update.rb +10 -10
  81. data/lib/packetgen/header/ospfv3/lsa.rb +62 -51
  82. data/lib/packetgen/header/ospfv3/lsa_header.rb +12 -11
  83. data/lib/packetgen/header/ospfv3.rb +54 -52
  84. data/lib/packetgen/header/sctp/chunk.rb +80 -56
  85. data/lib/packetgen/header/sctp/error.rb +174 -202
  86. data/lib/packetgen/header/sctp/padded32.rb +3 -3
  87. data/lib/packetgen/header/sctp/parameter.rb +89 -136
  88. data/lib/packetgen/header/sctp.rb +19 -8
  89. data/lib/packetgen/header/snmp.rb +108 -7
  90. data/lib/packetgen/header/tcp/option.rb +52 -39
  91. data/lib/packetgen/header/tcp/options.rb +13 -5
  92. data/lib/packetgen/header/tcp.rb +83 -65
  93. data/lib/packetgen/header/tftp.rb +31 -25
  94. data/lib/packetgen/header/udp.rb +21 -19
  95. data/lib/packetgen/header.rb +23 -18
  96. data/lib/packetgen/headerable.rb +21 -5
  97. data/lib/packetgen/inspect.rb +3 -8
  98. data/lib/packetgen/packet.rb +146 -71
  99. data/lib/packetgen/pcap.rb +15 -4
  100. data/lib/packetgen/pcapng/block.rb +20 -18
  101. data/lib/packetgen/pcapng/epb.rb +13 -15
  102. data/lib/packetgen/pcapng/file.rb +44 -111
  103. data/lib/packetgen/pcapng/idb.rb +11 -12
  104. data/lib/packetgen/pcapng/shb.rb +15 -16
  105. data/lib/packetgen/pcapng/spb.rb +9 -11
  106. data/lib/packetgen/pcapng/unknown_block.rb +6 -17
  107. data/lib/packetgen/pcapng.rb +6 -4
  108. data/lib/packetgen/pcaprub_wrapper.rb +17 -1
  109. data/lib/packetgen/proto.rb +5 -1
  110. data/lib/packetgen/unknown_packet.rb +5 -5
  111. data/lib/packetgen/utils/arp_spoofer.rb +18 -19
  112. data/lib/packetgen/utils.rb +4 -3
  113. data/lib/packetgen/version.rb +1 -1
  114. data/lib/packetgen.rb +12 -5
  115. metadata +29 -38
  116. data/lib/packetgen/types/abstract_tlv.rb +0 -278
  117. data/lib/packetgen/types/array.rb +0 -287
  118. data/lib/packetgen/types/cstring.rb +0 -109
  119. data/lib/packetgen/types/enum.rb +0 -171
  120. data/lib/packetgen/types/fieldable.rb +0 -66
  121. data/lib/packetgen/types/fields.rb +0 -622
  122. data/lib/packetgen/types/int.rb +0 -473
  123. data/lib/packetgen/types/int_string.rb +0 -102
  124. data/lib/packetgen/types/length_from.rb +0 -54
  125. data/lib/packetgen/types/oui.rb +0 -52
  126. data/lib/packetgen/types/string.rb +0 -97
  127. data/lib/packetgen/types/tlv.rb +0 -161
  128. data/lib/packetgen/types.rb +0 -26
@@ -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}, {Types::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
@@ -46,22 +48,23 @@ module PacketGen
46
48
  # @!attribute sport
47
49
  # 16-bit UDP source port
48
50
  # @return [Integer]
49
- define_field :sport, Types::Int16
51
+ define_attr :sport, BinStruct::Int16
50
52
  # @!attribute dport
51
53
  # 16-bit UDP destination port
52
54
  # @return [Integer]
53
- define_field :dport, Types::Int16
55
+ define_attr :dport, BinStruct::Int16
54
56
  # @!attribute length
55
57
  # 16-bit UDP length
56
58
  # @return [Integer]
57
- define_field :length, Types::Int16, default: 8
59
+ define_attr :length, BinStruct::Int16, default: 8
58
60
  # @!attribute checksum
59
61
  # 16-bit UDP checksum
60
62
  # @return [Integer]
61
- define_field :checksum, Types::Int16
63
+ define_attr :checksum, BinStruct::Int16
62
64
  # @!attribute body
63
- # @return [Types::String,Header::Base]
64
- define_field :body, Types::String
65
+ # UDP body
66
+ # @return [BinStruct::String,Headerable]
67
+ define_attr :body, BinStruct::String
65
68
 
66
69
  alias source_port sport
67
70
  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,10 +89,10 @@ 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
- Base.calculate_and_set_length self
95
+ Base.calculate_and_set_length(self)
93
96
  end
94
97
 
95
98
  # Invert source and destination port numbers
@@ -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
@@ -13,23 +13,28 @@ module PacketGen
13
13
  # This namespace handles all buitlin headers, such as {IP} or {TCP}.
14
14
  #
15
15
  # == Add a foreign header class
16
- # PacketGen permits adding you own header classes.
17
- # First, define the new header class. By example:
18
- # module MyModule
19
- # class MyHeader < PacketGen::Header::Base
20
- # define_field :field1, PacketGen::Types::Int32
21
- # define_field :field2, PacketGen::Types::Int32
22
- # end
16
+ # PacketGen permits adding your own header classes.
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)
31
- # pkt.myheader.field2.read 0x01
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)
32
36
  # @author Sylvain Daubert
37
+ # @author LemonTree55
33
38
  module Header
34
39
  @added_header_classes = {}
35
40
 
@@ -54,7 +59,7 @@ module PacketGen
54
59
  @header_classes = nil
55
60
  end
56
61
 
57
- # Remove a foreign header (previously added by {.add_header_class}
62
+ # Remove a foreign header previously added by {.add_class}
58
63
  # from known header classes.
59
64
  # @param [Class] klass
60
65
  # @return [void]
@@ -70,8 +75,8 @@ module PacketGen
70
75
  # @return [Class,nil]
71
76
  # @since 1.1.0
72
77
  def get_header_class_by_name(name)
73
- if Header.const_defined? name
74
- Header.const_get name
78
+ if Header.const_defined?(name)
79
+ Header.const_get(name)
75
80
  else
76
81
  @added_header_classes[name]
77
82
  end
@@ -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}.
@@ -33,7 +39,7 @@ module PacketGen
33
39
  # @param [Class] klass
34
40
  # @return [void]
35
41
  def self.included(klass)
36
- klass.extend ClassMethods
42
+ klass.extend(ClassMethods)
37
43
  end
38
44
 
39
45
  # Return header protocol name
@@ -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
- # fields 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?
@@ -65,7 +71,7 @@ module PacketGen
65
71
  end
66
72
 
67
73
  # @api private
68
- # Set packet to which this header belongs
74
+ # Set packet to which this header belongs to
69
75
  # @param [Packet] packet
70
76
  # @return [Packet] packet
71
77
  def packet=(packet)
@@ -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
@@ -91,5 +97,15 @@ module PacketGen
91
97
 
92
98
  super
93
99
  end
100
+
101
+ # @abstract This method MUST be redefined by subclasses.
102
+ # Generate binary string from header
103
+ # @return [String]
104
+ # @raise [NotImplementedError]
105
+ def to_s
106
+ raise NotImplementedError, "#{self.class} should implement #to_s" if method(:to_s).super_method.nil?
107
+
108
+ super
109
+ end
94
110
  end
95
111
  end
@@ -61,24 +61,19 @@ 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 {Types::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
 
79
74
  # Format a ASN.1 attribute for +#inspect+.
80
75
  # 4 cases are handled:
81
- # * attribute value is a =RANS1::Types::Enumerated+: show named value and
76
+ # * attribute value is a =RANS1::BinStruct::Enumerated+: show named value and
82
77
  # its integer value as hexdecimal format,
83
78
  # * attribute value is a +RASN1::Types::Integer+: show value as integer and in
84
79
  # hexdecimal format,