summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReyk Floeter <reyk@cvs.openbsd.org>2008-08-06 17:04:29 +0000
committerReyk Floeter <reyk@cvs.openbsd.org>2008-08-06 17:04:29 +0000
commit57c865ee2a0a50f5041a46583d3e2f791939074c (patch)
tree6e346ce4255f33af8cd3078a556d79652cc2647d
parent372faf6c60a9e4a72f255a4887f18d2d410eabe4 (diff)
fix trunk breakage that sneaked in with the lacp diff:
- don't use in-kernel IFMEDIA ioctls in lacp and remove two KASSERTs that caused reliable panics - the lacp key can be locally assigned and we don't need to query the media subtype here. - unbreak failover/loadbalance/broadcast status handling. Reported by brad@ ok deraadt@
-rw-r--r--sys/net/if_trunk.c4
-rw-r--r--sys/net/trunklacp.c22
2 files changed, 7 insertions, 19 deletions
diff --git a/sys/net/if_trunk.c b/sys/net/if_trunk.c
index e09648a8b58..2bff6485767 100644
--- a/sys/net/if_trunk.c
+++ b/sys/net/if_trunk.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_trunk.c,v 1.47 2008/07/30 10:15:35 mpf Exp $ */
+/* $OpenBSD: if_trunk.c,v 1.48 2008/08/06 17:04:28 reyk Exp $ */
/*
* Copyright (c) 2005, 2006, 2007 Reyk Floeter <reyk@openbsd.org>
@@ -599,11 +599,13 @@ trunk_port2req(struct trunk_port *tp, struct trunk_reqport *rp)
case TRUNK_PROTO_ROUNDROBIN:
case TRUNK_PROTO_LOADBALANCE:
case TRUNK_PROTO_BROADCAST:
+ rp->rp_flags = tp->tp_flags;
if (TRUNK_PORTACTIVE(tp))
rp->rp_flags |= TRUNK_PORT_ACTIVE;
break;
case TRUNK_PROTO_LACP:
+ rp->rp_flags = 0;
/* LACP has a different definition of active */
if (lacp_isactive(tp))
rp->rp_flags |= TRUNK_PORT_ACTIVE;
diff --git a/sys/net/trunklacp.c b/sys/net/trunklacp.c
index 92fe9f2fde9..f79146a726b 100644
--- a/sys/net/trunklacp.c
+++ b/sys/net/trunklacp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: trunklacp.c,v 1.2 2008/06/15 19:00:57 mpf Exp $ */
+/* $OpenBSD: trunklacp.c,v 1.3 2008/08/06 17:04:28 reyk Exp $ */
/* $NetBSD: ieee8023ad_lacp.c,v 1.3 2005/12/11 12:24:54 christos Exp $ */
/* $FreeBSD:ieee8023ad_lacp.c,v 1.15 2008/03/16 19:25:30 thompsa Exp $ */
@@ -514,7 +514,6 @@ lacp_port_create(struct trunk_port *tp)
struct lacp_port *lp;
struct ifnet *ifp = tp->tp_if;
struct ifreq ifr;
- struct ifmediareq ifmr;
int error;
int active = 1; /* XXX should be configurable */
@@ -552,11 +551,6 @@ lacp_port_create(struct trunk_port *tp)
lp->lp_aggregator = NULL;
lacp_sm_rx_set_expired(lp);
- bzero((char *)&ifmr, sizeof(ifmr));
- error = (*ifp->if_ioctl)(ifp, SIOCGIFMEDIA, (caddr_t)&ifmr);
- if (error == 0)
- lp->lp_media = ifmr.ifm_active;
-
lacp_linkstate(tp);
return (0);
@@ -870,7 +864,6 @@ lacp_aggregator_bandwidth(struct lacp_aggregator *la)
}
speed = lp->lp_ifp->if_baudrate;
- speed = ifmedia_baudrate(lp->lp_media);
speed *= la->la_nports;
if (speed == 0) {
LACP_DPRINTF((lp, "speed 0? media=0x%x nports=%d\n",
@@ -987,7 +980,6 @@ lacp_compose_key(struct lacp_port *lp)
{
struct trunk_port *tp = lp->lp_trunk;
struct trunk_softc *sc = tp->tp_trunk;
- u_int media = lp->lp_media;
u_int16_t key;
if ((lp->lp_state & LACP_STATE_AGGREGATION) == 0) {
@@ -1003,16 +995,10 @@ lacp_compose_key(struct lacp_port *lp)
/* bit 15: 1 */
key |= 0x8000;
} else {
- u_int subtype = IFM_SUBTYPE(media);
-
- KASSERT(IFM_TYPE(media) == IFM_ETHER);
- KASSERT((media & IFM_FDX) != 0);
-
- /* bit 0..4: IFM_SUBTYPE */
- key = subtype;
- /* bit 5..14: (some bits of) if_index of trunk device */
- key |= 0x7fe0 & ((sc->tr_ac.ac_if.if_index) << 5);
+ /* bit 0..14: (some bits of) if_index of trunk device */
+ key = sc->tr_ac.ac_if.if_index;
/* bit 15: 0 */
+ key &= ~0x8000;
}
return (htons(key));
}