Re: FreeBSD LAG LACP timeout tunable through IOCTL
Lakshmi Narasimhan Sundararajan
lakshmi.n at msystechnologies.com
Mon Aug 3 10:59:58 UTC 2015
Hi Ravi,
Addressed below review comments.
1. Added code changes for ifconfig utility
2. Updated the manual page
3. Added lock while traversing lacp port
4. Captured (HOW-TO) toggling the lacp_timeout option
Test logs and diffs follow. The changes have been compiled/loaded and sanity tested on 11-CURRENT.
Please do let me know if there are any other concerns on the below changes.
Test Logs:
<< Usage: ifconfig lagg{0..n} [-]lacp_timeout >>
root at mau-da-27-4-1:~ # ./ifconfig lagg0 lacp_timeout
root at mau-da-27-4-1:~ # ./ifconfig -v lagg0
lagg0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 9000
options=6407bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,TSO6,LRO,VLAN_HWTSO,RXCSUM_IPV6,TXCSUM_IPV6>
ether 68:05:ca:2f:77:10
groups: lagg
laggproto lacp lagghash l2,l3,l4
lagg options:
flags=91<USE_FLOWID,LACP_STRICT>
flowid_shift: 16
lagg statistics:
active ports: 4
flapping: 0
lag id: [(8000,68-05-CA-2F-77-10,0112,0000,0000),
(8000,00-01-E8-8B-8A-AD,0014,0000,0000)]
laggport: ixl0 flags=1c<ACTIVE,COLLECTING,DISTRIBUTING> state=3f<ACTIVITY,TIMEOUT,AGGREGATION,SYNC,COLLECTING,DISTRIBUTING>
[(8000,68-05-CA-2F-77-10,0112,8000,0001),
(8000,00-01-E8-8B-8A-AD,0014,8000,008A)]
laggport: ixl1 flags=1c<ACTIVE,COLLECTING,DISTRIBUTING> state=3f<ACTIVITY,TIMEOUT,AGGREGATION,SYNC,COLLECTING,DISTRIBUTING>
[(8000,68-05-CA-2F-77-10,0112,8000,0002),
(8000,00-01-E8-8B-8A-AD,0014,8000,008B)]
laggport: ixl2 flags=1c<ACTIVE,COLLECTING,DISTRIBUTING> state=3f<ACTIVITY,TIMEOUT,AGGREGATION,SYNC,COLLECTING,DISTRIBUTING>
[(8000,68-05-CA-2F-77-10,0112,8000,0003),
(8000,00-01-E8-8B-8A-AD,0014,8000,008C)]
laggport: ixl3 flags=1c<ACTIVE,COLLECTING,DISTRIBUTING> state=3f<ACTIVITY,TIMEOUT,AGGREGATION,SYNC,COLLECTING,DISTRIBUTING>
[(8000,68-05-CA-2F-77-10,0112,8000,0004),
(8000,00-01-E8-8B-8A-AD,0014,8000,008D)]
root at mau-da-27-4-1:~ # ./ifconfig lagg0 -lacp_timeout
root at mau-da-27-4-1:~ # ./ifconfig -v lagg0
lagg0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 9000
options=6407bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,TSO6,LRO,VLAN_HWTSO,RXCSUM_IPV6,TXCSUM_IPV6>
ether 68:05:ca:2f:77:10
groups: lagg
laggproto lacp lagghash l2,l3,l4
lagg options:
flags=11<USE_FLOWID,LACP_STRICT>
flowid_shift: 16
lagg statistics:
active ports: 4
flapping: 0
lag id: [(8000,68-05-CA-2F-77-10,0112,0000,0000),
(8000,00-01-E8-8B-8A-AD,0014,0000,0000)]
laggport: ixl0 flags=1c<ACTIVE,COLLECTING,DISTRIBUTING> state=3d<ACTIVITY,AGGREGATION,SYNC,COLLECTING,DISTRIBUTING>
[(8000,68-05-CA-2F-77-10,0112,8000,0001),
(8000,00-01-E8-8B-8A-AD,0014,8000,008A)]
laggport: ixl1 flags=1c<ACTIVE,COLLECTING,DISTRIBUTING> state=3d<ACTIVITY,AGGREGATION,SYNC,COLLECTING,DISTRIBUTING>
[(8000,68-05-CA-2F-77-10,0112,8000,0002),
(8000,00-01-E8-8B-8A-AD,0014,8000,008B)]
laggport: ixl2 flags=1c<ACTIVE,COLLECTING,DISTRIBUTING> state=3d<ACTIVITY,AGGREGATION,SYNC,COLLECTING,DISTRIBUTING>
[(8000,68-05-CA-2F-77-10,0112,8000,0003),
(8000,00-01-E8-8B-8A-AD,0014,8000,008C)]
laggport: ixl3 flags=1c<ACTIVE,COLLECTING,DISTRIBUTING> state=3d<ACTIVITY,AGGREGATION,SYNC,COLLECTING,DISTRIBUTING>
[(8000,68-05-CA-2F-77-10,0112,8000,0004),
(8000,00-01-E8-8B-8A-AD,0014,8000,008D)]
root at mau-da-27-4-1:~ #
<< man page output >>
[lakshmis at mau-bsd-10a /usr0/lakshmis/hol/sbin/ifconfig]$ man ./ifconfig.8
---
---
lacp_timeout
Enable lacp fast-timeout on the interface
-lacp_timeout
Disable lacp fast-timeout on the interface
<< end >>
Diffs:
Index: sbin/ifconfig/ifconfig.8
===================================================================
--- sbin/ifconfig/ifconfig.8 (revision 286151)
+++ sbin/ifconfig/ifconfig.8 (working copy)
@@ -2396,6 +2396,10 @@
Set a shift parameter for RSS local hash computation.
Hash is calculated by using flowid bits in a packet header mbuf
which are shifted by the number of this parameter.
+.It Cm lacp_timeout
+Enable lacp fast-timeout on the interface
+.It Cm -lacp_timeout
+Disable lacp fast-timeout on the interface
.El
.Pp
The following parameters are specific to IP tunnel interfaces,
Index: sbin/ifconfig/iflagg.c
===================================================================
--- sbin/ifconfig/iflagg.c (revision 286151)
+++ sbin/ifconfig/iflagg.c (working copy)
@@ -115,6 +115,8 @@
case -LAGG_OPT_LACP_TXTEST:
case LAGG_OPT_LACP_RXTEST:
case -LAGG_OPT_LACP_RXTEST:
+ case LAGG_OPT_LACP_TIMEOUT:
+ case -LAGG_OPT_LACP_TIMEOUT:
break;
default:
err(1, "Invalid lagg option");
@@ -293,6 +295,8 @@
DEF_CMD("-lacp_txtest", -LAGG_OPT_LACP_TXTEST, setlaggsetopt),
DEF_CMD("lacp_rxtest", LAGG_OPT_LACP_RXTEST, setlaggsetopt),
DEF_CMD("-lacp_rxtest", -LAGG_OPT_LACP_RXTEST, setlaggsetopt),
+ DEF_CMD("lacp_timeout", LAGG_OPT_LACP_TIMEOUT, setlaggsetopt),
+ DEF_CMD("-lacp_timeout", -LAGG_OPT_LACP_TIMEOUT, setlaggsetopt),
DEF_CMD_ARG("flowid_shift", setlaggflowidshift),
};
static struct afswtch af_lagg = {
Index: sys/net/ieee8023ad_lacp.c
===================================================================
--- sys/net/ieee8023ad_lacp.c (revision 286151)
+++ sys/net/ieee8023ad_lacp.c (working copy)
@@ -522,7 +522,7 @@
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 */
link_init_sdl(ifp, (struct sockaddr *)&sdl, IFT_ETHER);
sdl.sdl_alen = ETHER_ADDR_LEN;
Index: sys/net/ieee8023ad_lacp.h
===================================================================
--- sys/net/ieee8023ad_lacp.h (revision 286151)
+++ sys/net/ieee8023ad_lacp.h (working copy)
@@ -251,6 +251,7 @@
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
Index: sys/net/if_lagg.c
===================================================================
--- sys/net/if_lagg.c (revision 286151)
+++ sys/net/if_lagg.c (working copy)
@@ -1257,6 +1257,8 @@
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 {
@@ -1292,6 +1294,8 @@
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:
@@ -1320,6 +1324,7 @@
sc->sc_opts &= ~ro->ro_opts;
} else {
struct lacp_softc *lsc;
+ struct lacp_port *lp;
lsc = (struct lacp_softc *)sc->sc_psc;
@@ -1342,6 +1347,20 @@
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;
}
}
LAGG_WUNLOCK(sc);
Index: sys/net/if_lagg.h
===================================================================
--- sys/net/if_lagg.h (revision 286151)
+++ sys/net/if_lagg.h (working copy)
@@ -150,6 +150,7 @@
#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 */
Thanks,
LN
MSYS Technologies
From: Pokala, Ravi
Sent: Saturday, July 25, 2015 12:53 AM
To: Sundararajan, Lakshmi, freebsd-net at freebsd.org
Cc: panasas-network at msystechnologies.com, Lewis, Fred, 'Tallam, Sreen'
Hi LN,
You also need to teach `ifconfig' how to toggle this new setting. See
sbin/ifconfig/iflagg.c:lagg_cmds[]
and how the other LACP options are handled. (Thanks to Genesys on #bsdcode
for pointing that out.)
Also, please confirm that you don't need to do any locking to walk the
list or modify any of the list elements.
Thanks,
Ravi
-----Original Message-----
From: Lakshmi Narasimhan Sundararajan <lakshmi.n at msystechnologies.com>
Date: 2015-07-23, Thursday at 05:25
To: "freebsd-net at freebsd.org" <freebsd-net at freebsd.org>
Cc: "panasas-network at msystechnologies.com"
<panasas-network at msystechnologies.com>, "Lewis, Fred"
<flewis at panasas.com>, Ravi Pokala <rpokala at panasas.com>, "Tallam, Sreen"
<sreen at panasas.com>
Subject: FreeBSD LAG LACP timeout tunable through IOCTL
>Hi FreeBSD team,
>In FreeBSD-10 and in Current, by default LACP supports only long timeout.
>FreeBSD does not provide the way to configure LACP timeout period.
>We made code changes for LACP Fast-timeout (Using IOCTL, both GET / SET)
>on FreeBSD-11.
>
>And we were able to successfully test the operation using IOCtl calls
>from userland.
>
>
>Initially we wanted to use sysctl, but found in FreeBSD revision history,
>that sysctl in LAG results in LOR and has to be converted to IOCTL.
>Please let us know your comments to take this forward.
>
>
>
>
>Diffs inline:
>Index: sys/net/ieee8023ad_lacp.h
>===================================================================
>--- sys/net/ieee8023ad_lacp.h (revision 285195)
>+++ sys/net/ieee8023ad_lacp.h (working copy)
>@@ -251,6 +251,7 @@
> u_int32_t lsc_tx_test;
> } lsc_debug;
> u_int32_t lsc_strict_mode;
>+ u_int32_t lsc_fast_timeout; /* if set, fast / short timeout */
> };
>
> #define LACP_TYPE_ACTORINFO 1
>Index: sys/net/if_lagg.c
>===================================================================
>--- sys/net/if_lagg.c (revision 285195)
>+++ sys/net/if_lagg.c (working copy)
>@@ -1257,6 +1257,8 @@
> 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 {
>@@ -1292,6 +1294,8 @@
> 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:
>@@ -1320,6 +1324,7 @@
> sc->sc_opts &= ~ro->ro_opts;
> } else {
> struct lacp_softc *lsc;
>+ struct lacp_port *lp;
>
> lsc = (struct lacp_softc *)sc->sc_psc;
>
>@@ -1342,6 +1347,16 @@
> case -LAGG_OPT_LACP_STRICT:
> lsc->lsc_strict_mode = 0;
> break;
>+ case LAGG_OPT_LACP_TIMEOUT:
>+ LIST_FOREACH(lp, &lsc->lsc_ports, lp_next)
>+ lp->lp_state |= LACP_STATE_TIMEOUT;
>+ lsc->lsc_fast_timeout = 1;
>+ break;
>+ case -LAGG_OPT_LACP_TIMEOUT:
>+ LIST_FOREACH(lp, &lsc->lsc_ports, lp_next)
>+ lp->lp_state &= ~LACP_STATE_TIMEOUT;
>+ lsc->lsc_fast_timeout = 0;
>+ break;
> }
> }
> LAGG_WUNLOCK(sc);
>Index: sys/net/if_lagg.h
>===================================================================
>--- sys/net/if_lagg.h (revision 285195)
>+++ sys/net/if_lagg.h (working copy)
>@@ -150,6 +150,7 @@
> #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 Fast timeout */
> u_int ro_count; /* number of ports */
> u_int ro_active; /* active port count */
> u_int ro_flapping; /* number of flapping */
>
>
>Thanks,
>LN
>
>
>MSYS Technologies
>
>
>
More information about the freebsd-net
mailing list