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.
This commit is contained in:
Gleb Smirnoff 2014-09-26 12:54:24 +00:00
parent 469c4e0465
commit 38738d739a
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=272178
2 changed files with 131 additions and 82 deletions

View File

@ -131,7 +131,6 @@ static struct mbuf *lagg_rr_input(struct lagg_softc *, struct lagg_port *,
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 lagg_softc *, struct lagg_port *,
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, lagg_proto pr)
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_t *lladdr)
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 ifnet *ifp)
{
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, struct ifnet *ifp)
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_softc *sc)
#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, int runpd)
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, struct lagg_reqport *rp)
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, caddr_t data)
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 mbuf *m)
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 mbuf *m)
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 state)
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 mbuf *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, struct lagg_port *lp, struct mbuf *m)
/*
* 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, struct lagg_port *lp, struct mbuf *m)
/*
* 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);
}

View File

@ -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;