Home | History | Annotate | Line # | Download | only in lagg
      1 /*	$NetBSD: if_lagg.h,v 1.4 2024/04/04 07:55:32 yamaguchi Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 2005, 2006 Reyk Floeter <reyk (at) 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 /*
     22  * Copyright (c) 2021 Internet Initiative Japan Inc.
     23  * All rights reserved.
     24  *
     25  * Redistribution and use in source and binary forms, with or without
     26  * modification, are permitted provided that the following conditions
     27  * are met:
     28  * 1. Redistributions of source code must retain the above copyright
     29  *    notice, this list of conditions and the following disclaimer.
     30  * 2. Redistributions in binary form must reproduce the above copyright
     31  *    notice, this list of conditions and the following disclaimer in the
     32  *    documentation and/or other materials provided with the distribution.
     33  *
     34  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     35  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     36  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     37  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     38  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     39  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     40  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     41  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     42  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     43  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     44  * POSSIBILITY OF SUCH DAMAGE.
     45  */
     46 
     47 #ifndef _NET_LAGG_IF_LAGG_H_
     48 #define _NET_LAGG_IF_LAGG_H_
     49 
     50 typedef enum {
     51 	LAGG_PROTO_NONE = 0,
     52 	LAGG_PROTO_LACP,	/* 802.1ax lacp */
     53 	LAGG_PROTO_FAILOVER,
     54 	LAGG_PROTO_LOADBALANCE,
     55 	LAGG_PROTO_MAX,
     56 } lagg_proto;
     57 
     58 /* IEEE802.3ad LACP protocol definitions.*/
     59 #define LACP_STATE_ACTIVITY	__BIT(0)
     60 #define LACP_STATE_TIMEOUT	__BIT(1)
     61 #define LACP_STATE_AGGREGATION	__BIT(2)
     62 #define LACP_STATE_SYNC		__BIT(3)
     63 #define LACP_STATE_COLLECTING	__BIT(4)
     64 #define LACP_STATE_DISTRIBUTING	__BIT(5)
     65 #define LACP_STATE_DEFAULTED	__BIT(6)
     66 #define LACP_STATE_EXPIRED	__BIT(7)
     67 #define LACP_STATE_BITS		\
     68 	"\020"			\
     69 	"\001ACTIVITY"		\
     70 	"\002TIMEOUT"		\
     71 	"\003AGGREGATION"	\
     72 	"\004SYNC"		\
     73 	"\005COLLECTING"	\
     74 	"\006DISTRIBUTING"	\
     75 	"\007DEFAULTED"		\
     76 	"\010EXPIRED"
     77 #define LACP_STATESTR_LEN	256
     78 #define LACP_MAC_LEN		ETHER_ADDR_LEN
     79 
     80 enum lagg_ioctl_lacp {
     81 	LAGGIOC_LACPSETFLAGS = 1,
     82 	LAGGIOC_LACPCLRFLAGS,
     83 	LAGGIOC_LACPSETMAXPORTS,
     84 	LAGGIOC_LACPCLRMAXPORTS,
     85 };
     86 
     87 #define LAGGREQLACP_OPTIMISTIC		__BIT(0)
     88 #define LAGGREQLACP_DUMPDU		__BIT(1)
     89 #define LAGGREQLACP_STOPDU		__BIT(2)
     90 #define LAGGREQLACP_MULTILS		__BIT(3)
     91 #define LAGGREQLACP_BITS		\
     92 	"\020"				\
     93 	"\001OPTIMISTIC"		\
     94 	"\002DUMPDU"			\
     95 	"\003STOPDU"			\
     96 	"\004MULTILS"
     97 
     98 struct laggreq_lacp {
     99 	uint32_t	 command;
    100 	uint32_t	 flags;
    101 	size_t		 maxports;
    102 
    103 	uint16_t	 actor_prio;
    104 	uint8_t		 actor_mac[LACP_MAC_LEN];
    105 	uint16_t	 actor_key;
    106 	uint16_t	 partner_prio;
    107 	uint8_t		 partner_mac[LACP_MAC_LEN];
    108 	uint16_t	 partner_key;
    109 };
    110 
    111 enum lagg_ioctl_fail {
    112 	LAGGIOC_FAILSETFLAGS = 1,
    113 	LAGGIOC_FAILCLRFLAGS
    114 };
    115 
    116 #define LAGGREQFAIL_RXALL		__BIT(0)
    117 
    118 struct laggreq_fail {
    119 	uint32_t	 command;
    120 	uint32_t	 flags;
    121 };
    122 
    123 struct laggreqproto {
    124 	union {
    125 		struct laggreq_lacp	 proto_lacp;
    126 		struct laggreq_fail	 proto_fail;
    127 	} rp_proto;
    128 #define rp_lacp	rp_proto.proto_lacp
    129 #define rp_fail	rp_proto.proto_fail
    130 };
    131 
    132 #define LAGG_PORT_SLAVE		0
    133 #define LAGG_PORT_MASTER	__BIT(0)
    134 #define LAGG_PORT_STACK		__BIT(1)
    135 #define LAGG_PORT_ACTIVE	__BIT(2)
    136 #define LAGG_PORT_COLLECTING	__BIT(3)
    137 #define LAGG_PORT_DISTRIBUTING	__BIT(4)
    138 #define LAGG_PORT_STANDBY	__BIT(5)
    139 #define LAGG_PORT_BITS			\
    140 	"\020"				\
    141 	"\001MASTER"			\
    142 	"\002STACK"			\
    143 	"\003ACTIVE"			\
    144 	"\004COLLECTING"		\
    145 	"\005DISTRIBUTING"		\
    146 	"\006STANDBY"
    147 #define LACP_PORTSTR_LEN	256
    148 
    149 struct laggreq_lacpport {
    150 	uint16_t	 partner_prio;
    151 	uint8_t		 partner_mac[LACP_MAC_LEN];
    152 	uint16_t	 partner_key;
    153 
    154 	uint16_t	 actor_portprio;
    155 	uint16_t	 actor_portno;
    156 	uint8_t		 actor_state;
    157 	uint16_t	 partner_portprio;
    158 	uint16_t	 partner_portno;
    159 	uint8_t		 partner_state;
    160 };
    161 
    162 struct laggreqport {
    163 	char		 rp_portname[IFNAMSIZ];
    164 	uint32_t	 rp_prio;
    165 	uint32_t	 rp_flags;
    166 
    167 	union {
    168 		struct laggreq_lacpport	 port_lacp;
    169 	} rp_port;
    170 #define rp_lacpport	rp_port.port_lacp
    171 };
    172 
    173 enum lagg_ioctl {
    174 	LAGGIOC_NOCMD,
    175 	LAGGIOC_SETPROTO = 1,
    176 	LAGGIOC_SETPROTOOPT,
    177 	LAGGIOC_ADDPORT,
    178 	LAGGIOC_DELPORT,
    179 	LAGGIOC_SETPORTPRI,
    180 };
    181 
    182 struct lagg_req {
    183 	uint32_t		 lrq_ioctl;
    184 	lagg_proto		 lrq_proto;
    185 	size_t			 lrq_nports;
    186 	struct laggreqproto	 lrq_reqproto;
    187 	struct laggreqport	 lrq_reqports[];
    188 };
    189 
    190 #define	SIOCGLAGG		SIOCGIFGENERIC
    191 #define	SIOCSLAGG		SIOCSIFGENERIC
    192 #endif
    193