pio 0.18.2 → 0.19.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 (116) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -0
  3. data/README.md +40 -344
  4. data/Rakefile +32 -0
  5. data/bin/_guard-core +16 -0
  6. data/bin/byebug +16 -0
  7. data/bin/cc-tddium-post-worker +16 -0
  8. data/bin/cdiff +16 -0
  9. data/bin/coderay +16 -0
  10. data/bin/colortab +16 -0
  11. data/bin/coveralls +16 -0
  12. data/bin/cucumber +16 -0
  13. data/bin/decolor +16 -0
  14. data/bin/flay +16 -0
  15. data/bin/flog +16 -0
  16. data/bin/guard +16 -0
  17. data/bin/htmldiff +16 -0
  18. data/bin/inch +16 -0
  19. data/bin/ldiff +16 -0
  20. data/bin/listen +16 -0
  21. data/bin/minitar +16 -0
  22. data/bin/pry +16 -0
  23. data/bin/rake +16 -0
  24. data/bin/reek +16 -0
  25. data/bin/relish +16 -0
  26. data/bin/restclient +16 -0
  27. data/bin/rspec +16 -0
  28. data/bin/rubocop +16 -0
  29. data/bin/ruby-parse +16 -0
  30. data/bin/ruby-rewrite +16 -0
  31. data/bin/ruby_parse +16 -0
  32. data/bin/ruby_parse_extract_error +16 -0
  33. data/bin/sparkr +16 -0
  34. data/bin/term_display +16 -0
  35. data/bin/term_mandel +16 -0
  36. data/bin/thor +16 -0
  37. data/bin/unparser +16 -0
  38. data/bin/yard +16 -0
  39. data/bin/yardoc +16 -0
  40. data/bin/yri +16 -0
  41. data/features/arp.feature +61 -0
  42. data/features/dhcp.feature +4 -0
  43. data/features/icmp.feature +130 -0
  44. data/features/lldp.feature +47 -0
  45. data/features/open_flow10/echo_reply.feature +95 -0
  46. data/features/open_flow10/echo_request.feature +95 -0
  47. data/features/open_flow10/exact_match.feature +36 -0
  48. data/features/{features_read.feature → open_flow10/features_reply.feature} +54 -17
  49. data/features/open_flow10/features_request.feature +79 -0
  50. data/features/{flow_mod_read.feature → open_flow10/flow_mod.feature} +16 -21
  51. data/features/open_flow10/hello.feature +79 -0
  52. data/features/open_flow10/packet_in.feature +58 -0
  53. data/features/{packet_out_read.feature → open_flow10/packet_out.feature} +4 -5
  54. data/features/open_flow10/port_status.feature +23 -0
  55. data/features/open_flow13/echo_reply.feature +115 -0
  56. data/features/open_flow13/echo_request.feature +115 -0
  57. data/features/open_flow13/hello.feature +74 -0
  58. data/features/packet_data/echo13_reply_body.raw +0 -0
  59. data/features/packet_data/echo13_reply_no_body.raw +0 -0
  60. data/features/packet_data/echo13_request_body.raw +0 -0
  61. data/features/packet_data/echo13_request_no_body.raw +0 -0
  62. data/features/packet_data/hello13_no_version_bitmap.raw +0 -0
  63. data/features/packet_data/hello13_version_bitmap.raw +0 -0
  64. data/features/packet_data/udp_no_payload.raw +0 -0
  65. data/features/packet_data/udp_with_payload.raw +0 -0
  66. data/features/step_definitions/packet_data_steps.rb +49 -29
  67. data/features/support/env.rb +3 -0
  68. data/features/{udp_read.feature → udp.feature} +3 -4
  69. data/lib/pio.rb +1 -0
  70. data/lib/pio/echo.rb +67 -0
  71. data/lib/pio/hello13.rb +111 -0
  72. data/lib/pio/open_flow/message.rb +2 -1
  73. data/lib/pio/open_flow/open_flow_header.rb +21 -38
  74. data/lib/pio/open_flow/transaction_id.rb +25 -0
  75. data/lib/pio/version.rb +1 -1
  76. data/pio.gemspec +9 -14
  77. data/spec/pio/flow_mod_spec.rb +1 -1
  78. data/spec/pio/hello13_spec.rb +114 -0
  79. metadata +182 -138
  80. data/examples/arp_new.rb +0 -16
  81. data/examples/arp_read.rb +0 -4
  82. data/examples/dhcp_new.rb +0 -34
  83. data/examples/dhcp_read.rb +0 -4
  84. data/examples/echo_new.rb +0 -9
  85. data/examples/echo_read.rb +0 -4
  86. data/examples/features_new.rb +0 -28
  87. data/examples/features_read.rb +0 -4
  88. data/examples/flow_mod_new.rb +0 -13
  89. data/examples/flow_mod_read.rb +0 -6
  90. data/examples/hello_new.rb +0 -4
  91. data/examples/hello_read.rb +0 -4
  92. data/examples/icmp_new.rb +0 -21
  93. data/examples/icmp_read.rb +0 -4
  94. data/examples/lldp_new.rb +0 -4
  95. data/examples/lldp_read.rb +0 -4
  96. data/examples/packet_in_new.rb +0 -17
  97. data/examples/packet_in_read.rb +0 -5
  98. data/examples/packet_out_new.rb +0 -18
  99. data/examples/packet_out_read.rb +0 -6
  100. data/features/arp_read.feature +0 -10
  101. data/features/dhcp_read.feature +0 -6
  102. data/features/echo_read.feature +0 -29
  103. data/features/exact_match.feature +0 -38
  104. data/features/hello_read.feature +0 -14
  105. data/features/icmp_read.feature +0 -55
  106. data/features/lldp_read.feature +0 -26
  107. data/features/packet_in_read.feature +0 -22
  108. data/features/port_status_read.feature +0 -24
  109. data/features/step_definitions/pending_steps.rb +0 -3
  110. data/spec/pio/echo/reply_spec.rb +0 -135
  111. data/spec/pio/echo/request_spec.rb +0 -137
  112. data/spec/pio/features/reply_spec.rb +0 -137
  113. data/spec/pio/features/request_spec.rb +0 -112
  114. data/spec/pio/hello_spec.rb +0 -106
  115. data/spec/pio/lldp_spec.rb +0 -244
  116. data/spec/pio/packet_in_spec.rb +0 -146
