]> bbs.cooldavid.org Git - net-next-2.6.git/blame - drivers/staging/rt3090/ipv6.h
Staging: rt2860: add RT3090 chipset support
[net-next-2.6.git] / drivers / staging / rt3090 / ipv6.h
CommitLineData
36c7928c
BZ
1/*
2 *************************************************************************
3 * Ralink Tech Inc.
4 * 5F., No.36, Taiyuan St., Jhubei City,
5 * Hsinchu County 302,
6 * Taiwan, R.O.C.
7 *
8 * (c) Copyright 2002-2007, Ralink Technology, Inc.
9 *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 * This program is distributed in the hope that it will be useful, *
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
18 * GNU General Public License for more details. *
19 * *
20 * You should have received a copy of the GNU General Public License *
21 * along with this program; if not, write to the *
22 * Free Software Foundation, Inc., *
23 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
24 * *
25 *************************************************************************
26
27 Module Name:
28 ipv6.h
29
30 Abstract:
31 Miniport generic portion header file
32
33 Revision History:
34 Who When What
35 -------- ---------- ----------------------------------------------
36*/
37
38#ifndef __IPV6_HDR_H_
39#define __IPV6_HDR_H_
40
41#define IPV6_ADDR_LEN 16
42#define IPV6_HDR_LEN 40
43
44// IPv6 address definition
45#define IPV6_LINK_LOCAL_ADDR_PREFIX 0xFE8
46#define IPV6_SITE_LOCAL_ADDR_PREFIX 0xFEC
47#define IPV6_LOCAL_ADDR_PREFIX 0xFE8
48#define IPV6_MULTICAST_ADDR_PREFIX 0xFF
49#define IPV6_LOOPBACK_ADDR 0x1
50#define IPV6_UNSPECIFIED_ADDR 0x0
51
52// defined as sequence in IPv6 header
53#define IPV6_NEXT_HEADER_HOP_BY_HOP 0x00 // 0
54#define IPV6_NEXT_HEADER_DESTINATION 0x3c // 60
55#define IPV6_NEXT_HEADER_ROUTING 0x2b // 43
56#define IPV6_NEXT_HEADER_FRAGMENT 0x2c // 44
57#define IPV6_NEXT_HEADER_AUTHENTICATION 0x33 // 51
58#define IPV6_NEXT_HEADER_ENCAPSULATION 0x32 // 50, RFC-2406
59#define IPV6_NEXT_HEADER_NONE 0x3b // 59
60
61#define IPV6_NEXT_HEADER_TCP 0x06
62#define IPV6_NEXT_HEADER_UDP 0x11
63#define IPV6_NEXT_HEADER_ICMPV6 0x3a
64
65// ICMPv6 msg type definition
66#define ICMPV6_MSG_TYPE_ROUTER_SOLICITATION 0x85 // 133
67#define ROUTER_SOLICITATION_FIXED_LEN 8
68
69#define ICMPV6_MSG_TYPE_ROUTER_ADVERTISEMENT 0x86 // 134
70#define ROUTER_ADVERTISEMENT_FIXED_LEN 16
71
72#define ICMPV6_MSG_TYPE_NEIGHBOR_SOLICITATION 0x87 // 135
73#define NEIGHBOR_SOLICITATION_FIXED_LEN 24
74
75#define ICMPV6_MSG_TYPE_NEIGHBOR_ADVERTISEMENT 0x88 // 136
76#define NEIGHBOR_ADVERTISEMENT_FIXED_LEN 24
77
78#define ICMPV6_MSG_TYPE_REDIRECT 0x89 // 137
79#define REDIRECT_FIXED_LEN 40
80
81/* IPv6 Address related structures */
82typedef struct rt_ipv6_addr_
83{
84 union
85 {
86 UCHAR ipv6Addr8[16];
87 USHORT ipv6Addr16[8];
88 UINT32 ipv6Addr32[4];
89 }addr;
90#define ipv6_addr addr.ipv6Addr8
91#define ipv6_addr16 addr.ipv6Addr16
92#define ipv6_addr32 addr.ipv6Addr32
93}RT_IPV6_ADDR, *PRT_IPV6_ADDR;
94
95
96#define PRINT_IPV6_ADDR(ipv6Addr) \
97 OS_NTOHS((ipv6Addr).ipv6_addr16[0]), \
98 OS_NTOHS((ipv6Addr).ipv6_addr16[1]), \
99 OS_NTOHS((ipv6Addr).ipv6_addr16[2]), \
100 OS_NTOHS((ipv6Addr).ipv6_addr16[3]), \
101 OS_NTOHS((ipv6Addr).ipv6_addr16[4]), \
102 OS_NTOHS((ipv6Addr).ipv6_addr16[5]), \
103 OS_NTOHS((ipv6Addr).ipv6_addr16[6]), \
104 OS_NTOHS((ipv6Addr).ipv6_addr16[7])
105
106
107/*\14\14IPv6 Header related structures */
108typedef struct PACKED _rt_ipv6_hdr_
109{
110 UINT32 ver:4,
111 trafficClass:8,
112 flowLabel:20;
113 USHORT payload_len;
114 UCHAR nextHdr;
115 UCHAR hopLimit;
116 RT_IPV6_ADDR srcAddr;
117 RT_IPV6_ADDR dstAddr;
118}RT_IPV6_HDR, *PRT_IPV6_HDR;
119
120
121typedef struct PACKED _rt_ipv6_ext_hdr_
122{
123 UCHAR nextProto; // Indicate the protocol type of next extension header.
124 UCHAR extHdrLen; // optional field for msg length of this extension header which didn't include the first "nextProto" field.
125 UCHAR octets[1]; // hook to extend header message body.
126}RT_IPV6_EXT_HDR, *PRT_IPV6_EXT_HDR;
127
128
129/* ICMPv6 related structures */
130typedef struct PACKED _rt_ipv6_icmpv6_hdr_
131{
132 UCHAR type;
133 UCHAR code;
134 USHORT chksum;
135 UCHAR octets[1]; //hook to extend header message body.
136}RT_ICMPV6_HDR, *PRT_ICMPV6_HDR;
137
138
139typedef struct PACKED _rt_icmp6_option_hdr_
140{
141 UCHAR type;
142 UCHAR len;
143 UCHAR octet[1];
144}RT_ICMPV6_OPTION_HDR, *PRT_ICMPV6_OPTION_HDR;
145
146typedef enum{
147// Defined ICMPv6 Option Types.
148 TYPE_SRC_LL_ADDR = 1,
149 TYPE_TGT_LL_ADDR = 2,
150 TYPE_PREFIX_INFO = 3,
151 TYPE_REDIRECTED_HDR = 4,
152 TYPE_MTU = 5,
153}ICMPV6_OPTIONS_TYPE_DEF;
154
155
156static inline BOOLEAN IPv6ExtHdrHandle(
157 RT_IPV6_EXT_HDR *pExtHdr,
158 UCHAR *pProto,
159 UINT32 *pOffset)
160{
161 UCHAR nextProto = 0xff;
162 UINT32 extLen = 0;
163 BOOLEAN status = TRUE;
164
165 //printk("%s(): parsing the Extension Header with Protocol(0x%x):\n", __FUNCTION__, *pProto);
166 switch (*pProto)
167 {
168 case IPV6_NEXT_HEADER_HOP_BY_HOP:
169 // IPv6ExtHopByHopHandle();
170 nextProto = pExtHdr->nextProto;
171 extLen = (pExtHdr->extHdrLen + 1) * 8;
172 break;
173
174 case IPV6_NEXT_HEADER_DESTINATION:
175 // IPv6ExtDestHandle();
176 nextProto = pExtHdr->nextProto;
177 extLen = (pExtHdr->extHdrLen + 1) * 8;
178 break;
179
180 case IPV6_NEXT_HEADER_ROUTING:
181 // IPv6ExtRoutingHandle();
182 nextProto = pExtHdr->nextProto;
183 extLen = (pExtHdr->extHdrLen + 1) * 8;
184 break;
185
186 case IPV6_NEXT_HEADER_FRAGMENT:
187 // IPv6ExtFragmentHandle();
188 nextProto = pExtHdr->nextProto;
189 extLen = 8; // The Fragment header length is fixed to 8 bytes.
190 break;
191
192 case IPV6_NEXT_HEADER_AUTHENTICATION:
193 // IPV6_NEXT_HEADER_ENCAPSULATION:
194 /*
195 TODO: Not support. For encryption issue.
196 */
197 nextProto = 0xFF;
198 status = FALSE;
199 break;
200
201 default:
202 nextProto = 0xFF;
203 status = FALSE;
204 break;
205 }
206
207 *pProto = nextProto;
208 *pOffset += extLen;
209 //printk("%s(): nextProto = 0x%x!, offset=0x%x!\n", __FUNCTION__, nextProto, offset);
210
211 return status;
212
213}
214
215#endif // __IPV6_HDR_H_ //