blob: 3f809820c9c17ae87857b9f35807f0f140746c17 [file] [log] [blame]
Rich Lanecc327672014-04-10 13:37:35 -07001:: # Copyright 2014, 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 2014, 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::
28:: include('_copyright.c')
29:: import loxi_globals
Rich Lane18391592014-04-10 15:27:00 -070030:: from loxi_ir import *
Rich Lanecc327672014-04-10 13:37:35 -070031
32/**
33 *
34 * AUTOMATICALLY GENERATED FILE. Edits will be lost on regen.
35 *
36 * Source file for OpenFlow message validation.
37 *
38 */
39
40#include "loci_log.h"
41#include <loci/loci.h>
42#include <loci/loci_validator.h>
43
44#define VALIDATOR_LOG(...) LOCI_LOG_ERROR("Validator Error: " __VA_ARGS__)
45
Rich Lane18391592014-04-10 15:27:00 -070046:: validator_name = lambda ofclass: "loci_validate_%s_%s" % (ofclass.name, ofclass.protocol.version.constant_version(prefix='OF_VERSION_'))
47
48/* Forward declarations */
49:: for version, proto in loxi_globals.ir.items():
50:: for ofclass in proto.classes:
51static int __attribute__((unused)) ${validator_name(ofclass)}(uint8_t *data, int len);
52:: #endfor
53:: #endfor
54
55:: readers = { 1: 'buf_u8_get', 2: 'buf_u16_get', 4: 'buf_u32_get' }
56:: types = { 1: 'uint8_t', 2: 'uint16_t', 4: 'uint32_t' }
57
58:: for version, proto in loxi_globals.ir.items():
59:: for ofclass in proto.classes:
60static int
61${validator_name(ofclass)}(uint8_t *data, int len)
62{
63 if (len < ${ofclass.base_length}) {
64 return -1;
65 }
66
67:: # Read and validate length fields
68:: for m in ofclass.members:
69:: if type(m) == OFLengthMember:
70 ${types[m.length]} wire_len;
71 ${readers[m.length]}(data + ${m.offset}, &wire_len);
72 if (wire_len > len || wire_len < ${ofclass.base_length}) {
73 return -1;
74 }
75
76 len = wire_len;
77:: #endif
78:: #endfor
79
80:: # Dispatch to subclass validators
81:: if ofclass.virtual:
82:: discriminator = ofclass.discriminator
83 ${types[discriminator.length]} wire_type;
84 ${readers[discriminator.length]}(data + ${discriminator.offset}, &wire_type);
85 switch (wire_type) {
86:: for subclass in proto.classes:
87:: if subclass.superclass == ofclass:
88 case ${subclass.member_by_name(discriminator.name).value}:
89 return ${validator_name(subclass)}(data, len);
90:: #endif
91:: #endfor
92 }
93:: #endif
94
95 return 0;
96}
97
98:: #endfor
99:: #endfor
100
Rich Lanecc327672014-04-10 13:37:35 -0700101int
102of_validate_message(of_message_t msg, int len)
103{
104 of_version_t version;
105 if (len < OF_MESSAGE_MIN_LENGTH ||
106 len != of_message_length_get(msg)) {
107 VALIDATOR_LOG("message length %d != %d", len,
108 of_message_length_get(msg));
109 return -1;
110 }
111
112 version = of_message_version_get(msg);
113 switch (version) {
114:: for version, proto in loxi_globals.ir.items():
115 case ${version.constant_version(prefix='OF_VERSION_')}:
Rich Lane18391592014-04-10 15:27:00 -0700116 return ${validator_name(proto.class_by_name('of_header'))}(msg, len);
Rich Lanecc327672014-04-10 13:37:35 -0700117:: #endfor
118 default:
119 VALIDATOR_LOG("Bad version %d", OF_VERSION_1_3);
120 return -1;
121 }
122}