mirror of
https://github.com/YikeStone/MT7601u.git
synced 2025-08-03 19:34:08 +05:30
206 lines
5.5 KiB
C
206 lines
5.5 KiB
C
/****************************************************************************
|
||
* Ralink Tech Inc.
|
||
* 4F, No. 2 Technology 5th Rd.
|
||
* Science-based Industrial Park
|
||
* Hsin-chu, Taiwan, R.O.C.
|
||
* (c) Copyright 2002, Ralink Technology, Inc.
|
||
*
|
||
* All rights reserved. Ralink's source code is an unpublished work and the
|
||
* use of a copyright notice does not imply otherwise. This source code
|
||
* contains confidential trade secret material of Ralink Tech. Any attemp
|
||
* or participation in deciphering, decoding, reverse engineering or in any
|
||
* way altering the source code is stricitly prohibited, unless the prior
|
||
* written consent of Ralink Technology, Inc. is obtained.
|
||
****************************************************************************
|
||
|
||
Module Name:
|
||
ipv6.h
|
||
|
||
Abstract:
|
||
|
||
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
|
||
#define IPV6_NEXT_HEADER_PIM 0x67
|
||
|
||
/* 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 GNU_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 GNU_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 GNU_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 GNU_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_ */
|
||
|