| /* |
| ************************************************************************* |
| * Ralink Tech Inc. |
| * 5F., No.36, Taiyuan St., Jhubei City, |
| * Hsinchu County 302, |
| * Taiwan, R.O.C. |
| * |
| * (c) Copyright 2002-2007, Ralink Technology, Inc. |
| * |
| * This program is free software; you can redistribute it and/or modify * |
| * it under the terms of the GNU General Public License as published by * |
| * the Free Software Foundation; either version 2 of the License, or * |
| * (at your option) any later version. * |
| * * |
| * This program is distributed in the hope that it will be useful, * |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of * |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * |
| * GNU General Public License for more details. * |
| * * |
| * You should have received a copy of the GNU General Public License * |
| * along with this program; if not, write to the * |
| * Free Software Foundation, Inc., * |
| * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * |
| * * |
| ************************************************************************* |
| |
| Module Name: |
| ipv6.h |
| |
| Abstract: |
| Miniport generic portion header file |
| |
| Revision History: |
| Who When What |
| -------- ---------- ---------------------------------------------- |
| */ |
| |
| #ifndef __IPV6_HDR_H_ |
| #define __IPV6_HDR_H_ |
| |
| #define IPV6_ADDR_LEN 16 |
| #define IPV6_HDR_LEN 40 |
| |
| // IPv6 address definition |
| #define IPV6_LINK_LOCAL_ADDR_PREFIX 0xFE8 |
| #define IPV6_SITE_LOCAL_ADDR_PREFIX 0xFEC |
| #define IPV6_LOCAL_ADDR_PREFIX 0xFE8 |
| #define IPV6_MULTICAST_ADDR_PREFIX 0xFF |
| #define IPV6_LOOPBACK_ADDR 0x1 |
| #define IPV6_UNSPECIFIED_ADDR 0x0 |
| |
| // defined as sequence in IPv6 header |
| #define IPV6_NEXT_HEADER_HOP_BY_HOP 0x00 // 0 |
| #define IPV6_NEXT_HEADER_DESTINATION 0x3c // 60 |
| #define IPV6_NEXT_HEADER_ROUTING 0x2b // 43 |
| #define IPV6_NEXT_HEADER_FRAGMENT 0x2c // 44 |
| #define IPV6_NEXT_HEADER_AUTHENTICATION 0x33 // 51 |
| #define IPV6_NEXT_HEADER_ENCAPSULATION 0x32 // 50, RFC-2406 |
| #define IPV6_NEXT_HEADER_NONE 0x3b // 59 |
| |
| #define IPV6_NEXT_HEADER_TCP 0x06 |
| #define IPV6_NEXT_HEADER_UDP 0x11 |
| #define IPV6_NEXT_HEADER_ICMPV6 0x3a |
| |
| // ICMPv6 msg type definition |
| #define ICMPV6_MSG_TYPE_ROUTER_SOLICITATION 0x85 // 133 |
| #define ROUTER_SOLICITATION_FIXED_LEN 8 |
| |
| #define ICMPV6_MSG_TYPE_ROUTER_ADVERTISEMENT 0x86 // 134 |
| #define ROUTER_ADVERTISEMENT_FIXED_LEN 16 |
| |
| #define ICMPV6_MSG_TYPE_NEIGHBOR_SOLICITATION 0x87 // 135 |
| #define NEIGHBOR_SOLICITATION_FIXED_LEN 24 |
| |
| #define ICMPV6_MSG_TYPE_NEIGHBOR_ADVERTISEMENT 0x88 // 136 |
| #define NEIGHBOR_ADVERTISEMENT_FIXED_LEN 24 |
| |
| #define ICMPV6_MSG_TYPE_REDIRECT 0x89 // 137 |
| #define REDIRECT_FIXED_LEN 40 |
| |
| /* IPv6 Address related structures */ |
| typedef struct rt_ipv6_addr_ |
| { |
| union |
| { |
| UCHAR ipv6Addr8[16]; |
| USHORT ipv6Addr16[8]; |
| UINT32 ipv6Addr32[4]; |
| }addr; |
| #define ipv6_addr addr.ipv6Addr8 |
| #define ipv6_addr16 addr.ipv6Addr16 |
| #define ipv6_addr32 addr.ipv6Addr32 |
| }RT_IPV6_ADDR, *PRT_IPV6_ADDR; |
| |
| |
| #define PRINT_IPV6_ADDR(ipv6Addr) \ |
| OS_NTOHS((ipv6Addr).ipv6_addr16[0]), \ |
| OS_NTOHS((ipv6Addr).ipv6_addr16[1]), \ |
| OS_NTOHS((ipv6Addr).ipv6_addr16[2]), \ |
| OS_NTOHS((ipv6Addr).ipv6_addr16[3]), \ |
| OS_NTOHS((ipv6Addr).ipv6_addr16[4]), \ |
| OS_NTOHS((ipv6Addr).ipv6_addr16[5]), \ |
| OS_NTOHS((ipv6Addr).ipv6_addr16[6]), \ |
| OS_NTOHS((ipv6Addr).ipv6_addr16[7]) |
| |
| |
| /*IPv6 Header related structures */ |
| typedef struct PACKED _rt_ipv6_hdr_ |
| { |
| UINT32 ver:4, |
| trafficClass:8, |
| flowLabel:20; |
| USHORT payload_len; |
| UCHAR nextHdr; |
| UCHAR hopLimit; |
| RT_IPV6_ADDR srcAddr; |
| RT_IPV6_ADDR dstAddr; |
| }RT_IPV6_HDR, *PRT_IPV6_HDR; |
| |
| |
| typedef struct PACKED _rt_ipv6_ext_hdr_ |
| { |
| UCHAR nextProto; // Indicate the protocol type of next extension header. |
| UCHAR extHdrLen; // optional field for msg length of this extension header which didn't include the first "nextProto" field. |
| UCHAR octets[1]; // hook to extend header message body. |
| }RT_IPV6_EXT_HDR, *PRT_IPV6_EXT_HDR; |
| |
| |
| /* ICMPv6 related structures */ |
| typedef struct PACKED _rt_ipv6_icmpv6_hdr_ |
| { |
| UCHAR type; |
| UCHAR code; |
| USHORT chksum; |
| UCHAR octets[1]; //hook to extend header message body. |
| }RT_ICMPV6_HDR, *PRT_ICMPV6_HDR; |
| |
| |
| typedef struct PACKED _rt_icmp6_option_hdr_ |
| { |
| UCHAR type; |
| UCHAR len; |
| UCHAR octet[1]; |
| }RT_ICMPV6_OPTION_HDR, *PRT_ICMPV6_OPTION_HDR; |
| |
| typedef enum{ |
| // Defined ICMPv6 Option Types. |
| TYPE_SRC_LL_ADDR = 1, |
| TYPE_TGT_LL_ADDR = 2, |
| TYPE_PREFIX_INFO = 3, |
| TYPE_REDIRECTED_HDR = 4, |
| TYPE_MTU = 5, |
| }ICMPV6_OPTIONS_TYPE_DEF; |
| |
| |
| static inline BOOLEAN IPv6ExtHdrHandle( |
| RT_IPV6_EXT_HDR *pExtHdr, |
| UCHAR *pProto, |
| UINT32 *pOffset) |
| { |
| UCHAR nextProto = 0xff; |
| UINT32 extLen = 0; |
| BOOLEAN status = TRUE; |
| |
| //printk("%s(): parsing the Extension Header with Protocol(0x%x):\n", __FUNCTION__, *pProto); |
| switch (*pProto) |
| { |
| case IPV6_NEXT_HEADER_HOP_BY_HOP: |
| // IPv6ExtHopByHopHandle(); |
| nextProto = pExtHdr->nextProto; |
| extLen = (pExtHdr->extHdrLen + 1) * 8; |
| break; |
| |
| case IPV6_NEXT_HEADER_DESTINATION: |
| // IPv6ExtDestHandle(); |
| nextProto = pExtHdr->nextProto; |
| extLen = (pExtHdr->extHdrLen + 1) * 8; |
| break; |
| |
| case IPV6_NEXT_HEADER_ROUTING: |
| // IPv6ExtRoutingHandle(); |
| nextProto = pExtHdr->nextProto; |
| extLen = (pExtHdr->extHdrLen + 1) * 8; |
| break; |
| |
| case IPV6_NEXT_HEADER_FRAGMENT: |
| // IPv6ExtFragmentHandle(); |
| nextProto = pExtHdr->nextProto; |
| extLen = 8; // The Fragment header length is fixed to 8 bytes. |
| break; |
| |
| case IPV6_NEXT_HEADER_AUTHENTICATION: |
| // IPV6_NEXT_HEADER_ENCAPSULATION: |
| /* |
| TODO: Not support. For encryption issue. |
| */ |
| nextProto = 0xFF; |
| status = FALSE; |
| break; |
| |
| default: |
| nextProto = 0xFF; |
| status = FALSE; |
| break; |
| } |
| |
| *pProto = nextProto; |
| *pOffset += extLen; |
| //printk("%s(): nextProto = 0x%x!, offset=0x%x!\n", __FUNCTION__, nextProto, offset); |
| |
| return status; |
| |
| } |
| |
| #endif // __IPV6_HDR_H_ // |