diff options
author | thompsa <thompsa@FreeBSD.org> | 2007-05-03 08:56:20 +0000 |
---|---|---|
committer | thompsa <thompsa@FreeBSD.org> | 2007-05-03 08:56:20 +0000 |
commit | a6c25cdbc7b457ea7fdd75effeb107a4fbd1091a (patch) | |
tree | 06e3c98aa9cb7b55f335ec2b9c025aa34854be3e /sys/net/ieee8023ad_lacp.c | |
parent | 372e0ffbebe4ed301da3904e9a19b9eda8405ec2 (diff) | |
download | FreeBSD-src-a6c25cdbc7b457ea7fdd75effeb107a4fbd1091a.zip FreeBSD-src-a6c25cdbc7b457ea7fdd75effeb107a4fbd1091a.tar.gz |
- Add a disabled state for ports that can not be aggregated
- Refine check for lacp links, set to disabled if not suitable
Diffstat (limited to 'sys/net/ieee8023ad_lacp.c')
-rw-r--r-- | sys/net/ieee8023ad_lacp.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/sys/net/ieee8023ad_lacp.c b/sys/net/ieee8023ad_lacp.c index 83b071b..68d8d40 100644 --- a/sys/net/ieee8023ad_lacp.c +++ b/sys/net/ieee8023ad_lacp.c @@ -368,12 +368,19 @@ lacp_linkstate(struct lagg_port *lgp) return; media = ifmr.ifm_active; - LACP_DPRINTF((lp, "media changed 0x%x -> 0x%x\n", lp->lp_media, media)); + LACP_DPRINTF((lp, "media changed 0x%x -> 0x%x, ether = %d, fdx = %d, " + "link = %d\n", lp->lp_media, media, IFM_TYPE(media) == IFM_ETHER, + (media & IFM_FDX) != 0, ifp->if_link_state == LINK_STATE_UP)); old_state = lp->lp_state; old_key = lp->lp_key; lp->lp_media = media; - if ((media & IFM_FDX) == 0 || ifp->if_link_state == LINK_STATE_DOWN) { + /* + * If the port is not an active full duplex Ethernet link then it can + * not be aggregated. + */ + if (IFM_TYPE(media) != IFM_ETHER || (media & IFM_FDX) == 0 || + ifp->if_link_state != LINK_STATE_UP) { lacp_port_disable(lp); } else { lacp_port_enable(lp); @@ -477,6 +484,7 @@ lacp_port_destroy(struct lagg_port *lgp) lacp_disable_collecting(lp); lacp_disable_distributing(lp); lacp_unselect(lp); + lgp->lp_flags &= ~LAGG_PORT_DISABLED; bzero((char *)&sdl, sizeof(sdl)); sdl.sdl_len = sizeof(sdl); @@ -848,8 +856,6 @@ lacp_compose_key(struct lacp_port *lp) u_int media = lp->lp_media; uint16_t key; - KASSERT(IFM_TYPE(media) == IFM_ETHER, ("invalid interface type")); - if ((lp->lp_state & LACP_STATE_AGGREGATION) == 0) { /* @@ -865,7 +871,8 @@ lacp_compose_key(struct lacp_port *lp) } else { u_int subtype = IFM_SUBTYPE(media); - KASSERT((media & IFM_HDX) == 0, ("aggregating HDX interface")); + KASSERT(IFM_TYPE(media) == IFM_ETHER, ("invalid media type")); + KASSERT((media & IFM_FDX) != 0, ("aggregating HDX interface")); /* bit 0..4: IFM_SUBTYPE */ key = subtype; @@ -1011,12 +1018,17 @@ lacp_peerinfo_is_compatible(const struct lacp_peerinfo *a, static void lacp_port_enable(struct lacp_port *lp) { + struct lagg_port *lgp = lp->lp_lagg; + lp->lp_state |= LACP_STATE_AGGREGATION; + lgp->lp_flags &= ~LAGG_PORT_DISABLED; } static void lacp_port_disable(struct lacp_port *lp) { + struct lagg_port *lgp = lp->lp_lagg; + lacp_set_mux(lp, LACP_MUX_DETACHED); lp->lp_state &= ~LACP_STATE_AGGREGATION; @@ -1024,6 +1036,7 @@ lacp_port_disable(struct lacp_port *lp) lacp_sm_rx_record_default(lp); lp->lp_partner.lip_state &= ~LACP_STATE_AGGREGATION; lp->lp_state &= ~LACP_STATE_EXPIRED; + lgp->lp_flags |= LAGG_PORT_DISABLED; } /* |