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

Fork of PicoTCP by Daniele Lacamera

Committer:
tass
Date:
Fri May 17 12:09:59 2013 +0000
Revision:
1:cfe8984a32b4
Parent:
libraries/picotcp/modules/pico_icmp4.h@0:d7f2341ab245
Update for smaller SOCKETQ

Who changed what in which revision?

UserRevisionLine numberNew contents of line
daniele 0:d7f2341ab245 1 /*********************************************************************
daniele 0:d7f2341ab245 2 PicoTCP. Copyright (c) 2012 TASS Belgium NV. Some rights reserved.
daniele 0:d7f2341ab245 3 See LICENSE and COPYING for usage.
daniele 0:d7f2341ab245 4
daniele 0:d7f2341ab245 5 .
daniele 0:d7f2341ab245 6
daniele 0:d7f2341ab245 7 *********************************************************************/
daniele 0:d7f2341ab245 8 #ifndef _INCLUDE_PICO_ICMP4
daniele 0:d7f2341ab245 9 #define _INCLUDE_PICO_ICMP4
daniele 0:d7f2341ab245 10 #include "pico_addressing.h"
daniele 0:d7f2341ab245 11 #include "pico_protocol.h"
daniele 0:d7f2341ab245 12
daniele 0:d7f2341ab245 13 extern struct pico_protocol pico_proto_icmp4;
daniele 0:d7f2341ab245 14
daniele 0:d7f2341ab245 15 struct __attribute__((packed)) pico_icmp4_hdr {
daniele 0:d7f2341ab245 16 uint8_t type;
daniele 0:d7f2341ab245 17 uint8_t code;
daniele 0:d7f2341ab245 18 uint16_t crc;
daniele 0:d7f2341ab245 19
daniele 0:d7f2341ab245 20 /* hun */
daniele 0:d7f2341ab245 21 union {
daniele 0:d7f2341ab245 22 uint8_t ih_pptr;
daniele 0:d7f2341ab245 23 struct pico_ip4 ih_gwaddr;
daniele 0:d7f2341ab245 24 struct {
daniele 0:d7f2341ab245 25 uint16_t idseq_id;
daniele 0:d7f2341ab245 26 uint16_t idseq_seq;
daniele 0:d7f2341ab245 27 } ih_idseq;
daniele 0:d7f2341ab245 28 uint32_t ih_void;
daniele 0:d7f2341ab245 29 struct {
daniele 0:d7f2341ab245 30 uint16_t ipm_void;
daniele 0:d7f2341ab245 31 uint16_t ipm_nmtu;
daniele 0:d7f2341ab245 32 } ih_pmtu;
daniele 0:d7f2341ab245 33 struct {
daniele 0:d7f2341ab245 34 uint8_t rta_numgw;
daniele 0:d7f2341ab245 35 uint8_t rta_wpa;
daniele 0:d7f2341ab245 36 uint16_t rta_lifetime;
daniele 0:d7f2341ab245 37 } ih_rta;
daniele 0:d7f2341ab245 38 } hun;
daniele 0:d7f2341ab245 39
daniele 0:d7f2341ab245 40 /* dun */
daniele 0:d7f2341ab245 41 union {
daniele 0:d7f2341ab245 42 struct {
daniele 0:d7f2341ab245 43 uint32_t ts_otime;
daniele 0:d7f2341ab245 44 uint32_t ts_rtime;
daniele 0:d7f2341ab245 45 uint32_t ts_ttime;
daniele 0:d7f2341ab245 46 } id_ts;
daniele 0:d7f2341ab245 47 struct {
daniele 0:d7f2341ab245 48 uint32_t ip_options;
daniele 0:d7f2341ab245 49 uint32_t ip_data_hi;
daniele 0:d7f2341ab245 50 uint32_t ip_data_lo;
daniele 0:d7f2341ab245 51 } id_ip;
daniele 0:d7f2341ab245 52 struct {
daniele 0:d7f2341ab245 53 uint32_t ira_addr;
daniele 0:d7f2341ab245 54 uint32_t ira_pref;
daniele 0:d7f2341ab245 55 } id_ra;
daniele 0:d7f2341ab245 56 uint32_t id_mask;
daniele 0:d7f2341ab245 57 uint8_t id_data[1];
daniele 0:d7f2341ab245 58 } dun;
daniele 0:d7f2341ab245 59 };
daniele 0:d7f2341ab245 60
daniele 0:d7f2341ab245 61 #define PICO_ICMPHDR_DRY_SIZE 4
daniele 0:d7f2341ab245 62 #define PICO_ICMPHDR_UN_SIZE 8
daniele 0:d7f2341ab245 63
daniele 0:d7f2341ab245 64 #define PICO_ICMP_ECHOREPLY 0
daniele 0:d7f2341ab245 65 #define PICO_ICMP_DEST_UNREACH 3
daniele 0:d7f2341ab245 66 #define PICO_ICMP_SOURCE_QUENCH 4
daniele 0:d7f2341ab245 67 #define PICO_ICMP_REDIRECT 5
daniele 0:d7f2341ab245 68 #define PICO_ICMP_ECHO 8
daniele 0:d7f2341ab245 69 #define PICO_ICMP_TIME_EXCEEDED 11
daniele 0:d7f2341ab245 70 #define PICO_ICMP_PARAMETERPROB 12
daniele 0:d7f2341ab245 71 #define PICO_ICMP_TIMESTAMP 13
daniele 0:d7f2341ab245 72 #define PICO_ICMP_TIMESTAMPREPLY 14
daniele 0:d7f2341ab245 73 #define PICO_ICMP_INFO_REQUEST 15
daniele 0:d7f2341ab245 74 #define PICO_ICMP_INFO_REPLY 16
daniele 0:d7f2341ab245 75 #define PICO_ICMP_ADDRESS 17
daniele 0:d7f2341ab245 76 #define PICO_ICMP_ADDRESSREPLY 18
daniele 0:d7f2341ab245 77
daniele 0:d7f2341ab245 78
daniele 0:d7f2341ab245 79 #define PICO_ICMP_UNREACH 3
daniele 0:d7f2341ab245 80 #define PICO_ICMP_SOURCEQUENCH 4
daniele 0:d7f2341ab245 81 #define PICO_ICMP_ROUTERADVERT 9
daniele 0:d7f2341ab245 82 #define PICO_ICMP_ROUTERSOLICIT 10
daniele 0:d7f2341ab245 83 #define PICO_ICMP_TIMXCEED 11
daniele 0:d7f2341ab245 84 #define PICO_ICMP_PARAMPROB 12
daniele 0:d7f2341ab245 85 #define PICO_ICMP_TSTAMP 13
daniele 0:d7f2341ab245 86 #define PICO_ICMP_TSTAMPREPLY 14
daniele 0:d7f2341ab245 87 #define PICO_ICMP_IREQ 15
daniele 0:d7f2341ab245 88 #define PICO_ICMP_IREQREPLY 16
daniele 0:d7f2341ab245 89 #define PICO_ICMP_MASKREQ 17
daniele 0:d7f2341ab245 90 #define PICO_ICMP_MASKREPLY 18
daniele 0:d7f2341ab245 91
daniele 0:d7f2341ab245 92 #define PICO_ICMP_MAXTYPE 18
daniele 0:d7f2341ab245 93
daniele 0:d7f2341ab245 94
daniele 0:d7f2341ab245 95 #define PICO_ICMP_UNREACH_NET 0
daniele 0:d7f2341ab245 96 #define PICO_ICMP_UNREACH_HOST 1
daniele 0:d7f2341ab245 97 #define PICO_ICMP_UNREACH_PROTOCOL 2
daniele 0:d7f2341ab245 98 #define PICO_ICMP_UNREACH_PORT 3
daniele 0:d7f2341ab245 99 #define PICO_ICMP_UNREACH_NEEDFRAG 4
daniele 0:d7f2341ab245 100 #define PICO_ICMP_UNREACH_SRCFAIL 5
daniele 0:d7f2341ab245 101 #define PICO_ICMP_UNREACH_NET_UNKNOWN 6
daniele 0:d7f2341ab245 102 #define PICO_ICMP_UNREACH_HOST_UNKNOWN 7
daniele 0:d7f2341ab245 103 #define PICO_ICMP_UNREACH_ISOLATED 8
daniele 0:d7f2341ab245 104 #define PICO_ICMP_UNREACH_NET_PROHIB 9
daniele 0:d7f2341ab245 105 #define PICO_ICMP_UNREACH_HOST_PROHIB 10
daniele 0:d7f2341ab245 106 #define PICO_ICMP_UNREACH_TOSNET 11
daniele 0:d7f2341ab245 107 #define PICO_ICMP_UNREACH_TOSHOST 12
daniele 0:d7f2341ab245 108 #define PICO_ICMP_UNREACH_FILTER_PROHIB 13
daniele 0:d7f2341ab245 109 #define PICO_ICMP_UNREACH_HOST_PRECEDENCE 14
daniele 0:d7f2341ab245 110 #define PICO_ICMP_UNREACH_PRECEDENCE_CUTOFF 15
daniele 0:d7f2341ab245 111
daniele 0:d7f2341ab245 112
daniele 0:d7f2341ab245 113 #define PICO_ICMP_REDIRECT_NET 0
daniele 0:d7f2341ab245 114 #define PICO_ICMP_REDIRECT_HOST 1
daniele 0:d7f2341ab245 115 #define PICO_ICMP_REDIRECT_TOSNET 2
daniele 0:d7f2341ab245 116 #define PICO_ICMP_REDIRECT_TOSHOST 3
daniele 0:d7f2341ab245 117
daniele 0:d7f2341ab245 118
daniele 0:d7f2341ab245 119 #define PICO_ICMP_TIMXCEED_INTRANS 0
daniele 0:d7f2341ab245 120 #define PICO_ICMP_TIMXCEED_REASS 1
daniele 0:d7f2341ab245 121
daniele 0:d7f2341ab245 122
daniele 0:d7f2341ab245 123 #define PICO_ICMP_PARAMPROB_OPTABSENT 1
daniele 0:d7f2341ab245 124
daniele 0:d7f2341ab245 125 #define PICO_SIZE_ICMP4HDR ((sizeof(struct pico_icmp4_hdr)))
daniele 0:d7f2341ab245 126
daniele 0:d7f2341ab245 127 struct pico_icmp4_stats
daniele 0:d7f2341ab245 128 {
daniele 0:d7f2341ab245 129 struct pico_ip4 dst;
daniele 0:d7f2341ab245 130 unsigned long size;
daniele 0:d7f2341ab245 131 unsigned long seq;
daniele 0:d7f2341ab245 132 unsigned long time;
daniele 0:d7f2341ab245 133 unsigned long ttl;
daniele 0:d7f2341ab245 134 int err;
daniele 0:d7f2341ab245 135 };
daniele 0:d7f2341ab245 136
daniele 0:d7f2341ab245 137 int pico_icmp4_port_unreachable(struct pico_frame *f);
daniele 0:d7f2341ab245 138 int pico_icmp4_proto_unreachable(struct pico_frame *f);
daniele 0:d7f2341ab245 139 int pico_icmp4_dest_unreachable(struct pico_frame *f);
daniele 0:d7f2341ab245 140 int pico_icmp4_ttl_expired(struct pico_frame *f);
daniele 0:d7f2341ab245 141 int pico_icmp4_packet_filtered(struct pico_frame *f);
daniele 0:d7f2341ab245 142
daniele 0:d7f2341ab245 143 int pico_icmp4_ping(char *dst, int count, int interval, int timeout, int size, void (*cb)(struct pico_icmp4_stats *));
daniele 0:d7f2341ab245 144 #define PICO_PING_ERR_REPLIED 0
daniele 0:d7f2341ab245 145 #define PICO_PING_ERR_TIMEOUT 1
daniele 0:d7f2341ab245 146 #define PICO_PING_ERR_UNREACH 2
daniele 0:d7f2341ab245 147 #define PICO_PING_ERR_PENDING 0xFFFF
daniele 0:d7f2341ab245 148
daniele 0:d7f2341ab245 149 #endif