|
@@ -769,18 +769,21 @@ static void fcoe_ctlr_recv_adv(struct fcoe_ctlr *fip, struct sk_buff *skb)
|
|
|
list_add(&fcf->list, &fip->fcfs);
|
|
|
} else {
|
|
|
/*
|
|
|
- * Flags in advertisements are ignored once the FCF is
|
|
|
- * selected. Flags in unsolicited advertisements are
|
|
|
- * ignored after a usable solicited advertisement
|
|
|
- * has been received.
|
|
|
+ * Update the FCF's keep-alive descriptor flags.
|
|
|
+ * Other flag changes from new advertisements are
|
|
|
+ * ignored after a solicited advertisement is
|
|
|
+ * received and the FCF is selectable (usable).
|
|
|
*/
|
|
|
+ fcf->fd_flags = new.fd_flags;
|
|
|
+ if (!fcoe_ctlr_fcf_usable(fcf))
|
|
|
+ fcf->flags = new.flags;
|
|
|
+
|
|
|
if (fcf == fip->sel_fcf && !fcf->fd_flags) {
|
|
|
fip->ctlr_ka_time -= fcf->fka_period;
|
|
|
fip->ctlr_ka_time += new.fka_period;
|
|
|
if (time_before(fip->ctlr_ka_time, fip->timer.expires))
|
|
|
mod_timer(&fip->timer, fip->ctlr_ka_time);
|
|
|
- } else if (!fcoe_ctlr_fcf_usable(fcf))
|
|
|
- fcf->flags = new.flags;
|
|
|
+ }
|
|
|
fcf->fka_period = new.fka_period;
|
|
|
memcpy(fcf->fcf_mac, new.fcf_mac, ETH_ALEN);
|
|
|
}
|