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 | |
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')
-rw-r--r-- | sys/net/ieee8023ad_lacp.c | 23 | ||||
-rw-r--r-- | sys/net/if_lagg.c | 1 | ||||
-rw-r--r-- | sys/net/if_lagg.h | 3 |
3 files changed, 21 insertions, 6 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; } /* diff --git a/sys/net/if_lagg.c b/sys/net/if_lagg.c index 422377b..b6ccdbb 100644 --- a/sys/net/if_lagg.c +++ b/sys/net/if_lagg.c @@ -1028,6 +1028,7 @@ lagg_input(struct ifnet *ifp, struct mbuf *m) struct ifnet *trifp = sc->sc_ifp; if ((trifp->if_drv_flags & IFF_DRV_RUNNING) == 0 || + (lp->lp_flags & LAGG_PORT_DISABLED) || sc->sc_proto == LAGG_PROTO_NONE) { m_freem(m); return (NULL); diff --git a/sys/net/if_lagg.h b/sys/net/if_lagg.h index 716a2b7..d5a6406 100644 --- a/sys/net/if_lagg.h +++ b/sys/net/if_lagg.h @@ -36,9 +36,10 @@ #define LAGG_PORT_ACTIVE 0x00000004 /* port is active */ #define LAGG_PORT_COLLECTING 0x00000008 /* port is active */ #define LAGG_PORT_DISTRIBUTING 0x00000010 /* port is active */ +#define LAGG_PORT_DISABLED 0x00000020 /* port is disabled */ #define LAGG_PORT_GLOBAL 0x80000000 /* IOCTL: global flag */ #define LAGG_PORT_BITS "\20\01MASTER\02STACK\03ACTIVE\04COLLECTING" \ - "\05DISTRIBUTING" + "\05DISTRIBUTING\06DISABLED" /* Supported lagg PROTOs */ #define LAGG_PROTO_NONE 0 /* no lagg protocol defined */ |