summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/net/trill.h
blob: 4200557133f581cdbf8677eb463bd3a0a62123b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _NET_TRILL_H
#define	_NET_TRILL_H

#include <sys/types.h>
#include <sys/param.h>
#include <sys/ethernet.h>

#ifdef __cplusplus
extern "C" {
#endif

/* Various well-known Ethernet addresses used by TRILL */
#define	ALL_RBRIDGES		{ 0x01, 0x80, 0xC2, 0x00, 0x02, 0x00 }
#define	ALL_ISIS_RBRIDGES	{ 0x01, 0x80, 0xC2, 0x00, 0x02, 0x01 }
#define	ALL_ESADI_RBRIDGES	{ 0x01, 0x80, 0xC2, 0x00, 0x02, 0x02 }

#define	TRILL_PROTOCOL_VERS 0	/* th_version */
#define	TRILL_DEFAULT_HOPS 21	/* th_hopcount */

/* Nickname range */
#define	RBRIDGE_NICKNAME_MIN		0x0000
#define	RBRIDGE_NICKNAME_MAX		0xFFFF

/* Define well-known nicknames */
#define	RBRIDGE_NICKNAME_NONE		RBRIDGE_NICKNAME_MIN
#define	RBRIDGE_NICKNAME_MINRES		0xFFC0
#define	RBRIDGE_NICKNAME_MAXRES		(RBRIDGE_NICKNAME_MAX - 1)
#define	RBRIDGE_NICKNAME_UNUSED		RBRIDGE_NICKNAME_MAX

#define	MIN_RBRIDGE_RANDOM_NICKNAME	(RBRIDGE_NICKNAME_NONE + 1)
#define	MAX_RBRIDGE_RANDOM_NICKNAME	(RBRIDGE_NICKNAME_MINRES - 1)

/* AF_TRILL IOCTL codes */
#define	TRILL_BASE	(0x54524c00)	/* base (TRL in hex) */
#define	TRILL_SETNICK	(TRILL_BASE + 0)    /* trill_node_t */
#define	TRILL_GETNICK	(TRILL_BASE + 1)    /* uint16_t */
#define	TRILL_ADDNICK	(TRILL_BASE + 2)    /* trill_node_t */
#define	TRILL_DELNICK	(TRILL_BASE + 3)    /* uint16_t */
#define	TRILL_DELALL	(TRILL_BASE + 4)    /* void */
#define	TRILL_HWADDR	(TRILL_BASE + 5)    /* uint8_t[ETHERADDRL] */
#define	TRILL_TREEROOT	(TRILL_BASE + 6)    /* uint16_t */
#define	TRILL_NEWBRIDGE	(TRILL_BASE + 7)    /* char[MAXLINKNAMELEN] */
#define	TRILL_VLANFWDER	(TRILL_BASE + 8)    /* uint8_t[TRILL_VLANS_ARRSIZE] */
#define	TRILL_DESIGVLAN (TRILL_BASE + 9)    /* uint16_t */
#define	TRILL_LISTNICK	(TRILL_BASE + 10)   /* trill_listnick_t */
#define	TRILL_GETBRIDGE	(TRILL_BASE + 11)   /* char[MAXLINKNAMELEN] */
#define	TRILL_PORTFLUSH	(TRILL_BASE + 12)   /* uint16_t */
#define	TRILL_NICKFLUSH	(TRILL_BASE + 13)   /* uint16_t */
#define	TRILL_GETMTU	(TRILL_BASE + 14)   /* uint_t * */

typedef struct trill_header {
#ifdef	_BIT_FIELDS_HTOL
	uint8_t th_version : 2;
	uint8_t th_reserved : 2;
	uint8_t th_multidest : 1;
	uint8_t th_optslen_hi : 3;
#else
	uint8_t th_optslen_hi : 3;
	uint8_t th_multidest : 1;
	uint8_t th_reserved : 2;
	uint8_t th_version : 2;
#endif

#ifdef	_BIT_FIELDS_HTOL
	uint8_t th_optslen_lo : 2;
	uint8_t th_hopcount : 6;
#else
	uint8_t th_hopcount : 6;
	uint8_t th_optslen_lo : 2;
#endif
	uint16_t th_egressnick;
	uint16_t th_ingressnick;
} trill_header_t;

#define	TRILL_HDR_ALIGN		(sizeof (uint16_t))

#define	SET_TRILL_OPTS_LEN(hdr_p, val) \
	do { \
		(hdr_p)->th_optslen_lo = (val)&0x03;	\
		(hdr_p)->th_optslen_hi = (val)>>2;	\
		_NOTE(CONSTANTCONDITION)		\
	} while (0)

#define	GET_TRILL_OPTS_LEN(hdr_p) \
	((hdr_p)->th_optslen_lo|((hdr_p)->th_optslen_hi<<2))

/* RBridge nick and tree information (*variable* size) */
typedef struct trill_nickinfo_s {
	/* Nickname of the RBridge */
	uint16_t	tni_nick;
	/* Next-hop SNPA address to reach this RBridge */
	ether_addr_t	tni_adjsnpa;
	/* Link on our system to use to reach next-hop */
	datalink_id_t	tni_linkid;
	/* Num of *our* adjacencies on a tree rooted at this RBridge */
	uint16_t	tni_adjcount;
	/* Num of distribution tree root nicks chosen by this RBridge */
	uint16_t	tni_dtrootcount;
	/*
	 * Variable size bytes to store adjacency nicks, distribution
	 * tree roots and VLAN filter lists. Adjacency nicks and
	 * distribution tree roots are 16-bit fields.
	 *
	 * Number of VLAN filter lists is equal to tni_adjcount as
	 * the VLAN filter list is one per adjacency in each DT.
	 * VLAN filter list is a 512 byte bitmap with the set of VLANs
	 * that are reachable downstream via the adjacency.
	 */
} trill_nickinfo_t;

typedef struct trill_listnick_s {
	uint16_t	tln_nick;
	ether_addr_t	tln_nexthop;
	datalink_id_t	tln_linkid;
	boolean_t	tln_ours;
} trill_listnick_t;

/* Access the adjacency nick list at the end of trill_nickinfo_t */
#define	TNI_ADJNICKSPTR(v) ((uint16_t *)((trill_nickinfo_t *)(v)+1))
#define	TNI_ADJNICK(v, n) (TNI_ADJNICKSPTR(v)[(n)])

/* Access the DT root nick list in trill_nickinfo_t after adjacency nicks */
#define	TNI_DTROOTNICKSPTR(v) (TNI_ADJNICKSPTR(v)+(v)->tni_adjcount)
#define	TNI_DTROOTNICK(v, n) (TNI_DTROOTNICKSPTR(v)[(n)])

/* Access the VLAN filter list in trill_nickinfo_t after DT Roots */
#define	TNI_VLANFILTERSPTR(v) (TNI_DTROOTNICKSPTR(v)+(v)->tni_dtrootcount)
#define	TNI_VLANFILTERMAP(v, n) \
	(((uint8_t *)(TNI_VLANFILTERSPTR(v)))+((n)*((1<<12)/NBBY)))

#define	TNI_TOTALSIZE(v) (sizeof (trill_nickinfo_t) + \
	(sizeof (uint16_t) * (v)->tni_adjcount) + \
	(sizeof (uint16_t) * (v)->tni_dtrootcount) + \
	(((1<<12)/NBBY) * (v)->tni_adjcount))

/*
 * This is a special value used in the sockaddr_dl "selector" field to denote
 * that the packet represents a Bridging PDU.  The core STP instance is not
 * defined on a VLAN, so this overload is safe.  All other selector values are
 * used for TRILL IS-IS PDUs to indicate VLAN ID.
 */
#define	TRILL_TCI_BPDU	0xFFFF

#ifdef __cplusplus
}
#endif

#endif /* _NET_TRILL_H */