pio 0.10.1 → 0.11.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +33 -2
- data/examples/echo_read.rb +1 -1
- data/examples/features_read.rb +1 -1
- data/examples/flow_mod_new.rb +13 -0
- data/examples/flow_mod_read.rb +6 -0
- data/features/echo_read.feature +27 -3
- data/features/features_read.feature +46 -2
- data/features/flow_mod_read.feature +186 -0
- data/features/hello_read.feature +9 -0
- data/features/packet_data/flow_mod_add.raw +0 -0
- data/features/packet_data/flow_mod_delete.raw +0 -0
- data/features/packet_data/flow_mod_delete_strict.raw +0 -0
- data/features/packet_data/flow_mod_modify.raw +0 -0
- data/features/packet_data/flow_mod_modify_strict.raw +0 -0
- data/features/packet_in_read.feature +13 -0
- data/features/packet_out_read.feature +16 -0
- data/features/step_definitions/packet_data_steps.rb +10 -1
- data/lib/pio.rb +1 -0
- data/lib/pio/echo.rb +10 -8
- data/lib/pio/enqueue.rb +1 -1
- data/lib/pio/features.rb +64 -7
- data/lib/pio/flow_mod.rb +86 -0
- data/lib/pio/hello.rb +4 -74
- data/lib/pio/ipv4_address.rb +1 -1
- data/lib/pio/match.rb +167 -0
- data/lib/pio/open_flow.rb +1 -0
- data/lib/pio/open_flow/actions.rb +65 -0
- data/lib/pio/open_flow/flags.rb +12 -9
- data/lib/pio/open_flow/message.rb +105 -21
- data/lib/pio/open_flow/phy_port.rb +31 -27
- data/lib/pio/open_flow/type.rb +1 -0
- data/lib/pio/packet_in.rb +2 -12
- data/lib/pio/packet_out.rb +4 -74
- data/lib/pio/send_out_port.rb +1 -0
- data/lib/pio/type/ip_address.rb +2 -7
- data/lib/pio/version.rb +1 -1
- data/pio.gemspec +8 -8
- data/spec/pio/echo/reply_spec.rb +61 -6
- data/spec/pio/echo/request_spec.rb +61 -6
- data/spec/pio/features/reply_spec.rb +81 -4
- data/spec/pio/features/request_spec.rb +88 -41
- data/spec/pio/flow_mod_spec.rb +151 -0
- data/spec/pio/hello_spec.rb +73 -56
- data/spec/pio/match_spec.rb +194 -0
- data/spec/pio/packet_in_spec.rb +35 -38
- data/spec/pio/packet_out_spec.rb +243 -182
- data/spec/pio/wildcards_spec.rb +115 -0
- metadata +37 -30
- data/features/packet_data/echo.raw +0 -0
- data/lib/pio/echo/message.rb +0 -49
- data/lib/pio/echo/reply.rb +0 -41
- data/lib/pio/echo/request.rb +0 -43
- data/lib/pio/features/reply.rb +0 -88
- data/lib/pio/features/request.rb +0 -68
- data/lib/pio/open_flow/parser.rb +0 -22
- data/spec/pio/echo_spec.rb +0 -49
- data/spec/pio/features_spec.rb +0 -96
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c327a8b9d5983e25574403cbe3f1e5ddfad54633
|
4
|
+
data.tar.gz: 1c8395383b9ceaebbda9cfa5cf3a1e1201f4aab4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: efa2dd373e70c0e235b0c004da7b839df4d98031d1ebfebe5c96972f8933bcdcd9b3c70d6a475cb8eabedad9b62a23116905fb2ac68c971b8e7af46435c472d8
|
7
|
+
data.tar.gz: 046bf9ac402f5a9cd2ba411efcacff61857c68836b02c02563cb9125fd09f9dbd551deb1e6d69042a691ed0828289cf5f9ededbb9caa920a9a612cdefc24cb25
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -23,6 +23,7 @@ supports the following packet formats:
|
|
23
23
|
- Features
|
24
24
|
- Packet-In
|
25
25
|
- Packet-Out
|
26
|
+
- Flow Mod
|
26
27
|
- (…currently there are just a few formats supported but I'm sure this list will grow)
|
27
28
|
|
28
29
|
## Features Overview
|
@@ -194,7 +195,7 @@ and you can access each field of the parsed Echo message.
|
|
194
195
|
|
195
196
|
require 'pio'
|
196
197
|
|
197
|
-
echo = Pio::Echo.read(binary_data)
|
198
|
+
echo = Pio::Echo::Request.read(binary_data)
|
198
199
|
echo.xid # => 123
|
199
200
|
|
200
201
|
Also you can use `Pio::Echo::Request#new` or `Pio::Echo::Reply#new` to
|
@@ -218,7 +219,7 @@ Features message.
|
|
218
219
|
|
219
220
|
require 'pio'
|
220
221
|
|
221
|
-
features = Pio::Features.read(binary_data)
|
222
|
+
features = Pio::Features::Request.read(binary_data)
|
222
223
|
features.xid # => 123
|
223
224
|
|
224
225
|
Also you can use `Pio::Features::Request#new` or `Pio::Features::Reply#new` to
|
@@ -320,6 +321,36 @@ like below:
|
|
320
321
|
data: data_dump)
|
321
322
|
packet_out.to_binary # => Packet-Out message in binary format.
|
322
323
|
|
324
|
+
### Flow Mod
|
325
|
+
|
326
|
+
To parse an OpenFlow 1.0 flow mod message, use the API
|
327
|
+
`Pio::FlowMod.read` and you can access each field of the parsed
|
328
|
+
flow mod message.
|
329
|
+
|
330
|
+
require 'pio'
|
331
|
+
|
332
|
+
flow_mod = Pio::FlowMod.read(binary_data)
|
333
|
+
flow_mod.match.in_port # => 1
|
334
|
+
flow_mod.match.dl_src # => '00:00:00:00:00:0a'
|
335
|
+
# ...
|
336
|
+
|
337
|
+
Also you can use `Pio::FlowMod#new` and `Pio::Match#new` to generate a
|
338
|
+
flow mod message like below:
|
339
|
+
|
340
|
+
require 'pio'
|
341
|
+
|
342
|
+
flow_mod = Pio::FlowMod.new(transaction_id: 0x15,
|
343
|
+
buffer_id: 0xffffffff,
|
344
|
+
match: Pio::Match.new(in_port: 1),
|
345
|
+
cookie: 1,
|
346
|
+
command: :add,
|
347
|
+
priority: 0xffff,
|
348
|
+
out_port: 2,
|
349
|
+
flags: [:send_flow_rem, :check_overwrap],
|
350
|
+
actions: Pio::SendOutPort.new(2))
|
351
|
+
|
352
|
+
flow_mod.to_binary # => Flow mod message in binary format.
|
353
|
+
|
323
354
|
## Installation
|
324
355
|
|
325
356
|
The simplest way to install Pio is to use [Bundler](http://gembundler.com/).
|
data/examples/echo_read.rb
CHANGED
data/examples/features_read.rb
CHANGED
@@ -0,0 +1,13 @@
|
|
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.
|
data/features/echo_read.feature
CHANGED
@@ -1,5 +1,29 @@
|
|
1
1
|
Feature: Pio::Echo.read
|
2
|
-
Scenario:
|
3
|
-
Given a packet data file "
|
4
|
-
When I try to parse the file with "Echo" class
|
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
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,10 +1,54 @@
|
|
1
1
|
Feature: Pio::Features.read
|
2
2
|
Scenario: features_request.raw
|
3
3
|
Given a packet data file "features_request.raw"
|
4
|
-
When I try to parse the file with "Features" class
|
4
|
+
When I try to parse the file with "Features::Request" class
|
5
5
|
Then it should finish successfully
|
6
|
+
And the parsed data have the following field and value:
|
7
|
+
| field | value |
|
8
|
+
| class | Pio::Features::Request |
|
9
|
+
| ofp_version | 1 |
|
10
|
+
| message_type | 5 |
|
11
|
+
| message_length | 8 |
|
12
|
+
| transaction_id | 2 |
|
13
|
+
| xid | 2 |
|
14
|
+
| body | |
|
6
15
|
|
7
16
|
Scenario: features_reply.raw
|
8
17
|
Given a packet data file "features_reply.raw"
|
9
|
-
When I try to parse the file with "Features" class
|
18
|
+
When I try to parse the file with "Features::Reply" class
|
10
19
|
Then it should finish successfully
|
20
|
+
And the parsed data have the following field and value:
|
21
|
+
| field | value |
|
22
|
+
| class | Pio::Features::Reply |
|
23
|
+
| ofp_version | 1 |
|
24
|
+
| message_type | 6 |
|
25
|
+
| message_length | 176 |
|
26
|
+
| transaction_id | 2 |
|
27
|
+
| xid | 2 |
|
28
|
+
| datapath_id | 1 |
|
29
|
+
| dpid | 1 |
|
30
|
+
| n_buffers | 256 |
|
31
|
+
| n_tables | 1 |
|
32
|
+
| capabilities | [:flow_stats, :table_stats, :port_stats, :arp_match_ip] |
|
33
|
+
| actions | [:output, :set_vlan_vid, :set_vlan_pcp, :strip_vlan, :set_dl_src, :set_dl_dst, :set_nw_src, :set_nw_dst, :set_nw_tos, :set_tp_src, :set_tp_dst, :enqueue] |
|
34
|
+
| ports.length | 3 |
|
35
|
+
| ports.first.port_no | 2 |
|
36
|
+
| ports.first.mac_address | 16:7d:a4:37:ba:10 |
|
37
|
+
| ports.first.hardware_address | 16:7d:a4:37:ba:10 |
|
38
|
+
| ports.first.name | trema0-0 |
|
39
|
+
| ports.first.config | [] |
|
40
|
+
| ports.first.state | [] |
|
41
|
+
| ports.first.curr | [:port_10gb_fd, :port_copper] |
|
42
|
+
| ports.first.advertised | [] |
|
43
|
+
| ports.first.supported | [] |
|
44
|
+
| ports.first.peer | [] |
|
45
|
+
| ports.last.port_no | 1 |
|
46
|
+
| ports.last.mac_address | 62:94:3a:f6:40:db |
|
47
|
+
| ports.last.hardware_address | 62:94:3a:f6:40:db |
|
48
|
+
| ports.last.name | trema1-0 |
|
49
|
+
| ports.last.config | [] |
|
50
|
+
| ports.last.state | [] |
|
51
|
+
| ports.last.curr | [:port_10gb_fd, :port_copper] |
|
52
|
+
| ports.last.advertised | [] |
|
53
|
+
| ports.last.supported | [] |
|
54
|
+
| ports.last.peer | [] |
|
@@ -0,0 +1,186 @@
|
|
1
|
+
Feature: Pio::FlowMod.read
|
2
|
+
Scenario: flow_mod_add.raw
|
3
|
+
Given a packet data file "flow_mod_add.raw"
|
4
|
+
When I try to parse the file with "FlowMod" class
|
5
|
+
Then it should finish successfully
|
6
|
+
And the parsed data have the following field and value:
|
7
|
+
| field | value |
|
8
|
+
| ofp_version | 1 |
|
9
|
+
| message_type | 14 |
|
10
|
+
| message_length | 192 |
|
11
|
+
| transaction_id | 0 |
|
12
|
+
| xid | 0 |
|
13
|
+
| match.wildcards | {:nw_src=>24, :nw_dst=>24} |
|
14
|
+
| match.in_port | 1 |
|
15
|
+
| match.dl_src | 00:00:00:00:00:0a |
|
16
|
+
| match.dl_dst | 00:00:00:00:00:14 |
|
17
|
+
| match.dl_vlan | 0 |
|
18
|
+
| match.dl_vlan_pcp | 0 |
|
19
|
+
| match.dl_type | 2048 |
|
20
|
+
| match.nw_tos | 0 |
|
21
|
+
| match.nw_proto | 1 |
|
22
|
+
| match.nw_src | 10.0.0.0 |
|
23
|
+
| match.nw_src.prefixlen | 8 |
|
24
|
+
| match.nw_dst | 20.0.0.0 |
|
25
|
+
| match.nw_dst.prefixlen | 8 |
|
26
|
+
| match.tp_src | 8 |
|
27
|
+
| match.tp_dst | 0 |
|
28
|
+
| cookie | 0 |
|
29
|
+
| command | add |
|
30
|
+
| idle_timeout | 0 |
|
31
|
+
| hard_timeout | 0 |
|
32
|
+
| priority | 65535 |
|
33
|
+
| buffer_id | 4294967295 |
|
34
|
+
| out_port | 65535 |
|
35
|
+
| flags | [:send_flow_rem] |
|
36
|
+
| actions.length | 12 |
|
37
|
+
| actions.first.class | Pio::SetVlanVid |
|
38
|
+
| actions.first.vlan_id | 10 |
|
39
|
+
|
40
|
+
Scenario: flow_mod_modify.raw
|
41
|
+
Given a packet data file "flow_mod_modify.raw"
|
42
|
+
When I try to parse the file with "FlowMod" class
|
43
|
+
Then it should finish successfully
|
44
|
+
And the parsed data have the following field and value:
|
45
|
+
| field | value |
|
46
|
+
| ofp_version | 1 |
|
47
|
+
| message_type | 14 |
|
48
|
+
| message_length | 192 |
|
49
|
+
| transaction_id | 0 |
|
50
|
+
| xid | 0 |
|
51
|
+
| match.wildcards | {:nw_src=>24, :nw_dst=>24} |
|
52
|
+
| match.in_port | 1 |
|
53
|
+
| match.dl_src | 00:00:00:00:00:0a |
|
54
|
+
| match.dl_dst | 00:00:00:00:00:14 |
|
55
|
+
| match.dl_vlan | 0 |
|
56
|
+
| match.dl_vlan_pcp | 0 |
|
57
|
+
| match.dl_type | 2048 |
|
58
|
+
| match.nw_tos | 0 |
|
59
|
+
| match.nw_proto | 1 |
|
60
|
+
| match.nw_src | 10.0.0.0 |
|
61
|
+
| match.nw_src.prefixlen | 8 |
|
62
|
+
| match.nw_dst | 20.0.0.0 |
|
63
|
+
| match.nw_dst.prefixlen | 8 |
|
64
|
+
| match.tp_src | 8 |
|
65
|
+
| match.tp_dst | 0 |
|
66
|
+
| cookie | 0 |
|
67
|
+
| command | modify |
|
68
|
+
| idle_timeout | 0 |
|
69
|
+
| hard_timeout | 0 |
|
70
|
+
| priority | 65535 |
|
71
|
+
| buffer_id | 4294967295 |
|
72
|
+
| out_port | 65535 |
|
73
|
+
| flags | [:send_flow_rem] |
|
74
|
+
| actions.length | 12 |
|
75
|
+
| actions.first.class | Pio::SetVlanVid |
|
76
|
+
| actions.first.vlan_id | 10 |
|
77
|
+
|
78
|
+
Scenario: flow_mod_modify_strict.raw
|
79
|
+
Given a packet data file "flow_mod_modify_strict.raw"
|
80
|
+
When I try to parse the file with "FlowMod" class
|
81
|
+
Then it should finish successfully
|
82
|
+
And the parsed data have the following field and value:
|
83
|
+
| field | value |
|
84
|
+
| ofp_version | 1 |
|
85
|
+
| message_type | 14 |
|
86
|
+
| message_length | 192 |
|
87
|
+
| transaction_id | 0 |
|
88
|
+
| xid | 0 |
|
89
|
+
| match.wildcards | {:nw_src=>24, :nw_dst=>24} |
|
90
|
+
| match.in_port | 1 |
|
91
|
+
| match.dl_src | 00:00:00:00:00:0a |
|
92
|
+
| match.dl_dst | 00:00:00:00:00:14 |
|
93
|
+
| match.dl_vlan | 0 |
|
94
|
+
| match.dl_vlan_pcp | 0 |
|
95
|
+
| match.dl_type | 2048 |
|
96
|
+
| match.nw_tos | 0 |
|
97
|
+
| match.nw_proto | 1 |
|
98
|
+
| match.nw_src | 10.0.0.0 |
|
99
|
+
| match.nw_src.prefixlen | 8 |
|
100
|
+
| match.nw_dst | 20.0.0.0 |
|
101
|
+
| match.nw_dst.prefixlen | 8 |
|
102
|
+
| match.tp_src | 8 |
|
103
|
+
| match.tp_dst | 0 |
|
104
|
+
| cookie | 0 |
|
105
|
+
| command | modify_strict |
|
106
|
+
| idle_timeout | 0 |
|
107
|
+
| hard_timeout | 0 |
|
108
|
+
| priority | 65535 |
|
109
|
+
| buffer_id | 4294967295 |
|
110
|
+
| out_port | 65535 |
|
111
|
+
| flags | [:send_flow_rem] |
|
112
|
+
| actions.length | 12 |
|
113
|
+
| actions.first.class | Pio::SetVlanVid |
|
114
|
+
| actions.first.vlan_id | 10 |
|
115
|
+
|
116
|
+
Scenario: flow_mod_delete.raw
|
117
|
+
Given a packet data file "flow_mod_delete.raw"
|
118
|
+
When I try to parse the file with "FlowMod" class
|
119
|
+
Then it should finish successfully
|
120
|
+
And the parsed data have the following field and value:
|
121
|
+
| field | value |
|
122
|
+
| ofp_version | 1 |
|
123
|
+
| message_type | 14 |
|
124
|
+
| message_length | 72 |
|
125
|
+
| transaction_id | 0 |
|
126
|
+
| xid | 0 |
|
127
|
+
| match.wildcards | {:nw_src=>24, :nw_dst=>24} |
|
128
|
+
| match.in_port | 1 |
|
129
|
+
| match.dl_src | 00:00:00:00:00:0a |
|
130
|
+
| match.dl_dst | 00:00:00:00:00:00 |
|
131
|
+
| match.dl_vlan | 0 |
|
132
|
+
| match.dl_vlan_pcp | 0 |
|
133
|
+
| match.dl_type | 2048 |
|
134
|
+
| match.nw_tos | 0 |
|
135
|
+
| match.nw_proto | 1 |
|
136
|
+
| match.nw_src | 10.0.0.0 |
|
137
|
+
| match.nw_src.prefixlen | 8 |
|
138
|
+
| match.nw_dst | 20.0.0.0 |
|
139
|
+
| match.nw_dst.prefixlen | 8 |
|
140
|
+
| match.tp_src | 8 |
|
141
|
+
| match.tp_dst | 0 |
|
142
|
+
| cookie | 0 |
|
143
|
+
| command | delete |
|
144
|
+
| idle_timeout | 0 |
|
145
|
+
| hard_timeout | 0 |
|
146
|
+
| priority | 65535 |
|
147
|
+
| buffer_id | 4294967295 |
|
148
|
+
| out_port | 65535 |
|
149
|
+
| flags | [] |
|
150
|
+
| actions | [] |
|
151
|
+
|
152
|
+
Scenario: flow_mod_delete_strict.raw
|
153
|
+
Given a packet data file "flow_mod_delete_strict.raw"
|
154
|
+
When I try to parse the file with "FlowMod" class
|
155
|
+
Then it should finish successfully
|
156
|
+
And the parsed data have the following field and value:
|
157
|
+
| field | value |
|
158
|
+
| ofp_version | 1 |
|
159
|
+
| message_type | 14 |
|
160
|
+
| message_length | 72 |
|
161
|
+
| transaction_id | 0 |
|
162
|
+
| xid | 0 |
|
163
|
+
| match.wildcards | {:nw_src=>24, :nw_dst=>24} |
|
164
|
+
| match.in_port | 1 |
|
165
|
+
| match.dl_src | 00:00:00:00:00:0a |
|
166
|
+
| match.dl_dst | 00:00:00:00:00:14 |
|
167
|
+
| match.dl_vlan | 0 |
|
168
|
+
| match.dl_vlan_pcp | 0 |
|
169
|
+
| match.dl_type | 2048 |
|
170
|
+
| match.nw_tos | 0 |
|
171
|
+
| match.nw_proto | 1 |
|
172
|
+
| match.nw_src | 10.0.0.0 |
|
173
|
+
| match.nw_src.prefixlen | 8 |
|
174
|
+
| match.nw_dst | 20.0.0.0 |
|
175
|
+
| match.nw_dst.prefixlen | 8 |
|
176
|
+
| match.tp_src | 8 |
|
177
|
+
| match.tp_dst | 0 |
|
178
|
+
| cookie | 1 |
|
179
|
+
| command | delete_strict |
|
180
|
+
| idle_timeout | 0 |
|
181
|
+
| hard_timeout | 0 |
|
182
|
+
| priority | 65535 |
|
183
|
+
| buffer_id | 4294967295 |
|
184
|
+
| out_port | 65535 |
|
185
|
+
| flags | [] |
|
186
|
+
| actions | [] |
|
data/features/hello_read.feature
CHANGED
@@ -3,3 +3,12 @@ Feature: Pio::Hello.read
|
|
3
3
|
Given a packet data file "hello.raw"
|
4
4
|
When I try to parse the file with "Hello" class
|
5
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 | |
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -3,3 +3,16 @@ Feature: Pio::PacketIn.read
|
|
3
3
|
Given a packet data file "packet_in.raw"
|
4
4
|
When I try to parse the file with "PacketIn" class
|
5
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
|
+
| data.length | 60 |
|