Run-time Configuration and Status#

During run-time, Aerial components can be re-configured or queried for status through gRPC remote procedure calls (RPCs). The RPCs are defined in “protocol buffers” syntax, allowing support for clients written in any of the languages supported by gRPC and protocol buffers.

More information about gRPC may be found at https://grpc.io/docs/what-is-grpc/core-concepts/

More information about protocol buffers may be found at https://developers.google.com/protocol-buffers

Simple Request/Reply Flow#

Aerial applications support a request/reply flow using the gRPC framework with protobufs messages. At run-time, certain configuration items may be updated and certain status information may be queried. An external OAM client interfaces with the Aerial application acting as the gRPC server.

../../_images/image14.png

Streaming Request/Replies#

Aerial applications support the gRPC streaming feature for sending periodic status between client and server.

../../_images/image15.png

Asynchronous Interthread Communication#

Certain request/reply scenarios require interaction with the high-priority CPU-pinned threads orchestrating GPU work. These interactions occur through Aerial-internal asynchronous queues, and requests are processed on a best effort basis that prioritizes the orchestration of GPU kernel launches and other L1 tasks.

../../_images/image16.png

Aerial Common Service Definition#

syntax = "proto3";

package aerial;

service Common {

rpc TerminateCuphycontroller (GenericRequest) returns (DummyReply) {}

rpc GetSFN (GenericRequest) returns (SFNReply) {}

rpc GetCpuUtilization (GenericRequest) returns (CpuUtilizationReply) {}

rpc SetPuschH5DumpNextCrc (GenericRequest) returns (DummyReply) {}

rpc GetFAPIStream (FAPIStreamRequest) returns (stream FAPIStreamReply) {}

rpc UpdateCellParamsSyncCall (CellParamUpdateRequest) returns (CellParamUpdateReply) {}

rpc UpdateCellParams (CellParamUpdateRequest) returns (DummyReply) {}

}

message GenericRequest {

    string name = 1;

}

message SFNReply {

    int32 sfn = 1;

    int32 slot = 2;

}

message DummyReply {

}

message CpuUtilizationPerCore {

    int32 core_id = 1;

    int32 utilization_x1000 = 2;

}

message CpuUtilizationReply {

    repeated CpuUtilizationPerCore core = 1;

}

message FAPIStreamRequest {

    int32 client_id = 1;

    int32 total_msgs_requested = 2;

}

message FAPIStreamReply {

    int32 client_id = 1;

    bytes msg_buf = 2;

    bytes data_buf = 3;

}

rpc GetCpuUtilization#

The GetCpuUtilization RPC returns a variable-length array of CPU utilization per-high-priority-core.

CPU utilization is available through the Prometheus node exporter, however the design approach used by Aerial high-priority threads results in a false 100% CPU core utilization per thread. This RPC allows retrieval of the actual CPU utilization of high-priority threads. High-priority threads are pinned to specific CPU cores.

rpc GetFAPIStream#

This RPC requests snooping of one or more (up to infinite number) of SCF FAPI messages. The snooped messages are delivered from the Aerial gRPC server to a third party client. Refer to the $cuBB_SDK/cuPHY-CP/cuphyoam/examples/aerial_get_l2msgs.py script for an example client.

rpc TerminateCuphycontroller#

This RPC message terminates cuPHYController with immediate effect.

rpc CellParamUpdateRequest#

This RPC message updates cell configuration without stopping the cell. The message specification is as follows:

message CellParamUpdateRequest {

    int32 cell_id = 1;

    string dst_mac_addr = 2;

    int32 vlan_tci = 3;

}
  • dst_mac_addr must be in XX:XX:XX:XX:XX:XX format.

  • vlan_tci must include the 16-bit TCI value of 802.1Q tag.