From: Vincent Cheng <vincent.cheng...@renesas.com> Signed-off-by: Vincent Cheng <vincent.cheng...@renesas.com> --- unicast_client.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++ unicast_client.h | 8 ++++++++ 2 files changed, 58 insertions(+)
diff --git a/unicast_client.c b/unicast_client.c index 4d6386e..7688814 100644 --- a/unicast_client.c +++ b/unicast_client.c @@ -64,6 +64,23 @@ static int attach_request(struct ptp_message *msg, int log_period, return 0; } +static int attach_cancel(struct ptp_message *msg, uint8_t message_type) +{ + struct cancel_unicast_xmit_tlv *req; + struct tlv_extra *extra; + + extra = msg_tlv_append(msg, sizeof(*req)); + if (!extra) { + return -1; + } + req = (struct cancel_unicast_xmit_tlv *) extra->tlv; + req->type = TLV_CANCEL_UNICAST_TRANSMISSION; + req->length = sizeof(*req) - sizeof(req->type) - sizeof(req->length); + req->message_type_flags = message_type << 4; + + return 0; +} + static int unicast_client_announce(struct port *p, struct unicast_master_address *dst) { @@ -563,3 +580,36 @@ int unicast_client_unicast_master_table_received(struct port *p, struct ptp_mess return ucma ? 1 : 0; } +int unicast_client_tx_cancel(struct port *p, + struct unicast_master_address *dst) +{ + struct ptp_message *msg; + int err; + + msg = port_signaling_uc_construct(p, &dst->address, &dst->portIdentity); + if (!msg) { + return -1; + } + err = attach_cancel(msg, ANNOUNCE); + if (err) { + goto out; + } + err = attach_cancel(msg, SYNC); + if (err) { + goto out; + } + if (p->delayMechanism != DM_P2P) { + err = attach_cancel(msg, DELAY_RESP); + if (err) { + goto out; + } + } + + err = port_prepare_and_send(p, msg, TRANS_GENERAL); + if (err) { + pr_err("%s: signaling message failed", p->log_name); + } +out: + msg_put(msg); + return err; +} diff --git a/unicast_client.h b/unicast_client.h index b24c4eb..bb0f80a 100644 --- a/unicast_client.h +++ b/unicast_client.h @@ -93,4 +93,12 @@ int unicast_client_timer(struct port *p); int unicast_client_unicast_master_table_received(struct port *p, struct ptp_message *m); +/** + * Transmit CANCEL_UNICAST_TRANSMISSION TLV to destination address. + * @param p The port in question. + * @param dst The destination address. + * @return Zero on success, non-zero otherwise. + */ +int unicast_client_tx_cancel(struct port *p, + struct unicast_master_address *dst); #endif -- 2.34.1 _______________________________________________ Linuxptp-devel mailing list Linuxptp-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxptp-devel