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
@@ -31,24 +31,26 @@ module PacketGen
31
31
  # | ... |
32
32
  #
33
33
  # A DB description payload is composed of:
34
- # * a 16-bit {#mtu} field ({Types::Int16}),
35
- # * a 8-bit {#options} field ({Types::Int8}),
36
- # * a 8-bit {#flags} field ({Types::Int8}). Supported flags are:
34
+ # * a 16-bit {#mtu} field (+BinStruct::Int16+),
35
+ # * a 8-bit {#options} field (+BinStruct::Int8+),
36
+ # * a 8-bit {#flags} field (+BinStruct::Int8+). Supported flags are:
37
37
  # * {i_flag},
38
38
  # * {m_flag},
39
39
  # * {ms_flag},
40
- # * a 32-bit {#sequence_number} field ({Types::Int32}),
40
+ # * a 32-bit {#sequence_number} field (+BinStruct::Int32+),
41
41
  # * and an array of {LSAHeader LSAHeaders} ({#lsas}, {ArrayOfLSA}).
42
42
  #
43
- # == Create a DbDescription payload
43
+ # @example Create a DbDescription payload
44
44
  # # standalone
45
45
  # dbd = PacketGen::Header::OSPFv2::DbDescription.new
46
46
  # # in a packet
47
- # pkt = PacketGen.gen('IP', src: source_ip).add('OSPFv2').add('OSPFv2::DbDescription')
47
+ # pkt = PacketGen.gen('IP').add('OSPFv2').add('OSPFv2::DbDescription')
48
+ # pkt.ospfize
48
49
  # # access to DbDescription payload
49
- # pkt.ospfv2_dbdescription # => PacketGen::Header::OSPFv2::DbDescription
50
+ # pkt.ospfv2_dbdescription.class # => PacketGen::Header::OSPFv2::DbDescription
50
51
  #
51
- # == DbDescription attributes
52
+ # @example DbDescription attributes
53
+ # dbd = PacketGen::Header::OSPFv2::DbDescription.new
52
54
  # dbd.mtu = 1500
53
55
  # # set options. Options may also be set one by one with {#mt_opt},
54
56
  # # {#e_opt}, {#mc_opt}, {#n_opt}, {#l_opt}, {#dc_opt}, {#o_opt} and {#dn_opt}
@@ -57,14 +59,12 @@ module PacketGen
57
59
  # dbd.seqnum = 0x800001
58
60
  # # add a LSA Router header
59
61
  # dbd.lsas << { type: 'Router', age: 40, link_state_id: '0.0.0.1', advertising_router: '1.1.1.1', sequence_number: 42, checksum: 0x1234, length: 56 }
60
- # # a header may also be set from an existing lsa
61
- # dbd.lsas << existing_lsa.to_lsa_header
62
62
  # @author Sylvain Daubert
63
63
  class DbDescription < Base
64
64
  # @!attribute mtu
65
65
  # 16-bit interface MTU
66
66
  # @return [Integer]
67
- define_field :mtu, Types::Int16
67
+ define_attr :mtu, BinStruct::Int16
68
68
 
69
69
  # @!macro define_options
70
70
  OSPFv2.define_options(self)
@@ -72,30 +72,29 @@ module PacketGen
72
72
  # @!attribute flags
73
73
  # 8-bit interface flags ({#i_flag}, {#m_flag} and {#ms_flag})
74
74
  # @return [Integer]
75
- define_field :flags, Types::Int8
76
75
  # @!attribute i_flag
77
76
  # Init bit
78
- # @return [Boolean]
77
+ # @return [Integer]
79
78
  # @!attribute m_flag
80
79
  # More bit
81
- # @return [Boolean]
80
+ # @return [Integer]
82
81
  # @!attribute ms_flag
83
82
  # Master/Slave bit
84
- # @return [Boolean]
85
- define_bit_fields_on :flags, :zero, 5, :i_flag, :m_flag, :ms_flag
83
+ # @return [Integer]
84
+ define_bit_attr :flags, zero: 5, i_flag: 1, m_flag: 1, ms_flag: 1
86
85
 
87
86
  # @!attribute sequence_number
88
87
  # 32-bit DD sequence number, used to sequence the collection of Database
89
88
  # Description Packets.
90
89
  # @return [Integer]
