summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOle Troan <ot@cisco.com>2018-03-01 14:53:12 +0100
committerNeale Ranns <nranns@cisco.com>2018-03-05 16:44:28 +0000
commitf7b7fa53b7eaec81d8c00c1023fb7d01f1f9761f (patch)
tree4367f86fbb2c335c0e6d893a3eb6981ea7a63927
parentf313b747ad4313a5cadfdb6aa7eb66ce8bf7958f (diff)
API: Add service definitions for events and singleton messages.
Change-Id: I7de987c30b263d43521e6280c5273f30b5f6e11c Signed-off-by: Ole Troan <ot@cisco.com>
-rwxr-xr-xsrc/tools/vppapigen/vppapigen.py47
-rw-r--r--src/vlibmemory/memclnt.api10
-rw-r--r--src/vnet/dhcp/dhcp.api4
-rw-r--r--src/vnet/interface.api65
-rw-r--r--src/vnet/ip/ip.api10
-rw-r--r--src/vnet/l2/l2.api5
-rwxr-xr-xsrc/vpp-api/vapi/vapi_c_gen.py17
-rw-r--r--src/vpp/oam/oam.api5
-rw-r--r--src/vpp/stats/stats.api95
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
@@ -17,6 +17,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
*/
manual_print
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..d4f6d78954e 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
+ events vnet_ip4_nbr_counters;
+ rpc want_ip6_nbr_stats
+ returns want_ip6_nbr_stats
+ 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