incubator-nuttx/include/nuttx/net/ipv6ext.h

249 lines
9.8 KiB
C

/****************************************************************************
* include/nuttx/net/ipv6ext.h
* IPv6 Extension Header Definitions
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/* Extension headers carry optional Internet Layer information, and are
* placed between the fixed IPv6 header and the upper-layer protocol header.
* The headers form a chain, using the Next Header fields. The Next Header
* field in the fixed header indicates the type of the first extension
* header; the Next Header field of the last extension header indicates the
* type of the upper-layer protocol header in the payload of the packet.
*
* All extension headers are a multiple of 8 octets in size; some extension
* headers require internal padding to meet this requirement.
*
* Extension headers are to be examined and processed at the packet's
* destination only, except for Hop-by-Hop Options, which need to be
* processed at every intermediate node on the packet's path, including
* sending and receiving node.
*
* If a node does not recognize a specific extension header, it should
* discard the packet and send a Parameter Problem message (ICMPv6 type 4,
* code 1).
* When a Next Header value 0 appears in a header other than the fixed header
* a node should do the same.
*/
#ifndef __INCLUDE_NUTTX_NET_IPV6EXT_H
#define __INCLUDE_NUTTX_NET_IPV6EXT_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdint.h>
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* Commonly Used Extension Headers
*
* - Hop-by-Hop EH is used for the support of Jumbo-grams or, with the
* Router Alert option, it is an integral part in the operation of the
* IPv6 Multicast through Multicast Listener Discovery (MLD).
* - Destination EH is used in IPv6 Mobility as well as support of certain
* applications.
* - Routing EH is used in IPv6 Mobility and in Source Routing.
* - Fragmentation EH is critical in support of communication using
* fragmented packets (in IPv6, the traffic source must do fragmentation-
* routers do not perform fragmentation of the packets they forward)
* - Mobility EH is used in support of Mobile IPv6 service
* - Authentication EH is similar in format and use to the IPv4
* authentication header defined in RFC2402.
* - Encapsulating Security Payload EH is similar in format and use to the
* IPv4 ESP header defined in RFC2406 [5]. All information following the
* Encapsulating Security Header (ESH) is encrypted and for that reason, it
* is inaccessible to intermediary network devices. The ESH can be followed
* by an additional Destination Options EH and the upper layer datagram.
*/
/* Values of the Next Header Field. See also IP_PROTO_* definitions in
* include/nuttx/net/ip.h.
*
* These options should be applied a specific order:
*
* 1. Basic IPv6 Header
* 2. Hop-by-Hop Options (0)
* 3. Destination Options (with Routing Options) (60)
* 4. Routing Header (43)
* 5. Fragment Header (44)
* 6. Authentication Header (51)
* 7. Encapsulation Security Payload Header (50)
* 8. Destination Options (60)
* 9. Mobility Header (135)
* No next header (59)
* 10. Upper Layer TCP (6), UDP (17), ICMPv6 (58)
*/
#define NEXT_HOPBYBOT_EH 0 /* 0 Hop-by-Hop Options Header */
/* 1 See IP_PROTO_ICMP in
* include/nuttx/net/ip.h. */
/* 2 See IP_PROTO_IGMP in
* include/nuttx/net/ip.h. */
/* 6 See IP_PROTO_TCP in
* include/nuttx/net/ip.h. */
/* 17 See IP_PROTO_UDP in
* include/nuttx/net/ip.h. */
#define NEXT_ENCAP_EH 41 /* 41 Encapsulated IPv6 Header */
#define NEXT_ROUTING_EH 43 /* 43 Routing Header */
#define NEXT_FRAGMENT_EH 44 /* 44 Fragment Header */
#define NEXT_RRSVP_EH 46 /* 46 Resource ReSerVation Protocol */
#define NEXT_ENCAPSEC_EH 50 /* 50 Encapsulating Security Payload */
#define NEXT_AUTH_EH 51 /* 51 Authentication Header */
/* 58 See IP_PROTO_ICMP6 in
* include/nuttx/net/ip.h. */
#define NEXT_NOHEADER 59 /* 59 No next header */
#define NEXT_DESTOPT_EH 60 /* 60 Destination Options Header */
#define NEXT_MOBILITY_EH 135 /* 135 Mobility */
#define NEXT_HOSTID_EH 139 /* 139 Host Identity Protocol */
#define NEXT_SHIM6_EH 140 /* 140 Shim6 Protocol */
/* 253, 254 Reserved for experimentation
* and testing */
/* Size of the extension header */
#define EXTHDR_LEN(hdrlen) ((hdrlen + 1) << 3)
/* Fragment header has no length field and has a fixed size */
#define EXTHDR_FRAG_LEN 8
/* More frags flag bits in 16-bit flags in fragment header */
#define FRAGHDR_FRAG_MOREFRAGS 0x0001
/* Values of the Two High-Order Bits in the Hop-to-hop Option Type Field */
#define HOPBYHOP_TYPE_MASK 0xc0
#define HOPBYHOP_TYPE_SKIP 0x00 /* Skip the option */
#define HOPBYHOP_TYPE_DISCARD 0x40 /* Silently discard the packet */
#define HOPBYHOP_TYPE_DISCARD1 0x80 /* Discard and send problem message if
* ucast or mcast */
#define HOPBYHOP_TYPE_DISCARD2 0xc0 /* Discard and send problem message if
* not mcast */
/* Hop-to-hop Option Types */
#define HOPBYHOP_ROUTER_ALERT 5
/* Hop-to-hop Router Alert Values */
#define OPT_RA_MLD 0 /* Datagram contains a Multicast Listener
* Discovery message (RFC 2710) */
#define OPT_RA_RSVP 1 /* Datagram contains RSVP message */
#define OPT_RA_ACTIVE 2 /* Datagram contains an Active Networks
* message */
/* 3-65535 Reserved to IANA for future use */
/****************************************************************************
* Public Types
****************************************************************************/
/* "Generic" extension option header. Actual size is a multiple of 8 bytes */
struct ipv6_extension_s
{
uint8_t nxthdr; /* Next header */
uint8_t len; /* Extension header length */
uint8_t pad[6]; /* Pad to a multiple of 8 bytes */
};
/* Hop-by-hop Option Header */
struct ipv6_hopbyhop_extension_s
{
uint8_t nxthdr; /* Next header */
uint8_t len; /* Extension header length */
uint8_t options[6]; /* Options */
};
struct ipv6_routing_extension_s
{
uint8_t nxthdr; /* Next header */
uint8_t len; /* Extension header length */
uint8_t type; /* Routing type */
uint8_t segments; /* Segments left */
uint8_t reserved[4]; /* Reserved, must be zero */
/* IPv6 addresses follow */
};
struct ipv6_fragment_extension_s
{
uint8_t nxthdr; /* Next header */
uint8_t reserved; /* Reserved, must be zero */
uint8_t msoffset; /* MS offset 5:12 */
uint8_t lsoffset; /* LS offset 0:4, M flag */
uint8_t id[4]; /* Identification */
};
struct ipv6_authenitcation_extension_s
{
uint8_t nxthdr; /* Next header */
uint8_t len; /* Payload length */
uint8_t reserved[2]; /* Reserved, must be zero */
uint8_t security[4]; /* Security parameters */
uint8_t sequence[4]; /* Sequence number */
uint8_t authdata[4]; /* Authentication data */
};
struct ipv6_destoptions_extension_s
{
uint8_t nxthdr; /* Next header */
uint8_t len; /* Extension header length */
uint8_t options[6]; /* Options */
};
/* Router Alert Hop-to-Hop option */
struct ipv6_router_alert_s
{
struct ipv6_hopbyhop_extension_s hbyh;
uint8_t type; /* Hop-by-hop option number (5) */
uint8_t len; /* Length = 2 */
uint16_t value; /* Value. See OPT_RA_* Definitions */
uint8_t pad[4]; /* Pad to a multiple of 8 bytes */
};
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
/****************************************************************************
* Name: ipv6_exthdr
*
* Description:
* Check whether it is an IPv6 extension header.
*
* Input Parameters:
* The next header value extracted from an IPv6 frame.
*
* Returned Value:
* Return true if the next header value is an IPv6 extension header.
*
****************************************************************************/
bool ipv6_exthdr(uint8_t nxthdr);
#endif /* __INCLUDE_NUTTX_NET_IPV6EXT_H */