91
- define_field :sequence_number, Types::Int32
90
+ define_attr :sequence_number, BinStruct::Int32
92
91
  alias seqnum sequence_number
93
92
  alias seqnum= sequence_number=
94
93
 
95
94
  # @!attribute lsas
96
95
  # Array of LSA headers
97
96
  # @return [ArrayOfLSAHeader]
98
- define_field :lsas, ArrayOfLSA, builder: ->(_h, t) { t.new(only_headers: true) }
97
+ define_attr :lsas, ArrayOfLSA, builder: ->(_h, t) { t.new(only_headers: true) }
99
98
  end
100
99
  end
101
100
 
@@ -29,25 +29,26 @@ module PacketGen
29
29
  # | ... |
30
30
  # A HELLO payload consists of:
31
31
  # * a {#network_mask} field ({IP::Addr}),
32
- # * a {#hello_interval} field ({Types::Int16}),
33
- # * an {#options} field ({Types::Int8}),
34
- # * a {#priority} field ({Types::Int8}),
35
- # * a {#dead_interval} field ({Types::Int32}),
32
+ # * a {#hello_interval} field (+BinStruct::Int16+),
33
+ # * an {#options} field (+BinStruct::Int8+),
34
+ # * a {#priority} field (+BinStruct::Int8+),
35
+ # * a {#dead_interval} field (+BinStruct::Int32+),
36
36
  # * a {#designated_router} field ({IP::Addr}),
37
37
  # * a {#backup_designated_router} field ({IP::Addr}),
38
38
  # * a {#neighbors} array containing neighbors as {IP::Addr}.
39
39
  #
40
- # == Create a HELLO payload
40
+ # @example Create a HELLO payload
41
41
  # # standalone
42
42
  # hello = PacketGen::Header::OSPFv2::Hello.new
43
43
  # # in a packet
44
- # pkt = PacketGen.gen('IP', src: source_ip).add('OSPFv2').add('OSPFv2::Hello')
44
+ # pkt = PacketGen.gen('IP').add('OSPFv2').add('OSPFv2::Hello')
45
45
  # # make IP header correct for OSPF
46
46
  # pkt.ospfize
47
47
  # # access to Hello payload
48
- # pkt.ospfv2_hello # => PacketGen::Header::OSPFv2::Hello
48
+ # pkt.ospfv2_hello.class # => PacketGen::Header::OSPFv2::Hello
49
49
  #
50
- # == HELLO attributes
50
+ # @example HELLO attributes
51
+ # hello = PacketGen::Header::OSPFv2::Hello.new
51
52
  # hello.network_mask = '255.255.255.0'
52
53
  # hello.hello_interval = 10
53
54
  # hello.options = 0
@@ -63,11 +64,11 @@ module PacketGen
63
64
  # @!attribute network_mask
64
65
  # The network mask associated with this interface.
65
66
  # @return [String]
66
- define_field :network_mask, IP::Addr
67
+ define_attr :network_mask, IP::Addr
67
68
  # @!attribute hello_interval
68
69
  # The number of seconds between this router's Hello packets.
69
70
  # @return [Integer]
70
- define_field :hello_interval, Types::Int16
71
+ define_attr :hello_interval, BinStruct::Int16
71
72
 
72
73
  # @!macro define_options
73
74
  OSPFv2.define_options(self)
@@ -76,25 +77,25 @@ module PacketGen
76
77
  # This router's Router Priority. Used in (Backup) Designated
77
78
  # Router election.
78
79
  # @return [Integer]
79
- define_field :priority, Types::Int8
80
+ define_attr :priority, BinStruct::Int8
80
81
  # @!attribute dead_interval
81
82
  # The number of seconds before declaring a silent router down.
82
83
  # @return [Integer]
83
- define_field :dead_interval, Types::Int32
84
+ define_attr :dead_interval, BinStruct::Int32
84
85
  # @!attribute designated_router
85
- # The identity of the Designated Router for this network, in the
86
+ # The identity (as an IP address) of the Designated Router for this network, in the
86
87
  # view of the sending router.
87
88
  # @return [String]
88
- define_field :designated_router, IP::Addr
89
+ define_attr :designated_router, IP::Addr
89
90
  # @!attribute backup_designated_router
90
- # The identity of the Backup Designated Router for this network,
91
+ # The identity (as an IP address) of the Backup Designated Router for this network,
91
92
  # in the view of the sending router.
