6 datestring = datetime.datetime.utcfromtimestamp(
7 int(os.environ.get('SOURCE_DATE_EPOCH', time.time())))
8 input_filename = 'inputfil'
11 * VLIB API definitions {datestring}
12 * Input file: {input_filename}
13 * Automatically generated: please edit the input file NOT this file!
17 #if defined(vl_msg_id)||defined(vl_union_id) \\
18 || defined(vl_printfun) ||defined(vl_endianfun) \\
19 || defined(vl_api_version)||defined(vl_typedefs) \\
20 || defined(vl_msg_name)||defined(vl_msg_name_crc_list) \\
21 || defined(vl_api_version_tuple)
22 /* ok, something was selected */
24 #warning no content included from {input_filename}
27 #define VL_API_PACKED(x) x __attribute__ ((packed))
30 bottom_boilerplate = '''\
31 /****** API CRC (whole file) *****/
34 vl_api_version({input_filename}, {file_crc:#08x})
43 /****** Message ID / handler enum ******/
49 output += "vl_msg_id(VL_API_%s, vl_api_%s_t_handler)\n" % \
50 (t.name.upper(), t.name)
59 /****** Message names ******/
65 dont_trace = 0 if t.dont_trace else 1
66 output += "vl_msg_name(vl_api_%s_t, %d)\n" % (t.name, dont_trace)
72 def msg_name_crc_list(s, suffix):
75 /****** Message name, crc list ******/
77 #ifdef vl_msg_name_crc_list
79 output += "#define foreach_vl_msg_name_crc_%s " % suffix
82 output += "\\\n_(VL_API_%s, %s, %08x) " % \
83 (t.name.upper(), t.name, t.crc)
89 def duplicate_wrapper_head(name):
90 s = "#ifndef _vl_api_defined_%s\n" % name
91 s += "#define _vl_api_defined_%s\n" % name
95 def duplicate_wrapper_tail():
100 mappingtable = {'string': 'vl_api_string_t', }
101 if fieldtype in mappingtable:
102 return mappingtable[fieldtype]
106 def typedefs(objs, aliases, filename):
107 name = filename.replace('.', '_')
111 /****** Typedefs ******/
114 #ifndef included_{module}
115 #define included_{module}
117 output = output.format(module=name)
119 for k, v in aliases.items():
120 output += duplicate_wrapper_head(k)
122 output += 'typedef %s vl_api_%s_t[%s];\n' % (v['type'], k, v['length'])
124 output += 'typedef %s vl_api_%s_t;\n' % (v['type'], k)
125 output += duplicate_wrapper_tail()
128 tname = o.__class__.__name__
129 output += duplicate_wrapper_head(o.name)
131 if o.enumtype == 'u32':
132 output += "typedef enum {\n"
134 output += "typedef enum __attribute__((__packed__)) {\n"
137 output += " %s = %s,\n" % (b[0], b[1])
138 output += '} vl_api_%s_t;\n' % o.name
139 if o.enumtype != 'u32':
140 size1 = 'sizeof(vl_api_%s_t)' % o.name
141 size2 = 'sizeof(%s)' % o.enumtype
142 err_str = 'size of API enum %s is wrong' % o.name
143 output += 'STATIC_ASSERT(%s == %s, "%s");\n' % (size1, size2, err_str)
146 output += "typedef VL_API_PACKED(union _vl_api_%s {\n" % o.name
148 output += "typedef VL_API_PACKED(struct _vl_api_%s {\n" % o.name
150 if b.type == 'Field':
151 output += " %s %s;\n" % (api2c(b.fieldtype), b.fieldname)
152 elif b.type == 'Array':
154 output += " %s %s[0];\n" % (api2c(b.fieldtype), b.fieldname)
156 output += " %s %s[%s];\n" % (api2c(b.fieldtype), b.fieldname,
159 raise ValueError("Error in processing array type %s" % b)
161 output += '}) vl_api_%s_t;\n' % o.name
162 output += duplicate_wrapper_tail()
165 output += "\n#endif\n\n"
170 format_strings = {'u8': '%u',
183 /****** Print functions *****/
187 #define _uword_fmt \"%lld\"
188 #define _uword_cast (long long)
190 #define _uword_fmt \"%ld\"
191 #define _uword_cast long
196 if t.__class__.__name__ == 'Enum':
199 output += "/***** manual: vl_api_%s_t_print *****/\n\n" % t.name
201 output += duplicate_wrapper_head(t.name + '_t_print')
202 output += "static inline void *vl_api_%s_t_print (vl_api_%s_t *a," % \
204 output += "void *handle)\n{\n"
205 output += " vl_print(handle, \"vl_api_%s_t:\\n\");\n" % t.name
208 if o.type != 'Field':
210 if o.fieldtype in format_strings:
211 output += " vl_print(handle, \"%s: %s\\n\", a->%s);\n" % \
212 (o.fieldname, format_strings[o.fieldtype],
215 output += ' return handle;\n'
217 output += duplicate_wrapper_tail()
219 output += "\n#endif /* vl_printfun */\n"
225 'u16': 'clib_net_to_host_u16',
226 'u32': 'clib_net_to_host_u32',
227 'u64': 'clib_net_to_host_u64',
228 'i16': 'clib_net_to_host_u16',
229 'i32': 'clib_net_to_host_u32',
230 'i64': 'clib_net_to_host_u64',
237 /****** Endian swap functions *****/\n\
240 #undef clib_net_to_host_uword
242 #define clib_net_to_host_uword clib_net_to_host_u64
244 #define clib_net_to_host_uword clib_net_to_host_u32
250 if t.__class__.__name__ == 'Enum':
253 output += "/***** manual: vl_api_%s_t_endian *****/\n\n" % t.name
255 output += duplicate_wrapper_head(t.name + '_t_endian')
256 output += "static inline void vl_api_%s_t_endian (vl_api_%s_t *a)" % \
261 if o.type != 'Field':
263 if o.fieldtype in endian_strings:
264 output += " a->%s = %s(a->%s);\n" % \
265 (o.fieldname, endian_strings[o.fieldtype], o.fieldname)
267 output += " /* a->%s = a->%s (no-op) */\n" % \
268 (o.fieldname, o.fieldname)
271 output += duplicate_wrapper_tail()
272 output += "\n#endif /* vl_endianfun */\n\n"
277 def version_tuple(s, module):
279 /****** Version tuple *****/
281 #ifdef vl_api_version_tuple
284 if 'version' in s['Option']:
285 v = s['Option']['version']
286 (major, minor, patch) = v.split('.')
287 output += "vl_api_version_tuple(%s, %s, %s, %s)\n" % \
288 (module, major, minor, patch)
290 output += "\n#endif /* vl_api_version_tuple */\n\n"
298 def run(input_filename, s):
299 basename = os.path.basename(input_filename)
300 filename, file_extension = os.path.splitext(basename)
301 output = top_boilerplate.format(datestring=datestring,
302 input_filename=basename)
304 output += msg_names(s)
305 output += msg_name_crc_list(s, filename)
306 output += typedefs(s['types'] + s['Define'], s['Alias'], filename + file_extension)
307 output += printfun(s['types'] + s['Define'])
308 output += endianfun(s['types'] + s['Define'])
309 output += version_tuple(s, basename)
310 output += bottom_boilerplate.format(input_filename=basename,
311 file_crc=s['file_crc'])