Break out the static, global LACP debug options into a per-lagg unit

sysctl tree.

* Create a net.link.lagg.X.lacp node
* Add a debug node under that for tx_test and rx_test
* Add lacp_strict_mode, defaulting to 1

tx_test and rx_test are still a bitmap of unit numbers for now.
At some point it would be nice to create child nodes of the lagg bundle
for each sub-interface, and then populate those with various knobs
and statistics.

Sponsored by:	Netflix
This commit is contained in:
Adrian Chadd 2013-07-26 19:41:13 +00:00
parent 2f84c08eee
commit 49de4f2214
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=253687
4 changed files with 62 additions and 19 deletions

View File

@ -193,18 +193,6 @@ SYSCTL_INT(_net_link_lagg_lacp, OID_AUTO, debug, CTLFLAG_RW | CTLFLAG_TUN,
&lacp_debug, 0, "Enable LACP debug logging (1=debug, 2=trace)");
TUNABLE_INT("net.link.lagg.lacp.debug", &lacp_debug);
/* bitmap of ports */
static int lacp_rx_test = 0;
static int lacp_tx_test = 0;
SYSCTL_INT(_net_link_lagg_lacp, OID_AUTO, rxtest, CTLFLAG_RW, &lacp_rx_test, 0,
"RXTest");
SYSCTL_INT(_net_link_lagg_lacp, OID_AUTO, txtest, CTLFLAG_RW, &lacp_tx_test, 0,
"TXTest");
static int lacp_strict = 1;
SYSCTL_INT(_net_link_lagg_lacp, OID_AUTO, strict, CTLFLAG_RW, &lacp_strict,
0, "Strict spec compliance");
#define LACP_DPRINTF(a) if (lacp_debug & 0x01) { lacp_dprintf a ; }
#define LACP_TRACE(a) if (lacp_debug & 0x02) { lacp_dprintf(a,"%s\n",__func__); }
#define LACP_TPRINTF(a) if (lacp_debug & 0x04) { lacp_dprintf a ; }
@ -315,7 +303,7 @@ lacp_pdu_input(struct lacp_port *lp, struct mbuf *m)
lacp_dump_lacpdu(du);
}
if ((1 << lp->lp_ifp->if_dunit) & lacp_rx_test) {
if ((1 << lp->lp_ifp->if_dunit) & lp->lp_lsc->lsc_debug.lsc_rx_test) {
LACP_TPRINTF((lp, "Dropping RX PDU\n"));
goto bad;
}
@ -750,10 +738,48 @@ lacp_transit_expire(void *vp)
lsc->lsc_suppress_distributing = FALSE;
}
static void
lacp_attach_sysctl(struct lacp_softc *lsc, struct sysctl_oid *p_oid)
{
struct lagg_softc *sc = lsc->lsc_softc;
SYSCTL_ADD_UINT(&sc->ctx, SYSCTL_CHILDREN(p_oid), OID_AUTO,
"lacp_strict_mode",
CTLFLAG_RW,
&lsc->lsc_strict_mode,
lsc->lsc_strict_mode,
"Enable LACP strict mode");
}
static void
lacp_attach_sysctl_debug(struct lacp_softc *lsc, struct sysctl_oid *p_oid)
{
struct lagg_softc *sc = lsc->lsc_softc;
struct sysctl_oid *oid;
/* Create a child of the parent lagg interface */
oid = SYSCTL_ADD_NODE(&sc->ctx, SYSCTL_CHILDREN(p_oid),
OID_AUTO, "debug", CTLFLAG_RD, NULL, "DEBUG");
SYSCTL_ADD_UINT(&sc->ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
"rx_test",
CTLFLAG_RW,
&lsc->lsc_debug.lsc_rx_test,
lsc->lsc_debug.lsc_rx_test,
"Bitmap of if_dunit entries to drop RX frames for");
SYSCTL_ADD_UINT(&sc->ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
"tx_test",
CTLFLAG_RW,
&lsc->lsc_debug.lsc_tx_test,
lsc->lsc_debug.lsc_tx_test,
"Bitmap of if_dunit entries to drop TX frames for");
}
int
lacp_attach(struct lagg_softc *sc)
{
struct lacp_softc *lsc;
struct sysctl_oid *oid;
lsc = malloc(sizeof(struct lacp_softc),
M_DEVBUF, M_NOWAIT|M_ZERO);
@ -765,10 +791,19 @@ lacp_attach(struct lagg_softc *sc)
lsc->lsc_hashkey = arc4random();
lsc->lsc_active_aggregator = NULL;
lsc->lsc_strict_mode = 1;
LACP_LOCK_INIT(lsc);
TAILQ_INIT(&lsc->lsc_aggregators);
LIST_INIT(&lsc->lsc_ports);
/* Create a child of the parent lagg interface */
oid = SYSCTL_ADD_NODE(&sc->ctx, SYSCTL_CHILDREN(sc->sc_oid),
OID_AUTO, "lacp", CTLFLAG_RD, NULL, "LACP");
/* Attach sysctl nodes */
lacp_attach_sysctl(lsc, oid);
lacp_attach_sysctl_debug(lsc, oid);
callout_init_mtx(&lsc->lsc_transit_callout, &lsc->lsc_mtx, 0);
callout_init_mtx(&lsc->lsc_callout, &lsc->lsc_mtx, 0);
@ -1594,7 +1629,7 @@ lacp_sm_rx_record_pdu(struct lacp_port *lp, const struct lacpdu *du)
}
/* XXX Hack, still need to implement 5.4.9 para 2,3,4 */
if (lacp_strict)
if (lp->lp_lsc->lsc_strict_mode)
lp->lp_partner.lip_state |= LACP_STATE_SYNC;
lacp_sm_ptx_update_timeout(lp, oldpstate);
@ -1622,7 +1657,7 @@ lacp_sm_rx_record_default(struct lacp_port *lp)
LACP_TRACE(lp);
oldpstate = lp->lp_partner.lip_state;
if (lacp_strict)
if (lp->lp_lsc->lsc_strict_mode)
lp->lp_partner = lacp_partner_admin_strict;
else
lp->lp_partner = lacp_partner_admin_optimistic;;
@ -1660,7 +1695,7 @@ lacp_sm_rx_update_default_selected(struct lacp_port *lp)
LACP_TRACE(lp);
if (lacp_strict)
if (lp->lp_lsc->lsc_strict_mode)
lacp_sm_rx_update_selected_from_peerinfo(lp,
&lacp_partner_admin_strict);
else
@ -1695,10 +1730,11 @@ lacp_sm_tx(struct lacp_port *lp)
return;
}
if (((1 << lp->lp_ifp->if_dunit) & lacp_tx_test) == 0)
if (((1 << lp->lp_ifp->if_dunit) & lp->lp_lsc->lsc_debug.lsc_tx_test) == 0) {
error = lacp_xmit_lacpdu(lp);
else
} else {
LACP_TPRINTF((lp, "Dropping TX PDU\n"));
}
if (error == 0) {
lp->lp_flags &= ~LACP_PORT_NTT;

View File

@ -245,6 +245,11 @@ struct lacp_softc {
struct lacp_portmap lsc_pmap[2];
volatile u_int lsc_activemap;
u_int32_t lsc_hashkey;
struct {
u_int32_t lsc_rx_test;
u_int32_t lsc_tx_test;
} lsc_debug;
u_int32_t lsc_strict_mode;
};
#define LACP_TYPE_ACTORINFO 1

View File

@ -291,7 +291,8 @@ lagg_clone_create(struct if_clone *ifc, int unit, caddr_t params)
sysctl_ctx_init(&sc->ctx);
snprintf(num, sizeof(num), "%u", unit);
sc->use_flowid = def_use_flowid;
oid = SYSCTL_ADD_NODE(&sc->ctx, &SYSCTL_NODE_CHILDREN(_net_link, lagg),
sc->sc_oid = oid = SYSCTL_ADD_NODE(&sc->ctx,
&SYSCTL_NODE_CHILDREN(_net_link, lagg),
OID_AUTO, num, CTLFLAG_RD, NULL, "");
SYSCTL_ADD_INT(&sc->ctx, SYSCTL_CHILDREN(oid), OID_AUTO,
"use_flowid", CTLTYPE_INT|CTLFLAG_RW, &sc->use_flowid, sc->use_flowid,

View File

@ -228,6 +228,7 @@ struct lagg_softc {
eventhandler_tag vlan_detach;
struct callout sc_callout;
struct sysctl_ctx_list ctx; /* sysctl variables */
struct sysctl_oid *sc_oid; /* sysctl tree oid */
int use_flowid; /* use M_FLOWID */
};