92
93
  # @return [String]
93
- define_field :backup_designated_router, IP::Addr
94
+ define_attr :backup_designated_router, IP::Addr
94
95
  # @!attribute neighbors
95
96
  # Array of neighbors
96
97
  # @return [IP::ArrayOfAddr]
97
- define_field :neighbors, IP::ArrayOfAddr
98
+ define_attr :neighbors, IP::ArrayOfAddr
98
99
  end
99
100
  end
100
101
 
@@ -28,24 +28,23 @@ module PacketGen
28
28
  # This paylod is implemented as a unique field: {#lsas}, which is an
29
29
  # {ArrayOfLSA} object.
30
30
  #
31
- # == Create a LSAck payload
31
+ # @example Create a LSAck payload
32
32
  # # standalone
33
33
  # lsack = PacketGen::Header::OSPFv2::LSAck.new
34
34
  # # in a packet
35
- # pkt = PacketGen.gen('IP', src: source_ip).add('OSPFv2').add('OSPFv2::LSAck')
35
+ # pkt = PacketGen.gen('IP').add('OSPFv2').add('OSPFv2::LSAck')
36
36
  # # access to LSAck payload
37
- # lasck = pkt.ospfv2_lsack # => PacketGen::Header::OSPFv2::LSAck
37
+ # lasck = pkt.ospfv2_lsack.class # => PacketGen::Header::OSPFv2::LSAck
38
38
  #
39
- # == Adding LSA headers to a LSAck payload
39
+ # @example Adding LSA headers to a LSAck payload
40
+ # lsack = PacketGen::Header::OSPFv2::LSAck.new
40
41
  # lsack.lsas << { type: 'Router', age: 40, link_state_id: '0.0.0.1', advertising_router: '1.1.1.1', sequence_number: 42, checksum: 0x1234, length: 56 }
41
- # # a header may also be set from an existing lsa
42
- # lasck.lsas << existing_lsa.to_lsa_header
43
42
  # @author Sylvain Daubert
44
43
  class LSAck < Base
45
44
  # @!attribute lsas
46
45
  # Array of LSA headers
47
46
  # @return [ArrayOfLSA]
48
- define_field :lsas, ArrayOfLSA, builder: ->(_h, t) { t.new(only_headers: true) }
47
+ define_attr :lsas, ArrayOfLSA, builder: ->(_h, t) { t.new(only_headers: true) }
49
48
  end
50
49
  end
51
50
 
@@ -9,27 +9,27 @@
9
9
  module PacketGen
10
10
  module Header
11
11
  class OSPFv2
12
- # This class handle a LS request, which is composed 3 {Types::Int32} fields:
12
+ # This class handle a LS request, which is composed 3 +BinStruct::Int32+ fields:
13
13
  # * {#type},
14
14
  # * {#link_state_id},
15
15
  # * and {#advertising_router}.
16
16
  # @author Sylvain Daubert
17
- class LSR < Types::Fields
18
- include Types::Fieldable
17
+ class LSR < BinStruct::Struct
18
+ include BinStruct::Structable
19
19
 
20
20
  # @!attribute type
21
21
  # The type of the LSA to request.
22
22
  # @return [Integer]
23
- define_field :type, Types::Int32Enum, enum: LSAHeader::TYPES
23
+ define_attr :type, BinStruct::Int32Enum, enum: LSAHeader::TYPES
24
24
  # @!attribute link_state_id
25
25
  # This field identifies the portion of the internet environment
26
26
  # that is being described by the LSA to request.
27
27
  # @return [String]
28
- define_field :link_state_id, IP::Addr
28
+ define_attr :link_state_id, IP::Addr
29
29
  # @!attribute advertising_router
30
30
  # The Router ID of the requested LSA.
31
31
  # @return [String]
32
- define_field :advertising_router, IP::Addr
32
+ define_attr :advertising_router, IP::Addr
33
33
 
34
34
  # Get human-readable type
35
35
  # @return [String]
@@ -43,10 +43,10 @@ module PacketGen
43
43
  end
44
44
  end
45
45
 
46
- # This class defines a specialized {Types::Array array} to handle series
46
+ # This class defines a specialized +BinStruct::Array+ to handle series
47
47
  # of {LSR LSRs}.
48
48
  # @author Sylvain Daubert
49
- class ArrayOfLSR < Types::Array
49
+ class ArrayOfLSR < BinStruct::Array
50
50
  set_of LSR
