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_ipv4.h Source File

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 */