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
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
Generated on Tue Jul 12 2022 15:59:22 by 1.7.2