51
51
  end
52
52
 
@@ -65,24 +65,25 @@ module PacketGen
65
65
  # This paylod is implemented as a unique field: {#lsrs}, which is an
66
66
  # {ArrayOfLSR} object.
67
67
  #
68
- # == Create a LSRequest payload
68
+ # @example Create a LSRequest payload
69
69
  # # standalone
70
70
  # lsr = PacketGen::Header::OSPFv2::LSRequest.new
71
71
  # # in a packet
72
- # pkt = PacketGen.gen('IP', src: source_ip).add('OSPFv2').add('OSPFv2::LSRequest')
72
+ # pkt = PacketGen.gen('IP').add('OSPFv2').add('OSPFv2::LSRequest')
73
73
  # # make IP header correct for OSPF
74
74
  # pkt.ospfize
75
75
  # # access to LSRequest payload
76
- # pkt.ospfv2_lsrequest # => PacketGen::Header::OSPFv2::LSRequest
76
+ # pkt.ospfv2_lsrequest.class # => PacketGen::Header::OSPFv2::LSRequest
77
77
  #
78
- # == Add LSA requests to a LSRequest
78
+ # @example Add LSA requests to a LSRequest
79
+ # lsr = PacketGen::Header::OSPFv2::LSRequest.new
79
80
  # lsr.lsrs << { type: 'Router', link_state_id: '0.0.0.1', advertising_router: '1.1.1.1'}
80
81
  # @author Sylvain Daubert
81
82
  class LSRequest < Base
82
83
  # @!attribute lsrs
83
84
  # Array of {LSR}
84
85
  # @return [ArrayOfLSR]
85
- define_field :lsrs, ArrayOfLSR
86
+ define_attr :lsrs, ArrayOfLSR
86
87
  end
87
88
  end
88
89
 
@@ -22,22 +22,22 @@ module PacketGen
22
22
  # +- +-+
23
23
  # | ... |
24
24
  # This paylod is implemented with two fields:
25
- # * {#lsas_count}, a {Types::Int32} field,
25
+ # * {#lsas_count}, a +BinStruct::Int32+ field,
26
26
  # * and {#lsas}, an {ArrayOfLSA} object.
27
27
  #
28
- # == Create a LSUpdate payload
28
+ # @example Create a LSUpdate payload
29
29
  # # standalone
30
30
  # lsu = PacketGen::Header::OSPFv2::LSUpdate.new
31
31
  # # in a packet
32
- # pkt = PacketGen.gen('IP', src: source_ip).add('OSPFv2').add('OSPFv2::LSUpdate')
32
+ # pkt = PacketGen.gen('IP').add('OSPFv2').add('OSPFv2::LSUpdate')
33
33
  # # make IP header correct for OSPF
34
34
  # pkt.ospfize
35
35
  # # access to LSUpdate payload
36
- # lsu = pkt.ospfv2_lsupdate # => PacketGen::Header::OSPFv2::LSUpdate
36
+ # lsu = pkt.ospfv2_lsupdate.class # => PacketGen::Header::OSPFv2::LSUpdate
37
37
  #
38
- # == Add LSAs to a LSUpdate payload
39
- # Adding LSAs with {ArrayOfLSA#<< ArrayOfLSA#<<} automagically update
40
- # {#lsas_count}. To not update it, use {ArrayOfLSA#push ArrayOfLSA#push}.
38
+ # @example Add LSAs to a LSUpdate payload
39
+ # lsu = PacketGen::Header::OSPFv2::LSUpdate.new
40
+ # # Adding LSAs with #<< automagically update #lsas_count. To not update it, use #push.
41
41
  # lsu.lsas << { type: 'Router', age: 40, link_state_id: '0.0.0.1', advertising_router: '1.1.1.1', sequence_number: 42 }
42
42
  # lsu.lsas_count #=> 1
43
43
  # # add a link to Router LSA
@@ -47,11 +47,11 @@ module PacketGen
47
47
  # @!attribute lsas_count
48
48
  # Count of LSAs included in this update
49
49
  # @return [Integer]
50
- define_field :lsas_count, Types::Int32
50
+ define_attr :lsas_count, BinStruct::Int32
51
51
  # @!attribute lsas
52
52
  # Array of {LSA LSAs}
53
53
  # @return [ArrayOfLSA]
