svn commit: r272178 - head/sys/net
Gleb Smirnoff
glebius at FreeBSD.org
Fri Sep 26 12:54:26 UTC 2014
Author: glebius
Date: Fri Sep 26 12:54:24 2014
New Revision: 272178
URL: http://svnweb.freebsd.org/changeset/base/272178
Log:
Make all lagg protocol methods live in lagg_protos, not in softc. All
interfaces of a same protocol, use the same methods.
Sponsored by: Netflix
Sponsored by: Nginx, Inc.
Modified:
head/sys/net/if_lagg.c
head/sys/net/if_lagg.h
Modified: head/sys/net/if_lagg.c
==============================================================================
--- head/sys/net/if_lagg.c Fri Sep 26 12:48:54 2014 (r272177)
+++ head/sys/net/if_lagg.c Fri Sep 26 12:54:24 2014 (r272178)
@@ -131,7 +131,6 @@ static struct mbuf *lagg_rr_input(struct
struct mbuf *);
/* Active failover */
-static void lagg_fail_attach(struct lagg_softc *);
static int lagg_fail_start(struct lagg_softc *, struct mbuf *);
static struct mbuf *lagg_fail_input(struct lagg_softc *, struct lagg_port *,
struct mbuf *);
@@ -147,7 +146,6 @@ static struct mbuf *lagg_lb_input(struct
static int lagg_lb_porttable(struct lagg_softc *, struct lagg_port *);
/* Broadcast */
-static void lagg_bcast_attach(struct lagg_softc *);
static int lagg_bcast_start(struct lagg_softc *, struct mbuf *);
static struct mbuf *lagg_bcast_input(struct lagg_softc *, struct lagg_port *,
struct mbuf *);
@@ -167,6 +165,17 @@ static const struct lagg_proto {
lagg_proto pr_num;
void (*pr_attach)(struct lagg_softc *);
void (*pr_detach)(struct lagg_softc *);
+ int (*pr_start)(struct lagg_softc *, struct mbuf *);
+ struct mbuf * (*pr_input)(struct lagg_softc *, struct lagg_port *,
+ struct mbuf *);
+ int (*pr_addport)(struct lagg_port *);
+ void (*pr_delport)(struct lagg_port *);
+ void (*pr_linkstate)(struct lagg_port *);
+ void (*pr_init)(struct lagg_softc *);
+ void (*pr_stop)(struct lagg_softc *);
+ void (*pr_lladdr)(struct lagg_softc *);
+ void (*pr_request)(struct lagg_softc *, void *);
+ void (*pr_portreq)(struct lagg_port *, void *);
} lagg_protos[] = {
{
.pr_num = LAGG_PROTO_NONE
@@ -174,28 +183,49 @@ static const struct lagg_proto {
{
.pr_num = LAGG_PROTO_ROUNDROBIN,
.pr_attach = lagg_rr_attach,
+ .pr_start = lagg_rr_start,
+ .pr_input = lagg_rr_input,
},
{
.pr_num = LAGG_PROTO_FAILOVER,
- .pr_attach = lagg_fail_attach,
+ .pr_start = lagg_fail_start,
+ .pr_input = lagg_fail_input,
},
{
.pr_num = LAGG_PROTO_LOADBALANCE,
.pr_attach = lagg_lb_attach,
.pr_detach = lagg_lb_detach,
+ .pr_start = lagg_lb_start,
+ .pr_input = lagg_lb_input,
+ .pr_addport = lagg_lb_port_create,
+ .pr_delport = lagg_lb_port_destroy,
},
{
.pr_num = LAGG_PROTO_LACP,
.pr_attach = lagg_lacp_attach,
.pr_detach = lagg_lacp_detach,
+ .pr_start = lagg_lacp_start,
+ .pr_input = lagg_lacp_input,
+ .pr_addport = lacp_port_create,
+ .pr_delport = lacp_port_destroy,
+ .pr_linkstate = lacp_linkstate,
+ .pr_init = lacp_init,
+ .pr_stop = lacp_stop,
+ .pr_lladdr = lagg_lacp_lladdr,
+ .pr_request = lacp_req,
+ .pr_portreq = lacp_portreq,
},
{
.pr_num = LAGG_PROTO_ETHERCHANNEL,
.pr_attach = lagg_lb_attach,
+ .pr_detach = lagg_lb_detach,
+ .pr_start = lagg_lb_start,
+ .pr_input = lagg_lb_input,
},
{
.pr_num = LAGG_PROTO_BROADCAST,
- .pr_attach = lagg_bcast_attach,
+ .pr_start = lagg_bcast_start,
+ .pr_input = lagg_bcast_input,
},
};
@@ -265,7 +295,8 @@ lagg_proto_attach(struct lagg_softc *sc,
if (sc->sc_ifflags & IFF_DEBUG)
if_printf(sc->sc_ifp, "using proto %u\n", pr);
- lagg_protos[pr].pr_attach(sc);
+ if (lagg_protos[pr].pr_attach != NULL)
+ lagg_protos[pr].pr_attach(sc);
sc->sc_proto = pr;
}
@@ -285,6 +316,86 @@ lagg_proto_detach(struct lagg_softc *sc)
LAGG_WUNLOCK(sc);
}
+static int
+lagg_proto_start(struct lagg_softc *sc, struct mbuf *m)
+{
+
+ return (lagg_protos[sc->sc_proto].pr_start(sc, m));
+}
+
+static struct mbuf *
+lagg_proto_input(struct lagg_softc *sc, struct lagg_port *lp, struct mbuf *m)
+{
+
+ return (lagg_protos[sc->sc_proto].pr_input(sc, lp, m));
+}
+
+static int
+lagg_proto_addport(struct lagg_softc *sc, struct lagg_port *lp)
+{
+
+ if (lagg_protos[sc->sc_proto].pr_addport == NULL)
+ return (0);
+ else
+ return (lagg_protos[sc->sc_proto].pr_addport(lp));
+}
+
+static void
+lagg_proto_delport(struct lagg_softc *sc, struct lagg_port *lp)
+{
+
+ if (lagg_protos[sc->sc_proto].pr_delport != NULL)
+ lagg_protos[sc->sc_proto].pr_delport(lp);
+}
+
+static void
+lagg_proto_linkstate(struct lagg_softc *sc, struct lagg_port *lp)
+{
+
+ if (lagg_protos[sc->sc_proto].pr_linkstate != NULL)
+ lagg_protos[sc->sc_proto].pr_linkstate(lp);
+}
+
+static void
+lagg_proto_init(struct lagg_softc *sc)
+{
+
+ if (lagg_protos[sc->sc_proto].pr_init != NULL)
+ lagg_protos[sc->sc_proto].pr_init(sc);
+}
+
+static void
+lagg_proto_stop(struct lagg_softc *sc)
+{
+
+ if (lagg_protos[sc->sc_proto].pr_stop != NULL)
+ lagg_protos[sc->sc_proto].pr_stop(sc);
+}
+
+static void
+lagg_proto_lladdr(struct lagg_softc *sc)
+{
+
+ if (lagg_protos[sc->sc_proto].pr_lladdr != NULL)
+ lagg_protos[sc->sc_proto].pr_lladdr(sc);
+}
+
+static void
+lagg_proto_request(struct lagg_softc *sc, void *v)
+{
+
+ if (lagg_protos[sc->sc_proto].pr_request != NULL)
+ lagg_protos[sc->sc_proto].pr_request(sc, v);
+}
+
+static void
+lagg_proto_portreq(struct lagg_softc *sc, struct lagg_port *lp, void *v)
+{
+
+ if (lagg_protos[sc->sc_proto].pr_portreq != NULL)
+ lagg_protos[sc->sc_proto].pr_portreq(lp, v);
+}
+
/*
* This routine is run via an vlan
* config EVENT
@@ -479,8 +590,7 @@ lagg_lladdr(struct lagg_softc *sc, uint8
bcopy(lladdr, IF_LLADDR(ifp), ETHER_ADDR_LEN);
/* Let the protocol know the MAC has changed */
- if (sc->sc_lladdr != NULL)
- (*sc->sc_lladdr)(sc);
+ lagg_proto_lladdr(sc);
EVENTHANDLER_INVOKE(iflladdr_event, ifp);
}
@@ -602,7 +712,7 @@ lagg_port_create(struct lagg_softc *sc,
{
struct lagg_softc *sc_ptr;
struct lagg_port *lp, *tlp;
- int error = 0;
+ int error;
LAGG_WLOCK_ASSERT(sc);
@@ -730,15 +840,13 @@ lagg_port_create(struct lagg_softc *sc,
lagg_ether_cmdmulti(lp, 1);
lagg_setflags(lp, 1);
- if (sc->sc_port_create != NULL)
- error = (*sc->sc_port_create)(lp);
- if (error) {
- /* remove the port again, without calling sc_port_destroy */
+ if ((error = lagg_proto_addport(sc, lp)) != 0) {
+ /* Remove the port, without calling pr_delport. */
lagg_port_destroy(lp, 0);
return (error);
}
- return (error);
+ return (0);
}
#ifdef LAGG_PORT_STACKING
@@ -763,7 +871,7 @@ lagg_port_checkstacking(struct lagg_soft
#endif
static int
-lagg_port_destroy(struct lagg_port *lp, int runpd)
+lagg_port_destroy(struct lagg_port *lp, int rundelport)
{
struct lagg_softc *sc = lp->lp_softc;
struct lagg_port *lp_ptr;
@@ -772,8 +880,8 @@ lagg_port_destroy(struct lagg_port *lp,
LAGG_WLOCK_ASSERT(sc);
- if (runpd && sc->sc_port_destroy != NULL)
- (*sc->sc_port_destroy)(lp);
+ if (rundelport)
+ lagg_proto_delport(sc, lp);
/*
* Remove multicast addresses and interface flags from this port and
@@ -952,8 +1060,7 @@ lagg_port2req(struct lagg_port *lp, stru
strlcpy(rp->rp_portname, lp->lp_ifp->if_xname, sizeof(rp->rp_portname));
rp->rp_prio = lp->lp_prio;
rp->rp_flags = lp->lp_flags;
- if (sc->sc_portreq != NULL)
- (*sc->sc_portreq)(lp, &rp->rp_psc);
+ lagg_proto_portreq(sc, lp, &rp->rp_psc);
/* Add protocol specific flags */
switch (sc->sc_proto) {
@@ -1002,8 +1109,7 @@ lagg_init(void *xsc)
SLIST_FOREACH(lp, &sc->sc_ports, lp_entries)
lagg_port_lladdr(lp, IF_LLADDR(ifp));
- if (sc->sc_init != NULL)
- (*sc->sc_init)(sc);
+ lagg_proto_init(sc);
LAGG_WUNLOCK(sc);
}
@@ -1020,8 +1126,7 @@ lagg_stop(struct lagg_softc *sc)
ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
- if (sc->sc_stop != NULL)
- (*sc->sc_stop)(sc);
+ lagg_proto_stop(sc);
}
static int
@@ -1054,9 +1159,7 @@ lagg_ioctl(struct ifnet *ifp, u_long cmd
LAGG_RLOCK(sc, &tracker);
ra->ra_proto = sc->sc_proto;
- if (sc->sc_req != NULL)
- (*sc->sc_req)(sc, &ra->ra_psc);
-
+ lagg_proto_request(sc, &ra->ra_psc);
count = 0;
buf = outbuf;
len = min(ra->ra_size, buflen);
@@ -1343,7 +1446,7 @@ lagg_transmit(struct ifnet *ifp, struct
ETHER_BPF_MTAP(ifp, m);
- error = (*sc->sc_start)(sc, m);
+ error = lagg_proto_start(sc, m);
LAGG_RUNLOCK(sc, &tracker);
if (error == 0) {
@@ -1383,7 +1486,7 @@ lagg_input(struct ifnet *ifp, struct mbu
ETHER_BPF_MTAP(scifp, m);
- m = (*sc->sc_input)(sc, lp, m);
+ m = lagg_proto_input(sc, lp, m);
if (m != NULL) {
counter_u64_add(sc->sc_ipackets, 1);
@@ -1479,8 +1582,7 @@ lagg_port_state(struct ifnet *ifp, int s
LAGG_WLOCK(sc);
lagg_linkstate(sc);
- if (sc->sc_linkstate != NULL)
- (*sc->sc_linkstate)(lp);
+ lagg_proto_linkstate(sc, lp);
LAGG_WUNLOCK(sc);
}
@@ -1683,9 +1785,6 @@ lagg_enqueue(struct ifnet *ifp, struct m
static void
lagg_rr_attach(struct lagg_softc *sc)
{
- sc->sc_start = lagg_rr_start;
- sc->sc_input = lagg_rr_input;
- sc->sc_port_create = NULL;
sc->sc_capabilities = IFCAP_LAGG_FULLDUPLEX;
sc->sc_seq = 0;
}
@@ -1729,18 +1828,6 @@ lagg_rr_input(struct lagg_softc *sc, str
/*
* Broadcast mode
*/
-static void
-lagg_bcast_attach(struct lagg_softc *sc)
-{
- sc->sc_start = lagg_bcast_start;
- sc->sc_input = lagg_bcast_input;
- sc->sc_port_create = NULL;
- sc->sc_port_destroy = NULL;
- sc->sc_linkstate = NULL;
- sc->sc_req = NULL;
- sc->sc_portreq = NULL;
-}
-
static int
lagg_bcast_start(struct lagg_softc *sc, struct mbuf *m)
{
@@ -1802,15 +1889,6 @@ lagg_bcast_input(struct lagg_softc *sc,
/*
* Active failover
*/
-static void
-lagg_fail_attach(struct lagg_softc *sc)
-{
- sc->sc_start = lagg_fail_start;
- sc->sc_input = lagg_fail_input;
- sc->sc_port_create = NULL;
- sc->sc_port_destroy = NULL;
-}
-
static int
lagg_fail_start(struct lagg_softc *sc, struct mbuf *m)
{
@@ -1864,10 +1942,6 @@ lagg_lb_attach(struct lagg_softc *sc)
lb = malloc(sizeof(struct lagg_lb), M_DEVBUF, M_WAITOK | M_ZERO);
- sc->sc_start = lagg_lb_start;
- sc->sc_input = lagg_lb_input;
- sc->sc_port_create = lagg_lb_port_create;
- sc->sc_port_destroy = lagg_lb_port_destroy;
sc->sc_capabilities = IFCAP_LAGG_FULLDUPLEX;
lb->lb_key = arc4random();
@@ -1970,19 +2044,7 @@ lagg_lacp_attach(struct lagg_softc *sc)
{
struct lagg_port *lp;
- sc->sc_port_create = lacp_port_create;
- sc->sc_port_destroy = lacp_port_destroy;
- sc->sc_linkstate = lacp_linkstate;
- sc->sc_start = lagg_lacp_start;
- sc->sc_input = lagg_lacp_input;
- sc->sc_init = lacp_init;
- sc->sc_stop = lacp_stop;
- sc->sc_lladdr = lagg_lacp_lladdr;
- sc->sc_req = lacp_req;
- sc->sc_portreq = lacp_portreq;
-
lacp_attach(sc);
-
SLIST_FOREACH(lp, &sc->sc_ports, lp_entries)
lacp_port_create(lp);
}
Modified: head/sys/net/if_lagg.h
==============================================================================
--- head/sys/net/if_lagg.h Fri Sep 26 12:48:54 2014 (r272177)
+++ head/sys/net/if_lagg.h Fri Sep 26 12:54:24 2014 (r272178)
@@ -216,19 +216,6 @@ struct lagg_softc {
struct task sc_lladdr_task;
SLIST_HEAD(__llqhd, lagg_llq) sc_llq_head; /* interfaces to program
the lladdr on */
-
- /* lagg protocol callbacks */
- int (*sc_start)(struct lagg_softc *, struct mbuf *);
- struct mbuf *(*sc_input)(struct lagg_softc *, struct lagg_port *,
- struct mbuf *);
- int (*sc_port_create)(struct lagg_port *);
- void (*sc_port_destroy)(struct lagg_port *);
- void (*sc_linkstate)(struct lagg_port *);
- void (*sc_init)(struct lagg_softc *);
- void (*sc_stop)(struct lagg_softc *);
- void (*sc_lladdr)(struct lagg_softc *);
- void (*sc_req)(struct lagg_softc *, void *);
- void (*sc_portreq)(struct lagg_port *, void *);
eventhandler_tag vlan_attach;
eventhandler_tag vlan_detach;
struct callout sc_callout;
More information about the svn-src-head
mailing list