Explicitly detect and handle changes of the peer's port id by resetting asCapable and the port's nrate
This patch also changes port_capable() to reset the port's nrate every time asCapable changes from true to false. Signed-off-by: Delio Brignoli <dbrignoli@audioscience.com>master
parent
9650cb687d
commit
d374ad6bf7
44
port.c
44
port.c
|
@ -60,6 +60,8 @@ struct port {
|
||||||
struct ptp_message *peer_delay_req;
|
struct ptp_message *peer_delay_req;
|
||||||
struct ptp_message *peer_delay_resp;
|
struct ptp_message *peer_delay_resp;
|
||||||
struct ptp_message *peer_delay_fup;
|
struct ptp_message *peer_delay_fup;
|
||||||
|
int peer_portid_valid;
|
||||||
|
struct PortIdentity peer_portid;
|
||||||
struct {
|
struct {
|
||||||
UInteger16 announce;
|
UInteger16 announce;
|
||||||
UInteger16 delayreq;
|
UInteger16 delayreq;
|
||||||
|
@ -96,6 +98,7 @@ struct port {
|
||||||
|
|
||||||
static int port_capable(struct port *p);
|
static int port_capable(struct port *p);
|
||||||
static int port_is_ieee8021as(struct port *p);
|
static int port_is_ieee8021as(struct port *p);
|
||||||
|
static void port_nrate_initialize(struct port *p);
|
||||||
|
|
||||||
static int announce_compare(struct ptp_message *m1, struct ptp_message *m2)
|
static int announce_compare(struct ptp_message *m1, struct ptp_message *m2)
|
||||||
{
|
{
|
||||||
|
@ -399,6 +402,13 @@ static int port_capable(struct port *p)
|
||||||
goto not_capable;
|
goto not_capable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!p->peer_portid_valid) {
|
||||||
|
if (p->asCapable)
|
||||||
|
pr_debug("port %hu: invalid peer port id, "
|
||||||
|
"resetting asCapable", portnum(p));
|
||||||
|
goto not_capable;
|
||||||
|
}
|
||||||
|
|
||||||
capable:
|
capable:
|
||||||
if (!p->asCapable)
|
if (!p->asCapable)
|
||||||
pr_debug("port %hu: setting asCapable", portnum(p));
|
pr_debug("port %hu: setting asCapable", portnum(p));
|
||||||
|
@ -406,6 +416,8 @@ capable:
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
not_capable:
|
not_capable:
|
||||||
|
if (p->asCapable)
|
||||||
|
port_nrate_initialize(p);
|
||||||
p->asCapable = 0;
|
p->asCapable = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -698,6 +710,8 @@ static void port_nrate_initialize(struct port *p)
|
||||||
p->pdr_missing = ALLOWED_LOST_RESPONSES + 1;
|
p->pdr_missing = ALLOWED_LOST_RESPONSES + 1;
|
||||||
p->asCapable = 0;
|
p->asCapable = 0;
|
||||||
|
|
||||||
|
p->peer_portid_valid = 0;
|
||||||
|
|
||||||
p->nrate.origin1 = tmv_zero();
|
p->nrate.origin1 = tmv_zero();
|
||||||
p->nrate.ingress1 = tmv_zero();
|
p->nrate.ingress1 = tmv_zero();
|
||||||
p->nrate.max_count = (1 << shift);
|
p->nrate.max_count = (1 << shift);
|
||||||
|
@ -1363,6 +1377,21 @@ static int process_pdelay_req(struct port *p, struct ptp_message *m)
|
||||||
pr_info("port %hu: peer detected, switch to P2P", portnum(p));
|
pr_info("port %hu: peer detected, switch to P2P", portnum(p));
|
||||||
p->delayMechanism = DM_P2P;
|
p->delayMechanism = DM_P2P;
|
||||||
}
|
}
|
||||||
|
if (p->peer_portid_valid) {
|
||||||
|
if (!pid_eq(&p->peer_portid, &m->header.sourcePortIdentity)) {
|
||||||
|
pr_err("port %hu: received pdelay_req msg with "
|
||||||
|
"unexpected peer port id %s",
|
||||||
|
portnum(p),
|
||||||
|
pid2str(&m->header.sourcePortIdentity));
|
||||||
|
p->peer_portid_valid = 0;
|
||||||
|
port_capable(p);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
p->peer_portid_valid = 1;
|
||||||
|
p->peer_portid = m->header.sourcePortIdentity;
|
||||||
|
pr_debug("port %hu: peer port id set to %s", portnum(p),
|
||||||
|
pid2str(&p->peer_portid));
|
||||||
|
}
|
||||||
|
|
||||||
rsp = msg_allocate();
|
rsp = msg_allocate();
|
||||||
if (!rsp)
|
if (!rsp)
|
||||||
|
@ -1526,6 +1555,21 @@ static int process_pdelay_resp(struct port *p, struct ptp_message *m)
|
||||||
pr_err("port %hu: rogue peer delay response", portnum(p));
|
pr_err("port %hu: rogue peer delay response", portnum(p));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if (p->peer_portid_valid) {
|
||||||
|
if (!pid_eq(&p->peer_portid, &m->header.sourcePortIdentity)) {
|
||||||
|
pr_err("port %hu: received pdelay_resp msg with "
|
||||||
|
"unexpected peer port id %s",
|
||||||
|
portnum(p),
|
||||||
|
pid2str(&m->header.sourcePortIdentity));
|
||||||
|
p->peer_portid_valid = 0;
|
||||||
|
port_capable(p);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
p->peer_portid_valid = 1;
|
||||||
|
p->peer_portid = m->header.sourcePortIdentity;
|
||||||
|
pr_debug("port %hu: peer port id set to %s", portnum(p),
|
||||||
|
pid2str(&p->peer_portid));
|
||||||
|
}
|
||||||
|
|
||||||
if (p->peer_delay_resp) {
|
if (p->peer_delay_resp) {
|
||||||
msg_put(p->peer_delay_resp);
|
msg_put(p->peer_delay_resp);
|
||||||
|
|
Loading…
Reference in New Issue