1b47888ceSAndrew Thompson /* $NetBSD: ieee8023ad_impl.h,v 1.2 2005/12/10 23:21:39 elad Exp $ */ 2b47888ceSAndrew Thompson 3b47888ceSAndrew Thompson /*- 4*fe267a55SPedro F. Giffuni * SPDX-License-Identifier: BSD-2-Clause-NetBSD 5*fe267a55SPedro F. Giffuni * 6b47888ceSAndrew Thompson * Copyright (c)2005 YAMAMOTO Takashi, 7b47888ceSAndrew Thompson * All rights reserved. 8b47888ceSAndrew Thompson * 9b47888ceSAndrew Thompson * Redistribution and use in source and binary forms, with or without 10b47888ceSAndrew Thompson * modification, are permitted provided that the following conditions 11b47888ceSAndrew Thompson * are met: 12b47888ceSAndrew Thompson * 1. Redistributions of source code must retain the above copyright 13b47888ceSAndrew Thompson * notice, this list of conditions and the following disclaimer. 14b47888ceSAndrew Thompson * 2. Redistributions in binary form must reproduce the above copyright 15b47888ceSAndrew Thompson * notice, this list of conditions and the following disclaimer in the 16b47888ceSAndrew Thompson * documentation and/or other materials provided with the distribution. 17b47888ceSAndrew Thompson * 18b47888ceSAndrew Thompson * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19b47888ceSAndrew Thompson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20b47888ceSAndrew Thompson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21b47888ceSAndrew Thompson * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22b47888ceSAndrew Thompson * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23b47888ceSAndrew Thompson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24b47888ceSAndrew Thompson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25b47888ceSAndrew Thompson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26b47888ceSAndrew Thompson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27b47888ceSAndrew Thompson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28b47888ceSAndrew Thompson * SUCH DAMAGE. 29b47888ceSAndrew Thompson * 30b47888ceSAndrew Thompson * $FreeBSD$ 31b47888ceSAndrew Thompson */ 32b47888ceSAndrew Thompson 33b47888ceSAndrew Thompson /* 34b47888ceSAndrew Thompson * IEEE802.3ad LACP 35b47888ceSAndrew Thompson * 36b47888ceSAndrew Thompson * implementation details. 37b47888ceSAndrew Thompson */ 38b47888ceSAndrew Thompson 39b47888ceSAndrew Thompson #define LACP_TIMER_CURRENT_WHILE 0 40b47888ceSAndrew Thompson #define LACP_TIMER_PERIODIC 1 41b47888ceSAndrew Thompson #define LACP_TIMER_WAIT_WHILE 2 42b47888ceSAndrew Thompson #define LACP_NTIMER 3 43b47888ceSAndrew Thompson 44b47888ceSAndrew Thompson #define LACP_TIMER_ARM(port, timer, val) \ 45b47888ceSAndrew Thompson (port)->lp_timer[(timer)] = (val) 46b47888ceSAndrew Thompson #define LACP_TIMER_DISARM(port, timer) \ 47b47888ceSAndrew Thompson (port)->lp_timer[(timer)] = 0 48b47888ceSAndrew Thompson #define LACP_TIMER_ISARMED(port, timer) \ 49b47888ceSAndrew Thompson ((port)->lp_timer[(timer)] > 0) 50b47888ceSAndrew Thompson 51b47888ceSAndrew Thompson /* 52b47888ceSAndrew Thompson * IEEE802.3ad LACP 53b47888ceSAndrew Thompson * 54b47888ceSAndrew Thompson * protocol definitions. 55b47888ceSAndrew Thompson */ 56b47888ceSAndrew Thompson 57b47888ceSAndrew Thompson #define LACP_STATE_ACTIVITY (1<<0) 58b47888ceSAndrew Thompson #define LACP_STATE_TIMEOUT (1<<1) 59b47888ceSAndrew Thompson #define LACP_STATE_AGGREGATION (1<<2) 60b47888ceSAndrew Thompson #define LACP_STATE_SYNC (1<<3) 61b47888ceSAndrew Thompson #define LACP_STATE_COLLECTING (1<<4) 62b47888ceSAndrew Thompson #define LACP_STATE_DISTRIBUTING (1<<5) 63b47888ceSAndrew Thompson #define LACP_STATE_DEFAULTED (1<<6) 64b47888ceSAndrew Thompson #define LACP_STATE_EXPIRED (1<<7) 65b47888ceSAndrew Thompson 66b47888ceSAndrew Thompson #define LACP_PORT_NTT 0x00000001 67998971a7SAndrew Thompson #define LACP_PORT_MARK 0x00000002 68b47888ceSAndrew Thompson 69b47888ceSAndrew Thompson #define LACP_STATE_BITS \ 70b47888ceSAndrew Thompson "\020" \ 71b47888ceSAndrew Thompson "\001ACTIVITY" \ 72b47888ceSAndrew Thompson "\002TIMEOUT" \ 73b47888ceSAndrew Thompson "\003AGGREGATION" \ 74b47888ceSAndrew Thompson "\004SYNC" \ 75b47888ceSAndrew Thompson "\005COLLECTING" \ 76b47888ceSAndrew Thompson "\006DISTRIBUTING" \ 77b47888ceSAndrew Thompson "\007DEFAULTED" \ 78b47888ceSAndrew Thompson "\010EXPIRED" 79b47888ceSAndrew Thompson 807eb756faSHiroki Sato #ifdef _KERNEL 81b47888ceSAndrew Thompson /* 82b47888ceSAndrew Thompson * IEEE802.3 slow protocols 83b47888ceSAndrew Thompson * 84b47888ceSAndrew Thompson * protocol (on-wire) definitions. 85b47888ceSAndrew Thompson * 86b47888ceSAndrew Thompson * XXX should be elsewhere. 87b47888ceSAndrew Thompson */ 88b47888ceSAndrew Thompson 89b47888ceSAndrew Thompson #define SLOWPROTOCOLS_SUBTYPE_LACP 1 90b47888ceSAndrew Thompson #define SLOWPROTOCOLS_SUBTYPE_MARKER 2 91b47888ceSAndrew Thompson 92b47888ceSAndrew Thompson struct slowprothdr { 93b47888ceSAndrew Thompson uint8_t sph_subtype; 94b47888ceSAndrew Thompson uint8_t sph_version; 95b47888ceSAndrew Thompson } __packed; 96b47888ceSAndrew Thompson 97b47888ceSAndrew Thompson /* 98b47888ceSAndrew Thompson * TLV on-wire structure. 99b47888ceSAndrew Thompson */ 100b47888ceSAndrew Thompson 101b47888ceSAndrew Thompson struct tlvhdr { 102b47888ceSAndrew Thompson uint8_t tlv_type; 103b47888ceSAndrew Thompson uint8_t tlv_length; 104b47888ceSAndrew Thompson /* uint8_t tlv_value[]; */ 105b47888ceSAndrew Thompson } __packed; 106b47888ceSAndrew Thompson 107b47888ceSAndrew Thompson /* 108b47888ceSAndrew Thompson * ... and our implementation. 109b47888ceSAndrew Thompson */ 110b47888ceSAndrew Thompson 111b47888ceSAndrew Thompson #define TLV_SET(tlv, type, length) \ 112b47888ceSAndrew Thompson do { \ 113b47888ceSAndrew Thompson (tlv)->tlv_type = (type); \ 114b47888ceSAndrew Thompson (tlv)->tlv_length = sizeof(*tlv) + (length); \ 115b47888ceSAndrew Thompson } while (/*CONSTCOND*/0) 116b47888ceSAndrew Thompson 117b47888ceSAndrew Thompson struct tlv_template { 118b47888ceSAndrew Thompson uint8_t tmpl_type; 119b47888ceSAndrew Thompson uint8_t tmpl_length; 120b47888ceSAndrew Thompson }; 121b47888ceSAndrew Thompson 122b47888ceSAndrew Thompson struct lacp_systemid { 123b47888ceSAndrew Thompson uint16_t lsi_prio; 124b47888ceSAndrew Thompson uint8_t lsi_mac[6]; 125b47888ceSAndrew Thompson } __packed; 126b47888ceSAndrew Thompson 127b47888ceSAndrew Thompson struct lacp_portid { 128b47888ceSAndrew Thompson uint16_t lpi_prio; 129b47888ceSAndrew Thompson uint16_t lpi_portno; 130b47888ceSAndrew Thompson } __packed; 131b47888ceSAndrew Thompson 132b47888ceSAndrew Thompson struct lacp_peerinfo { 133b47888ceSAndrew Thompson struct lacp_systemid lip_systemid; 134b47888ceSAndrew Thompson uint16_t lip_key; 135b47888ceSAndrew Thompson struct lacp_portid lip_portid; 136b47888ceSAndrew Thompson uint8_t lip_state; 137b47888ceSAndrew Thompson uint8_t lip_resv[3]; 138b47888ceSAndrew Thompson } __packed; 139b47888ceSAndrew Thompson 140b47888ceSAndrew Thompson struct lacp_collectorinfo { 141b47888ceSAndrew Thompson uint16_t lci_maxdelay; 142b47888ceSAndrew Thompson uint8_t lci_resv[12]; 143b47888ceSAndrew Thompson } __packed; 144b47888ceSAndrew Thompson 145b47888ceSAndrew Thompson struct lacpdu { 146b47888ceSAndrew Thompson struct ether_header ldu_eh; 147b47888ceSAndrew Thompson struct slowprothdr ldu_sph; 148b47888ceSAndrew Thompson 149b47888ceSAndrew Thompson struct tlvhdr ldu_tlv_actor; 150b47888ceSAndrew Thompson struct lacp_peerinfo ldu_actor; 151b47888ceSAndrew Thompson struct tlvhdr ldu_tlv_partner; 152b47888ceSAndrew Thompson struct lacp_peerinfo ldu_partner; 153b47888ceSAndrew Thompson struct tlvhdr ldu_tlv_collector; 154b47888ceSAndrew Thompson struct lacp_collectorinfo ldu_collector; 155b47888ceSAndrew Thompson struct tlvhdr ldu_tlv_term; 156b47888ceSAndrew Thompson uint8_t ldu_resv[50]; 157b47888ceSAndrew Thompson } __packed; 158b47888ceSAndrew Thompson 159998971a7SAndrew Thompson /* 160998971a7SAndrew Thompson * IEEE802.3ad marker protocol 161998971a7SAndrew Thompson * 162998971a7SAndrew Thompson * protocol (on-wire) definitions. 163998971a7SAndrew Thompson */ 164998971a7SAndrew Thompson struct lacp_markerinfo { 165998971a7SAndrew Thompson uint16_t mi_rq_port; 166998971a7SAndrew Thompson uint8_t mi_rq_system[ETHER_ADDR_LEN]; 167998971a7SAndrew Thompson uint32_t mi_rq_xid; 168998971a7SAndrew Thompson uint8_t mi_pad[2]; 169998971a7SAndrew Thompson } __packed; 170998971a7SAndrew Thompson 171998971a7SAndrew Thompson struct markerdu { 172998971a7SAndrew Thompson struct ether_header mdu_eh; 173998971a7SAndrew Thompson struct slowprothdr mdu_sph; 174998971a7SAndrew Thompson 175998971a7SAndrew Thompson struct tlvhdr mdu_tlv; 176998971a7SAndrew Thompson struct lacp_markerinfo mdu_info; 177998971a7SAndrew Thompson struct tlvhdr mdu_tlv_term; 178998971a7SAndrew Thompson uint8_t mdu_resv[90]; 179998971a7SAndrew Thompson } __packed; 180998971a7SAndrew Thompson 181998971a7SAndrew Thompson #define MARKER_TYPE_INFO 0x01 182998971a7SAndrew Thompson #define MARKER_TYPE_RESPONSE 0x02 183b47888ceSAndrew Thompson 184b47888ceSAndrew Thompson enum lacp_selected { 185b47888ceSAndrew Thompson LACP_UNSELECTED, 186b47888ceSAndrew Thompson LACP_STANDBY, /* not used in this implementation */ 187b47888ceSAndrew Thompson LACP_SELECTED, 188b47888ceSAndrew Thompson }; 189b47888ceSAndrew Thompson 190b47888ceSAndrew Thompson enum lacp_mux_state { 191b47888ceSAndrew Thompson LACP_MUX_DETACHED, 192b47888ceSAndrew Thompson LACP_MUX_WAITING, 193b47888ceSAndrew Thompson LACP_MUX_ATTACHED, 194b47888ceSAndrew Thompson LACP_MUX_COLLECTING, 195b47888ceSAndrew Thompson LACP_MUX_DISTRIBUTING, 196b47888ceSAndrew Thompson }; 197b47888ceSAndrew Thompson 1983de18008SAndrew Thompson #define LACP_MAX_PORTS 32 1993de18008SAndrew Thompson 2003de18008SAndrew Thompson struct lacp_portmap { 2013de18008SAndrew Thompson int pm_count; 2023de18008SAndrew Thompson struct lacp_port *pm_map[LACP_MAX_PORTS]; 2033de18008SAndrew Thompson }; 2043de18008SAndrew Thompson 205b47888ceSAndrew Thompson struct lacp_port { 206b47888ceSAndrew Thompson TAILQ_ENTRY(lacp_port) lp_dist_q; 207b47888ceSAndrew Thompson LIST_ENTRY(lacp_port) lp_next; 208b47888ceSAndrew Thompson struct lacp_softc *lp_lsc; 20918242d3bSAndrew Thompson struct lagg_port *lp_lagg; 210b47888ceSAndrew Thompson struct ifnet *lp_ifp; 211b47888ceSAndrew Thompson struct lacp_peerinfo lp_partner; 212b47888ceSAndrew Thompson struct lacp_peerinfo lp_actor; 213998971a7SAndrew Thompson struct lacp_markerinfo lp_marker; 214b47888ceSAndrew Thompson #define lp_state lp_actor.lip_state 215b47888ceSAndrew Thompson #define lp_key lp_actor.lip_key 216998971a7SAndrew Thompson #define lp_systemid lp_actor.lip_systemid 217b47888ceSAndrew Thompson struct timeval lp_last_lacpdu; 218b47888ceSAndrew Thompson int lp_lacpdu_sent; 219b47888ceSAndrew Thompson enum lacp_mux_state lp_mux_state; 220b47888ceSAndrew Thompson enum lacp_selected lp_selected; 221b47888ceSAndrew Thompson int lp_flags; 222b47888ceSAndrew Thompson u_int lp_media; /* XXX redundant */ 223b47888ceSAndrew Thompson int lp_timer[LACP_NTIMER]; 224d74fd345SAndrew Thompson struct ifmultiaddr *lp_ifma; 225b47888ceSAndrew Thompson 226b47888ceSAndrew Thompson struct lacp_aggregator *lp_aggregator; 227b47888ceSAndrew Thompson }; 228b47888ceSAndrew Thompson 229b47888ceSAndrew Thompson struct lacp_aggregator { 230b47888ceSAndrew Thompson TAILQ_ENTRY(lacp_aggregator) la_q; 231b47888ceSAndrew Thompson int la_refcnt; /* num of ports which selected us */ 232b47888ceSAndrew Thompson int la_nports; /* num of distributing ports */ 233b47888ceSAndrew Thompson TAILQ_HEAD(, lacp_port) la_ports; /* distributing ports */ 234b47888ceSAndrew Thompson struct lacp_peerinfo la_partner; 235b47888ceSAndrew Thompson struct lacp_peerinfo la_actor; 236ec32b37eSAndrew Thompson int la_pending; /* number of ports in wait_while */ 237b47888ceSAndrew Thompson }; 238b47888ceSAndrew Thompson 239b47888ceSAndrew Thompson struct lacp_softc { 240ec32b37eSAndrew Thompson struct lagg_softc *lsc_softc; 2413de18008SAndrew Thompson struct mtx lsc_mtx; 242b47888ceSAndrew Thompson struct lacp_aggregator *lsc_active_aggregator; 243b47888ceSAndrew Thompson TAILQ_HEAD(, lacp_aggregator) lsc_aggregators; 244b47888ceSAndrew Thompson boolean_t lsc_suppress_distributing; 245b47888ceSAndrew Thompson struct callout lsc_transit_callout; 246b47888ceSAndrew Thompson struct callout lsc_callout; 247b47888ceSAndrew Thompson LIST_HEAD(, lacp_port) lsc_ports; 2483de18008SAndrew Thompson struct lacp_portmap lsc_pmap[2]; 2493de18008SAndrew Thompson volatile u_int lsc_activemap; 250b47888ceSAndrew Thompson u_int32_t lsc_hashkey; 25149de4f22SAdrian Chadd struct { 25249de4f22SAdrian Chadd u_int32_t lsc_rx_test; 25349de4f22SAdrian Chadd u_int32_t lsc_tx_test; 25449de4f22SAdrian Chadd } lsc_debug; 25549de4f22SAdrian Chadd u_int32_t lsc_strict_mode; 2560e02b43aSHiren Panchasara boolean_t lsc_fast_timeout; /* if set, fast timeout */ 257b47888ceSAndrew Thompson }; 258b47888ceSAndrew Thompson 259b47888ceSAndrew Thompson #define LACP_TYPE_ACTORINFO 1 260b47888ceSAndrew Thompson #define LACP_TYPE_PARTNERINFO 2 261b47888ceSAndrew Thompson #define LACP_TYPE_COLLECTORINFO 3 262b47888ceSAndrew Thompson 263b47888ceSAndrew Thompson /* timeout values (in sec) */ 264b47888ceSAndrew Thompson #define LACP_FAST_PERIODIC_TIME (1) 265b47888ceSAndrew Thompson #define LACP_SLOW_PERIODIC_TIME (30) 266b47888ceSAndrew Thompson #define LACP_SHORT_TIMEOUT_TIME (3 * LACP_FAST_PERIODIC_TIME) 267b47888ceSAndrew Thompson #define LACP_LONG_TIMEOUT_TIME (3 * LACP_SLOW_PERIODIC_TIME) 268b47888ceSAndrew Thompson #define LACP_CHURN_DETECTION_TIME (60) 269b47888ceSAndrew Thompson #define LACP_AGGREGATE_WAIT_TIME (2) 270998971a7SAndrew Thompson #define LACP_TRANSIT_DELAY 3000 /* in msec */ 271b47888ceSAndrew Thompson 272b47888ceSAndrew Thompson #define LACP_STATE_EQ(s1, s2, mask) \ 273b47888ceSAndrew Thompson ((((s1) ^ (s2)) & (mask)) == 0) 274b47888ceSAndrew Thompson 275fe45e65fSAndrew Thompson #define LACP_SYS_PRI(peer) (peer).lip_systemid.lsi_prio 276fe45e65fSAndrew Thompson 27718242d3bSAndrew Thompson #define LACP_PORT(_lp) ((struct lacp_port *)(_lp)->lp_psc) 27818242d3bSAndrew Thompson #define LACP_SOFTC(_sc) ((struct lacp_softc *)(_sc)->sc_psc) 279b47888ceSAndrew Thompson 2803de18008SAndrew Thompson #define LACP_LOCK_INIT(_lsc) mtx_init(&(_lsc)->lsc_mtx, \ 28169f04a82SAndrew Thompson "lacp mtx", NULL, MTX_DEF) 28269f04a82SAndrew Thompson #define LACP_LOCK_DESTROY(_lsc) mtx_destroy(&(_lsc)->lsc_mtx) 2833de18008SAndrew Thompson #define LACP_LOCK(_lsc) mtx_lock(&(_lsc)->lsc_mtx) 2843de18008SAndrew Thompson #define LACP_UNLOCK(_lsc) mtx_unlock(&(_lsc)->lsc_mtx) 2853de18008SAndrew Thompson #define LACP_LOCK_ASSERT(_lsc) mtx_assert(&(_lsc)->lsc_mtx, MA_OWNED) 2863de18008SAndrew Thompson 287af0084c9SAndrew Thompson struct mbuf *lacp_input(struct lagg_port *, struct mbuf *); 28818242d3bSAndrew Thompson struct lagg_port *lacp_select_tx_port(struct lagg_softc *, struct mbuf *); 289f3e7afe2SHans Petter Selasky #ifdef RATELIMIT 290f3e7afe2SHans Petter Selasky struct lagg_port *lacp_select_tx_port_by_hash(struct lagg_softc *, uint32_t); 291f3e7afe2SHans Petter Selasky #endif 29209c7577eSGleb Smirnoff void lacp_attach(struct lagg_softc *); 29309c7577eSGleb Smirnoff void lacp_detach(void *); 29418242d3bSAndrew Thompson void lacp_init(struct lagg_softc *); 29518242d3bSAndrew Thompson void lacp_stop(struct lagg_softc *); 29618242d3bSAndrew Thompson int lacp_port_create(struct lagg_port *); 29718242d3bSAndrew Thompson void lacp_port_destroy(struct lagg_port *); 29818242d3bSAndrew Thompson void lacp_linkstate(struct lagg_port *); 2996900d0d3SGleb Smirnoff void lacp_req(struct lagg_softc *, void *); 3006900d0d3SGleb Smirnoff void lacp_portreq(struct lagg_port *, void *); 301b47888ceSAndrew Thompson 3023de18008SAndrew Thompson static __inline int 3033de18008SAndrew Thompson lacp_isactive(struct lagg_port *lgp) 3043de18008SAndrew Thompson { 3053de18008SAndrew Thompson struct lacp_port *lp = LACP_PORT(lgp); 3063de18008SAndrew Thompson struct lacp_softc *lsc = lp->lp_lsc; 3073de18008SAndrew Thompson struct lacp_aggregator *la = lp->lp_aggregator; 3083de18008SAndrew Thompson 3093de18008SAndrew Thompson /* This port is joined to the active aggregator */ 3103de18008SAndrew Thompson if (la != NULL && la == lsc->lsc_active_aggregator) 3113de18008SAndrew Thompson return (1); 3123de18008SAndrew Thompson 3133de18008SAndrew Thompson return (0); 3143de18008SAndrew Thompson } 3153de18008SAndrew Thompson 3163de18008SAndrew Thompson static __inline int 3173de18008SAndrew Thompson lacp_iscollecting(struct lagg_port *lgp) 3183de18008SAndrew Thompson { 3193de18008SAndrew Thompson struct lacp_port *lp = LACP_PORT(lgp); 3203de18008SAndrew Thompson 3213de18008SAndrew Thompson return ((lp->lp_state & LACP_STATE_COLLECTING) != 0); 3223de18008SAndrew Thompson } 3233de18008SAndrew Thompson 3243de18008SAndrew Thompson static __inline int 3253de18008SAndrew Thompson lacp_isdistributing(struct lagg_port *lgp) 3263de18008SAndrew Thompson { 3273de18008SAndrew Thompson struct lacp_port *lp = LACP_PORT(lgp); 3283de18008SAndrew Thompson 3293de18008SAndrew Thompson return ((lp->lp_state & LACP_STATE_DISTRIBUTING) != 0); 3303de18008SAndrew Thompson } 3313de18008SAndrew Thompson 332b47888ceSAndrew Thompson /* following constants don't include terminating NUL */ 333b47888ceSAndrew Thompson #define LACP_MACSTR_MAX (2*6 + 5) 334b47888ceSAndrew Thompson #define LACP_SYSTEMPRIOSTR_MAX (4) 335b47888ceSAndrew Thompson #define LACP_SYSTEMIDSTR_MAX (LACP_SYSTEMPRIOSTR_MAX + 1 + LACP_MACSTR_MAX) 336b47888ceSAndrew Thompson #define LACP_PORTPRIOSTR_MAX (4) 337b47888ceSAndrew Thompson #define LACP_PORTNOSTR_MAX (4) 338b47888ceSAndrew Thompson #define LACP_PORTIDSTR_MAX (LACP_PORTPRIOSTR_MAX + 1 + LACP_PORTNOSTR_MAX) 339b47888ceSAndrew Thompson #define LACP_KEYSTR_MAX (4) 340b47888ceSAndrew Thompson #define LACP_PARTNERSTR_MAX \ 341b47888ceSAndrew Thompson (1 + LACP_SYSTEMIDSTR_MAX + 1 + LACP_KEYSTR_MAX + 1 \ 342b47888ceSAndrew Thompson + LACP_PORTIDSTR_MAX + 1) 343b47888ceSAndrew Thompson #define LACP_LAGIDSTR_MAX \ 344b47888ceSAndrew Thompson (1 + LACP_PARTNERSTR_MAX + 1 + LACP_PARTNERSTR_MAX + 1) 345b47888ceSAndrew Thompson #define LACP_STATESTR_MAX (255) /* XXX */ 3467eb756faSHiroki Sato #endif /* _KERNEL */ 347