blob: e9eb9fa1122fcbf3b6bdddb344c723572c62cb7c [file] [log] [blame]
Rich Lane7708c182013-10-01 23:27:27 -07001:: # Copyright 2013, Big Switch Networks, Inc.
2:: #
3:: # LoxiGen is licensed under the Eclipse Public License, version 1.0 (EPL), with
4:: # the following special exception:
5:: #
6:: # LOXI Exception
7:: #
8:: # As a special exception to the terms of the EPL, you may distribute libraries
9:: # generated by LoxiGen (LoxiGen Libraries) under the terms of your choice, provided
10:: # that copyright and licensing notices generated by LoxiGen are not altered or removed
11:: # from the LoxiGen Libraries and the notice provided below is (i) included in
12:: # the LoxiGen Libraries, if distributed in source code form and (ii) included in any
13:: # documentation for the LoxiGen Libraries, if distributed in binary form.
14:: #
15:: # Notice: "Copyright 2013, Big Switch Networks, Inc. This library was generated by the LoxiGen Compiler."
16:: #
17:: # You may not use this file except in compliance with the EPL or LOXI Exception. You may obtain
18:: # a copy of the EPL at:
19:: #
20:: # http://www.eclipse.org/legal/epl-v10.html
21:: #
22:: # Unless required by applicable law or agreed to in writing, software
23:: # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
24:: # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
25:: # EPL for the specific language governing permissions and limitations
26:: # under the EPL.
27
28function read_scalar(reader, subtree, field_name, length)
29 subtree:add(fields[field_name], reader.read(length))
30end
31
32function read_uint8_t(reader, version, subtree, field_name)
33 read_scalar(reader, subtree, field_name, 1)
34end
35
36function read_uint16_t(reader, version, subtree, field_name)
37 read_scalar(reader, subtree, field_name, 2)
38end
39
40function read_uint32_t(reader, version, subtree, field_name)
41 read_scalar(reader, subtree, field_name, 4)
42end
43
44function read_uint64_t(reader, version, subtree, field_name)
45 read_scalar(reader, subtree, field_name, 8)
46end
47
48function read_of_octets_t(reader, version, subtree, field_name)
Rich Lane4a868262013-10-02 15:19:44 -070049 if not reader.is_empty() then
50 subtree:add(fields[field_name], reader.read_all())
51 end
Rich Lane7708c182013-10-01 23:27:27 -070052end
53
Tomaszcdfb36c2013-12-08 11:16:03 -080054function peek_scalar(reader, subtree, field_name, length)
55 return reader.read(length):uint()
56end
57
58function peek_uint8_t(reader, version, subtree, field_name)
59 return peek_scalar(reader, subtree, field_name, 1)
60end
61
62function peek_uint16_t(reader, version, subtree, field_name)
63 return peek_scalar(reader, subtree, field_name, 2)
64end
65
66function peek_uint32_t(reader, version, subtree, field_name)
67 return peek_scalar(reader, subtree, field_name, 4)
68end
69
70function peek_uint64_t(reader, version, subtree, field_name)
71 return peek_scalar(reader, subtree, field_name, 8)
72end
73
74function peek_of_octets_t(reader, version, subtree, field_name)
75 if not reader.is_empty() then
76 return reader.peek_all()
77 end
78end
79
Rich Lane7708c182013-10-01 23:27:27 -070080function read_list_of_hello_elem_t(reader, version, subtree, field_name)
81 -- TODO
82end
Rich Lanea6e650e2013-10-02 16:30:06 -070083
84function read_of_match_t(reader, version, subtree, field_name)
85 if version == 1 then
86 dissect_of_match_v1_v1(reader, subtree:add(fields[field_name]))
87 elseif version == 2 then
88 dissect_of_match_v2_v2(reader, subtree:add(fields[field_name]))
89 elseif version >= 3 then
90 dissect_of_match_v3_v3(reader, subtree:add(fields[field_name]))
91 end
92end
93
94function read_of_wc_bmap_t(reader, version, subtree, field_name)
95 if version <= 2 then
96 read_scalar(reader, subtree, field_name, 4)
97 else
98 read_scalar(reader, subtree, field_name, 8)
99 end
100end
101
102function read_of_port_no_t(reader, version, subtree, field_name)
103 if version == 1 then
104 read_scalar(reader, subtree, field_name, 2)
105 else
106 read_scalar(reader, subtree, field_name, 4)
107 end
108end
109
Tomaszc595d5b2013-11-02 13:30:32 -0700110function read_of_port_name_t(reader, version, subtree, field_name)
111 read_scalar(reader, subtree, field_name, 16)
112end
113
Rich Lanea6e650e2013-10-02 16:30:06 -0700114function read_of_mac_addr_t(reader, version, subtree, field_name)
115 read_scalar(reader, subtree, field_name, 6)
116end
117
118function read_of_ipv4_t(reader, version, subtree, field_name)
119 read_scalar(reader, subtree, field_name, 4)
120end
121
Rich Lane5c56c3b2013-10-25 14:39:29 -0700122function read_of_ipv6_t(reader, version, subtree, field_name)
123 read_scalar(reader, subtree, field_name, 16)
124end
125
Rich Lanea6e650e2013-10-02 16:30:06 -0700126function read_of_fm_cmd_t(reader, version, subtree, field_name)
127 if version == 1 then
128 read_scalar(reader, subtree, field_name, 2)
129 else
130 read_scalar(reader, subtree, field_name, 1)
131 end
132end
133
Tomaszcdfb36c2013-12-08 11:16:03 -0800134function peek_of_fm_cmd_t(reader, version, subtree, field_name)
135 if version == 1 then
136 return peek_scalar(reader, subtree, field_name, 2)
137 else
138 return peek_scalar(reader, subtree, field_name, 1)
139 end
140end
141
Rich Lanea6e650e2013-10-02 16:30:06 -0700142function read_list_of_action_t(reader, version, subtree, field_name)
Rich Laned03d0152013-10-03 13:24:37 -0700143 if reader.is_empty() then
144 return
145 end
146
Tomaszf53bf322013-11-02 13:31:14 -0700147 local list_len = 0
148
149 if string.find(field_name,'packet_out') then
150 if version == 1 then
151 list_len = reader.peek(-2,2):uint()
152 else
153 list_len = reader.peek(-8,2):uint()
154 end
155 end
156
157 local list = nil
158 local reader2 = nil
159
160 if list_len == 0 then
161 list = subtree:add(fields[field_name], reader.peek_all(0))
162 reader2 = reader
163 else
164 list = subtree:add(fields[field_name], reader.peek(0, list_len))
165 reader2 = reader.slice(list_len)
166 end
167
168 while not reader2.is_empty() do
169 local action_len = reader2.peek(2, 2):uint()
170 local child_reader = reader2.slice(action_len)
Rich Laned03d0152013-10-03 13:24:37 -0700171 local child_subtree = list:add(fields[field_name], child_reader.peek_all(0))
Tomasz742c2ba2013-10-24 22:35:45 -0700172 local info = dissect_of_action(child_reader, child_subtree, version)
Rich Lanedb927a02013-10-04 11:00:13 -0700173 child_subtree:set_text(info)
Rich Laned03d0152013-10-03 13:24:37 -0700174 end
Tomasz742c2ba2013-10-24 22:35:45 -0700175 list:set_text("List of actions")
Rich Lanea6e650e2013-10-02 16:30:06 -0700176end
177
178function read_list_of_port_desc_t(reader, version, subtree, field_name)
Tomaszc595d5b2013-11-02 13:30:32 -0700179 if reader.is_empty() then
180 return
181 end
182 local list = subtree:add(fields[field_name], reader.peek_all(0))
183 list:set_text("List of port descriptions")
184 while not reader.is_empty() do
185 local port_desc_len = 64
186 local child_reader = reader.slice(port_desc_len)
187 local child_subtree = list:add(fields[field_name], child_reader.peek_all(0))
188 local info = dissect_of_port_desc(child_reader, child_subtree, version)
189 child_subtree:set_text(info)
190 end
191end
192
193function read_list_of_flow_stats_entry_t(reader, version, subtree, field_name)
194 if reader.is_empty() then
195 return
196 end
197 local list = subtree:add(fields[field_name], reader.peek_all(0))
198 list:set_text("List of flow stats entries")
199 while not reader.is_empty() do
200 local stats_len = reader.peek(0,2):uint()
201 local child_reader = reader.slice(stats_len)
202 local child_subtree = list:add(fields[field_name], child_reader.peek_all(0))
203 local info = dissect_of_flow_stats_entry(child_reader, child_subtree, version)
204 child_subtree:set_text(info)
205 end
206end
207
208function read_list_of_port_stats_entry_t(reader, version, subtree, field_name)
209 if reader.is_empty() then
210 return
211 end
212 local list = subtree:add(fields[field_name], reader.peek_all(0))
213 list:set_text("List of port stats entries")
214 while not reader.is_empty() do
215 local stats_len = 112
216 local child_reader = reader.slice(stats_len)
217 local child_subtree = list:add(fields[field_name], child_reader.peek_all(0))
218 local info = dissect_of_port_stats_entry(child_reader, child_subtree, version)
219 child_subtree:set_text(info)
220 end
221end
222
223function read_list_of_table_stats_entry_t(reader, version, subtree, field_name)
224 if reader.is_empty() then
225 return
226 end
227 local list = subtree:add(fields[field_name], reader.peek_all(0))
228 list:set_text("List of table stats entries")
229 while not reader.is_empty() do
230 local stats_len = 24
231 local child_reader = reader.slice(stats_len)
232 local child_subtree = list:add(fields[field_name], child_reader.peek_all(0))
233 local info = dissect_of_table_stats_entry(child_reader, child_subtree, version)
234 child_subtree:set_text(info)
235 end
236end
237
238function read_list_of_queue_stats_entry_t(reader, version, subtree, field_name)
239 if reader.is_empty() then
240 return
241 end
242 local list = subtree:add(fields[field_name], reader.peek_all(0))
243 list:set_text("List of flow stats entries")
244 while not reader.is_empty() do
245 local stats_len = 40
246 local child_reader = reader.slice(stats_len)
247 local child_subtree = list:add(fields[field_name], child_reader.peek_all(0))
248 local info = dissect_of_queue_stats_entry(child_reader, child_subtree, version)
249 child_subtree:set_text(info)
250 end
Rich Lanea6e650e2013-10-02 16:30:06 -0700251end
252
253function read_list_of_packet_queue_t(reader, version, subtree, field_name)
254 -- TODO
Tomaszc595d5b2013-11-02 13:30:32 -0700255 read_of_octets_t()
256end
257
258function read_of_desc_str_t(reader, version, subtree, field_name)
259 read_scalar(reader, subtree, field_name, 256)
260end
261
262function read_of_serial_num_t(reader, version, subtree, field_name)
263 read_scalar(reader, subtree, field_name, 32)
Rich Lanea6e650e2013-10-02 16:30:06 -0700264end
Tomasze0584352013-10-23 16:43:26 -0700265
266function read_list_of_oxm_t(reader, version, subtree, field_name)
267 if reader.is_empty() then
268 return
269 end
270 local list_len = reader.peek(-2,2):uint()
271 local reader2 = reader.slice(list_len - 4)
Rich Lane74938222013-10-25 14:35:16 -0700272 local list = nil
273 if not reader2.is_empty() then
274 list = subtree:add(fields[field_name], reader2.peek_all(0))
Tomasza17a6692013-10-30 17:34:18 -0700275 list:set_text("List of matches")
Rich Lane74938222013-10-25 14:35:16 -0700276 end
Tomasze0584352013-10-23 16:43:26 -0700277 while not reader2.is_empty() do
278 local match_len = 4 + reader2.peek(3,1):uint()
279 local child_reader = reader2.slice(match_len)
280 local child_subtree = list:add(fields[field_name], child_reader.peek_all(0))
Tomasz742c2ba2013-10-24 22:35:45 -0700281 local info = dissect_of_oxm(child_reader, child_subtree, version)
Tomasze0584352013-10-23 16:43:26 -0700282 child_subtree:set_text(info)
283 end
Tomasz742c2ba2013-10-24 22:35:45 -0700284 subtree:set_text("OXM")
Tomasze0584352013-10-23 16:43:26 -0700285 reader.skip_align()
286end
Tomasz71a30b32013-10-23 16:45:09 -0700287
288function read_list_of_instruction_t(reader, version, subtree, field_name)
289 if reader.is_empty() then
290 return
291 end
Tomasz742c2ba2013-10-24 22:35:45 -0700292 local child_subtree = subtree:add(fields[field_name], reader.peek_all(0))
293 local info = dissect_of_instruction(reader, child_subtree, version)
294 child_subtree:set_text("Instructions")
Tomasz71a30b32013-10-23 16:45:09 -0700295end
Tomasza17a6692013-10-30 17:34:18 -0700296
297function read_list_of_bucket_t(reader, version, subtree, field_name)
298 if reader.is_empty() then
299 return
300 end
Tomaszffb31612013-10-31 09:53:03 -0700301 local bucket_list_subtree = subtree:add(fields[field_name], reader.peek_all(0))
302 bucket_list_subtree:set_text("List of buckets")
303 while not reader.is_empty() do
304 local bucket_len = reader.peek(0,2):uint()
305 local child_reader = reader.slice(bucket_len)
306 local child_subtree = bucket_list_subtree:add(fields[field_name], child_reader.peek_all(0))
307 local info = dissect_of_bucket(child_reader, child_subtree, version)
308 child_subtree:set_text(info)
309 end
Tomasza17a6692013-10-30 17:34:18 -0700310end
311
312function read_of_oxm_t(reader, version, subtree, field_name)
313 if reader.is_empty() then
314 return
315 end
316 local child_subtree = subtree:add(fields[field_name], reader.peek_all(0))
317 local info = dissect_of_oxm(reader, child_subtree, version)
318 child_subtree:set_text(info)
319end