54
- define_field :lsas, ArrayOfLSA, builder: ->(h, t) { t.new(counter: h[:lsas_count]) }
54
+ define_attr :lsas, ArrayOfLSA, builder: ->(h, t) { t.new(counter: h[:lsas_count]) }
55
55
 
56
56
  # Calculate checksums of all LSAs
57
57
  # @return [void]
@@ -16,28 +16,28 @@ module PacketGen
16
16
  # @!attribute body
17
17
  # LSA body
18
18
  # @return [String]
19
- define_field :body, Types::String,
20
- builder: ->(h, t) { t.new(length_from: -> { h.length - 20 }) }
19
+ define_attr :body, BinStruct::String,
20
+ builder: ->(h, t) { t.new(length_from: -> { h.length - 20 }) }
21
21
  end
22
22
 
23
23
  # This class handles TOS metrics for {Link links} in a {LSARouter
24
24
  # LSA router payload}.
25
25
  # @author Sylvain Daubert
26
- class TosMetric < Types::Fields
27
- include Types::Fieldable
26
+ class TosMetric < BinStruct::Struct
27
+ include BinStruct::Structable
28
28
 
29
29
  # @!attribute tos
30
30
  # 8-bit IP Type of Service that this metric refers to.
31
31
  # @return [Integer]
32
- define_field :tos, Types::Int8
32
+ define_attr :tos, BinStruct::Int8
33
33
  # @!attribute reserved
34
34
  # 8-bit reserved field.
35
35
  # @return [Integer]
36
- define_field :reserved, Types::Int8, default: 0
36
+ define_attr :reserved, BinStruct::Int8, default: 0
37
37
  # @!attribute tos_metric
38
38
  # 16-bit TOS-specific metric information..
39
39
  # @return [Integer]
40
- define_field :tos_metric, Types::Int16
40
+ define_attr :tos_metric, BinStruct::Int16
41
41
 
42
42
  # @return [String]
43
43
  def to_human
@@ -45,48 +45,58 @@ module PacketGen
45
45
  end
46
46
  end
47
47
 
48
- # This class defines a specialized {Types::Array array} to handle series
48
+ # This class defines a specialized +BinStruct::Array+ to handle series
49
49
  # of {TosMetric TOS metrics}.
50
50
  # @author Sylvain Daubert
51
- class ArrayOfTosMetric < Types::Array
51
+ class ArrayOfTosMetric < BinStruct::Array
52
52
  set_of TosMetric
53
53
  end
54
54
 
55
55
  # This class handles links in a {LSARouter LSA router payload}.
56
56
  # @author Sylvain Daubert
57
- class Link < Types::Fields
58
- include Types::Fieldable
57
+ class Link < BinStruct::Struct
58
+ include BinStruct::Structable
59
59
 
60
60
  # @!attribute id
61
+ # Identify the link
61
62
  # @return [IP::Addr]
62
- define_field :id, IP::Addr
63
+ define_attr :id, IP::Addr
63
64
  # @!attribute data
65
+ # Link data
64
66
  # @return [IP::Addr]
65
- define_field :data, IP::Addr
67
+ define_attr :data, IP::Addr
66
68
  # @!attribute type
69
+ # Link type.
70
+ # * 1: Point-to-point connection to another router
71
+ # * 2: Connection to a transit network
72
+ # * 3: Connection to a stub network
73
+ # * 4: Virtual link
67
74
  # @return [Integer]
68
- define_field :type, Types::Int8
75
+ define_attr :type, BinStruct::Int8
69
76
  # @!attribute tos_count
77
+ # Count of #{#tos TOS metrics}
70
78
  # @return [Integer]
71
- define_field :tos_count, Types::Int8
79
+ define_attr :tos_count, BinStruct::Int8
72
80
  # @!attribute metric
81
+ # The cost of using this router link
73
82
  # @return [Integer]
74
- define_field :metric, Types::Int16
83
+ define_attr :metric, BinStruct::Int16
75
84
  # @!attribute tos
76
85
  # Additionnal TOS metrics
77
86
  # @return [ArrayOfTosMetric]
78
- define_field :tos, ArrayOfTosMetric, builder: ->(h, t) { t.new(counter: h[:tos_count]) }
87
+ define_attr :tos, ArrayOfTosMetric, builder: ->(h, t) { t.new(counter: h[:tos_count]) }
79
88
 
