source: rtems-libbsd/freebsd/sys/net/if_lagg.h @ 09bbedc

55-freebsd-126-freebsd-12
Last change on this file since 09bbedc was de8a76d, checked in by Sebastian Huber <sebastian.huber@…>, on 04/04/17 at 07:36:57

Update to FreeBSD head 2017-04-04

Git mirror commit 642b174daddbd0efd9bb5f242c43f4ab4db6869f.

  • Property mode set to 100644
File size: 9.4 KB
Line 
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 */
50typedef 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
60struct 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 */
83struct 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 */
99struct 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 */
115struct 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
131struct 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
139struct 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
176struct 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 */
194struct lagg_lb {
195        u_int32_t               lb_key;
196        struct lagg_port        *lb_ports[LAGG_MAX_PORTS];
197};
198
199struct lagg_mc {
200        struct sockaddr_dl      mc_addr;
201        struct ifmultiaddr      *mc_ifma;
202        SLIST_ENTRY(lagg_mc)    mc_entries;
203};
204
205typedef 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 */
211struct 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
218struct lagg_counters {
219        uint64_t        val[IFCOUNTERS];
220};
221
222struct 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
252struct 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
288extern struct mbuf *(*lagg_input_p)(struct ifnet *, struct mbuf *);
289extern void     (*lagg_linkstate_p)(struct ifnet *, int );
290
291int             lagg_enqueue(struct ifnet *, struct mbuf *);
292
293SYSCTL_DECL(_net_link_lagg);
294
295#endif /* _KERNEL */
296
297#endif /* _NET_LAGG_H */
Note: See TracBrowser for help on using the repository browser.