Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F103269638
D540.id12487.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D540.id12487.diff
View Options
Index: sbin/ifconfig/iflagg.c
===================================================================
--- sbin/ifconfig/iflagg.c
+++ sbin/ifconfig/iflagg.c
@@ -100,6 +100,19 @@
}
static void
+setlaggrr_limit(const char *val, int d, int s, const struct afswtch *afp)
+{
+ struct lagg_reqopts ro;
+
+ bzero(&ro, sizeof(ro));
+ strlcpy(ro.ro_ifname, name, sizeof(ro.ro_ifname));
+ ro.ro_bkt = (int)strtol(val, NULL, 10);
+
+ if (ioctl(s, SIOCSLAGGOPTS, &ro) != 0)
+ err(1, "SIOCSLAGG");
+}
+
+static void
setlaggsetopt(const char *val, int d, int s, const struct afswtch *afp)
{
struct lagg_reqopts ro;
@@ -252,6 +265,8 @@
printb("\t\tflags", ro.ro_opts, LAGG_OPT_BITS);
putchar('\n');
printf("\t\tflowid_shift: %d\n", ro.ro_flowid_shift);
+ if (ra.ra_proto == LAGG_PROTO_ROUNDROBIN)
+ printf("\t\trr_limit: %d\n", ro.ro_bkt);
printf("\tlagg statistics:\n");
printf("\t\tactive ports: %d\n", ro.ro_active);
printf("\t\tflapping: %u\n", ro.ro_flapping);
@@ -298,6 +313,7 @@
DEF_CMD("lacp_fast_timeout", LAGG_OPT_LACP_TIMEOUT, setlaggsetopt),
DEF_CMD("-lacp_fast_timeout", -LAGG_OPT_LACP_TIMEOUT, setlaggsetopt),
DEF_CMD_ARG("flowid_shift", setlaggflowidshift),
+ DEF_CMD_ARG("rr_limit", setlaggrr_limit),
};
static struct afswtch af_lagg = {
.af_name = "af_lagg",
Index: share/man/man4/lagg.4
===================================================================
--- share/man/man4/lagg.4
+++ share/man/man4/lagg.4
@@ -16,7 +16,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd November 6, 2015
+.Dd January 20, 2016
.Dt LAGG 4
.Os
.Sh NAME
@@ -110,6 +110,10 @@
Distributes outgoing traffic using a round-robin scheduler
through all active ports and accepts incoming traffic from
any active port.
+.Ic roundrobin
+mode can cause unordered packet arrival at the client.
+Throughput might be limited as the client performs CPU-intensive packet
+reordering.
.It Ic broadcast
Sends frames to all ports of the LAG and receives frames on
any port of the LAG.
@@ -161,6 +165,19 @@
192.168.1.1 netmask 255.255.255.0
.Ed
.Pp
+Create a link aggregation using ROUNDROBIN with two
+.Xr bge 4
+Gigabit Ethernet interfaces and set the limit of 500 packets
+per interface:
+.Bd -literal -offset indent
+# ifconfig bge0 up
+# ifconfig bge1 up
+# ifconfig lagg0 create
+# ifconfig lagg0 laggproto roundrobin laggport bge0 laggport bge1 \e
+ 192.168.1.1 netmask 255.255.255.0
+# ifconfig lagg0 rr_limit 500
+.Ed
+.Pp
The following example uses an active failover interface to set up roaming
between wired and wireless networks using two network devices.
Whenever the wired master interface is unplugged, the wireless failover
Index: sys/net/if_lagg.h
===================================================================
--- sys/net/if_lagg.h
+++ sys/net/if_lagg.h
@@ -153,6 +153,7 @@
u_int ro_active; /* active port count */
u_int ro_flapping; /* number of flapping */
int ro_flowid_shift; /* shift the flowid */
+ uint32_t ro_bkt; /* packet bucket for roundrobin */
};
#define SIOCGLAGGOPTS _IOWR('i', 152, struct lagg_reqopts)
@@ -243,6 +244,8 @@
struct callout sc_callout;
u_int sc_opts;
int flowid_shift; /* shift the flowid */
+ uint32_t sc_bkt; /* packates bucket for roundrobin */
+ uint32_t sc_bkt_count; /* packates bucket count for roundrobin */
struct lagg_counters detached_counters; /* detached ports sum */
};
Index: sys/net/if_lagg.c
===================================================================
--- sys/net/if_lagg.c
+++ sys/net/if_lagg.c
@@ -3,7 +3,7 @@
/*
* Copyright (c) 2005, 2006 Reyk Floeter <reyk@openbsd.org>
* Copyright (c) 2007 Andrew Thompson <thompsa@FreeBSD.org>
- * Copyright (c) 2014 Marcelo Araujo <araujo@FreeBSD.org>
+ * Copyright (c) 2014, 2016 Marcelo Araujo <araujo@FreeBSD.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -1291,10 +1291,17 @@
SLIST_FOREACH(lp, &sc->sc_ports, lp_entries)
ro->ro_active += LAGG_PORTACTIVE(lp);
}
+ ro->ro_bkt = sc->sc_bkt;
ro->ro_flapping = sc->sc_flapping;
ro->ro_flowid_shift = sc->flowid_shift;
break;
case SIOCSLAGGOPTS:
+ if (sc->sc_proto == LAGG_PROTO_ROUNDROBIN) {
+ if (ro->ro_bkt == 0)
+ sc->sc_bkt = 1; // Minimum 1 packet per iface.
+ else
+ sc->sc_bkt = ro->ro_bkt;
+ }
error = priv_check(td, PRIV_NET_LAGG);
if (error)
break;
@@ -1329,6 +1336,7 @@
}
LAGG_WLOCK(sc);
+
if (valid == 0 ||
(lacp == 1 && sc->sc_proto != LAGG_PROTO_LACP)) {
/* Invalid combination of options specified. */
@@ -1879,6 +1887,7 @@
{
sc->sc_capabilities = IFCAP_LAGG_FULLDUPLEX;
sc->sc_seq = 0;
+ sc->sc_bkt_count = sc->sc_bkt;
}
static int
@@ -1887,9 +1896,21 @@
struct lagg_port *lp;
uint32_t p;
- p = atomic_fetchadd_32(&sc->sc_seq, 1);
+ if (sc->sc_bkt_count == 0 && sc->sc_bkt > 0)
+ sc->sc_bkt_count = sc->sc_bkt;
+
+ if (sc->sc_bkt > 0) {
+ atomic_subtract_int(&sc->sc_bkt_count, 1);
+ if (atomic_cmpset_int(&sc->sc_bkt_count, 0, sc->sc_bkt))
+ p = atomic_fetchadd_32(&sc->sc_seq, 1);
+ else
+ p = sc->sc_seq;
+ } else
+ p = atomic_fetchadd_32(&sc->sc_seq, 1);
+
p %= sc->sc_count;
lp = SLIST_FIRST(&sc->sc_ports);
+
while (p--)
lp = SLIST_NEXT(lp, lp_entries);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Nov 23, 9:13 PM (15 h, 42 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14809508
Default Alt Text
D540.id12487.diff (5 KB)
Attached To
Mode
D540: Set a better granularity and distribution on roundrobin protocol.
Attached
Detach File
Event Timeline
Log In to Comment