summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/net/if_lagg.h
diff options
context:
space:
mode:
Diffstat (limited to 'freebsd/sys/net/if_lagg.h')
-rw-r--r--freebsd/sys/net/if_lagg.h127
1 files changed, 78 insertions, 49 deletions
diff --git a/freebsd/sys/net/if_lagg.h b/freebsd/sys/net/if_lagg.h
index 27ab46f2..334995e5 100644
--- a/freebsd/sys/net/if_lagg.h
+++ b/freebsd/sys/net/if_lagg.h
@@ -21,8 +21,6 @@
#ifndef _NET_LAGG_H
#define _NET_LAGG_H
-#include <sys/sysctl.h>
-
/*
* Global definitions
*/
@@ -49,26 +47,28 @@
"\05DISTRIBUTING\06DISABLED"
/* Supported lagg PROTOs */
-#define LAGG_PROTO_NONE 0 /* no lagg protocol defined */
-#define LAGG_PROTO_ROUNDROBIN 1 /* simple round robin */
-#define LAGG_PROTO_FAILOVER 2 /* active failover */
-#define LAGG_PROTO_LOADBALANCE 3 /* loadbalance */
-#define LAGG_PROTO_LACP 4 /* 802.3ad lacp */
-#define LAGG_PROTO_ETHERCHANNEL 5 /* Cisco FEC */
-#define LAGG_PROTO_MAX 6
+typedef enum {
+ LAGG_PROTO_NONE = 0, /* no lagg protocol defined */
+ LAGG_PROTO_ROUNDROBIN, /* simple round robin */
+ LAGG_PROTO_FAILOVER, /* active failover */
+ LAGG_PROTO_LOADBALANCE, /* loadbalance */
+ LAGG_PROTO_LACP, /* 802.3ad lacp */
+ LAGG_PROTO_BROADCAST, /* broadcast */
+ LAGG_PROTO_MAX,
+} lagg_proto;
struct lagg_protos {
const char *lpr_name;
- int lpr_proto;
+ lagg_proto lpr_proto;
};
#define LAGG_PROTO_DEFAULT LAGG_PROTO_FAILOVER
#define LAGG_PROTOS { \
- { "failover", LAGG_PROTO_FAILOVER }, \
- { "fec", LAGG_PROTO_ETHERCHANNEL }, \
+ { "failover", LAGG_PROTO_FAILOVER }, \
{ "lacp", LAGG_PROTO_LACP }, \
{ "loadbalance", LAGG_PROTO_LOADBALANCE }, \
- { "roundrobin", LAGG_PROTO_ROUNDROBIN }, \
+ { "roundrobin", LAGG_PROTO_ROUNDROBIN }, \
+ { "broadcast", LAGG_PROTO_BROADCAST }, \
{ "none", LAGG_PROTO_NONE }, \
{ "default", LAGG_PROTO_DEFAULT } \
}
@@ -136,16 +136,40 @@ 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 /* enable use of flowid */
+/* Pseudo flags which are used in ro_opts but not stored into sc_opts. */
+#define LAGG_OPT_FLOWIDSHIFT 0x02 /* set flowid shift */
+#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 */
+#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 */
+ int ro_flowid_shift; /* shift the flowid */
+ uint32_t ro_bkt; /* packet bucket for roundrobin */
+};
+
+#define SIOCGLAGGOPTS _IOWR('i', 152, struct lagg_reqopts)
+#define SIOCSLAGGOPTS _IOW('i', 153, struct lagg_reqopts)
+
+#define LAGG_OPT_BITS "\020\001USE_FLOWID\005LACP_STRICT" \
+ "\006LACP_TXTEST\007LACP_RXTEST"
+
#ifdef _KERNEL
+
/*
* Internal kernel part
*/
-#define lp_ifname lp_ifp->if_xname /* interface name */
-#define lp_link_state lp_ifp->if_link_state /* link state */
-
#define LAGG_PORTACTIVE(_tp) ( \
- ((_tp)->lp_link_state == LINK_STATE_UP) && \
+ ((_tp)->lp_ifp->if_link_state == LINK_STATE_UP) && \
((_tp)->lp_ifp->if_flags & IFF_UP) \
)
@@ -173,25 +197,39 @@ struct lagg_lb {
};
struct lagg_mc {
+ struct sockaddr_dl mc_addr;
struct ifmultiaddr *mc_ifma;
SLIST_ENTRY(lagg_mc) mc_entries;
};
+typedef enum {
+ LAGG_LLQTYPE_PHYS = 0, /* Task related to physical (underlying) port */
+ LAGG_LLQTYPE_VIRT, /* Task related to lagg interface itself */
+} lagg_llqtype;
+
/* List of interfaces to have the MAC address modified */
struct lagg_llq {
struct ifnet *llq_ifp;
uint8_t llq_lladdr[ETHER_ADDR_LEN];
+ lagg_llqtype llq_type;
SLIST_ENTRY(lagg_llq) llq_entries;
};
+struct lagg_counters {
+ uint64_t val[IFCOUNTERS];
+};
+
struct lagg_softc {
struct ifnet *sc_ifp; /* virtual interface */
- struct rwlock sc_mtx;
+ struct rmlock sc_mtx;
int sc_proto; /* lagg protocol */
u_int sc_count; /* number of ports */
+ u_int sc_active; /* active port count */
+ u_int sc_flapping; /* number of flapping
+ * events */
struct lagg_port *sc_primary; /* primary port */
struct ifmedia sc_media; /* media config */
- caddr_t sc_psc; /* protocol data */
+ void *sc_psc; /* protocol data */
uint32_t sc_seq; /* sequence counter */
uint32_t sc_flags;
@@ -201,26 +239,14 @@ 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_detach)(struct lagg_softc *);
- 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 *, caddr_t);
- void (*sc_portreq)(struct lagg_port *, caddr_t);
-#if __FreeBSD_version >= 800000
eventhandler_tag vlan_attach;
eventhandler_tag vlan_detach;
-#endif
- struct sysctl_ctx_list ctx; /* sysctl variables */
- int use_flowid; /* use M_FLOWID */
+ 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 */
};
struct lagg_port {
@@ -233,33 +259,36 @@ struct lagg_port {
uint32_t lp_flags; /* port flags */
int lp_ifflags; /* saved ifp flags */
void *lh_cookie; /* if state hook */
- caddr_t lp_psc; /* protocol data */
+ void *lp_psc; /* protocol data */
int lp_detaching; /* ifnet is detaching */
SLIST_HEAD(__mclhd, lagg_mc) lp_mc_head; /* multicast addresses */
/* Redirected callbacks */
int (*lp_ioctl)(struct ifnet *, u_long, caddr_t);
- int (*lp_output)(struct ifnet *, struct mbuf *, struct sockaddr *,
- struct route *);
+ int (*lp_output)(struct ifnet *, struct mbuf *,
+ const struct sockaddr *, struct route *);
+ struct lagg_counters port_counters; /* ifp counters copy */
SLIST_ENTRY(lagg_port) lp_entries;
};
-#define LAGG_LOCK_INIT(_sc) rw_init(&(_sc)->sc_mtx, "if_lagg rwlock")
-#define LAGG_LOCK_DESTROY(_sc) rw_destroy(&(_sc)->sc_mtx)
-#define LAGG_RLOCK(_sc) rw_rlock(&(_sc)->sc_mtx)
-#define LAGG_WLOCK(_sc) rw_wlock(&(_sc)->sc_mtx)
-#define LAGG_RUNLOCK(_sc) rw_runlock(&(_sc)->sc_mtx)
-#define LAGG_WUNLOCK(_sc) rw_wunlock(&(_sc)->sc_mtx)
-#define LAGG_RLOCK_ASSERT(_sc) rw_assert(&(_sc)->sc_mtx, RA_RLOCKED)
-#define LAGG_WLOCK_ASSERT(_sc) rw_assert(&(_sc)->sc_mtx, RA_WLOCKED)
+#define LAGG_LOCK_INIT(_sc) rm_init(&(_sc)->sc_mtx, "if_lagg rmlock")
+#define LAGG_LOCK_DESTROY(_sc) rm_destroy(&(_sc)->sc_mtx)
+#define LAGG_RLOCK(_sc, _p) rm_rlock(&(_sc)->sc_mtx, (_p))
+#define LAGG_WLOCK(_sc) rm_wlock(&(_sc)->sc_mtx)
+#define LAGG_RUNLOCK(_sc, _p) rm_runlock(&(_sc)->sc_mtx, (_p))
+#define LAGG_WUNLOCK(_sc) rm_wunlock(&(_sc)->sc_mtx)
+#define LAGG_RLOCK_ASSERT(_sc) rm_assert(&(_sc)->sc_mtx, RA_RLOCKED)
+#define LAGG_WLOCK_ASSERT(_sc) rm_assert(&(_sc)->sc_mtx, RA_WLOCKED)
+#define LAGG_UNLOCK_ASSERT(_sc) rm_assert(&(_sc)->sc_mtx, RA_UNLOCKED)
extern struct mbuf *(*lagg_input_p)(struct ifnet *, struct mbuf *);
extern void (*lagg_linkstate_p)(struct ifnet *, int );
int lagg_enqueue(struct ifnet *, struct mbuf *);
-uint32_t lagg_hashmbuf(struct lagg_softc *, struct mbuf *, uint32_t);
+
+SYSCTL_DECL(_net_link_lagg);
#endif /* _KERNEL */