summaryrefslogtreecommitdiffstats
path: root/sys/net
diff options
context:
space:
mode:
authorhiren <hiren@FreeBSD.org>2015-09-15 05:19:10 +0000
committerhiren <hiren@FreeBSD.org>2015-09-15 05:19:10 +0000
commitc6c0cd45579f43f207e8e2947ad33106d634728a (patch)
tree9ba814221adfa983b40c02dee7a4b22582335d18 /sys/net
parenta6f66e44deebac6adc1fdb2f3abb6f0afbbc38de (diff)
downloadFreeBSD-src-c6c0cd45579f43f207e8e2947ad33106d634728a.zip
FreeBSD-src-c6c0cd45579f43f207e8e2947ad33106d634728a.tar.gz
MFC r286700
Make LAG LACP fast timeout tunable through IOCTL.
Diffstat (limited to 'sys/net')
-rw-r--r--sys/net/ieee8023ad_lacp.c2
-rw-r--r--sys/net/ieee8023ad_lacp.h1
-rw-r--r--sys/net/if_lagg.c19
-rw-r--r--sys/net/if_lagg.h1
4 files changed, 22 insertions, 1 deletions
diff --git a/sys/net/ieee8023ad_lacp.c b/sys/net/ieee8023ad_lacp.c
index 3a0de01..361f592 100644
--- a/sys/net/ieee8023ad_lacp.c
+++ b/sys/net/ieee8023ad_lacp.c
@@ -519,7 +519,7 @@ lacp_port_create(struct lagg_port *lgp)
int error;
boolean_t active = TRUE; /* XXX should be configurable */
- boolean_t fast = FALSE; /* XXX should be configurable */
+ boolean_t fast = FALSE; /* Configurable via ioctl */
bzero((char *)&sdl, sizeof(sdl));
sdl.sdl_len = sizeof(sdl);
diff --git a/sys/net/ieee8023ad_lacp.h b/sys/net/ieee8023ad_lacp.h
index 6dbdb95..1573c0b 100644
--- a/sys/net/ieee8023ad_lacp.h
+++ b/sys/net/ieee8023ad_lacp.h
@@ -251,6 +251,7 @@ struct lacp_softc {
u_int32_t lsc_tx_test;
} lsc_debug;
u_int32_t lsc_strict_mode;
+ boolean_t lsc_fast_timeout; /* if set, fast timeout */
};
#define LACP_TYPE_ACTORINFO 1
diff --git a/sys/net/if_lagg.c b/sys/net/if_lagg.c
index d62f148..a690794 100644
--- a/sys/net/if_lagg.c
+++ b/sys/net/if_lagg.c
@@ -1081,6 +1081,8 @@ lagg_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
ro->ro_opts |= LAGG_OPT_LACP_RXTEST;
if (lsc->lsc_strict_mode != 0)
ro->ro_opts |= LAGG_OPT_LACP_STRICT;
+ if (lsc->lsc_fast_timeout != 0)
+ ro->ro_opts |= LAGG_OPT_LACP_TIMEOUT;
ro->ro_active = sc->sc_active;
} else {
@@ -1116,6 +1118,8 @@ lagg_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
case -LAGG_OPT_LACP_RXTEST:
case LAGG_OPT_LACP_STRICT:
case -LAGG_OPT_LACP_STRICT:
+ case LAGG_OPT_LACP_TIMEOUT:
+ case -LAGG_OPT_LACP_TIMEOUT:
valid = lacp = 1;
break;
default:
@@ -1144,6 +1148,7 @@ lagg_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
sc->sc_opts &= ~ro->ro_opts;
} else {
struct lacp_softc *lsc;
+ struct lacp_port *lp;
lsc = (struct lacp_softc *)sc->sc_psc;
@@ -1166,6 +1171,20 @@ lagg_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
case -LAGG_OPT_LACP_STRICT:
lsc->lsc_strict_mode = 0;
break;
+ case LAGG_OPT_LACP_TIMEOUT:
+ LACP_LOCK(lsc);
+ LIST_FOREACH(lp, &lsc->lsc_ports, lp_next)
+ lp->lp_state |= LACP_STATE_TIMEOUT;
+ LACP_UNLOCK(lsc);
+ lsc->lsc_fast_timeout = 1;
+ break;
+ case -LAGG_OPT_LACP_TIMEOUT:
+ LACP_LOCK(lsc);
+ LIST_FOREACH(lp, &lsc->lsc_ports, lp_next)
+ lp->lp_state &= ~LACP_STATE_TIMEOUT;
+ LACP_UNLOCK(lsc);
+ lsc->lsc_fast_timeout = 0;
+ break;
}
}
proto->ti_attach(sc);
diff --git a/sys/net/if_lagg.h b/sys/net/if_lagg.h
index 34f5f6e..ac01032 100644
--- a/sys/net/if_lagg.h
+++ b/sys/net/if_lagg.h
@@ -148,6 +148,7 @@ struct lagg_reqopts {
#define LAGG_OPT_LACP_STRICT 0x10 /* LACP strict mode */
#define LAGG_OPT_LACP_TXTEST 0x20 /* LACP debug: txtest */
#define LAGG_OPT_LACP_RXTEST 0x40 /* LACP debug: rxtest */
+#define LAGG_OPT_LACP_TIMEOUT 0x80 /* LACP timeout */
u_int ro_count; /* number of ports */
u_int ro_active; /* active port count */
u_int ro_flapping; /* number of flapping */
OpenPOWER on IntegriCloud