]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/net/if_lagg.h
Copy bin/ls/tests from ^/head
[FreeBSD/FreeBSD.git] / sys / net / if_lagg.h
1 /*      $OpenBSD: if_trunk.h,v 1.11 2007/01/31 06:20:19 reyk Exp $      */
2
3 /*
4  * Copyright (c) 2005, 2006 Reyk Floeter <reyk@openbsd.org>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  *
18  * $FreeBSD$
19  */
20
21 #ifndef _NET_LAGG_H
22 #define _NET_LAGG_H
23
24 /*
25  * Global definitions
26  */
27
28 #define LAGG_MAX_PORTS          32      /* logically */
29 #define LAGG_MAX_NAMESIZE       32      /* name of a protocol */
30 #define LAGG_MAX_STACKING       4       /* maximum number of stacked laggs */
31
32 /* Lagg flags */
33 #define LAGG_F_HASHL2           0x00000001      /* hash layer 2 */
34 #define LAGG_F_HASHL3           0x00000002      /* hash layer 3 */
35 #define LAGG_F_HASHL4           0x00000004      /* hash layer 4 */
36 #define LAGG_F_HASHMASK         0x00000007
37
38 /* Port flags */
39 #define LAGG_PORT_SLAVE         0x00000000      /* normal enslaved port */
40 #define LAGG_PORT_MASTER        0x00000001      /* primary port */
41 #define LAGG_PORT_STACK         0x00000002      /* stacked lagg port */
42 #define LAGG_PORT_ACTIVE        0x00000004      /* port is active */
43 #define LAGG_PORT_COLLECTING    0x00000008      /* port is receiving frames */
44 #define LAGG_PORT_DISTRIBUTING  0x00000010      /* port is sending frames */
45 #define LAGG_PORT_DISABLED      0x00000020      /* port is disabled */
46 #define LAGG_PORT_BITS          "\20\01MASTER\02STACK\03ACTIVE\04COLLECTING" \
47                                   "\05DISTRIBUTING\06DISABLED"
48
49 /* Supported lagg PROTOs */
50 typedef enum {
51         LAGG_PROTO_NONE = 0,    /* no lagg protocol defined */
52         LAGG_PROTO_ROUNDROBIN,  /* simple round robin */
53         LAGG_PROTO_FAILOVER,    /* active failover */
54         LAGG_PROTO_LOADBALANCE, /* loadbalance */
55         LAGG_PROTO_LACP,        /* 802.3ad lacp */
56         LAGG_PROTO_ETHERCHANNEL,/* Cisco FEC */
57         LAGG_PROTO_BROADCAST,   /* broadcast */
58         LAGG_PROTO_MAX,
59 } lagg_proto;
60
61 struct lagg_protos {
62         const char              *lpr_name;
63         lagg_proto              lpr_proto;
64 };
65
66 #define LAGG_PROTO_DEFAULT      LAGG_PROTO_FAILOVER
67 #define LAGG_PROTOS     {                                               \
68         { "failover",           LAGG_PROTO_FAILOVER },          \
69         { "fec",                LAGG_PROTO_ETHERCHANNEL },              \
70         { "lacp",               LAGG_PROTO_LACP },                      \
71         { "loadbalance",        LAGG_PROTO_LOADBALANCE },               \
72         { "roundrobin", LAGG_PROTO_ROUNDROBIN },                \
73         { "broadcast",  LAGG_PROTO_BROADCAST },         \
74         { "none",               LAGG_PROTO_NONE },                      \
75         { "default",            LAGG_PROTO_DEFAULT }                    \
76 }
77
78 /*
79  * lagg ioctls.
80  */
81
82 /*
83  * LACP current operational parameters structure.
84  */
85 struct lacp_opreq {
86         uint16_t                actor_prio;
87         uint8_t                 actor_mac[ETHER_ADDR_LEN];
88         uint16_t                actor_key;
89         uint16_t                actor_portprio;
90         uint16_t                actor_portno;
91         uint8_t                 actor_state;
92         uint16_t                partner_prio;
93         uint8_t                 partner_mac[ETHER_ADDR_LEN];
94         uint16_t                partner_key;
95         uint16_t                partner_portprio;
96         uint16_t                partner_portno;
97         uint8_t                 partner_state;
98 };
99
100 /* lagg port settings */
101 struct lagg_reqport {
102         char                    rp_ifname[IFNAMSIZ];    /* name of the lagg */
103         char                    rp_portname[IFNAMSIZ];  /* name of the port */
104         u_int32_t               rp_prio;                /* port priority */
105         u_int32_t               rp_flags;               /* port flags */
106         union {
107                 struct lacp_opreq rpsc_lacp;
108         } rp_psc;
109 #define rp_lacpreq      rp_psc.rpsc_lacp
110 };
111
112 #define SIOCGLAGGPORT           _IOWR('i', 140, struct lagg_reqport)
113 #define SIOCSLAGGPORT            _IOW('i', 141, struct lagg_reqport)
114 #define SIOCSLAGGDELPORT         _IOW('i', 142, struct lagg_reqport)
115
116 /* lagg, ports and options */
117 struct lagg_reqall {
118         char                    ra_ifname[IFNAMSIZ];    /* name of the lagg */
119         u_int                   ra_proto;               /* lagg protocol */
120
121         size_t                  ra_size;                /* size of buffer */
122         struct lagg_reqport     *ra_port;               /* allocated buffer */
123         int                     ra_ports;               /* total port count */
124         union {
125                 struct lacp_opreq rpsc_lacp;
126         } ra_psc;
127 #define ra_lacpreq      ra_psc.rpsc_lacp
128 };
129
130 #define SIOCGLAGG               _IOWR('i', 143, struct lagg_reqall)
131 #define SIOCSLAGG                _IOW('i', 144, struct lagg_reqall)
132
133 struct lagg_reqflags {
134         char                    rf_ifname[IFNAMSIZ];    /* name of the lagg */
135         uint32_t                rf_flags;               /* lagg protocol */
136 };
137
138 #define SIOCGLAGGFLAGS          _IOWR('i', 145, struct lagg_reqflags)
139 #define SIOCSLAGGHASH            _IOW('i', 146, struct lagg_reqflags)
140
141 struct lagg_reqopts {
142         char                    ro_ifname[IFNAMSIZ];    /* name of the lagg */
143
144         int                     ro_opts;                /* Option bitmap */
145 #define LAGG_OPT_NONE                   0x00
146 #define LAGG_OPT_USE_FLOWID             0x01            /* enable use of flowid */
147 /* Pseudo flags which are used in ro_opts but not stored into sc_opts. */
148 #define LAGG_OPT_FLOWIDSHIFT            0x02            /* set flowid shift */
149 #define LAGG_OPT_FLOWIDSHIFT_MASK       0x1f            /* flowid is uint32_t */
150 #define LAGG_OPT_LACP_STRICT            0x10            /* LACP strict mode */
151 #define LAGG_OPT_LACP_TXTEST            0x20            /* LACP debug: txtest */
152 #define LAGG_OPT_LACP_RXTEST            0x40            /* LACP debug: rxtest */
153 #define LAGG_OPT_LACP_TIMEOUT           0x80            /* LACP timeout */
154         u_int                   ro_count;               /* number of ports */
155         u_int                   ro_active;              /* active port count */
156         u_int                   ro_flapping;            /* number of flapping */
157         int                     ro_flowid_shift;        /* shift the flowid */
158 };
159
160 #define SIOCGLAGGOPTS           _IOWR('i', 152, struct lagg_reqopts)
161 #define SIOCSLAGGOPTS            _IOW('i', 153, struct lagg_reqopts)
162
163 #define LAGG_OPT_BITS           "\020\001USE_FLOWID\005LACP_STRICT" \
164                                 "\006LACP_TXTEST\007LACP_RXTEST"
165
166 #ifdef _KERNEL
167
168 /*
169  * Internal kernel part
170  */
171
172 #define LAGG_PORTACTIVE(_tp)    (                                       \
173         ((_tp)->lp_ifp->if_link_state == LINK_STATE_UP) &&              \
174         ((_tp)->lp_ifp->if_flags & IFF_UP)                              \
175 )
176
177 struct lagg_ifreq {
178         union {
179                 struct ifreq ifreq;
180                 struct {
181                         char ifr_name[IFNAMSIZ];
182                         struct sockaddr_storage ifr_ss;
183                 } ifreq_storage;
184         } ifreq;
185 };
186
187 #define sc_ifflags              sc_ifp->if_flags                /* flags */
188 #define sc_ifname               sc_ifp->if_xname                /* name */
189 #define sc_capabilities         sc_ifp->if_capabilities /* capabilities */
190
191 #define IFCAP_LAGG_MASK         0xffff0000      /* private capabilities */
192 #define IFCAP_LAGG_FULLDUPLEX   0x00010000      /* full duplex with >1 ports */
193
194 /* Private data used by the loadbalancing protocol */
195 struct lagg_lb {
196         u_int32_t               lb_key;
197         struct lagg_port        *lb_ports[LAGG_MAX_PORTS];
198 };
199
200 struct lagg_mc {
201         struct sockaddr_dl      mc_addr;
202         struct ifmultiaddr      *mc_ifma;
203         SLIST_ENTRY(lagg_mc)    mc_entries;
204 };
205
206 /* List of interfaces to have the MAC address modified */
207 struct lagg_llq {
208         struct ifnet            *llq_ifp;
209         uint8_t                 llq_lladdr[ETHER_ADDR_LEN];
210         uint8_t                 llq_primary;
211         SLIST_ENTRY(lagg_llq)   llq_entries;
212 };
213
214 struct lagg_counters {
215         uint64_t        val[IFCOUNTERS];
216 };
217
218 struct lagg_softc {
219         struct ifnet                    *sc_ifp;        /* virtual interface */
220         struct rmlock                   sc_mtx;
221         int                             sc_proto;       /* lagg protocol */
222         u_int                           sc_count;       /* number of ports */
223         u_int                           sc_active;      /* active port count */
224         u_int                           sc_flapping;    /* number of flapping
225                                                          * events */
226         struct lagg_port                *sc_primary;    /* primary port */
227         struct ifmedia                  sc_media;       /* media config */
228         void                            *sc_psc;        /* protocol data */
229         uint32_t                        sc_seq;         /* sequence counter */
230         uint32_t                        sc_flags;
231
232         SLIST_HEAD(__tplhd, lagg_port)  sc_ports;       /* list of interfaces */
233         SLIST_ENTRY(lagg_softc) sc_entries;
234
235         struct task                     sc_lladdr_task;
236         SLIST_HEAD(__llqhd, lagg_llq)   sc_llq_head;    /* interfaces to program
237                                                            the lladdr on */
238         eventhandler_tag vlan_attach;
239         eventhandler_tag vlan_detach;
240         struct callout                  sc_callout;
241         u_int                           sc_opts;
242         int                             flowid_shift;   /* shift the flowid */
243         struct lagg_counters            detached_counters; /* detached ports sum */
244 };
245
246 struct lagg_port {
247         struct ifnet                    *lp_ifp;        /* physical interface */
248         struct lagg_softc               *lp_softc;      /* parent lagg */
249         uint8_t                         lp_lladdr[ETHER_ADDR_LEN];
250
251         u_char                          lp_iftype;      /* interface type */
252         uint32_t                        lp_prio;        /* port priority */
253         uint32_t                        lp_flags;       /* port flags */
254         int                             lp_ifflags;     /* saved ifp flags */
255         void                            *lh_cookie;     /* if state hook */
256         void                            *lp_psc;        /* protocol data */
257         int                             lp_detaching;   /* ifnet is detaching */
258
259         SLIST_HEAD(__mclhd, lagg_mc)    lp_mc_head;     /* multicast addresses */
260
261         /* Redirected callbacks */
262         int     (*lp_ioctl)(struct ifnet *, u_long, caddr_t);
263         int     (*lp_output)(struct ifnet *, struct mbuf *,
264                      const struct sockaddr *, struct route *);
265         struct lagg_counters            port_counters;  /* ifp counters copy */
266
267         SLIST_ENTRY(lagg_port)          lp_entries;
268 };
269
270 #define LAGG_LOCK_INIT(_sc)     rm_init(&(_sc)->sc_mtx, "if_lagg rmlock")
271 #define LAGG_LOCK_DESTROY(_sc)  rm_destroy(&(_sc)->sc_mtx)
272 #define LAGG_RLOCK(_sc, _p)     rm_rlock(&(_sc)->sc_mtx, (_p))
273 #define LAGG_WLOCK(_sc)         rm_wlock(&(_sc)->sc_mtx)
274 #define LAGG_RUNLOCK(_sc, _p)   rm_runlock(&(_sc)->sc_mtx, (_p))
275 #define LAGG_WUNLOCK(_sc)       rm_wunlock(&(_sc)->sc_mtx)
276 #define LAGG_RLOCK_ASSERT(_sc)  rm_assert(&(_sc)->sc_mtx, RA_RLOCKED)
277 #define LAGG_WLOCK_ASSERT(_sc)  rm_assert(&(_sc)->sc_mtx, RA_WLOCKED)
278
279 extern struct mbuf *(*lagg_input_p)(struct ifnet *, struct mbuf *);
280 extern void     (*lagg_linkstate_p)(struct ifnet *, int );
281
282 int             lagg_enqueue(struct ifnet *, struct mbuf *);
283
284 SYSCTL_DECL(_net_link_lagg);
285
286 #endif /* _KERNEL */
287
288 #endif /* _NET_LAGG_H */