/**@page mypage8 Using QCSAPI via RPC
 * @section mysecton8_1 Introduction
 * @subsection mysection8_1_1 rpcgen
 * <c>rpcgen</c> is a tool for creating remote procedure call stubs in C, given an RPC protocol definition file.
 * These stubs contain code relevant for marshaling and un-marshaling, which is serialization of data so that
 * it can be transmitted over a network. The marshaled data can be sent over UDP sockets, TCP sockets, or through PCIe.
 *
 * @section mysection8_2 call_qcsapi_sockrpc / call_qcsapi_rpcd
 * These are utilities for remote invocation of the <c>call_qcsapi</c> example program.
 *
 * <c>call_qcsapi_rpcd</c> is a server implementation, which is much like <c>call_qcsapi</c>, except that it runs as a daemon,
 * accepting requests from RPC clients. Requests take the format of a list of strings, which are equivalent to <c>argv</c> in <c>call_qcsapi</c>.
 *
 * <c>call_qcsapi_sockrpc</c> is a client implementation, which finds the server hostname, 
 * then creates a request out of argc and <c>argv</c>, waits for a response then prints it.
 * It uses UDP sockets to communicate with the server.
 *
 * <c>call_qcsapi_pcie</c> is a client implementation which creates requests from <c>argc</c> and <c>argv</c>, 
 * but it uses PCIe to communicate with the server instead of UDP sockets.<br>
 * @image latex rpc_img1.jpg " " width=\textwidth
 *
 * @subsection mysection8_2_1 Implementation
 * <c>call_qcsapi_rpc</c> and associated client programs use <c>rpcgen</c> to create client and server stubs based on a simple interface definition file, <c>call_qcsapi_rpc.x</c>.
 *
 * @section mysection8_3 RPC for qcsapi.h
 * This is an RPC service, which provides and RPC interface for (almost) all of the functions in libqcsapi.
 * @subsection mysection8_3_1 libqcsapi
 * The target device includes a binary library, <c>libqcsapi.so</c>, which provides implementations for 
 * the functions prototyped in <c>qcsapi.h</c>. Third party developers may develop applications that run on the target and link to libqcsapi.so
 * @subsection mysection8_3_2 libqcsapi_client
 * In order to develop applications that can use QCSAPI, but run on another host, libqcsapi_client provides RPC 
 * stubs based on prototypes in qcsapi.h, with an additional function for specifying the RPC transport mechanism (UDP/TCP/PCIe).<br>
 * Third party developers can create a program running on a host platform, link against <c>libqcsapi_client.so</c>,
 * and call qcsapi functions from C code.<br>
 * <c>libqcsapi_client.so</c> communicates with server RPC stubs running on <c>qcsapi_rpcd</c>.
 * @subsection mysection8_3_3 qcsapi_rpcd
 * <c>qcsapi_rpcd</c> is an RPC service program, which contains RPC server stubs for each function in libqcsapi.
 * <c>qcsapi_rpcd</c> registers UDP, TCP and PCIe services. It links to <c>libqcsapi.so</c>, to invoke the real QCSAPI functions when requested by clients.
 *
 * @subsection mysection8_3_4 qcsapi_sockrpc
 * qcsapi_sockrpc is a version of <c>call_qcsapi</c>, which is linked against <c>libqcsapi_client.so</c> instead of <c>libqcsapi.so</c>.
 * It works as follows:<br>
 * @image latex rpc_img2.jpg " " width=\textwidth
 *
 * @section mysection8_4 Implementation details of libqcsapi_client + qcsapi_rpcd
 * To reduce ongoing maintenance effort required, <c>libqcsapi_client</c> and <c>qcsapi_rpcd</c> are both automatically generated
 * based on the contents of <c>qcsapi.h</c>; it is just RPC client and server stubs. The process of code generation
 * is as follows. All of these files are relative paths under <c>buildroot/package/qcsapi/qcsapi-1.0.1/</c>.
 * -# <c>qcsapi.h</c> is manually changed with new feature developments, as it always has been.
 * -# <c>qcsapi_rpc</c>/<c>qcsapi_rpc_gen.pl</c> reads <c>qcsapi.h</c>, and generates:
 *    -# an rpc interface definition file for use with <c>rpcgen</c><br>
	 <c>qcsapi_rpc/generated/qcsapi_rpc.x</c>. This file is later used as an input for <c>rpcgen</c>.
 *    -# client stub implementations:<br>
	 <c>qcsapi_rpc/generated/qcsapi_rpc_clnt_adapter.c</c>.
	 This will contain function definitions matched to the prototypes in <c>qcsapi.h</c>, which convert <c>qcsapi.h</c> calls to the relevant RPC routines.
 *    -# server stub adapter implementation:<br>
	 <c>qcsapi_rpc/generated/qcsapi_rpc_svc_adapter.c</c>, which convert from <c>rpcgen</c> RPC server stub functions to <c>qcsapi.h</c> calls; these calls will go to the real implementation in <c>libqcsapi.so</c>.
 * -# Once the perl script generates <c>qcsapi_rpc/generated/qcsapi_rpc.x</c>, <c>rpcgen</c> is used to create other files:
      -# <c>qcsapi_rpc/generated/qcsapi_rpc.h</c>, structure definitions and function prototypes to represent data that is appropriate for marshaling/un-marshaling.
      -# <c>qcsapi_rpc/generated/qcsapi_rpc_clnt.c</c>, which is <c>rpcgen</c> generated client stubs, but these are unused. Required code is already in <c>qcsapi_rpc_clnt_adapter.c</c>.
      -# <c>qcsapi_rpc/generated/qcsapi_rpc_svc.c</c>, RPC service function demultiplexer. Takes arguments from the RPC service program, and will call the appropriate function in <c>qcsapi_rpc_svc_adapter.c</c>.
      -# <c>qcsapi_rpc/generated/qcsapi_rpc_xdr.c</c> marshaling/un-marshaling functions.
 * -# Programs are compiled and linked with the following dependencies:
      -# <c>qcsapi_rpcd</c>
	-# <c>qcsapi_rpc/generated/qcsapi_rpc_svc.c</c>
	-# <c>qcsapi_rpc/generated/qcsapi_rpc_svc_adapter.c</c>
	-# <c>qcsapi_rpc/generated/qcsapi_rpc_xdr.c</c>
	-# <c>libqcsapi.so</c>
	-# Additional code for starting and registering the server, and PCIe server transport.
      -# <c>libqcsapi_client</c>
	-# <c>qcsapi_rpc/generated/qcsapi_rpc_clnt_adapter.c</c>
	-# <c>qcsapi_rpc/generated/qcsapi_rpc_xdr.c</c>
      -# <c>qcsapi_sockrpc</c>:
	-# Code for resolving which remote server to use
	-# <c>call_qcsapi</c> frontend code
	-# <c>libqcsapi_client.so</c>
 *.
 * @section mysection8_5 QCSAPI RPC in the SDK
 * The sdk ships with generated sources for <c>qcsapi_rpc</c> and <c>call_qcsapi_rpc</c>, but not with <c>qcsapi_rpc/qcsapi_rpc_gen.pl</c>,
 * or interface definition files. This allows <c>libqcsapi_client</c> and other client programs to be rebuild by customers, 
 * but any changes to <c>qcsapi.h</c> will not automatically update the RPC code.
 *
 * @subsection mysection8_5_1 Source bundles
 * <c>call_qcsapi</c> clients and <c>qcsapi_rpc</c> clients (including <c>libqcsapi_client.so</c> source) are included in the 
 * SDK as source code .zip bundles, which can be taken integrated with host tools by vendors, 
 * so their host firmware can contain QCSAPI RPC client programs without the Quantenna build system. 
 * A caveat of this is that automatically generated code based on <c>qcsapi.h</c> will be updated with each change to <c>qcsapi.h</c>,
 * so vendors must be diligent to make sure they are matching the appropriate client 
 * release with the Quantenna target platform server.
 */
