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

Fork of PicoTCP by Daniele Lacamera

Committer:
daniele
Date:
Sat Aug 03 08:50:27 2013 +0000
Revision:
51:18637a3d071f
Parent:
3:b4047e8a0123
Branch for CDC-ECM: Work in progress

Who changed what in which revision?

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