X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Ftools%2Fvppapigen%2Fvppapigen_c.py;h=59dbbc99fb64f0d6dbded684138dd83433af1441;hb=refs%2Fchanges%2F66%2F28566%2F2;hp=e15a141764343ab37f9f828cde9df920ceb5ff51;hpb=7c8803d4577c0d0417bf918e764611b7c0de0593;p=vpp.git diff --git a/src/tools/vppapigen/vppapigen_c.py b/src/tools/vppapigen/vppapigen_c.py index e15a1417643..59dbbc99fb6 100644 --- a/src/tools/vppapigen/vppapigen_c.py +++ b/src/tools/vppapigen/vppapigen_c.py @@ -136,10 +136,9 @@ class Printfun(): if o.modern_vla: write(' if (vl_api_string_len(&a->{f}) > 0) {{\n' .format(f=o.fieldname)) - write(' s = format(s, "\\n%U{f}: %.*s", ' + write(' s = format(s, "\\n%U{f}: %U", ' 'format_white_space, indent, ' - 'vl_api_string_len(&a->{f}) - 1, ' - 'vl_api_from_api_string(&a->{f}));\n'.format(f=o.fieldname)) + 'vl_api_format_string, (&a->{f}));\n'.format(f=o.fieldname)) write(' } else {\n') write(' s = format(s, "\\n%U{f}:", ' 'format_white_space, indent);\n'.format(f=o.fieldname)) @@ -395,6 +394,7 @@ def endianfun_array(o): name=o.fieldname)) return output +no_endian_conversion = {'client_index': None} def endianfun_obj(o): output = '' @@ -404,6 +404,9 @@ def endianfun_obj(o): output += (' s = format(s, "\\n{} {} {} (print not implemented");\n' .format(o.type, o.fieldtype, o.fieldname)) return output + if o.fieldname in no_endian_conversion: + output += ' /* a->{n} = a->{n} (no-op) */\n'.format(n=o.fieldname) + return output if o.fieldtype in endian_strings: output += (' a->{name} = {format}(a->{name});\n' .format(name=o.fieldname, @@ -522,6 +525,13 @@ def generate_include_types(s, module, stream): write('#ifndef included_{module}_api_types_h\n'.format(module=module)) write('#define included_{module}_api_types_h\n'.format(module=module)) + if 'version' in s['Option']: + v = s['Option']['version'] + (major, minor, patch) = v.split('.') + write('#define VL_API_{m}_API_VERSION_MAJOR {v}\n'.format(m=module.upper(), v=major)) + write('#define VL_API_{m}_API_VERSION_MINOR {v}\n'.format(m=module.upper(), v=minor)) + write('#define VL_API_{m}_API_VERSION_PATCH {v}\n'.format(m=module.upper(), v=patch)) + if len(s['Import']): write('/* Imported API files */\n') for i in s['Import']: @@ -586,11 +596,16 @@ def generate_include_types(s, module, stream): write('} vl_api_%s_t;\n' % o.name) + for t in s['Define']: + write('#define VL_API_{ID}_CRC "{n}_{crc:08x}"\n' + .format(n=t.name, ID=t.name.upper(), crc=t.crc)) + write("\n#endif\n") def generate_c_boilerplate(services, defines, file_crc, module, stream): write = stream.write + define_hash = {d.name:d for d in defines} hdr = '''\ #define vl_endianfun /* define message structures */ @@ -608,7 +623,8 @@ def generate_c_boilerplate(services, defines, file_crc, module, stream): write(hdr.format(module=module)) write('static u16\n') write('setup_message_id_table (void) {\n') - write(' api_main_t *am = &api_main;\n') + write(' api_main_t *am = my_api_main;\n') + write(' vl_msg_api_msg_config_t c;\n') write(' u16 msg_id_base = vl_msg_api_get_msg_ids ("{}_{crc:08x}", VL_MSG_FIRST_AVAILABLE);\n' .format(module, crc=file_crc)) @@ -618,11 +634,29 @@ def generate_c_boilerplate(services, defines, file_crc, module, stream): ' VL_API_{ID} + msg_id_base);\n' .format(n=d.name, ID=d.name.upper(), crc=d.crc)) for s in services: - write(' vl_msg_api_set_handlers(VL_API_{ID} + msg_id_base, "{n}",\n' - ' vl_api_{n}_t_handler, vl_noop_handler,\n' - ' vl_api_{n}_t_endian, vl_api_{n}_t_print,\n' - ' sizeof(vl_api_{n}_t), 1);\n' + d = define_hash[s.caller] + write(' c = (vl_msg_api_msg_config_t) {{.id = VL_API_{ID} + msg_id_base,\n' + ' .name = "{n}",\n' + ' .handler = vl_api_{n}_t_handler,\n' + ' .cleanup = vl_noop_handler,\n' + ' .endian = vl_api_{n}_t_endian,\n' + ' .print = vl_api_{n}_t_print,\n' + ' .is_autoendian = 0}};\n' .format(n=s.caller, ID=s.caller.upper())) + write(' vl_msg_api_config (&c);\n') + try: + d = define_hash[s.reply] + write(' c = (vl_msg_api_msg_config_t) {{.id = VL_API_{ID} + msg_id_base,\n' + ' .name = "{n}",\n' + ' .handler = 0,\n' + ' .cleanup = vl_noop_handler,\n' + ' .endian = vl_api_{n}_t_endian,\n' + ' .print = vl_api_{n}_t_print,\n' + ' .is_autoendian = 0}};\n' + .format(n=s.reply, ID=s.reply.upper())) + write(' vl_msg_api_config (&c);\n') + except KeyError: + pass write(' return msg_id_base;\n') write('}\n')