On Mon, Mar 24, 2014 at 09:53:43AM +0100, Jiri Benc wrote:
> Require subscriptions to be renewed regularly. This way, the subscription
> automatically times out when phc2sys is killed.
>
> Signed-off-by: Jiri Benc <[email protected]>
> ---
> clock.c | 24 ++++++++++++++++++++++++
> phc2sys.c | 10 ++++++----
> 2 files changed, 30 insertions(+), 4 deletions(-)
>
> diff --git a/clock.c b/clock.c
> index c893a58391ce..d9ee6c4c77e2 100644
> --- a/clock.c
> +++ b/clock.c
> @@ -68,6 +68,7 @@ struct clock_subscriber {
> uint8_t addr[TRANSPORT_RECV_ADDR_LEN];
> int addrlen;
> UInteger16 sequenceId;
> + time_t subscribed;
Make this "expiration" instead, and then we can implement 1588 unicast
in the same way...
> };
>
> struct clock {
> @@ -142,6 +143,7 @@ static void clock_update_subscription(struct clock *c,
> struct ptp_message *req,
> uint8_t addr[TRANSPORT_RECV_ADDR_LEN];
> int addrlen;
> struct clock_subscriber *s;
> + struct timespec now;
>
> addrlen = port_recv_addr(uds, addr);
> if (!addrlen) {
> @@ -157,6 +159,8 @@ static void clock_update_subscription(struct clock *c,
> struct ptp_message *req,
> memcpy(s->addr, addr, addrlen);
> s->addrlen = addrlen;
> s->events = events;
> + clock_gettime(CLOCK_MONOTONIC, &now);
> + s->subscribed = now.tv_sec;
> } else {
> remove_subscriber(s);
> }
> @@ -175,6 +179,8 @@ static void clock_update_subscription(struct clock *c,
> struct ptp_message *req,
> memcpy(s->addr, addr, addrlen);
> s->addrlen = addrlen;
> s->events = events;
> + clock_gettime(CLOCK_MONOTONIC, &now);
> + s->subscribed = now.tv_sec;
> s->sequenceId = 0;
> LIST_INSERT_HEAD(&c->subscribers, s, list);
> }
> @@ -188,6 +194,23 @@ static void clock_flush_subscriptions(struct clock *c)
> }
> }
>
> +static void clock_prune_subscriptions(struct clock *c)
> +{
> + struct clock_subscriber *s, *tmp;
> + struct timespec now;
> +
> + clock_gettime(CLOCK_MONOTONIC, &now);
> + LIST_FOREACH_SAFE(s, &c->subscribers, list, tmp) {
> + /* prune subscribers older than 3 minutes */
> + if (s->subscribed + 180 < now.tv_sec) {
and you won't need a hard coded magic number here.
> + pr_info("subscriber %s timed out (not renewed in %ld
> seconds)",
> + pid2str(&s->targetPortIdentity),
> + now.tv_sec - s->subscribed);
> + remove_subscriber(s);
> + }
> + }
> +}
> +
Thanks,
Richard
------------------------------------------------------------------------------
_______________________________________________
Linuxptp-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel