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