data/examples/arp_new.rb DELETED
@@ -1,16 +0,0 @@
1
- require 'pio'
2
-
3
- request = Pio::Arp::Request.new(
4
- source_mac: '00:26:82:eb:ea:d1',
5
- sender_protocol_address: '192.168.83.3',
6
- target_protocol_address: '192.168.83.254'
7
- )
8
- request.to_binary # => Arp Request frame in binary format.
9
-
10
- reply = Pio::Arp::Reply.new(
11
- source_mac: '00:16:9d:1d:9c:c4',
12
- destination_mac: '00:26:82:eb:ea:d1',
13
- sender_protocol_address: '192.168.83.254',
14
- target_protocol_address: '192.168.83.3'
15
- )
16
- reply.to_binary # => Arp Reply frame in binary format.
data/examples/arp_read.rb DELETED
@@ -1,4 +0,0 @@
1
- require 'pio'
2
-
3
- arp = Pio::Arp.read(binary_data)
4
- arp.source_mac.to_s # => '00:26:82:eb:ea:d1'
data/examples/dhcp_new.rb DELETED
@@ -1,34 +0,0 @@
1
- require 'pio'
2
-
3
- dhcp_client_mac_address = '24:db:ac:41:e5:5b'
4
-
5
- dhcp_server_options =
6
- {
7
- source_mac: '00:26:82:eb:ea:d1',
8
- destination_mac: '24:db:ac:41:e5:5b',
9
- ip_source_address: '192.168.0.100',
10
- ip_destination_address: '192.168.0.1'
11
- }
12
-
13
- # Client side
14
- discover = Pio::Dhcp::Discover.new(source_mac: dhcp_client_mac_address)
15
- discover.to_binary # => DHCP Discover frame in binary format
16
-
17
- # Server side
18
- offer = Pio::Dhcp::Offer.new(dhcp_server_options
19
- .merge(transaction_id: discover.transaction_id))
20
- offer.to_binary # => DHCP Offer frame in binary format
21
-
22
- # Client side
23
- request = Pio::Dhcp::Request.new(
24
- source_mac: dhcp_client_mac_address,
25
- server_identifier: dhcp_server_options[:ip_source_address],
26
- requested_ip_address: dhcp_server_options[:ip_destination_address],
27
- transaction_id: offer.transaction_id
28
- )
29
- request.to_binary # => DHCP Request frame in binary format
30
-
31
- # Server side
32
- ack = Pio::Dhcp::Ack.new(dhcp_server_options
33
- .merge(transaction_id: request.transaction_id))
34
- ack.to_binary # => DHCP Ack frame in binary format
@@ -1,4 +0,0 @@
1
- require 'pio'
2
-
3
- dhcp = Pio::Dhcp.read(binary_data)
4
- dhcp.destination_mac.to_s # => 'ff:ff:ff:ff:ff:ff'
data/examples/echo_new.rb DELETED
@@ -1,9 +0,0 @@
1
- require 'pio'
2
-
3
- request = Pio::Echo::Request.new
4
- request.to_binary # => ECHO Request message in binary format.
5
-
6
- # The ECHO xid (transaction_id)
7
- # should be same as that of the request.
8
- reply = Pio::Echo::Reply.new(xid: request.xid)
9
- reply.to_binary # => ECHO Reply message in binary format.
@@ -1,4 +0,0 @@
1
- require 'pio'
2
-
3
- echo = Pio::Echo::Request.read(binary_data)
4
- echo.xid # => 123
@@ -1,28 +0,0 @@
1
- require 'pio'
2
-
3
- request = Pio::Features::Request.new
4
- request.to_binary # => Features Request message in binary format.
5
-
6
- # The Features xid (transaction_id)
7
- # should be same as that of the request.
8
- reply =
9
- Pio::Features::Reply.new(xid: request.xid,
10
- dpid: 0x123,
11
- n_buffers: 0x100,
12
- n_tables: 0xfe,
13
- capabilities: [:flow_stats, :table_stats,
14
- :port_stats, :queue_stats,
15
- :arp_match_ip],
16
- actions: [:output, :set_vlan_vid,
17
- :set_vlan_pcp, :strip_vlan,
18
- :set_dl_src, :set_dl_dst,
19
- :set_nw_src, :set_nw_dst,
20
- :set_nw_tos, :set_tp_src,
21
- :set_tp_dst, :enqueue],
22
- ports: [{ port_no: 1,
23
- hardware_address: '11:22:33:44:55:66',
24
- name: 'port123',
25
- config: [:port_down],
26
- state: [:link_down],
27
- curr: [:port_10gb_fd, :port_copper] }])
28
- reply.to_binary # => Features Reply message in binary format.
@@ -1,4 +0,0 @@
1
- require 'pio'
2
-
3
- features = Pio::Features::Request.read(binary_data)
4
- features.xid # => 123
@@ -1,13 +0,0 @@
1
- require 'pio'
2
-
3
- flow_mod = Pio::FlowMod.new(transaction_id: 0x15,
4
- buffer_id: 0xffffffff,
5
- match: Pio::Match.new(in_port: 1),
6
- cookie: 1,
7
- command: :add,
8
- priority: 0xffff,
9
- out_port: 2,
10
- flags: [:send_flow_rem, :check_overwrap],
11
- actions: Pio::SendOutPort.new(2))
12
-
13
- flow_mod.to_binary # => Flow mod message in binary format.
@@ -1,6 +0,0 @@
1
- require 'pio'
2
-
3
- flow_mod = Pio::FlowMod.read(binary_data)
4
- flow_mod.match.in_port # => 1
5
- flow_mod.match.dl_src # => '00:00:00:00:00:0a'
6
- # ...
@@ -1,4 +0,0 @@
1
- require 'pio'
2
-
3
- hello = Pio::Hello.new(transaction_id: 123)
4
- hello.to_binary # => HELLO message in binary format.
@@ -1,4 +0,0 @@
1
- require 'pio'
2
-
3
- hello = Pio::Hello.read(binary_data)
4
- hello.transaction_id # => 123
data/examples/icmp_new.rb DELETED
@@ -1,21 +0,0 @@
1
- require 'pio'
2
-
3
- request = Pio::Icmp::Request.new(
4
- source_mac: '00:16:9d:1d:9c:c4',
5
- destination_mac: '00:26:82:eb:ea:d1',
6
- ip_source_address: '192.168.83.3',
7
- ip_destination_address: '192.168.83.254'
8
- )
9
- request.to_binary # => ICMP Request frame in binary format.
10
-
11
- reply = Pio::Icmp::Reply.new(
12
- source_mac: '00:26:82:eb:ea:d1',
13
- destination_mac: '00:16:9d:1d:9c:c4',
14
- ip_source_address: '192.168.83.254',
15
- ip_destination_address: '192.168.83.3',
16
- # The ICMP Identifier and the ICMP Sequence number
17
- # should be same as those of the request.
18
- identifier: request.icmp_identifier,
19
- sequence_number: request.icmp_sequence_number
20
- )
21
- reply.to_binary # => ICMP Reply frame in binary format.
@@ -1,4 +0,0 @@
1
- require 'pio'
2
-
3
- icmp = Pio::Icmp.read(binary_data)
4
- icmp.source_mac.to_s # => '00:26:82:eb:ea:d1'
data/examples/lldp_new.rb DELETED
@@ -1,4 +0,0 @@
1
- require 'pio'
2
-
3
- lldp = Pio::Lldp.new(dpid: 0x123, port_number: 12)
4
- lldp.to_binary # => LLDP frame in binary format.
@@ -1,4 +0,0 @@
1
- require 'pio'
2
-
3
- lldp = Pio::Lldp.read(binary_data)
4
- lldp.ttl # => 120
@@ -1,17 +0,0 @@
1
- require 'pio'
2
-
3
- data_dump = [
4
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xac, 0x5d, 0x10, 0x31, 0x37,
5
- 0x79, 0x08, 0x06, 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x01,
6
- 0xac, 0x5d, 0x10, 0x31, 0x37, 0x79, 0xc0, 0xa8, 0x02, 0xfe, 0xff,
7
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xa8, 0x02, 0x05, 0x00, 0x00,
8
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9
- 0x00, 0x00, 0x00, 0x00, 0x00
10
- ].pack('C*')
11
-
12
- packet_in = Pio::PacketIn.new(transaction_id: 0,
13
- buffer_id: 0xffffff00,
14
- in_port: 1,
15
- reason: :no_match,
16
- raw_data: data_dump)
17
- packet_in.to_binary # => Packet-In message in binary format.
@@ -1,5 +0,0 @@
1
- require 'pio'
2
-
3
- packet_in = Pio::PacketIn.read(binary_data)
4
- packet_in.in_port # => 1
5
- packet_in.buffer_id # => 4294967040
@@ -1,18 +0,0 @@
1
- require 'pio'
2
-
3
- data_dump = [
4
- 0x01, 0x80, 0xc2, 0x00, 0x00, 0x0e, 0x01, 0x02, 0x03, 0x04,
5
- 0x05, 0x06, 0x88, 0xcc, 0x02, 0x09, 0x07, 0x00, 0x00, 0x00,
6
- 0x00, 0x00, 0x00, 0x01, 0x23, 0x04, 0x05, 0x07, 0x00, 0x00,
7
- 0x00, 0x0c, 0x06, 0x02, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00,
8
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
9
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10
- 0x00, 0x00, 0x00, 0x00
11
- ].pack('C*')
12
-
13
- packet_out = Pio::PacketOut.new(transaction_id: 0x16,
14
- buffer_id: 0xffffffff,
15
- in_port: 0xffff,
16
- actions: Pio::SendOutPort.new(2),
17
- raw_data: data_dump)
18
- packet_out.to_binary # => Packet-Out message in binary format.
@@ -1,6 +0,0 @@
1
- require 'pio'
2
-
3
- packet_out = Pio::PacketOut.read(binary_data)
4
- packet_out.actions.length # => 1
5
- packet_out.actions[0] # => Pio::SendOutPort
6
- packet_out.actions[0].port_number # => 2
@@ -1,10 +0,0 @@
1
- Feature: Pio::Arp.read
2
- Scenario: arp.pcap
3
- Given a packet data file "arp.pcap"
4
- When I try to parse the file with "Arp" class
5
- Then it should finish successfully
6
-
7
- Scenario: arp-storm.pcap
8
- Given a packet data file "arp-storm.pcap"
9
- When I try to parse the file with "Arp" class
10
- Then it should finish successfully
@@ -1,6 +0,0 @@
1
- @announce
2
- Feature: Pio::Dhcp.read
3
- Scenario: dhcp.pcap
4
- Given a packet data file "dhcp.pcap"
5
- When I try to parse the file with "Dhcp" class
6
- Then it should finish successfully
@@ -1,29 +0,0 @@
1
- Feature: Pio::Echo.read
2
- Scenario: echo_request.raw
3
- Given a packet data file "echo_request.raw"
4
- When I try to parse the file with "Echo::Request" class
5
- Then it should finish successfully
6
- And the parsed data have the following field and value:
7
- | field | value |
8
- | class | Pio::Echo::Request |
9
- | ofp_version | 1 |
10
- | message_type | 2 |
11
- | message_length | 8 |
12
- | transaction_id | 0 |
13
- | xid | 0 |
14
- | body | |
15
-
16
- Scenario: echo_reply.raw
17
- Given a packet data file "echo_reply.raw"
18
- When I try to parse the file with "Echo::Reply" class
19
- Then it should finish successfully
20
- And the parsed data have the following field and value:
21
- | field | value |
22
- | class | Pio::Echo::Reply |
23
- | ofp_version | 1 |
24
- | message_type | 3 |
25
- | message_length | 8 |
26
- | transaction_id | 6 |
27
- | xid | 6 |
28
- | body | |
29
-
@@ -1,38 +0,0 @@
1
- Feature: Pio::ExactMatch.new
2
- Scenario: packet_in_arp_request.raw
3
- Given a packet data file "packet_in_arp_request.raw"
4
- When I try to create an exact match from the packet
5
- And the parsed data have the following field and value:
6
- | field | value |
7
- | wildcards | {} |
8
- | in_port | 1 |
9
- | dl_src | ac:5d:10:31:37:79 |
10
- | dl_dst | ff:ff:ff:ff:ff:ff |
11
- | dl_vlan | 65535 |
12
- | dl_vlan_pcp | 0 |
13
- | dl_type | 2054 |
14
- | nw_tos | 0 |
15
- | nw_proto | 1 |
16
- | nw_src | 192.168.2.254 |
17
- | nw_dst | 192.168.2.5 |
18
- | tp_src | 0 |
19
- | tp_dst | 0 |
20
-
21
- Scenario: packet_in_cbench.raw (ARP request)
22
- Given a packet data file "packet_in_cbench.raw"
23
- When I try to create an exact match from the packet
24
- And the parsed data have the following field and value:
25
- | field | value |
26
- | wildcards | {} |
27
- | in_port | 1 |
28
- | dl_src | 00:00:00:00:00:01 |
29
- | dl_dst | 80:00:00:00:00:01 |
30
- | dl_vlan | 65535 |
31
- | dl_vlan_pcp | 0 |
32
- | dl_type | 2048 |
33
- | nw_tos | 0 |
34
- | nw_proto | 255 |
35
- | nw_src | 192.168.0.40 |
36
- | nw_dst | 192.168.1.40 |
37
- | tp_src | 31256 |
38
- | tp_dst | 22635 |
@@ -1,14 +0,0 @@
1
- Feature: Pio::Hello.read
2
- Scenario: hello.raw
3
- Given a packet data file "hello.raw"
4
- When I try to parse the file with "Hello" class
5
- Then it should finish successfully
6
- And the parsed data have the following field and value:
7
- | field | value |
8
- | class | Pio::Hello |
9
- | ofp_version | 1 |
10
- | message_type | 0 |
11
- | message_length | 8 |
12
- | transaction_id | 23 |
13
- | xid | 23 |
14
- | body | |
@@ -1,55 +0,0 @@
1
- Feature: Pio::Icmp.read
2
- Scenario: icmp.pcap
3
- Given a packet data file "icmp.pcap"
4
- When I try to parse the file with "Icmp" class
5
- Then it should finish successfully
6
- And the parsed data #1 have the following field and value:
7
- | field | value |
8
- | class | Pio::Icmp::Request |
9
- | destination_mac | 00:13:46:0b:22:ba |
10
- | source_mac | 00:16:ce:6e:8b:24 |
11
- | ether_type | 2048 |
12
- | ip_version | 4 |
13
- | ip_header_length | 5 |
14
- | ip_type_of_service | 0 |
15
- | ip_total_length | 60 |
16
- | ip_identifier | 36507 |
17
- | ip_flag | 0 |
18
- | ip_fragment | 0 |
19
- | ip_ttl | 128 |
20
- | ip_protocol | 1 |
21
- | ip_header_checksum | 10850 |
22
- | ip_source_address | 192.168.0.114 |
23
- | ip_destination_address | 192.168.0.1 |
24
- | ip_option | |
25
- | icmp_type | 8 |
26
- | icmp_code | 0 |
27
- | icmp_checksum | 18780 |
28
- | icmp_identifier | 768 |
29
- | icmp_sequence_number | 256 |
30
- | echo_data | abcdefghijklmnopqrstuvwabcdefghi |
31
- And the parsed data #2 have the following field and value:
32
- | field | value |
33
- | class | Pio::Icmp::Reply |
34
- | destination_mac | 00:16:ce:6e:8b:24 |
35
- | source_mac | 00:13:46:0b:22:ba |
36
- | ether_type | 2048 |
37
- | ip_version | 4 |
38
- | ip_header_length | 5 |
39
- | ip_type_of_service | 0 |
40
- | ip_total_length | 60 |
41
- | ip_identifier | 24150 |
42
- | ip_flag | 0 |
43
- | ip_fragment | 0 |
44
- | ip_ttl | 127 |
45
- | ip_protocol | 1 |
46
- | ip_header_checksum | 23463 |
47
- | ip_source_address | 192.168.0.1 |
48
- | ip_destination_address | 192.168.0.114 |
49
- | ip_option | |
50
- | icmp_type | 0 |
51
- | icmp_code | 0 |
52
- | icmp_checksum | 20828 |
53
- | icmp_identifier | 768 |
54
- | icmp_sequence_number | 256 |
55
- | echo_data | abcdefghijklmnopqrstuvwabcdefghi |
@@ -1,26 +0,0 @@
1
- Feature: Pio::Lldp.read
2
- Scenario: lldp.minimal.pcap
3
- Given a packet data file "lldp.minimal.pcap"
4
- When I try to parse the file with "Lldp" class
5
- Then it should finish successfully
6
- Then the parsed data #1 have the following field and value:
7
- | field | value |
8
- | class | Pio::Lldp |
9
- | destination_mac | 01:80:c2:00:00:0e |
10
- | source_mac | 00:04:96:1f:a7:26 |
11
- | ether_type | 35020 |
12
- | chassis_id | 19698525990 |
13
- | dpid | 19698525990 |
14
- | port_id | 1/3 |
15
- | ttl | 120 |
16
- | port_description | |
17
- | system_name | |
18
- | system_description | |
19
- | system_capabilities | |
20
- | management_address | |
21
- | organizationally_specific | |
22
-
23
- Scenario: lldp.detailed.pcap
24
- Given a packet data file "lldp.detailed.pcap"
25
- When I try to parse the file with "Lldp" class
26
- Then it should finish successfully
@@ -1,22 +0,0 @@
1
- Feature: Pio::PacketIn.read
2
- Scenario: packet_in_arp_request.raw
3
- Given a packet data file "packet_in_arp_request.raw"
4
- When I try to parse the file with "PacketIn" class
5
- Then it should finish successfully
6
- And the parsed data have the following field and value:
7
- | field | value |
8
- | class | Pio::PacketIn |
9
- | ofp_version | 1 |
10
- | message_type | 10 |
11
- | message_length | 78 |
12
- | transaction_id | 0 |
13
- | xid | 0 |
14
- | buffer_id | 4294967040 |
15
- | total_len | 60 |
16
- | in_port | 1 |
17
- | reason | no_match |
18
- | raw_data.length | 60 |
19
- | source_mac | ac:5d:10:31:37:79 |
20
- | source_mac.class | Pio::Mac |
21
- | destination_mac | ff:ff:ff:ff:ff:ff |
22
- | destination_mac.class | Pio::Mac |