89
+ # Get human-readable description
80
90
  # @return [String]
81
91
  def to_human
82
92
  "<type:#{type},metric:#{metric},id:#{id},data:#{data}>"
83
93
  end
84
94
  end
85
95
 
86
- # This class defines a specialized {Types::Array array} to handle series
96
+ # This class defines a specialized +BinStruct::Array+ to handle series
87
97
  # of {Link Links}.
88
98
  # @author Sylvain Daubert
89
- class ArrayOfLink < Types::Array
99
+ class ArrayOfLink < BinStruct::Array
90
100
  set_of Link
91
101
  end
92
102
 
@@ -94,30 +104,32 @@ module PacketGen
94
104
  #
95
105
  # A LSA router payload is composed of:
96
106
  # * a header (see methods inherited from {LSAHeader}),
97
- # * a 16-bit flag word {#u16} ({Types::Int16}),
98
- # * a 16-bit {#link_count} field ({Types::Int16}),
107
+ # * a 16-bit flag word {#u16} (+BinStruct::Int16+),
108
+ # * a 16-bit {#link_count} field (+BinStruct::Int16+),
99
109
  # * an array of {#links} ({ArrayOfLink}).
100
110
  # @author Sylvain Daubert
101
111
  class LSARouter < LSAHeader
102
112
  # @attribute u16
103
113
  # 16-bit flag word
104
114
  # @return [Integer]
105
- define_field :u16, Types::Int16
115
+ # @attribute v_flag
116
+ # Virtual link point flag
117
+ # @return [Integer]
118
+ # @attribute e_flag*
119
+ # AS boundary flag
120
+ # @return [Integer]
121
+ # @attribute b_flag
122
+ # Area border router flag
123
+ # @return [Integer]
124
+ define_bit_attr :u16, z: 5, v_flag: 1, e_flag: 1, b_flag: 1, zz: 8
106
125
  # @attribute link_count
107
126
  # Number of links
108
127
  # @return [Integer]
109
- define_field :link_count, Types::Int16
128
+ define_attr :link_count, BinStruct::Int16
110
129
  # @attribute links
130
+ # Router links
111
131
  # @return [ArrayOfLink]
112
- define_field :links, ArrayOfLink, builder: ->(h, t) { t.new(counter: h[:link_count]) }
113
-
114
- # @attribute v_flag
115
- # @return [Boolean]
116
- # @attribute e_flag
117
- # @return [Boolean]
118
- # @attribute b_flag
119
- # @return [Boolean]
120
- define_bit_fields_on :u16, :z, 5, :v_flag, :e_flag, :b_flag, :zz, 8
132
+ define_attr :links, ArrayOfLink, builder: ->(h, t) { t.new(counter: h[:link_count]) }
121
133
  end
122
134
 
123
135
  # This class handles LSA Network payloads.
@@ -130,48 +142,55 @@ module PacketGen
130
142
  class LSANetwork < LSAHeader
131
143
  # @!attribute netmask
132
144
  # @return [IP::Addr]
133
- define_field :netmask, IP::Addr
145
+ define_attr :netmask, IP::Addr
134
146
  # @!attribute routers
135
147
  # List of routers in network
136
148
  # @return [IP::ArrayOfAddr]
137
- define_field :routers, IP::ArrayOfAddr,
138
- builder: ->(h, t) { t.new(length_from: -> { h.length - 24 }) }
149
+ define_attr :routers, IP::ArrayOfAddr,
150
+ builder: ->(h, t) { t.new(length_from: -> { h.length - 24 }) }
139
151
  end
140
152
 
141
153
  # This class handles external links in {LSAASExternal LSA AS-External payloads}.
142
154
  # @author Sylvain Daubert
143
- class External < Types::Fields
144
- include Types::Fieldable
155
+ # @author LemonTree55
156
+ class External < BinStruct::Struct
157
+ include BinStruct::Structable
145
158
 
146
159
  # @!attribute u8
160
+ # 1st byte containing {#e_flag} and #{tos}
147
161
  # @return [Integer]
148
- define_field :u8, Types::Int8
162
+ # @!attribute e_flag
163
+ # 1-bit type of external metric.
164
+ # If set, {#metric} is Type 2 external metric, else it is Type1.
165
+ # @return [Integer]
166
+ # @!attribute tos
167
+ # 7-bit TOS
168
+ # @return [Integer]
169
+ define_bit_attr :u8, e_flag: 1, tos: 7
149
170
  # @!attribute metric
