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