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_ipv4.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_IPV4 00009 #define INCLUDE_PICO_IPV4 00010 #include "pico_addressing.h" 00011 #include "pico_protocol.h" 00012 #include "pico_tree.h" 00013 #include "pico_device.h" 00014 00015 #define PICO_IPV4_INADDR_ANY 0x00000000U 00016 00017 #define PICO_IPV4_MTU (1500u) 00018 #define PICO_SIZE_IP4HDR (uint32_t)((sizeof(struct pico_ipv4_hdr))) 00019 #define PICO_IPV4_MAXPAYLOAD (PICO_IPV4_MTU - PICO_SIZE_IP4HDR) 00020 #define PICO_IPV4_DONTFRAG 0x4000U 00021 #define PICO_IPV4_MOREFRAG 0x2000U 00022 #define PICO_IPV4_EVIL 0x8000U 00023 #define PICO_IPV4_FRAG_MASK 0x1FFFU 00024 #define PICO_IPV4_DEFAULT_TTL 64 00025 #ifndef MBED 00026 #define PICO_IPV4_FRAG_MAX_SIZE (uint32_t)(63 * 1024) 00027 #else 00028 #define PICO_IPV4_FRAG_MAX_SIZE PICO_DEFAULT_SOCKETQ 00029 #endif 00030 00031 extern struct pico_protocol pico_proto_ipv4; 00032 00033 PACKED_STRUCT_DEF pico_ipv4_hdr { 00034 uint8_t vhl; 00035 uint8_t tos; 00036 uint16_t len; 00037 uint16_t id; 00038 uint16_t frag; 00039 uint8_t ttl; 00040 uint8_t proto; 00041 uint16_t crc; 00042 struct pico_ip4 src; 00043 struct pico_ip4 dst; 00044 uint8_t options[]; 00045 }; 00046 00047 PACKED_STRUCT_DEF pico_ipv4_pseudo_hdr 00048 { 00049 struct pico_ip4 src; 00050 struct pico_ip4 dst; 00051 uint8_t zeros; 00052 uint8_t proto; 00053 uint16_t len; 00054 }; 00055 00056 /* Interface: link to device */ 00057 struct pico_mcast_list; 00058 00059 struct pico_ipv4_link 00060 { 00061 struct pico_device *dev; 00062 struct pico_ip4 address; 00063 struct pico_ip4 netmask; 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 #ifdef PICO_SUPPORT_MCAST 00072 struct pico_mcast_group { 00073 uint8_t filter_mode; 00074 uint16_t reference_count; 00075 struct pico_ip4 mcast_addr; 00076 struct pico_tree MCASTSources; 00077 }; 00078 #endif 00079 00080 struct pico_ipv4_route 00081 { 00082 struct pico_ip4 dest; 00083 struct pico_ip4 netmask; 00084 struct pico_ip4 gateway; 00085 struct pico_ipv4_link *link; 00086 uint32_t metric; 00087 }; 00088 00089 extern struct pico_tree Routes; 00090 00091 00092 int pico_ipv4_compare(struct pico_ip4 *a, struct pico_ip4 *b); 00093 int pico_ipv4_to_string(char *ipbuf, const uint32_t ip); 00094 int pico_string_to_ipv4(const char *ipstr, uint32_t *ip); 00095 int pico_ipv4_valid_netmask(uint32_t mask); 00096 int pico_ipv4_is_unicast(uint32_t address); 00097 int pico_ipv4_is_multicast(uint32_t address); 00098 int pico_ipv4_is_broadcast(uint32_t addr); 00099 int pico_ipv4_is_loopback(uint32_t addr); 00100 int pico_ipv4_is_valid_src(uint32_t addr, struct pico_device *dev); 00101 00102 int pico_ipv4_link_add(struct pico_device *dev, struct pico_ip4 address, struct pico_ip4 netmask); 00103 int pico_ipv4_link_del(struct pico_device *dev, struct pico_ip4 address); 00104 int pico_ipv4_rebound(struct pico_frame *f); 00105 00106 int pico_ipv4_frame_push(struct pico_frame *f, struct pico_ip4 *dst, uint8_t proto); 00107 struct pico_ipv4_link *pico_ipv4_link_get(struct pico_ip4 *address); 00108 struct pico_ipv4_link *pico_ipv4_link_by_dev(struct pico_device *dev); 00109 struct pico_ipv4_link *pico_ipv4_link_by_dev_next(struct pico_device *dev, struct pico_ipv4_link *last); 00110 struct pico_device *pico_ipv4_link_find(struct pico_ip4 *address); 00111 struct pico_ip4 *pico_ipv4_source_find(const struct pico_ip4 *dst); 00112 struct pico_device *pico_ipv4_source_dev_find(const struct pico_ip4 *dst); 00113 int pico_ipv4_route_add(struct pico_ip4 address, struct pico_ip4 netmask, struct pico_ip4 gateway, int metric, struct pico_ipv4_link *link); 00114 int pico_ipv4_route_del(struct pico_ip4 address, struct pico_ip4 netmask, int metric); 00115 struct pico_ip4 pico_ipv4_route_get_gateway(struct pico_ip4 *addr); 00116 void pico_ipv4_route_set_bcast_link(struct pico_ipv4_link *link); 00117 void pico_ipv4_unreachable(struct pico_frame *f, int err); 00118 00119 int pico_ipv4_mcast_join(struct pico_ip4 *mcast_link, struct pico_ip4 *mcast_group, uint8_t reference_count, uint8_t filter_mode, struct pico_tree *MCASTFilter); 00120 int pico_ipv4_mcast_leave(struct pico_ip4 *mcast_link, struct pico_ip4 *mcast_group, uint8_t reference_count, uint8_t filter_mode, struct pico_tree *MCASTFilter); 00121 struct pico_ipv4_link *pico_ipv4_get_default_mcastlink(void); 00122 int pico_ipv4_cleanup_links(struct pico_device *dev); 00123 00124 #endif /* _INCLUDE_PICO_IPV4 */
Generated on Tue Jul 12 2022 15:59:22 by 1.7.2