Latmon Network Service
Overview
Provides the functionality required for network-based latency monitoring, including socket management, client-server communication, and data exchange with the Latmus service running on the System Under Test (SUT).
The Latmon network service is responsible for establishing and managing network communication between the Latmon application (running on a Zephyr-based board) and the Latmus service (running on the SUT).
It uses TCP sockets for reliable communication and UDP sockets for broadcasting the IP address of the Latmon device.
API Reference
Features
Socket Management: Creates and manages TCP and UDP sockets for communication.
Client-Server Communication: Handles incoming connections from the Latmus service.
Data Exchange: Sends latency metrics and histogram data to the Latmus service.
IP Address Broadcasting: Broadcasts the IP address of the Latmon device to facilitate discovery by the Latmus service.
Thread-Safe Design: Uses Zephyr’s kernel primitives (e.g., message queues and semaphores) for synchronization.
Workflow
Socket Creation
The net_latmon_get_socket()
function is called to create and configure a TCP socket to
communicate with the Latmus service. A connection address can be specified as a paramenter to
bind the socket to a specific interface and port.
Connection Handling
The net_latmon_connect()
function waits for a connection from the Latmus service.
If no connection is received within the timeout period, the service broadcasts its IP address
using UDP and returns -EAGAIN
.
If the broadcast request cannot be sent, the function returns -1
, and the client should quit.
Monitoring Start
Once a connection is established, the net_latmon_start()
function is called to
start the monitoring process. This function uses a callback to calculate latency deltas
and sends the data to the Latmus service.
Monitoring Status
The net_latmon_running()
function can be used to check if the monitoring process is active.
Thread Management
The service uses Zephyr threads to handle incoming connections and manage the monitoring process.
Enabling the Latmon Service
The following configuration option must be enabled in the prj.conf
file.
The following options may be configured to customize the Latmon service:
Example Usage
#include <zephyr/net/latmon.h>
#include <zephyr/net/socket.h>
void main(void)
{
struct in_addr ip;
int server_socket, client_socket;
/* Create and configure the server socket */
server_socket = net_latmon_get_socket(NULL);
while (1) {
/* Wait for a connection from the Latmus service */
client_socket = net_latmon_connect(server_socket, &ip);
if (client_socket < 0) {
if (client_socket == -EAGAIN) {
continue;
}
goto out;
}
/* Start the latency monitoring process */
net_latmon_start(client_socket, measure_latency_cycles);
}
out:
close(server_socket);
}