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 <mac...@machnikowski.net>
> ---
>  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


_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

Reply via email to