port: update port link_status to enum
Besides link up and down, we may also receive other rtnl messages, like bond slave changed info, which link state keeps the same. So we should return EV_FAULT_CLEARED only when both LINK_UP and LINK_STATE_CHANGED. When the link state keep the same, we should return EV_NONE. Signed-off-by: Hangbin Liu <liuhangbin@gmail.com>master
parent
6d1e2a62bd
commit
b65b1d5f3b
34
port.c
34
port.c
|
@ -56,6 +56,12 @@ enum syfu_event {
|
||||||
FUP_MATCH,
|
FUP_MATCH,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum link_state {
|
||||||
|
LINK_DOWN = (1<<0),
|
||||||
|
LINK_UP = (1<<1),
|
||||||
|
LINK_STATE_CHANGED = (1<<3),
|
||||||
|
};
|
||||||
|
|
||||||
struct nrate_estimator {
|
struct nrate_estimator {
|
||||||
double ratio;
|
double ratio;
|
||||||
tmv_t origin1;
|
tmv_t origin1;
|
||||||
|
@ -122,7 +128,7 @@ struct port {
|
||||||
int path_trace_enabled;
|
int path_trace_enabled;
|
||||||
int rx_timestamp_offset;
|
int rx_timestamp_offset;
|
||||||
int tx_timestamp_offset;
|
int tx_timestamp_offset;
|
||||||
int link_status;
|
enum link_state link_status;
|
||||||
struct fault_interval flt_interval_pertype[FT_CNT];
|
struct fault_interval flt_interval_pertype[FT_CNT];
|
||||||
enum fault_type last_fault_type;
|
enum fault_type last_fault_type;
|
||||||
unsigned int versionNumber; /*UInteger4*/
|
unsigned int versionNumber; /*UInteger4*/
|
||||||
|
@ -2224,18 +2230,21 @@ void port_dispatch(struct port *p, enum fsm_event event, int mdiff)
|
||||||
static void port_link_status(void *ctx, int linkup, int ts_index)
|
static void port_link_status(void *ctx, int linkup, int ts_index)
|
||||||
{
|
{
|
||||||
struct port *p = ctx;
|
struct port *p = ctx;
|
||||||
|
int link_state;
|
||||||
|
|
||||||
if (p->link_status == linkup)
|
link_state = linkup ? LINK_UP : LINK_DOWN;
|
||||||
return;
|
if (p->link_status & link_state) {
|
||||||
|
p->link_status = link_state;
|
||||||
p->link_status = linkup;
|
} else {
|
||||||
pr_notice("port %hu: link %s", portnum(p), linkup ? "up" : "down");
|
p->link_status = link_state | LINK_STATE_CHANGED;
|
||||||
|
pr_notice("port %hu: link %s", portnum(p), linkup ? "up" : "down");
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A port going down can affect the BMCA result.
|
* A port going down can affect the BMCA result.
|
||||||
* Force a state decision event.
|
* Force a state decision event.
|
||||||
*/
|
*/
|
||||||
if (!p->link_status)
|
if (p->link_status & LINK_DOWN)
|
||||||
clock_set_sde(p->clock, 1);
|
clock_set_sde(p->clock, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2281,7 +2290,12 @@ enum fsm_event port_event(struct port *p, int fd_index)
|
||||||
case FD_RTNL:
|
case FD_RTNL:
|
||||||
pr_debug("port %hu: received link status notification", portnum(p));
|
pr_debug("port %hu: received link status notification", portnum(p));
|
||||||
rtnl_link_status(fd, p->name, port_link_status, p);
|
rtnl_link_status(fd, p->name, port_link_status, p);
|
||||||
return port_link_status_get(p) ? EV_FAULT_CLEARED : EV_FAULT_DETECTED;
|
if (p->link_status == (LINK_UP | LINK_STATE_CHANGED))
|
||||||
|
return EV_FAULT_CLEARED;
|
||||||
|
else if (p->link_status == (LINK_DOWN | LINK_STATE_CHANGED))
|
||||||
|
return EV_FAULT_DETECTED;
|
||||||
|
else
|
||||||
|
return EV_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
msg = msg_allocate();
|
msg = msg_allocate();
|
||||||
|
@ -2409,7 +2423,7 @@ int port_number(struct port *p)
|
||||||
|
|
||||||
int port_link_status_get(struct port *p)
|
int port_link_status_get(struct port *p)
|
||||||
{
|
{
|
||||||
return p->link_status;
|
return !!(p->link_status & LINK_UP);
|
||||||
}
|
}
|
||||||
|
|
||||||
int port_manage(struct port *p, struct port *ingress, struct ptp_message *msg)
|
int port_manage(struct port *p, struct port *ingress, struct ptp_message *msg)
|
||||||
|
@ -2630,7 +2644,7 @@ struct port *port_open(int phc_index,
|
||||||
p->path_trace_enabled = config_get_int(cfg, p->name, "path_trace_enabled");
|
p->path_trace_enabled = config_get_int(cfg, p->name, "path_trace_enabled");
|
||||||
p->rx_timestamp_offset = config_get_int(cfg, p->name, "ingressLatency");
|
p->rx_timestamp_offset = config_get_int(cfg, p->name, "ingressLatency");
|
||||||
p->tx_timestamp_offset = config_get_int(cfg, p->name, "egressLatency");
|
p->tx_timestamp_offset = config_get_int(cfg, p->name, "egressLatency");
|
||||||
p->link_status = 1;
|
p->link_status = LINK_UP;
|
||||||
p->clock = clock;
|
p->clock = clock;
|
||||||
p->trp = transport_create(cfg, transport);
|
p->trp = transport_create(cfg, transport);
|
||||||
if (!p->trp)
|
if (!p->trp)
|
||||||
|
|
Loading…
Reference in New Issue