From 51e59688359ddac32ed58f3add3ea9ac358c9132 Mon Sep 17 00:00:00 2001 From: Marek Gradzki Date: Tue, 6 Mar 2018 10:05:44 +0100 Subject: [PATCH] API: Add service definitions for events and singleton messages (second attempt) Based on https://gerrit.fd.io/r/#/c/10920/ Updates service definition in stats.api with correct reply message names. Change-Id: I3282bee5304e667e23bc1fab3f43d967a50d880d Signed-off-by: Marek Gradzki --- src/tools/vppapigen/vppapigen.py | 47 +++++++++++++------- src/vlibmemory/memclnt.api | 10 +++++ src/vnet/dhcp/dhcp.api | 4 ++ src/vnet/interface.api | 65 +++------------------------ src/vnet/ip/ip.api | 10 +++++ src/vnet/l2/l2.api | 5 +++ src/vpp-api/vapi/vapi_c_gen.py | 17 +++++++ src/vpp/oam/oam.api | 5 +++ src/vpp/stats/stats.api | 95 ++++++++++++++++++++++++++++++++++++++++ 9 files changed, 181 insertions(+), 77 deletions(-) diff --git a/src/tools/vppapigen/vppapigen.py b/src/tools/vppapigen/vppapigen.py index a230e2290e3..620b2ef7b71 100755 --- a/src/tools/vppapigen/vppapigen.py +++ b/src/tools/vppapigen/vppapigen.py @@ -41,6 +41,7 @@ class VPPAPILexer(object): 'service': 'SERVICE', 'rpc': 'RPC', 'returns': 'RETURNS', + 'null': 'NULL', 'stream': 'STREAM', 'events': 'EVENTS', 'define': 'DEFINE', @@ -115,12 +116,6 @@ class VPPAPILexer(object): # A string containing ignored characters (spaces and tabs) t_ignore = ' \t' - -class Iterator(type): - def __iter__(self): - return self.iter() - - class Service(): def __init__(self, caller, reply, events=[], stream=False): self.caller = caller @@ -346,7 +341,8 @@ class VPPAPIParser(object): p[0] = p[1] + [p[2]] def p_service_statement(self, p): - '''service_statement : RPC ID RETURNS ID ';' + '''service_statement : RPC ID RETURNS NULL ';' + | RPC ID RETURNS ID ';' | RPC ID RETURNS STREAM ID ';' | RPC ID RETURNS ID EVENTS event_list ';' ''' if len(p) == 8: @@ -571,15 +567,16 @@ class VPPAPI(object): if isinstance(o2, Service): s['services'].append(o2) - # Create services implicitly + msgs = {d.name: d for d in s['defines']} svcs = {s.caller: s for s in s['services']} + seen_services = {} for service in svcs: if service not in msgs: raise ValueError('Service definition refers to unknown message' ' definition: {}'.format(service)) - if svcs[service].reply not in msgs: + if svcs[service].reply != 'null' and svcs[service].reply not in msgs: raise ValueError('Service definition refers to unknown message' ' definition in reply: {}' .format(svcs[service].reply)) @@ -588,12 +585,18 @@ class VPPAPI(object): raise ValueError('Service definition refers to unknown ' 'event: {} in message: {}' .format(event, service)) + seen_services[event] = True + # Create services implicitly for d in msgs: - if msgs[d].singular is True: + if d in seen_services: continue - if d.endswith('_counters'): + if msgs[d].singular is True: continue + #if d.endswith('_counters'): + # continue + #if d.endswith('_event'): + # continue if d.endswith('_reply'): if d[:-6] in svcs: continue @@ -629,10 +632,16 @@ class VPPAPI(object): return s - def process_imports(self, objs): + def process_imports(self, objs, in_import): + imported_objs = [] for o in objs: if isinstance(o, Import): - return objs + self.process_imports(o.result) + return objs + self.process_imports(o.result, True) + if in_import: + if isinstance(o, Define) and o.typeonly: + imported_objs.append(o) + if in_import: + return imported_objs return objs @@ -664,9 +673,6 @@ def dirlist_get(): # Main # def main(): - logging.basicConfig() - log = logging.getLogger('vppapigen') - cliparser = argparse.ArgumentParser(description='VPP API generator') cliparser.add_argument('--pluginpath', default=""), cliparser.add_argument('--includedir', action='append'), @@ -692,11 +698,18 @@ def main(): else: filename = '' + if args.debug: + logging.basicConfig(stream=sys.stdout, level=logging.WARNING) + else: + logging.basicConfig() + log = logging.getLogger('vppapigen') + + parser = VPPAPI(debug=args.debug, filename=filename, logger=log) result = parser.parse_file(args.input, log) # Build a list of objects. Hash of lists. - result = parser.process_imports(result) + result = parser.process_imports(result, False) s = parser.process(result) # Add msg_id field diff --git a/src/vlibmemory/memclnt.api b/src/vlibmemory/memclnt.api index fb08f5120ee..d03c1058ae1 100644 --- a/src/vlibmemory/memclnt.api +++ b/src/vlibmemory/memclnt.api @@ -16,6 +16,16 @@ option version = "1.0.0"; +/* + * Define services not following the normal convetions here + */ +service { + rpc memclnt_rx_thread_suspend returns null; + rpc memclnt_read_timeout returns null; + rpc rx_thread_exit returns null; + rpc trace_plugin_msg_ids returns null; +}; + /* * Create a client registration */ diff --git a/src/vnet/dhcp/dhcp.api b/src/vnet/dhcp/dhcp.api index 721a1be3547..975aa6ee9e7 100644 --- a/src/vnet/dhcp/dhcp.api +++ b/src/vnet/dhcp/dhcp.api @@ -109,6 +109,10 @@ define dhcp_compl_event u8 host_mac[6]; }; +service { + rpc dhcp_client_config returns dhcp_client_config_reply events dhcp_compl_event; +}; + /** \brief Dump DHCP proxy table @param client_index - opaque cookie to identify the sender @param True for IPv6 proxy table diff --git a/src/vnet/interface.api b/src/vnet/interface.api index a8733d1854f..a5a9184f0bb 100644 --- a/src/vnet/interface.api +++ b/src/vnet/interface.api @@ -1,5 +1,10 @@ option version = "1.0.0"; +service { + rpc want_interface_events returns want_interface_events_reply + events sw_interface_event; +}; + /** \brief Set flags on the interface @param client_index - opaque cookie to identify the sender @param context - sender context, to match reply w/ request @@ -273,66 +278,6 @@ typeonly manual_print manual_endian define vnet_simple_counter u64 rx_mpls; }; -/** \brief Simple stats counters structure - @param vnet_counter_type- such as ip4, ip6, punts, etc - @param first_sw_if_index - first sw index in block of index, counts - @param count - number of counters, equal to the number of interfaces in - this stats block - @param data - contiguous block of u64 counters - - vnet_counter_type defined in enums - plural - in vnet/interface.h -*/ -manual_print manual_endian define vnet_interface_simple_counters -{ - u8 vnet_counter_type; - u32 first_sw_if_index; - u32 count; - u64 data[count]; -}; - -/** \brief Combined stats counters structure - @param vnet_counter_type- such as ip4, ip6, punts, etc - @param first_sw_if_index - first sw index in block of index, counts - @param count - number of counters, equal to the number of interfaces in - this stats block - @param data - contiguous block of vlib_counter_t structures - - vnet_counter_type defined in enums - plural - in vnet/interface.h -*/ -manual_print manual_endian define vnet_interface_combined_counters -{ - u8 vnet_counter_type; - u32 first_sw_if_index; - u32 count; - vl_api_vlib_counter_t data[count]; -}; - - -/** \brief Simple per interface stats counters structure - @param count - number of elements in message - @param timestamp - u32 vlib timestamp for control plane - @param data[count] - vl_api_vnet_simple_counter_t - -*/ -manual_print manual_endian define vnet_per_interface_simple_counters -{ - u32 count; - u32 timestamp; - vl_api_vnet_simple_counter_t data[count]; -}; - -/** \brief Combined stats counters structure per interface - @param count - number of elements in message - @param timestamp - u32 vlib timestamp for control plane - @param data[count] - vl_api_vnet_combined_counter_t -*/ -manual_print manual_endian define vnet_per_interface_combined_counters -{ - u32 count; - u32 timestamp; - vl_api_vnet_combined_counter_t data[count]; -}; - /** \brief Set unnumbered interface add / del request @param client_index - opaque cookie to identify the sender @param context - sender context, to match reply w/ request diff --git a/src/vnet/ip/ip.api b/src/vnet/ip/ip.api index 6ed5a9d6bdb..b94d6d748b2 100644 --- a/src/vnet/ip/ip.api +++ b/src/vnet/ip/ip.api @@ -686,6 +686,11 @@ define ip4_arp_event u8 mac_ip; }; +service { + rpc want_ip4_arp_events returns want_ip4_arp_events_reply + events ip4_arp_event; +}; + /** \brief Register for ip6 nd resolution events @param client_index - opaque cookie to identify the sender @param context - sender context, to match reply w/ request @@ -720,6 +725,11 @@ define ip6_nd_event u8 mac_ip; }; +service { + rpc want_ip6_nd_events returns want_ip6_nd_events_reply + events ip6_nd_event; +}; + /** \brief Proxy ARP add / del request @param client_index - opaque cookie to identify the sender @param context - sender context, to match reply w/ request diff --git a/src/vnet/l2/l2.api b/src/vnet/l2/l2.api index 5102783bcb4..3fb6de0d073 100644 --- a/src/vnet/l2/l2.api +++ b/src/vnet/l2/l2.api @@ -182,6 +182,11 @@ define l2_macs_event vl_api_mac_entry_t mac[n_macs]; }; +service { + rpc want_l2_macs_events returns want_l2_macs_events_reply + events l2_macs_event; +}; + /** \brief Set interface L2 flags (such as L2_LEARN, L2_FWD, L2_FLOOD, L2_UU_FLOOD, or L2_ARP_TERM bits). This can be used to disable one or more of the features represented by the diff --git a/src/vpp-api/vapi/vapi_c_gen.py b/src/vpp-api/vapi/vapi_c_gen.py index 4b7da6a1f15..60c54e4f031 100755 --- a/src/vpp-api/vapi/vapi_c_gen.py +++ b/src/vpp-api/vapi/vapi_c_gen.py @@ -70,6 +70,13 @@ class CStruct(Struct): def __init__(self, name, fields): super(CStruct, self).__init__(name, fields) + def duplicate_barrier(func): + def func_wrapper(self): + name = self.get_c_name() + return "#ifndef defined_{}\n#define defined_{}\n{}\n#endif".format(name, name, func(self)) + return func_wrapper + + @duplicate_barrier def get_c_def(self): return "\n".join([ "typedef struct __attribute__((__packed__)) {", @@ -271,6 +278,13 @@ class CMessage (Message): "}", ]) + def duplicate_barrier(func): + def func_wrapper(self): + name = self.get_payload_struct_name() + return "#ifndef defined_{}\n#define defined_{}\n{}\n#endif".format(name, name, func(self)) + return func_wrapper + + @duplicate_barrier def get_c_def(self): if self.has_payload(): return "\n".join([ @@ -585,9 +599,12 @@ def gen_json_unified_header(parser, logger, j, io, name): print("") function_attrs = "static inline " for t in parser.types_by_json[j].values(): + print("#ifndef defined_inline_%s" % t.get_c_name()) + print("#define defined_inline_%s" % t.get_c_name()) print("%s%s" % (function_attrs, t.get_swap_to_be_func_def())) print("") print("%s%s" % (function_attrs, t.get_swap_to_host_func_def())) + print("#endif") print("") for m in parser.messages_by_json[j].values(): if m.has_payload(): diff --git a/src/vpp/oam/oam.api b/src/vpp/oam/oam.api index d03902e7fea..3823d8e2eed 100644 --- a/src/vpp/oam/oam.api +++ b/src/vpp/oam/oam.api @@ -45,6 +45,11 @@ autoreply define want_oam_events u32 pid; }; +service { + rpc want_oam_events returns want_oam_events_reply + events oam_event; +}; + /** \brief OAM add / del target request @param client_index - opaque cookie to identify the sender @param context - sender context, to match reply w/ request diff --git a/src/vpp/stats/stats.api b/src/vpp/stats/stats.api index b429faa901a..2913d242d19 100644 --- a/src/vpp/stats/stats.api +++ b/src/vpp/stats/stats.api @@ -20,6 +20,43 @@ option version = "1.0.0"; +import "vnet/interface.api"; + +service { + rpc want_stats + returns want_stats_reply; + rpc want_interface_simple_stats + returns want_interface_simple_stats_reply + events vnet_interface_simple_counters; + rpc want_per_interface_simple_stats + returns want_per_interface_simple_stats_reply + events vnet_per_interface_simple_counters; + rpc want_interface_combined_stats + returns want_interface_combined_stats_reply + events vnet_interface_combined_counters; + rpc want_per_interface_combined_stats + returns want_per_interface_combined_stats_reply + events vnet_per_interface_combined_counters; + rpc want_ip4_fib_stats + returns want_ip4_fib_stats_reply + events vnet_ip4_fib_counters; + rpc want_ip6_fib_stats + returns want_ip6_fib_stats_reply + events vnet_ip6_fib_counters; + rpc want_ip4_mfib_stats + returns want_ip4_mfib_stats_reply + events vnet_ip4_mfib_counters; + rpc want_ip6_mfib_stats + returns want_ip6_mfib_stats_reply + events vnet_ip6_mfib_counters; + rpc want_ip4_nbr_stats + returns want_ip4_nbr_stats_reply + events vnet_ip4_nbr_counters; + rpc want_ip6_nbr_stats + returns want_ip6_nbr_stats_reply + events vnet_ip6_nbr_counters; +}; + /** \brief Want Stats, enable/disable ALL stats updates @param client_index - opaque cookie to identify the sender @param context - sender context, to match reply w/ request @@ -292,6 +329,64 @@ manual_print manual_endian define vnet_ip6_nbr_counters vl_api_ip6_nbr_counter_t c[count]; }; +/** \brief Simple stats counters structure + @param vnet_counter_type- such as ip4, ip6, punts, etc + @param first_sw_if_index - first sw index in block of index, counts + @param count - number of counters, equal to the number of interfaces in + this stats block + @param data - contiguous block of u64 counters + + vnet_counter_type defined in enums - plural - in vnet/interface.h +*/ +manual_print manual_endian define vnet_interface_simple_counters +{ + u8 vnet_counter_type; + u32 first_sw_if_index; + u32 count; + u64 data[count]; +}; + +/** \brief Combined stats counters structure + @param vnet_counter_type- such as ip4, ip6, punts, etc + @param first_sw_if_index - first sw index in block of index, counts + @param count - number of counters, equal to the number of interfaces in + this stats block + @param data - contiguous block of vlib_counter_t structures + + vnet_counter_type defined in enums - plural - in vnet/interface.h +*/ +manual_print manual_endian define vnet_interface_combined_counters +{ + u8 vnet_counter_type; + u32 first_sw_if_index; + u32 count; + vl_api_vlib_counter_t data[count]; +}; + +/** \brief Simple per interface stats counters structure + @param count - number of elements in message + @param timestamp - u32 vlib timestamp for control plane + @param data[count] - vl_api_vnet_simple_counter_t + +*/ +manual_print manual_endian define vnet_per_interface_simple_counters +{ + u32 count; + u32 timestamp; + vl_api_vnet_simple_counter_t data[count]; +}; + +/** \brief Combined stats counters structure per interface + @param count - number of elements in message + @param timestamp - u32 vlib timestamp for control plane + @param data[count] - vl_api_vnet_combined_counter_t +*/ +manual_print manual_endian define vnet_per_interface_combined_counters +{ + u32 count; + u32 timestamp; + vl_api_vnet_combined_counter_t data[count]; +}; /** \brief Request for a single block of summary stats @param client_index - opaque cookie to identify the sender -- 2.16.6