From: Vincent Cheng <[email protected]>
Signed-off-by: Vincent Cheng <[email protected]>
---
port.c | 28 +++++++++++++++++++++++++++-
1 file changed, 27 insertions(+), 1 deletion(-)
diff --git a/port.c b/port.c
index f2b666c..0169161 100644
--- a/port.c
+++ b/port.c
@@ -167,6 +167,27 @@ static int msg_source_equal(struct ptp_message *m1, struct
foreign_clock *fc)
return 0 == memcmp(id1, id2, sizeof(*id1));
}
+static int port_unicast_message_valid(struct port *p, struct ptp_message *m)
+{
+ struct unicast_master_address master;
+
+ if (!unicast_client_unicast_master_table_received(p, m)) {
+ memset(&master, 0, sizeof(master));
+ master.address = m->address;
+ master.portIdentity = m->header.sourcePortIdentity;
+
+ pr_warning("%s: new foreign master %s not in unicast master
table",
+ p->log_name, pid2str(&m->header.sourcePortIdentity));
+
+ if (unicast_client_tx_cancel(p, &master)) {
+ pr_warning("%s: cancel unicast transmission to %s
failed",
+ p->log_name,
pid2str(&m->header.sourcePortIdentity));
+ }
+ return 0;
+ }
+ return 1;
+}
+
int source_pid_eq(struct ptp_message *m1, struct ptp_message *m2)
{
return pid_eq(&m1->header.sourcePortIdentity,
@@ -351,8 +372,13 @@ static int add_foreign_master(struct port *p, struct
ptp_message *m)
}
}
if (!fc) {
+ if (unicast_client_enabled(p)) {
+ if (!port_unicast_message_valid(p, m)) {
+ return 0;
+ }
+ }
pr_notice("%s: new foreign master %s", p->log_name,
- pid2str(&m->header.sourcePortIdentity));
+ pid2str(&m->header.sourcePortIdentity));
fc = malloc(sizeof(*fc));
if (!fc) {
--
2.34.1
_______________________________________________
Linuxptp-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel