summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/net/iso88025.h
blob: 11bd6ec49eb41600c315fbb1b0bfbb1409362a27 (plain) (blame)
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
/*-
 * Copyright (c) 1998, Larry Lile
 * All rights reserved.
 *
 * For latest sources and information on this driver, please
 * go to http://anarchy.stdio.com.
 *
 * Questions, comments or suggestions should be directed to
 * Larry Lile <lile@stdio.com>.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice unmodified, this list of conditions, and the following
 *    disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * $FreeBSD$
 *
 * Information gathered from tokenring@freebsd, /sys/net/ethernet.h and
 * the Mach token ring driver.
 */

/*
 * Fundamental constants relating to iso 802.5
 */

#ifndef _NET_ISO88025_H_
#define	_NET_ISO88025_H_

/*
 * General ISO 802.5 definitions
 */
#define	ISO88025_ADDR_LEN	6
#define	ISO88025_CF_LEN		2
#define	ISO88025_HDR_LEN	(ISO88025_CF_LEN + (ISO88025_ADDR_LEN * 2))
#define	RCF_LEN			2
#define	RIF_MAX_RD		14
#define	RIF_MAX_LEN		16

#define	TR_AC			0x10
#define	TR_LLC_FRAME		0x40

#define	TR_4MBPS		4000000
#define	TR_16MBPS		16000000
#define	TR_100MBPS		100000000

/*
 * Source routing 
 */
#define	TR_RII			0x80
#define	TR_RCF_BCST_MASK	0xe000
#define	TR_RCF_LEN_MASK		0x1f00
#define	TR_RCF_DIR		0x0080
#define	TR_RCF_LF_MASK		0x0070

#define	TR_RCF_RIFLEN(x)	((ntohs(x) & TR_RCF_LEN_MASK) >> 8)

/*
 * Minimum and maximum packet payload lengths.
 */
#define	ISO88025_MIN_LEN	0 
#define	ISO88025_MAX_LEN_4	4464
#define	ISO88025_MAX_LEN_16	17960	
#define	ISO88025_MAX_LEN	ISO88025_MAX_LEN_16

/*
 * A macro to validate a length with
 */
#define	ISO88025_IS_VALID_LEN(foo)	\
	((foo) >= ISO88025_MIN_LEN && (foo) <= ISO88025_MAX_LEN)

/* Access Control field */
#define	AC_PRI_MASK		0xe0	/* Priority bits 		*/
#define	AC_TOKEN		0x10	/* Token bit: 0=Token, 1=Frame	*/
#define	AC_MONITOR		0x08	/* Monitor			*/
#define	AC_RESV_MASK		0x07	/* Reservation bits		*/

/* Frame Control field */
#define	FC_FT_MASK		0xc0	/* Frame Type			*/
#define	FC_FT_MAC		0x00	/* MAC frame			*/
#define	FC_FT_LLC		0x40	/* LLC frame			*/
#define	FC_ATTN_MASK		0x0f	/* Attention bits		*/
#define	FC_ATTN_EB		0x01	/* Express buffer		*/
#define	FC_ATTN_BE		0x02	/* Beacon			*/
#define	FC_ATTN_CT		0x03	/* Claim token			*/
#define	FC_ATTN_RP		0x04	/* Ring purge			*/
#define	FC_ATTN_AMP		0x05	/* Active monitor present	*/
#define	FC_ATTN_SMP		0x06	/* Standby monitor present	*/

/* Token Ring destination address */
#define	DA_IG			0x80	/* Individual/group address.	*/
					/* 0=Individual, 1=Group	*/
#define	DA_UL			0x40	/* Universal/local address.	*/
					/* 0=Universal, 1=Local		*/
/* Token Ring source address */
#define	SA_RII			0x80	/* Routing information indicator */
#define	SA_IG			0x40	/* Individual/group address	*/
					/* 0=Group, 1=Individual	*/

/*
 * ISO 802.5 physical header
 */
struct iso88025_header {
	u_int8_t	ac;				    /* access control field */
	u_int8_t	fc;				    /* frame control field */
	u_int8_t	iso88025_dhost[ISO88025_ADDR_LEN];  /* destination address */
	u_int8_t	iso88025_shost[ISO88025_ADDR_LEN];  /* source address */
	u_int16_t	rcf;				    /* route control field */
	u_int16_t	rd[RIF_MAX_RD];			    /* routing designators */
} __packed;

struct iso88025_rif {
	u_int16_t	rcf;				    /* route control field */
	u_int16_t	rd[RIF_MAX_RD];			    /* routing designators */
} __packed;

struct iso88025_sockaddr_data {
	u_char ether_dhost[ISO88025_ADDR_LEN];
	u_char ether_shost[ISO88025_ADDR_LEN];
	u_char ac;
	u_char fc;
};

struct iso88025_sockaddr_dl_data {
	u_short	 trld_rcf;
	u_short	*trld_route[RIF_MAX_LEN];
};

#define	ISO88025_MAX(a, b)	(((a)>(b))?(a):(b))
#define	SDL_ISO88025(s)		((struct iso88025_sockaddr_dl_data *)	\
				 ((s)->sdl_data + \
				  ISO88025_MAX((s)->sdl_nlen + (s)->sdl_alen + \
					       (s)->sdl_slen, 12)))

/*
 * Structure of a 48-bit iso 802.5 address.
 *  ( We could also add the 16 bit addresses as a union)
 */
struct	iso88025_addr {
	u_char octet[ISO88025_ADDR_LEN];
};

#define	ISO88025_MAX_MTU		18000
#define	ISO88025_DEFAULT_MTU		1500

#define	ISO88025_BPF_UNSUPPORTED	0
#define	ISO88025_BPF_SUPPORTED		1

#ifdef _KERNEL
void	iso88025_ifattach	(struct ifnet *, const u_int8_t *, int);
void	iso88025_ifdetach	(struct ifnet *, int);
int	iso88025_ioctl		(struct ifnet *, u_long, caddr_t );
int	iso88025_output		(struct ifnet *, struct mbuf *,
				 const struct sockaddr *, struct route *);
void	iso88025_input		(struct ifnet *, struct mbuf *);
#endif	/* _KERNEL */

#endif	/* !_NET_ISO88025_H_ */