blob: d327b4916c6530f49c07576a2958e3d786e17096 [file] [log] [blame]
Rich Lane9cfa1652013-10-01 21:24:04 -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::
Rich Lane96641df2013-06-10 13:36:35 -070028:: from loxi_ir import *
Tomasz3f1b1f92013-12-10 01:58:10 -080029:: from wireshark_gen import make_field_name, get_reader
Rich Lane4bbdcf52013-10-01 22:07:35 -070030:: attrs = []
31:: if ofclass.virtual: attrs.append("virtual")
32:: if ofclass.superclass: attrs.append("child")
33:: if not ofclass.superclass: attrs.append("top-level")
34-- ${' '.join(attrs)} class ${ofclass.name}
35:: if ofclass.superclass:
Andreas Wundsamc2ce5fa2013-11-15 15:20:11 -080036-- Child of ${ofclass.superclass.name}
Rich Lane4bbdcf52013-10-01 22:07:35 -070037:: #endif
38:: if ofclass.virtual:
39-- Discriminator is ${ofclass.discriminator.name}
40:: #endif
Rich Lane93991e42013-10-01 22:24:51 -070041function ${name}(reader, subtree)
Tomaszc0b397a2013-12-16 22:17:31 -080042:: field_length_members = []
Tomasza19e9d22013-12-08 11:18:11 -080043:: if ofclass.virtual:
Tomasz9cb04a52013-12-10 02:31:38 -080044 return ${ofclass.name}_v${version.wire_version}_dissectors[reader.peek(${ofclass.discriminator.offset},${ofclass.discriminator.length}):uint()](reader, subtree)
45:: else:
Tomaszb5711af2013-12-14 21:50:28 -080046:: if not ofclass.is_fixed_length:
Tomasze77318d2013-12-16 21:21:42 -080047 local _length = reader.peek(${ofclass.length_member.offset}, ${ofclass.length_member.base_length}):uint()
48 local orig_reader = reader
49 reader = orig_reader.slice(_length)
Tomaszb5711af2013-12-14 21:50:28 -080050:: #endif
Rich Lane96641df2013-06-10 13:36:35 -070051:: for m in ofclass.members:
Rich Lane7708c182013-10-01 23:27:27 -070052:: if isinstance(m, OFPadMember):
Tomasze77318d2013-12-16 21:21:42 -080053 reader.skip(${m.length})
Rich Lane7708c182013-10-01 23:27:27 -070054:: continue
Rich Lane96641df2013-06-10 13:36:35 -070055:: #endif
Tomaszb5711af2013-12-14 21:50:28 -080056:: if isinstance(m, OFFieldLengthMember):
Tomaszc0b397a2013-12-16 22:17:31 -080057 local _${m.field_name}_length = reader.peek(0, ${m.base_length}):uint()
58:: field_length_members.append(m.field_name)
Tomaszb5711af2013-12-14 21:50:28 -080059:: #endif
60:: if m.oftype.startswith("list"):
61:: class_name = m.oftype.replace('_t)', '').replace('(', '').replace('list', '')
Tomaszc0b397a2013-12-16 22:17:31 -080062:: if m.name in field_length_members:
63 read_list(reader.slice(_${m.name}_length), dissect_${class_name}_v${version.wire_version}, subtree, '${class_name}')
Tomasze77318d2013-12-16 21:21:42 -080064:: else:
Tomaszc0b397a2013-12-16 22:17:31 -080065 read_list(reader, dissect_${class_name}_v${version.wire_version}, subtree, '${class_name}')
Tomasz5fc60712013-12-14 22:18:29 -080066:: #endif
Tomaszb5711af2013-12-14 21:50:28 -080067:: if ofclass.has_external_alignment:
Tomasze77318d2013-12-16 21:21:42 -080068 orig_reader.skip_align()
Tomaszb5711af2013-12-14 21:50:28 -080069:: #endif
70:: else:
Rich Lane7708c182013-10-01 23:27:27 -070071:: field_name = make_field_name(version, ofclass.name, m.name)
Rich Lane7ff373a2013-10-25 14:18:04 -070072:: reader_name = get_reader(version, ofclass, m)
Tomasze77318d2013-12-16 21:21:42 -080073 ${reader_name}(reader, ${version.wire_version}, subtree, '${field_name}')
Tomaszb5711af2013-12-14 21:50:28 -080074:: #endif
Rich Lane96641df2013-06-10 13:36:35 -070075:: #endfor
Rich Laneb017c732013-10-02 14:05:01 -070076 return '${ofclass.name}'
Tomaszcdfb36c2013-12-08 11:16:03 -080077:: #endif
Rich Lane96641df2013-06-10 13:36:35 -070078end