blob: b77d762010be2f89ddad9d1608a5e436b35624a2 [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
Tomaszbe8adf62014-01-04 15:24:08 -080048local hex2bin_tab = {
49 ["0"] = "0000",
50 ["1"] = "0001",
51 ["2"] = "0010",
52 ["3"] = "0011",
53 ["4"] = "0100",
54 ["5"] = "0101",
55 ["6"] = "0110",
56 ["7"] = "0111",
57 ["8"] = "1000",
58 ["9"] = "1001",
59 ["a"] = "1010",
60 ["b"] = "1011",
61 ["c"] = "1100",
62 ["d"] = "1101",
63 ["e"] = "1110",
64 ["f"] = "1111"
65 }
66
67function hex2bin(str)
68 local bin = ''
69 for byte in string.gmatch(tostring(str), '%x') do
70 bin = bin .. hex2bin_tab[byte]
71 end
72 return bin
73end
74
Tomasz24d059a2013-12-19 09:29:24 -080075function read_of_bitmap_128_t(reader, version, subtree, field_name)
Tomaszbe8adf62014-01-04 15:24:08 -080076 if string.match(field_name, 'value_mask') then
77 local masked_ports = ''
78 local bitmap_string = hex2bin(reader.read(16))
79 local len = string.len(bitmap_string)
80 i = len
81 while i > 0 do
82 if string.sub(bitmap_string, i, i) == '0' then
83 masked_ports = masked_ports .. tostring(len - i) .. ' '
84 end
85 i = i - 1
86 end
87 subtree:add("masked_ports:", masked_ports)
88 else
89 subtree:add(fields[field_name], reader.read(16))
90 end
Tomasz24d059a2013-12-19 09:29:24 -080091end
92
Rich Lanee6fc8152014-01-08 15:21:23 -080093function read_of_checksum_128_t(reader, version, subtree, field_name)
94 read_scalar(reader, subtree, field_name, 16)
95end
96
Rich Lane7708c182013-10-01 23:27:27 -070097function read_of_octets_t(reader, version, subtree, field_name)
Rich Lane4a868262013-10-02 15:19:44 -070098 if not reader.is_empty() then
99 subtree:add(fields[field_name], reader.read_all())
100 end
Rich Lane7708c182013-10-01 23:27:27 -0700101end
102
103function read_list_of_hello_elem_t(reader, version, subtree, field_name)
104 -- TODO
105end
Rich Lanea6e650e2013-10-02 16:30:06 -0700106
107function read_of_match_t(reader, version, subtree, field_name)
108 if version == 1 then
Tomasza0dfec02013-12-14 21:51:04 -0800109 dissect_of_match_v1_v1(reader, subtree:add("of_match"))
Rich Lanea6e650e2013-10-02 16:30:06 -0700110 elseif version == 2 then
Tomasza0dfec02013-12-14 21:51:04 -0800111 dissect_of_match_v2_v2(reader, subtree:add("of_match"))
Rich Lanea6e650e2013-10-02 16:30:06 -0700112 elseif version >= 3 then
Tomasza0dfec02013-12-14 21:51:04 -0800113 dissect_of_match_v3_v3(reader, subtree:add("of_match"))
Rich Lanea6e650e2013-10-02 16:30:06 -0700114 end
115end
116
117function read_of_wc_bmap_t(reader, version, subtree, field_name)
118 if version <= 2 then
119 read_scalar(reader, subtree, field_name, 4)
120 else
121 read_scalar(reader, subtree, field_name, 8)
122 end
123end
124
125function read_of_port_no_t(reader, version, subtree, field_name)
126 if version == 1 then
127 read_scalar(reader, subtree, field_name, 2)
128 else
129 read_scalar(reader, subtree, field_name, 4)
130 end
131end
132
Tomaszc595d5b2013-11-02 13:30:32 -0700133function read_of_port_name_t(reader, version, subtree, field_name)
134 read_scalar(reader, subtree, field_name, 16)
135end
136
Rich Lanea6e650e2013-10-02 16:30:06 -0700137function read_of_mac_addr_t(reader, version, subtree, field_name)
138 read_scalar(reader, subtree, field_name, 6)
139end
140
141function read_of_ipv4_t(reader, version, subtree, field_name)
142 read_scalar(reader, subtree, field_name, 4)
143end
144
Rich Lane5c56c3b2013-10-25 14:39:29 -0700145function read_of_ipv6_t(reader, version, subtree, field_name)
146 read_scalar(reader, subtree, field_name, 16)
147end
148
Rich Lanea6e650e2013-10-02 16:30:06 -0700149function read_of_fm_cmd_t(reader, version, subtree, field_name)
150 if version == 1 then
151 read_scalar(reader, subtree, field_name, 2)
152 else
153 read_scalar(reader, subtree, field_name, 1)
154 end
155end
156
Tomaszc595d5b2013-11-02 13:30:32 -0700157function read_of_desc_str_t(reader, version, subtree, field_name)
158 read_scalar(reader, subtree, field_name, 256)
159end
160
161function read_of_serial_num_t(reader, version, subtree, field_name)
162 read_scalar(reader, subtree, field_name, 32)
Rich Lanea6e650e2013-10-02 16:30:06 -0700163end
Tomasze0584352013-10-23 16:43:26 -0700164
Tomasz359147c2013-12-17 18:34:20 -0800165function read_of_port_desc_t(reader, version, subtree, field_name)
166 if reader.is_empty() then
167 return
168 end
169 local child_subtree = subtree:add(fields[field_name], reader.peek_all(0))
170 local info = of_port_desc_dissectors[version](reader, child_subtree)
171 child_subtree:set_text(info)
172end
173
Tomasza17a6692013-10-30 17:34:18 -0700174function read_of_oxm_t(reader, version, subtree, field_name)
175 if reader.is_empty() then
176 return
177 end
178 local child_subtree = subtree:add(fields[field_name], reader.peek_all(0))
Tomasz2663f4f2013-12-10 05:12:42 -0800179 local info = of_oxm_dissectors[version](reader, child_subtree)
Tomasza17a6692013-10-30 17:34:18 -0700180 child_subtree:set_text(info)
181end
Tomaszabaeac32013-12-16 21:22:13 -0800182
183function read_list(reader, dissector, subtree, field_name)
184 if not reader.is_empty() then
185 local list_subtree = subtree:add(field_name .. " list", reader.peek_all(0))
186 while not reader.is_empty() do
187 local atom_subtree = list_subtree:add(field_name, reader.peek_all(0))
188 local info = dissector(reader, atom_subtree)
189 atom_subtree:set_text(info)
190 end
191 else
192 return
193 end
194end
tomaszklimczyk8d18d722014-01-19 23:17:05 -0800195
196function read_ethernet(reader, version, subtree, field_name)
197 if reader.is_empty() then
198 return
199 end
200 local child_subtree = subtree:add(fields[field_name], reader.peek_all(0))
201 child_subtree:set_text("Ethernet packet")
202 ethernet_dissector:call(reader.read_all():tvb(), current_pkt, child_subtree)
203end
tomaszklimczyk8c833852014-01-19 23:18:12 -0800204
205function read_of_bsn_vport_q_in_q_t(reader, version, subtree, field_name)
206 if reader.is_empty() then
207 return
208 end
209 local child_subtree = subtree:add(fields[field_name], reader.peek_all(0))
210 local info = of_bsn_vport_q_in_q_dissectors[version](reader, child_subtree)
211 child_subtree:set_text(info)
212end