Re: [Linuxptp-devel] [PATCH v7 1/2] pmc_agent: Add option to run callback for signaling messages
PTP IEEE 1588 stack for Linux
Brought to you by:
rcochran
|
From: Maciek M. <ma...@ma...> - 2023-12-04 07:40:14
|
Hey, please take a look at these patches and merge them if there are no
bugs in this code.
Thanks,
Maciek
On 10/11/2023 15:14, Maciek Machnikowski wrote:
> Add option to run callback that when the PMC agent receives signaling messages.
>
> v2: changed pmc_agent implementation to not use a separate callback
> v3: updated poll thread to use less CPU
> v4: changed sleep routine to usleep, simplified poll thread
> v5: make sure management_tlv_id is not called on non-management messages
> v6: optimized code to not check signaling_cb_ena on management messages
> v7: rebase
>
> Signed-off-by: Maciek Machnikowski <ma...@ma...>
> ---
> pmc_agent.c | 22 ++++++++++++++++++++--
> pmc_agent.h | 7 +++++++
> 2 files changed, 27 insertions(+), 2 deletions(-)
>
> diff --git a/pmc_agent.c b/pmc_agent.c
> index 62d1a86..bea6b59 100644
> --- a/pmc_agent.c
> +++ b/pmc_agent.c
> @@ -42,6 +42,7 @@ struct pmc_agent {
> bool dds_valid;
> int leap;
> int pmc_ds_requested;
> + bool signaling_cb_ena;
> bool stay_subscribed;
> int sync_offset;
> int utc_offset_traceable;
> @@ -127,6 +128,7 @@ static int run_pmc(struct pmc_agent *node, int timeout, int ds_id,
> #define N_FD 1
> struct pollfd pollfd[N_FD];
> int cnt, res;
> + bool skip_cb;
>
> while (1) {
> pollfd[0].fd = pmc_get_transport_fd(node->pmc);
> @@ -178,9 +180,19 @@ static int run_pmc(struct pmc_agent *node, int timeout, int ds_id,
> node->pmc_ds_requested = 0;
> return RUN_PMC_NODEV;
> }
> - if (res <= 0 ||
> +
> + /* Skip callback if message is not management */
> + skip_cb = (res <= 0) ? true : false;
> +
> + /* Run the callback on signaling messages if configured */
> + if (res == 0 && node->signaling_cb_ena &&
> + msg_type(*msg) == SIGNALING) {
> + skip_cb = false;
> + }
> +
> + if (skip_cb ||
> node->recv_subscribed(node->recv_context, *msg, ds_id) ||
> - management_tlv_id(*msg) != ds_id) {
> + (res == 1 && management_tlv_id(*msg) != ds_id)) {
> msg_put(*msg);
> *msg = NULL;
> continue;
> @@ -430,3 +442,9 @@ bool pmc_agent_utc_offset_traceable(struct pmc_agent *agent)
> {
> return agent->utc_offset_traceable;
> }
> +
> +void pmc_agent_enable_signaling_cb(struct pmc_agent *agent, bool enable)
> +{
> + agent->signaling_cb_ena = enable;
> +}
> +
> diff --git a/pmc_agent.h b/pmc_agent.h
> index 2fb1cc8..9ae37f7 100644
> --- a/pmc_agent.h
> +++ b/pmc_agent.h
> @@ -170,4 +170,11 @@ int pmc_agent_update(struct pmc_agent *agent);
> */
> bool pmc_agent_utc_offset_traceable(struct pmc_agent *agent);
>
> +/**
> + * Enables or disables callback on signaling messages
> + * @param agent Pointer to a PMC instance obtained via @ref pmc_agent_create().
> + * @param enable - if set to true, callback will be called on signaling msgs
> + */
> +void pmc_agent_enable_signaling_cb(struct pmc_agent *agent, bool enable);
> +
> #endif
|