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_BROADCAST, /* broadcast */ |
---|
57 | LAGG_PROTO_MAX, |
---|
58 | } lagg_proto; |
---|
59 | |
---|
60 | struct lagg_protos { |
---|
61 | const char *lpr_name; |
---|
62 | lagg_proto lpr_proto; |
---|
63 | }; |
---|
64 | |
---|
65 | #define LAGG_PROTO_DEFAULT LAGG_PROTO_FAILOVER |
---|
66 | #define LAGG_PROTOS { \ |
---|
67 | { "failover", LAGG_PROTO_FAILOVER }, \ |
---|
68 | { "lacp", LAGG_PROTO_LACP }, \ |
---|
69 | { "loadbalance", LAGG_PROTO_LOADBALANCE }, \ |
---|
70 | { "roundrobin", LAGG_PROTO_ROUNDROBIN }, \ |
---|
71 | { "broadcast", LAGG_PROTO_BROADCAST }, \ |
---|
72 | { "none", LAGG_PROTO_NONE }, \ |
---|
73 | { "default", LAGG_PROTO_DEFAULT } \ |
---|
74 | } |
---|
75 | |
---|
76 | /* |
---|
77 | * lagg ioctls. |
---|
78 | */ |
---|
79 | |
---|
80 | /* |
---|
81 | * LACP current operational parameters structure. |
---|
82 | */ |
---|
83 | struct lacp_opreq { |
---|
84 | uint16_t actor_prio; |
---|
85 | uint8_t actor_mac[ETHER_ADDR_LEN]; |
---|
86 | uint16_t actor_key; |
---|
87 | uint16_t actor_portprio; |
---|
88 | uint16_t actor_portno; |
---|
89 | uint8_t actor_state; |
---|
90 | uint16_t partner_prio; |
---|
91 | uint8_t partner_mac[ETHER_ADDR_LEN]; |
---|
92 | uint16_t partner_key; |
---|
93 | uint16_t partner_portprio; |
---|
94 | uint16_t partner_portno; |
---|
95 | uint8_t partner_state; |
---|
96 | }; |
---|
97 | |
---|
98 | /* lagg port settings */ |
---|
99 | struct lagg_reqport { |
---|
100 | char rp_ifname[IFNAMSIZ]; /* name of the lagg */ |
---|
101 | char rp_portname[IFNAMSIZ]; /* name of the port */ |
---|
102 | u_int32_t rp_prio; /* port priority */ |
---|
103 | u_int32_t rp_flags; /* port flags */ |
---|
104 | union { |
---|
105 | struct lacp_opreq rpsc_lacp; |
---|
106 | } rp_psc; |
---|
107 | #define rp_lacpreq rp_psc.rpsc_lacp |
---|
108 | }; |
---|
109 | |
---|
110 | #define SIOCGLAGGPORT _IOWR('i', 140, struct lagg_reqport) |
---|
111 | #define SIOCSLAGGPORT _IOW('i', 141, struct lagg_reqport) |
---|
112 | #define SIOCSLAGGDELPORT _IOW('i', 142, struct lagg_reqport) |
---|
113 | |
---|
114 | /* lagg, ports and options */ |
---|
115 | struct lagg_reqall { |
---|
116 | char ra_ifname[IFNAMSIZ]; /* name of the lagg */ |
---|
117 | u_int ra_proto; /* lagg protocol */ |
---|
118 | |
---|
119 | size_t ra_size; /* size of buffer */ |
---|
120 | struct lagg_reqport *ra_port; /* allocated buffer */ |
---|
121 | int ra_ports; /* total port count */ |
---|
122 | union { |
---|
123 | struct lacp_opreq rpsc_lacp; |
---|
124 | } ra_psc; |
---|
125 | #define ra_lacpreq ra_psc.rpsc_lacp |
---|
126 | }; |
---|
127 | |
---|
128 | #define SIOCGLAGG _IOWR('i', 143, struct lagg_reqall) |
---|
129 | #define SIOCSLAGG _IOW('i', 144, struct lagg_reqall) |
---|
130 | |
---|
131 | struct lagg_reqflags { |
---|
132 | char rf_ifname[IFNAMSIZ]; /* name of the lagg */ |
---|
133 | uint32_t rf_flags; /* lagg protocol */ |
---|
134 | }; |
---|
135 | |
---|
136 | #define SIOCGLAGGFLAGS _IOWR('i', 145, struct lagg_reqflags) |
---|
137 | #define SIOCSLAGGHASH _IOW('i', 146, struct lagg_reqflags) |
---|
138 | |
---|
139 | struct lagg_reqopts { |
---|
140 | char ro_ifname[IFNAMSIZ]; /* name of the lagg */ |
---|
141 | |
---|
142 | int ro_opts; /* Option bitmap */ |
---|
143 | #define LAGG_OPT_NONE 0x00 |
---|
144 | #define LAGG_OPT_USE_FLOWID 0x01 /* enable use of flowid */ |
---|
145 | /* Pseudo flags which are used in ro_opts but not stored into sc_opts. */ |
---|
146 | #define LAGG_OPT_FLOWIDSHIFT 0x02 /* set flowid shift */ |
---|
147 | #define LAGG_OPT_FLOWIDSHIFT_MASK 0x1f /* flowid is uint32_t */ |
---|
148 | #define LAGG_OPT_LACP_STRICT 0x10 /* LACP strict mode */ |
---|
149 | #define LAGG_OPT_LACP_TXTEST 0x20 /* LACP debug: txtest */ |
---|
150 | #define LAGG_OPT_LACP_RXTEST 0x40 /* LACP debug: rxtest */ |
---|
151 | #define LAGG_OPT_LACP_TIMEOUT 0x80 /* LACP timeout */ |
---|
152 | u_int ro_count; /* number of ports */ |
---|
153 | u_int ro_active; /* active port count */ |
---|
154 | u_int ro_flapping; /* number of flapping */ |
---|
155 | int ro_flowid_shift; /* shift the flowid */ |
---|
156 | uint32_t ro_bkt; /* packet bucket for roundrobin */ |
---|
157 | }; |
---|
158 | |
---|
159 | #define SIOCGLAGGOPTS _IOWR('i', 152, struct lagg_reqopts) |
---|
160 | #define SIOCSLAGGOPTS _IOW('i', 153, struct lagg_reqopts) |
---|
161 | |
---|
162 | #define LAGG_OPT_BITS "\020\001USE_FLOWID\005LACP_STRICT" \ |
---|
163 | "\006LACP_TXTEST\007LACP_RXTEST" |
---|
164 | |
---|
165 | #ifdef _KERNEL |
---|
166 | |
---|
167 | /* |
---|
168 | * Internal kernel part |
---|
169 | */ |
---|
170 | |
---|
171 | #define LAGG_PORTACTIVE(_tp) ( \ |
---|
172 | ((_tp)->lp_ifp->if_link_state == LINK_STATE_UP) && \ |
---|
173 | ((_tp)->lp_ifp->if_flags & IFF_UP) \ |
---|
174 | ) |
---|
175 | |
---|
176 | struct lagg_ifreq { |
---|
177 | union { |
---|
178 | struct ifreq ifreq; |
---|
179 | struct { |
---|
180 | char ifr_name[IFNAMSIZ]; |
---|
181 | struct sockaddr_storage ifr_ss; |
---|
182 | } ifreq_storage; |
---|
183 | } ifreq; |
---|
184 | }; |
---|
185 | |
---|
186 | #define sc_ifflags sc_ifp->if_flags /* flags */ |
---|
187 | #define sc_ifname sc_ifp->if_xname /* name */ |
---|
188 | #define sc_capabilities sc_ifp->if_capabilities /* capabilities */ |
---|
189 | |
---|
190 | #define IFCAP_LAGG_MASK 0xffff0000 /* private capabilities */ |
---|
191 | #define IFCAP_LAGG_FULLDUPLEX 0x00010000 /* full duplex with >1 ports */ |
---|
192 | |
---|
193 | /* Private data used by the loadbalancing protocol */ |
---|
194 | struct lagg_lb { |
---|
195 | u_int32_t lb_key; |
---|
196 | struct lagg_port *lb_ports[LAGG_MAX_PORTS]; |
---|
197 | }; |
---|
198 | |
---|
199 | struct lagg_mc { |
---|
200 | struct sockaddr_dl mc_addr; |
---|
201 | struct ifmultiaddr *mc_ifma; |
---|
202 | SLIST_ENTRY(lagg_mc) mc_entries; |
---|
203 | }; |
---|
204 | |
---|
205 | typedef enum { |
---|
206 | LAGG_LLQTYPE_PHYS = 0, /* Task related to physical (underlying) port */ |
---|
207 | LAGG_LLQTYPE_VIRT, /* Task related to lagg interface itself */ |
---|
208 | } lagg_llqtype; |
---|
209 | |
---|
210 | /* List of interfaces to have the MAC address modified */ |
---|
211 | struct lagg_llq { |
---|
212 | struct ifnet *llq_ifp; |
---|
213 | uint8_t llq_lladdr[ETHER_ADDR_LEN]; |
---|
214 | lagg_llqtype llq_type; |
---|
215 | SLIST_ENTRY(lagg_llq) llq_entries; |
---|
216 | }; |
---|
217 | |
---|
218 | struct lagg_counters { |
---|
219 | uint64_t val[IFCOUNTERS]; |
---|
220 | }; |
---|
221 | |
---|
222 | struct lagg_softc { |
---|
223 | struct ifnet *sc_ifp; /* virtual interface */ |
---|
224 | struct rmlock sc_mtx; |
---|
225 | int sc_proto; /* lagg protocol */ |
---|
226 | u_int sc_count; /* number of ports */ |
---|
227 | u_int sc_active; /* active port count */ |
---|
228 | u_int sc_flapping; /* number of flapping |
---|
229 | * events */ |
---|
230 | struct lagg_port *sc_primary; /* primary port */ |
---|
231 | struct ifmedia sc_media; /* media config */ |
---|
232 | void *sc_psc; /* protocol data */ |
---|
233 | uint32_t sc_seq; /* sequence counter */ |
---|
234 | uint32_t sc_flags; |
---|
235 | |
---|
236 | SLIST_HEAD(__tplhd, lagg_port) sc_ports; /* list of interfaces */ |
---|
237 | SLIST_ENTRY(lagg_softc) sc_entries; |
---|
238 | |
---|
239 | struct task sc_lladdr_task; |
---|
240 | SLIST_HEAD(__llqhd, lagg_llq) sc_llq_head; /* interfaces to program |
---|
241 | the lladdr on */ |
---|
242 | eventhandler_tag vlan_attach; |
---|
243 | eventhandler_tag vlan_detach; |
---|
244 | struct callout sc_callout; |
---|
245 | u_int sc_opts; |
---|
246 | int flowid_shift; /* shift the flowid */ |
---|
247 | uint32_t sc_bkt; /* packates bucket for roundrobin */ |
---|
248 | uint32_t sc_bkt_count; /* packates bucket count for roundrobin */ |
---|
249 | struct lagg_counters detached_counters; /* detached ports sum */ |
---|
250 | }; |
---|
251 | |
---|
252 | struct lagg_port { |
---|
253 | struct ifnet *lp_ifp; /* physical interface */ |
---|
254 | struct lagg_softc *lp_softc; /* parent lagg */ |
---|
255 | uint8_t lp_lladdr[ETHER_ADDR_LEN]; |
---|
256 | |
---|
257 | u_char lp_iftype; /* interface type */ |
---|
258 | uint32_t lp_prio; /* port priority */ |
---|
259 | uint32_t lp_flags; /* port flags */ |
---|
260 | int lp_ifflags; /* saved ifp flags */ |
---|
261 | void *lh_cookie; /* if state hook */ |
---|
262 | void *lp_psc; /* protocol data */ |
---|
263 | int lp_detaching; /* ifnet is detaching */ |
---|
264 | #define LAGG_PORT_DETACH 0x01 /* detach lagg port */ |
---|
265 | #define LAGG_CLONE_DESTROY 0x02 /* destroy lagg clone */ |
---|
266 | |
---|
267 | SLIST_HEAD(__mclhd, lagg_mc) lp_mc_head; /* multicast addresses */ |
---|
268 | |
---|
269 | /* Redirected callbacks */ |
---|
270 | int (*lp_ioctl)(struct ifnet *, u_long, caddr_t); |
---|
271 | int (*lp_output)(struct ifnet *, struct mbuf *, |
---|
272 | const struct sockaddr *, struct route *); |
---|
273 | struct lagg_counters port_counters; /* ifp counters copy */ |
---|
274 | |
---|
275 | SLIST_ENTRY(lagg_port) lp_entries; |
---|
276 | }; |
---|
277 | |
---|
278 | #define LAGG_LOCK_INIT(_sc) rm_init(&(_sc)->sc_mtx, "if_lagg rmlock") |
---|
279 | #define LAGG_LOCK_DESTROY(_sc) rm_destroy(&(_sc)->sc_mtx) |
---|
280 | #define LAGG_RLOCK(_sc, _p) rm_rlock(&(_sc)->sc_mtx, (_p)) |
---|
281 | #define LAGG_WLOCK(_sc) rm_wlock(&(_sc)->sc_mtx) |
---|
282 | #define LAGG_RUNLOCK(_sc, _p) rm_runlock(&(_sc)->sc_mtx, (_p)) |
---|
283 | #define LAGG_WUNLOCK(_sc) rm_wunlock(&(_sc)->sc_mtx) |
---|
284 | #define LAGG_RLOCK_ASSERT(_sc) rm_assert(&(_sc)->sc_mtx, RA_RLOCKED) |
---|
285 | #define LAGG_WLOCK_ASSERT(_sc) rm_assert(&(_sc)->sc_mtx, RA_WLOCKED) |
---|
286 | #define LAGG_UNLOCK_ASSERT(_sc) rm_assert(&(_sc)->sc_mtx, RA_UNLOCKED) |
---|
287 | |
---|
288 | extern struct mbuf *(*lagg_input_p)(struct ifnet *, struct mbuf *); |
---|
289 | extern void (*lagg_linkstate_p)(struct ifnet *, int ); |
---|
290 | |
---|
291 | int lagg_enqueue(struct ifnet *, struct mbuf *); |
---|
292 | |
---|
293 | SYSCTL_DECL(_net_link_lagg); |
---|
294 | |
---|
295 | #endif /* _KERNEL */ |
---|
296 | |
---|
297 | #endif /* _NET_LAGG_H */ |
---|