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
Hangbin Liu 2017-10-09 22:31:44 +08:00 committed by Richard Cochran
parent 6d1e2a62bd
commit b65b1d5f3b
1 changed files with 24 additions and 10 deletions

34
port.c
View File

@ -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)