171
+ # Cost of this route
150
172
  # @return [Integer]
151
- define_field :metric, Types::Int24
173
+ define_attr :metric, BinStruct::Int24
152
174
  # @!attribute forwarding_addr
175
+ # Forwarding address
153
176
  # @return [IP::Addr]
154
- define_field :forwarding_addr, IP::Addr
177
+ define_attr :forwarding_addr, IP::Addr
155
178
  # @!attribute ext_route_tag
179
+ # 32-bit external route tag. Not used by OSPF protocol.
156
180
  # @return [Integer]
157
- define_field :ext_route_tag, Types::Int32
158
-
159
- # @!attribute e_flag
160
- # @return [Boolean]
161
- # @!attribute tos
162
- # @return [Integer]
163
- define_bit_fields_on :u8, :e_flag, :tos, 7
181
+ define_attr :ext_route_tag, BinStruct::Int32
164
182
 
183
+ # Get human-readable string
165
184
  # @return [String]
166
185
  def to_human
167
186
  "<type:#{e_flag? ? 2 : 1},tos:#{tos},metric:#{metric},fwaddr:#{forwarding_addr},tag:#{ext_route_tag}>"
168
187
  end
169
188
  end
170
189
 
171
- # This class defines a specialized {Types::Array array} to handle series
190
+ # This class defines a specialized +BinStruct::Array+ to handle series
172
191
  # of {External Externals}.
173
192
  # @author Sylvain Daubert
174
- class ArrayOfExternal < Types::Array
193
+ class ArrayOfExternal < BinStruct::Array
175
194
  set_of External
176
195
  end
177
196
 
@@ -185,33 +204,33 @@ module PacketGen
185
204
  class LSAASExternal < LSAHeader
186
205
  # @!attribute netmask
187
206
  # @return [IP::Addr]
188
- define_field :netmask, IP::Addr
207
+ define_attr :netmask, IP::Addr
189
208
  # @!attribute externals
190
209
  # List of external destinations
191
210
  # @return [ArrayOfExternal]
192
- define_field :externals, ArrayOfExternal,
193
- builder: ->(h, t) { t.new(length_from: -> { h.length - 24 }) }
211
+ define_attr :externals, ArrayOfExternal,
212
+ builder: ->(h, t) { t.new(length_from: -> { h.length - 24 }) }
194
213
  end
195
214
 
196
- # This class defines a specialized {Types::Array array} to handle series
215
+ # This class defines a specialized +BinStruct::Array+ to handle series
197
216
  # of {LSA LSAs}. It recognizes known LSA types and infers correct type.
198
217
  # @author Sylvain Daubert
199
- class ArrayOfLSA < Types::Array
218
+ class ArrayOfLSA < BinStruct::Array
200
219
  set_of LSAHeader
201
220
 
202
221
  # @param [Hash] options
203
- # @option options [Types::Int] counter Int object used as a counter for this set
204
- # @option options [Boolean] only_headers if +true+, only {LSAHeader LSAHeaders}
222
+ # @option options [BinStruct::Int] :counter +BinStruct::Int+ object used as a counter for this set
223
+ # @option options [Boolean] :only_headers if +true+, only {LSAHeader LSAHeaders}
205
224
  # will be added to this array.
206
225
  def initialize(options={})
207
- super()
226
+ super
208
227
  @only_headers = options[:only_headers] || false
209
228
  end
210
229
 
211
230
  private
212
231
 
213
232
  def record_from_hash(hsh)
214
- raise ArgumentError, 'hash should have :type key' unless hsh.key? :type
233
+ raise ArgumentError, 'hash should have :type key' unless hsh.key?(:type)
215
234
 
216
235
  klass = if @only_headers
217
236
  LSAHeader
@@ -231,8 +250,8 @@ module PacketGen
231
250
  def get_lsa_class_by_human_type(htype)
232
251
  klassname = "LSA#{htype.to_s.delete('-')}"
233
252
  begin
234
- if OSPFv2.const_defined? klassname
235
- OSPFv2.const_get klassname
253
+ if OSPFv2.const_defined?(klassname)
254
+ OSPFv2.const_get(klassname)
236
255
  else
237
256
  LSA
238
257
  end