Free (GPLv2) TCP/IP stack developed by TASS Belgium

Dependents:   lpc1768-picotcp-demo ZeroMQ_PicoTCP_Publisher_demo TCPSocket_HelloWorld_PicoTCP Pico_TCP_UDP_Test ... more

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers pico_ipv6.h Source File

pico_ipv6.h

00001 /*********************************************************************
00002    PicoTCP. Copyright (c) 2012-2015 Altran Intelligent Systems. Some rights reserved.
00003    See LICENSE and COPYING for usage.
00004 
00005    .
00006 
00007  *********************************************************************/
00008 #ifndef _INCLUDE_PICO_IPV6
00009 #define _INCLUDE_PICO_IPV6
00010 #include "pico_addressing.h"
00011 #include "pico_protocol.h"
00012 #include "pico_ipv4.h"
00013 #define PICO_SIZE_IP6HDR ((uint32_t)(sizeof(struct pico_ipv6_hdr)))
00014 #define PICO_IPV6_DEFAULT_HOP 64
00015 #define PICO_IPV6_MIN_MTU 1280
00016 #define PICO_IPV6_STRING 46
00017 
00018 #define PICO_IPV6_EXTHDR_HOPBYHOP 0
00019 #define PICO_IPV6_EXTHDR_ROUTING 43
00020 #define PICO_IPV6_EXTHDR_FRAG 44
00021 #define PICO_IPV6_EXTHDR_ESP 50
00022 #define PICO_IPV6_EXTHDR_AUTH 51
00023 #define PICO_IPV6_EXTHDR_NONE 59
00024 #define PICO_IPV6_EXTHDR_DESTOPT 60
00025 
00026 
00027 #define PICO_IPV6_EXTHDR_OPT_ROUTER_ALERT 5
00028 #define PICO_IPV6_EXTHDR_OPT_ROUTER_ALERT_DATALEN 2
00029 
00030 #define HBH_LEN(hbh) ((((hbh->ext.hopbyhop.len + 1) << 3) - 2)) /* len in bytes, minus nxthdr and len byte */
00031 
00032 extern const uint8_t PICO_IP6_ANY[PICO_SIZE_IP6];
00033 extern struct pico_protocol pico_proto_ipv6;
00034 extern struct pico_tree IPV6Routes;
00035 
00036 PACKED_STRUCT_DEF pico_ipv6_hdr {
00037     uint32_t vtf;
00038     uint16_t len;
00039     uint8_t nxthdr;
00040     uint8_t hop;
00041     struct pico_ip6 src;
00042     struct pico_ip6 dst;
00043 };
00044 
00045 PACKED_STRUCT_DEF pico_ipv6_pseudo_hdr
00046 {
00047     struct pico_ip6 src;
00048     struct pico_ip6 dst;
00049     uint32_t len;
00050     uint8_t zero[3];
00051     uint8_t nxthdr;
00052 };
00053 
00054 struct pico_ipv6_link
00055 {
00056     struct pico_device *dev;
00057     struct pico_ip6 address;
00058     struct pico_ip6 netmask;
00059     uint8_t istentative : 1;
00060     uint8_t isduplicate : 1;
00061     struct pico_timer *dad_timer;
00062     uint16_t dup_detect_retrans;
00063     pico_time expire_time;
00064 #ifdef PICO_SUPPORT_MCAST
00065     struct pico_tree *MCASTGroups;
00066     uint8_t mcast_compatibility;
00067     uint8_t mcast_last_query_interval;
00068 #endif
00069 
00070 };
00071 union pico_link {
00072     struct pico_ipv4_link ipv4;
00073     struct pico_ipv6_link ipv6;
00074 };
00075 
00076 struct pico_ipv6_hbhoption {
00077     uint8_t type;
00078     uint8_t len;
00079 };
00080 #ifdef PICO_SUPPORT_MCAST
00081 struct pico_ipv6_mcast_group {
00082     uint8_t filter_mode;
00083     uint16_t reference_count;
00084     struct pico_ip6 mcast_addr;
00085     struct pico_tree MCASTSources;
00086 };
00087 #endif
00088 struct pico_ipv6_destoption {
00089     uint8_t type;
00090     uint8_t len;
00091 };
00092 
00093 struct pico_ipv6_route
00094 {
00095     struct pico_ip6 dest;
00096     struct pico_ip6 netmask;
00097     struct pico_ip6 gateway;
00098     struct pico_ipv6_link *link;
00099     uint32_t metric;
00100 };
00101 
00102 PACKED_STRUCT_DEF pico_ipv6_exthdr {
00103     uint8_t nxthdr;
00104 
00105     PACKED_UNION_DEF ipv6_ext_u {
00106         PEDANTIC_STRUCT_DEF hopbyhop_s {
00107             uint8_t len;
00108         } hopbyhop;
00109 
00110         PEDANTIC_STRUCT_DEF destopt_s {
00111             uint8_t len;
00112         } destopt;
00113 
00114         PEDANTIC_STRUCT_DEF routing_s {
00115             uint8_t len;
00116             uint8_t routtype;
00117             uint8_t segleft;
00118         } routing;
00119 
00120         PEDANTIC_STRUCT_DEF fragmentation_s {
00121             uint8_t res;
00122             uint8_t om[2];
00123             uint8_t id[4];
00124         } frag;
00125     } ext;
00126 };
00127 
00128 int pico_ipv6_compare(struct pico_ip6 *a, struct pico_ip6 *b);
00129 int pico_string_to_ipv6(const char *ipstr, uint8_t *ip);
00130 int pico_ipv6_to_string(char *ipbuf, const uint8_t ip[PICO_SIZE_IP6]);
00131 int pico_ipv6_is_unicast(struct pico_ip6 *a);
00132 int pico_ipv6_is_multicast(const uint8_t addr[PICO_SIZE_IP6]);
00133 int pico_ipv6_is_allhosts_multicast(const uint8_t addr[PICO_SIZE_IP6]);
00134 int pico_ipv6_is_solnode_multicast(const uint8_t addr[PICO_SIZE_IP6], struct pico_device *dev);
00135 int pico_ipv6_is_global(const uint8_t addr[PICO_SIZE_IP6]);
00136 int pico_ipv6_is_uniquelocal(const uint8_t addr[PICO_SIZE_IP6]);
00137 int pico_ipv6_is_sitelocal(const uint8_t addr[PICO_SIZE_IP6]);
00138 int pico_ipv6_is_linklocal(const uint8_t addr[PICO_SIZE_IP6]);
00139 int pico_ipv6_is_solicited(const uint8_t addr[PICO_SIZE_IP6]);
00140 int pico_ipv6_is_unspecified(const uint8_t addr[PICO_SIZE_IP6]);
00141 int pico_ipv6_is_localhost(const uint8_t addr[PICO_SIZE_IP6]);
00142 
00143 int pico_ipv6_frame_push(struct pico_frame *f, struct pico_ip6 *src, struct pico_ip6 *dst, uint8_t proto, int is_dad);
00144 int pico_ipv6_route_add(struct pico_ip6 address, struct pico_ip6 netmask, struct pico_ip6 gateway, int metric, struct pico_ipv6_link *link);
00145 int pico_ipv6_route_del(struct pico_ip6 address, struct pico_ip6 netmask, struct pico_ip6 gateway, int metric, struct pico_ipv6_link *link);
00146 void pico_ipv6_unreachable(struct pico_frame *f, uint8_t code);
00147 
00148 struct pico_ipv6_link *pico_ipv6_link_add(struct pico_device *dev, struct pico_ip6 address, struct pico_ip6 netmask);
00149 int pico_ipv6_link_del(struct pico_device *dev, struct pico_ip6 address);
00150 int pico_ipv6_cleanup_links(struct pico_device *dev);
00151 struct pico_ipv6_link *pico_ipv6_link_istentative(struct pico_ip6 *address);
00152 struct pico_ipv6_link *pico_ipv6_link_get(struct pico_ip6 *address);
00153 struct pico_device *pico_ipv6_link_find(struct pico_ip6 *address);
00154 struct pico_ip6 pico_ipv6_route_get_gateway(struct pico_ip6 *addr);
00155 struct pico_ip6 *pico_ipv6_source_find(const struct pico_ip6 *dst);
00156 struct pico_device *pico_ipv6_source_dev_find(const struct pico_ip6 *dst);
00157 struct pico_ipv6_link *pico_ipv6_link_by_dev(struct pico_device *dev);
00158 struct pico_ipv6_link *pico_ipv6_link_by_dev_next(struct pico_device *dev, struct pico_ipv6_link *last);
00159 struct pico_ipv6_link *pico_ipv6_global_get(struct pico_device *dev);
00160 struct pico_ipv6_link *pico_ipv6_linklocal_get(struct pico_device *dev);
00161 struct pico_ipv6_link *pico_ipv6_sitelocal_get(struct pico_device *dev);
00162 struct pico_ipv6_link *pico_ipv6_prefix_configured(struct pico_ip6 *prefix);
00163 int pico_ipv6_lifetime_set(struct pico_ipv6_link *l, pico_time expire);
00164 void pico_ipv6_check_lifetime_expired(pico_time now, void *arg);
00165 int pico_ipv6_dev_routing_enable(struct pico_device *dev);
00166 int pico_ipv6_dev_routing_disable(struct pico_device *dev);
00167 void pico_ipv6_router_down(struct pico_ip6 *address);
00168 
00169 int pico_ipv6_mcast_join(struct pico_ip6 *mcast_link, struct pico_ip6 *mcast_group, uint8_t reference_count, uint8_t filter_mode, struct pico_tree *_MCASTFilter);
00170 int pico_ipv6_mcast_leave(struct pico_ip6 *mcast_link, struct pico_ip6 *mcast_group, uint8_t reference_count, uint8_t filter_mode, struct pico_tree *_MCASTFilter);
00171 
00172 struct pico_ipv6_link *pico_ipv6_get_default_mcastlink(void);
00173 
00174 int pico_ipv6_is_null_address(struct pico_ip6 * ip6);
00175 #endif