summaryrefslogtreecommitdiffstats
path: root/sys/net
diff options
context:
space:
mode:
authorthompsa <thompsa@FreeBSD.org>2007-05-03 08:56:20 +0000
committerthompsa <thompsa@FreeBSD.org>2007-05-03 08:56:20 +0000
commita6c25cdbc7b457ea7fdd75effeb107a4fbd1091a (patch)
tree06e3c98aa9cb7b55f335ec2b9c025aa34854be3e /sys/net
parent372e0ffbebe4ed301da3904e9a19b9eda8405ec2 (diff)
downloadFreeBSD-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.c23
-rw-r--r--sys/net/if_lagg.c1
-rw-r--r--sys/net/if_lagg.h3
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 */
OpenPOWER on IntegriCloud