svn commit: r272446 - in head: sbin/ifconfig sys/net
Hiroki Sato
hrs at FreeBSD.org
Thu Oct 2 20:01:15 UTC 2014
Author: hrs
Date: Thu Oct 2 20:01:13 2014
New Revision: 272446
URL: https://svnweb.freebsd.org/changeset/base/272446
Log:
Separate option handling from SIOC[SG]LAGG to SIOC[SG]LAGGOPTS for
backward compatibility with old ifconfig(8).
Modified:
head/sbin/ifconfig/iflagg.c
head/sys/net/if_lagg.c
head/sys/net/if_lagg.h
Modified: head/sbin/ifconfig/iflagg.c
==============================================================================
--- head/sbin/ifconfig/iflagg.c Thu Oct 2 19:53:37 2014 (r272445)
+++ head/sbin/ifconfig/iflagg.c Thu Oct 2 20:01:13 2014 (r272446)
@@ -85,27 +85,27 @@ setlaggproto(const char *val, int d, int
static void
setlaggflowidshift(const char *val, int d, int s, const struct afswtch *afp)
{
- struct lagg_reqall ra;
+ struct lagg_reqopts ro;
- bzero(&ra, sizeof(ra));
- ra.ra_opts = LAGG_OPT_FLOWIDSHIFT;
- strlcpy(ra.ra_ifname, name, sizeof(ra.ra_ifname));
- ra.ra_flowid_shift = (int)strtol(val, NULL, 10);
- if (ra.ra_flowid_shift & ~LAGG_OPT_FLOWIDSHIFT_MASK)
+ bzero(&ro, sizeof(ro));
+ ro.ro_opts = LAGG_OPT_FLOWIDSHIFT;
+ strlcpy(ro.ro_ifname, name, sizeof(ro.ro_ifname));
+ ro.ro_flowid_shift = (int)strtol(val, NULL, 10);
+ if (ro.ro_flowid_shift & ~LAGG_OPT_FLOWIDSHIFT_MASK)
errx(1, "Invalid flowid_shift option: %s", val);
- if (ioctl(s, SIOCSLAGG, &ra) != 0)
- err(1, "SIOCSLAGG");
+ if (ioctl(s, SIOCSLAGGOPTS, &ro) != 0)
+ err(1, "SIOCSLAGGOPTS");
}
static void
setlaggsetopt(const char *val, int d, int s, const struct afswtch *afp)
{
- struct lagg_reqall ra;
+ struct lagg_reqopts ro;
- bzero(&ra, sizeof(ra));
- ra.ra_opts = d;
- switch (ra.ra_opts) {
+ bzero(&ro, sizeof(ro));
+ ro.ro_opts = d;
+ switch (ro.ro_opts) {
case LAGG_OPT_USE_FLOWID:
case -LAGG_OPT_USE_FLOWID:
case LAGG_OPT_LACP_STRICT:
@@ -118,10 +118,10 @@ setlaggsetopt(const char *val, int d, in
default:
err(1, "Invalid lagg option");
}
- strlcpy(ra.ra_ifname, name, sizeof(ra.ra_ifname));
+ strlcpy(ro.ro_ifname, name, sizeof(ro.ro_ifname));
- if (ioctl(s, SIOCSLAGG, &ra) != 0)
- err(1, "SIOCSLAGG");
+ if (ioctl(s, SIOCSLAGGOPTS, &ro) != 0)
+ err(1, "SIOCSLAGGOPTS");
}
static void
@@ -186,6 +186,7 @@ lagg_status(int s)
struct lagg_protos lpr[] = LAGG_PROTOS;
struct lagg_reqport rp, rpbuf[LAGG_MAX_PORTS];
struct lagg_reqall ra;
+ struct lagg_reqopts ro;
struct lagg_reqflags rf;
struct lacp_opreq *lp;
const char *proto = "<unknown>";
@@ -193,6 +194,7 @@ lagg_status(int s)
bzero(&rp, sizeof(rp));
bzero(&ra, sizeof(ra));
+ bzero(&ro, sizeof(ro));
strlcpy(rp.rp_ifname, name, sizeof(rp.rp_ifname));
strlcpy(rp.rp_portname, name, sizeof(rp.rp_portname));
@@ -204,6 +206,9 @@ lagg_status(int s)
ra.ra_size = sizeof(rpbuf);
ra.ra_port = rpbuf;
+ strlcpy(ro.ro_ifname, name, sizeof(ro.ro_ifname));
+ ioctl(s, SIOCGLAGGOPTS, &ro);
+
strlcpy(rf.rf_ifname, name, sizeof(rf.rf_ifname));
if (ioctl(s, SIOCGLAGGFLAGS, &rf) != 0)
rf.rf_flags = 0;
@@ -242,20 +247,20 @@ lagg_status(int s)
if (verbose) {
printf("\tlagg options:\n");
printf("\t\tuse_flowid: %d\n",
- (ra.ra_opts & LAGG_OPT_USE_FLOWID) ? 1 : 0);
- printf("\t\tflowid_shift: %d\n", ra.ra_flowid_shift);
+ (ro.ro_opts & LAGG_OPT_USE_FLOWID) ? 1 : 0);
+ printf("\t\tflowid_shift: %d\n", ro.ro_flowid_shift);
switch (ra.ra_proto) {
case LAGG_PROTO_LACP:
printf("\t\tlacp_strict: %d\n",
- (ra.ra_opts & LAGG_OPT_LACP_STRICT) ? 1 : 0);
+ (ro.ro_opts & LAGG_OPT_LACP_STRICT) ? 1 : 0);
printf("\t\tlacp_rxtest: %d\n",
- (ra.ra_opts & LAGG_OPT_LACP_RXTEST) ? 1 : 0);
+ (ro.ro_opts & LAGG_OPT_LACP_RXTEST) ? 1 : 0);
printf("\t\tlacp_txtest: %d\n",
- (ra.ra_opts & LAGG_OPT_LACP_TXTEST) ? 1 : 0);
+ (ro.ro_opts & LAGG_OPT_LACP_TXTEST) ? 1 : 0);
}
printf("\tlagg statistics:\n");
- printf("\t\tactive ports: %d\n", ra.ra_active);
- printf("\t\tflapping: %u\n", ra.ra_flapping);
+ printf("\t\tactive ports: %d\n", ro.ro_active);
+ printf("\t\tflapping: %u\n", ro.ro_flapping);
if (ra.ra_proto == LAGG_PROTO_LACP) {
printf("\tlag id: %s\n",
lacp_format_peer(lp, "\n\t\t "));
Modified: head/sys/net/if_lagg.c
==============================================================================
--- head/sys/net/if_lagg.c Thu Oct 2 19:53:37 2014 (r272445)
+++ head/sys/net/if_lagg.c Thu Oct 2 20:01:13 2014 (r272446)
@@ -1189,6 +1189,7 @@ lagg_ioctl(struct ifnet *ifp, u_long cmd
{
struct lagg_softc *sc = (struct lagg_softc *)ifp->if_softc;
struct lagg_reqall *ra = (struct lagg_reqall *)data;
+ struct lagg_reqopts *ro = (struct lagg_reqopts *)data;
struct lagg_reqport *rp = (struct lagg_reqport *)data, rpbuf;
struct lagg_reqflags *rf = (struct lagg_reqflags *)data;
struct ifreq *ifr = (struct ifreq *)data;
@@ -1215,31 +1216,6 @@ lagg_ioctl(struct ifnet *ifp, u_long cmd
LAGG_RLOCK(sc, &tracker);
ra->ra_proto = sc->sc_proto;
lagg_proto_request(sc, &ra->ra_psc);
- ra->ra_opts = sc->sc_opts;
- if (sc->sc_proto == LAGG_PROTO_LACP) {
- struct lacp_softc *lsc;
-
- lsc = (struct lacp_softc *)sc->sc_psc;
- if (lsc->lsc_debug.lsc_tx_test != 0)
- ra->ra_opts |= LAGG_OPT_LACP_TXTEST;
- if (lsc->lsc_debug.lsc_rx_test != 0)
- ra->ra_opts |= LAGG_OPT_LACP_RXTEST;
- if (lsc->lsc_strict_mode != 0)
- ra->ra_opts |= LAGG_OPT_LACP_STRICT;
-
- ra->ra_active = sc->sc_active;
- } else {
- /*
- * LACP tracks active links automatically,
- * the others do not.
- */
- ra->ra_active = 0;
- SLIST_FOREACH(lp, &sc->sc_ports, lp_entries)
- ra->ra_active += LAGG_PORTACTIVE(lp);
- }
- ra->ra_flapping = sc->sc_flapping;
- ra->ra_flowid_shift = sc->flowid_shift;
-
count = 0;
buf = outbuf;
len = min(ra->ra_size, buflen);
@@ -1260,96 +1236,118 @@ lagg_ioctl(struct ifnet *ifp, u_long cmd
free(outbuf, M_TEMP);
break;
case SIOCSLAGG:
- /*
- * Set options or protocol depending on
- * ra->ra_opts and ra->ra_proto.
- */
error = priv_check(td, PRIV_NET_LAGG);
if (error)
break;
- if (ra->ra_opts != 0) {
- /*
- * Set options. LACP options are stored in sc->sc_psc,
- * not in sc_opts.
- */
- int valid, lacp;
+ if (ra->ra_proto < 1 || ra->ra_proto >= LAGG_PROTO_MAX) {
+ error = EPROTONOSUPPORT;
+ break;
+ }
- switch (ra->ra_opts) {
- case LAGG_OPT_USE_FLOWID:
- case -LAGG_OPT_USE_FLOWID:
- case LAGG_OPT_FLOWIDSHIFT:
- valid = 1;
- lacp = 0;
- break;
+ LAGG_WLOCK(sc);
+ lagg_proto_detach(sc);
+ lagg_proto_attach(sc, ra->ra_proto);
+ break;
+ case SIOCGLAGGOPTS:
+ ro->ro_opts = sc->sc_opts;
+ if (sc->sc_proto == LAGG_PROTO_LACP) {
+ struct lacp_softc *lsc;
+
+ lsc = (struct lacp_softc *)sc->sc_psc;
+ if (lsc->lsc_debug.lsc_tx_test != 0)
+ ro->ro_opts |= LAGG_OPT_LACP_TXTEST;
+ if (lsc->lsc_debug.lsc_rx_test != 0)
+ ro->ro_opts |= LAGG_OPT_LACP_RXTEST;
+ if (lsc->lsc_strict_mode != 0)
+ ro->ro_opts |= LAGG_OPT_LACP_STRICT;
+
+ ro->ro_active = sc->sc_active;
+ } else {
+ ro->ro_active = 0;
+ SLIST_FOREACH(lp, &sc->sc_ports, lp_entries)
+ ro->ro_active += LAGG_PORTACTIVE(lp);
+ }
+ ro->ro_flapping = sc->sc_flapping;
+ ro->ro_flowid_shift = sc->flowid_shift;
+ break;
+ case SIOCSLAGGOPTS:
+ error = priv_check(td, PRIV_NET_LAGG);
+ if (error)
+ break;
+ if (ro->ro_opts == 0)
+ break;
+ /*
+ * Set options. LACP options are stored in sc->sc_psc,
+ * not in sc_opts.
+ */
+ int valid, lacp;
+
+ switch (ro->ro_opts) {
+ case LAGG_OPT_USE_FLOWID:
+ case -LAGG_OPT_USE_FLOWID:
+ case LAGG_OPT_FLOWIDSHIFT:
+ valid = 1;
+ lacp = 0;
+ break;
+ case LAGG_OPT_LACP_TXTEST:
+ case -LAGG_OPT_LACP_TXTEST:
+ case LAGG_OPT_LACP_RXTEST:
+ case -LAGG_OPT_LACP_RXTEST:
+ case LAGG_OPT_LACP_STRICT:
+ case -LAGG_OPT_LACP_STRICT:
+ valid = lacp = 1;
+ break;
+ default:
+ valid = lacp = 0;
+ break;
+ }
+
+ LAGG_WLOCK(sc);
+ if (valid == 0 ||
+ (lacp == 1 && sc->sc_proto != LAGG_PROTO_LACP)) {
+ /* Invalid combination of options specified. */
+ error = EINVAL;
+ LAGG_WUNLOCK(sc);
+ break; /* Return from SIOCSLAGGOPTS. */
+ }
+ /*
+ * Store new options into sc->sc_opts except for
+ * FLOWIDSHIFT and LACP options.
+ */
+ if (lacp == 0) {
+ if (ro->ro_opts == LAGG_OPT_FLOWIDSHIFT)
+ sc->flowid_shift = ro->ro_flowid_shift;
+ else if (ro->ro_opts > 0)
+ sc->sc_opts |= ro->ro_opts;
+ else
+ sc->sc_opts &= ~ro->ro_opts;
+ } else {
+ struct lacp_softc *lsc;
+
+ lsc = (struct lacp_softc *)sc->sc_psc;
+
+ switch (ro->ro_opts) {
case LAGG_OPT_LACP_TXTEST:
+ lsc->lsc_debug.lsc_tx_test = 1;
+ break;
case -LAGG_OPT_LACP_TXTEST:
+ lsc->lsc_debug.lsc_tx_test = 0;
+ break;
case LAGG_OPT_LACP_RXTEST:
+ lsc->lsc_debug.lsc_rx_test = 1;
+ break;
case -LAGG_OPT_LACP_RXTEST:
+ lsc->lsc_debug.lsc_rx_test = 0;
+ break;
case LAGG_OPT_LACP_STRICT:
- case -LAGG_OPT_LACP_STRICT:
- valid = lacp = 1;
+ lsc->lsc_strict_mode = 1;
break;
- default:
- valid = lacp = 0;
+ case -LAGG_OPT_LACP_STRICT:
+ lsc->lsc_strict_mode = 0;
break;
}
-
- LAGG_WLOCK(sc);
- if (valid == 0 ||
- (lacp == 1 && sc->sc_proto != LAGG_PROTO_LACP)) {
- /* Invalid combination of options specified. */
- error = EINVAL;
- LAGG_WUNLOCK(sc);
- break; /* Return from SIOCSLAGG. */
- }
- /*
- * Store new options into sc->sc_opts except for
- * FLOWIDSHIFT and LACP options.
- */
- if (lacp == 0) {
- if (ra->ra_opts == LAGG_OPT_FLOWIDSHIFT)
- sc->flowid_shift = ra->ra_flowid_shift;
- else if (ra->ra_opts > 0)
- sc->sc_opts |= ra->ra_opts;
- else
- sc->sc_opts &= ~ra->ra_opts;
- } else {
- struct lacp_softc *lsc;
-
- lsc = (struct lacp_softc *)sc->sc_psc;
-
- switch (ra->ra_opts) {
- case LAGG_OPT_LACP_TXTEST:
- lsc->lsc_debug.lsc_tx_test = 1;
- break;
- case -LAGG_OPT_LACP_TXTEST:
- lsc->lsc_debug.lsc_tx_test = 0;
- break;
- case LAGG_OPT_LACP_RXTEST:
- lsc->lsc_debug.lsc_rx_test = 1;
- break;
- case -LAGG_OPT_LACP_RXTEST:
- lsc->lsc_debug.lsc_rx_test = 0;
- break;
- case LAGG_OPT_LACP_STRICT:
- lsc->lsc_strict_mode = 1;
- break;
- case -LAGG_OPT_LACP_STRICT:
- lsc->lsc_strict_mode = 0;
- break;
- }
- }
- LAGG_WUNLOCK(sc);
- break; /* Return from SIOCSLAGG. */
- }
- if (ra->ra_proto < 1 || ra->ra_proto >= LAGG_PROTO_MAX) {
- error = EPROTONOSUPPORT;
- break;
}
-
- LAGG_WLOCK(sc);
- lagg_proto_detach(sc);
- lagg_proto_attach(sc, ra->ra_proto);
+ LAGG_WUNLOCK(sc);
break;
case SIOCGLAGGFLAGS:
rf->rf_flags = sc->sc_flags;
Modified: head/sys/net/if_lagg.h
==============================================================================
--- head/sys/net/if_lagg.h Thu Oct 2 19:53:37 2014 (r272445)
+++ head/sys/net/if_lagg.h Thu Oct 2 20:01:13 2014 (r272446)
@@ -125,19 +125,6 @@ struct lagg_reqall {
struct lacp_opreq rpsc_lacp;
} ra_psc;
#define ra_lacpreq ra_psc.rpsc_lacp
- int ra_opts; /* Option bitmap */
-#define LAGG_OPT_NONE 0x00
-#define LAGG_OPT_USE_FLOWID 0x01 /* use M_FLOWID */
-/* Pseudo flags which are used in ra_opts but not stored into sc_opts. */
-#define LAGG_OPT_FLOWIDSHIFT 0x02 /* Set flowid */
-#define LAGG_OPT_FLOWIDSHIFT_MASK 0x1f /* flowid is uint32_t */
-#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 */
- u_int ra_count; /* number of ports */
- u_int ra_active; /* active port count */
- u_int ra_flapping; /* number of flapping */
- int ra_flowid_shift; /* shift the flowid */
};
#define SIOCGLAGG _IOWR('i', 143, struct lagg_reqall)
@@ -151,6 +138,27 @@ struct lagg_reqflags {
#define SIOCGLAGGFLAGS _IOWR('i', 145, struct lagg_reqflags)
#define SIOCSLAGGHASH _IOW('i', 146, struct lagg_reqflags)
+struct lagg_reqopts {
+ char ro_ifname[IFNAMSIZ]; /* name of the lagg */
+
+ int ro_opts; /* Option bitmap */
+#define LAGG_OPT_NONE 0x00
+#define LAGG_OPT_USE_FLOWID 0x01 /* use M_FLOWID */
+/* Pseudo flags which are used in ro_opts but not stored into sc_opts. */
+#define LAGG_OPT_FLOWIDSHIFT 0x02 /* Set flowid */
+#define LAGG_OPT_FLOWIDSHIFT_MASK 0x1f /* flowid is uint32_t */
+#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 */
+ u_int ro_count; /* number of ports */
+ u_int ro_active; /* active port count */
+ u_int ro_flapping; /* number of flapping */
+ int ro_flowid_shift; /* shift the flowid */
+};
+
+#define SIOCGLAGGOPTS _IOWR('i', 152, struct lagg_reqopts)
+#define SIOCSLAGGOPTS _IOW('i', 153, struct lagg_reqopts)
+
#ifdef _KERNEL
/*
More information about the svn-src-head
mailing list