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_TCP
daniele 3:b4047e8a0123 9 #define _INCLUDE_PICO_TCP
daniele 3:b4047e8a0123 10 #include "pico_addressing.h"
daniele 3:b4047e8a0123 11 #include "pico_protocol.h"
daniele 3:b4047e8a0123 12 #include "pico_socket.h"
daniele 3:b4047e8a0123 13
daniele 3:b4047e8a0123 14 extern struct pico_protocol pico_proto_tcp;
daniele 3:b4047e8a0123 15
daniele 3:b4047e8a0123 16 struct __attribute__((packed)) pico_tcp_hdr {
daniele 3:b4047e8a0123 17 struct pico_trans trans;
daniele 3:b4047e8a0123 18 uint32_t seq;
daniele 3:b4047e8a0123 19 uint32_t ack;
daniele 3:b4047e8a0123 20 uint8_t len;
daniele 3:b4047e8a0123 21 uint8_t flags;
daniele 3:b4047e8a0123 22 uint16_t rwnd;
daniele 3:b4047e8a0123 23 uint16_t crc;
daniele 3:b4047e8a0123 24 uint16_t urgent;
daniele 3:b4047e8a0123 25 };
daniele 3:b4047e8a0123 26
daniele 3:b4047e8a0123 27 struct __attribute__((packed)) tcp_pseudo_hdr_ipv4
daniele 3:b4047e8a0123 28 {
daniele 3:b4047e8a0123 29 struct pico_ip4 src;
daniele 3:b4047e8a0123 30 struct pico_ip4 dst;
daniele 3:b4047e8a0123 31 uint16_t tcp_len;
daniele 3:b4047e8a0123 32 uint8_t res;
daniele 3:b4047e8a0123 33 uint8_t proto;
daniele 3:b4047e8a0123 34 };
daniele 3:b4047e8a0123 35
daniele 3:b4047e8a0123 36 #define PICO_TCPHDR_SIZE 20
daniele 3:b4047e8a0123 37 #define PICO_SIZE_TCPOPT_SYN 20
daniele 3:b4047e8a0123 38 #define PICO_SIZE_TCPHDR (sizeof(struct pico_tcp_hdr))
daniele 3:b4047e8a0123 39
daniele 3:b4047e8a0123 40 #define PICO_TCP_DEFAULT_MSS 1444
daniele 3:b4047e8a0123 41
daniele 3:b4047e8a0123 42
daniele 3:b4047e8a0123 43
daniele 3:b4047e8a0123 44 /* TCP options */
daniele 3:b4047e8a0123 45 #define PICO_TCP_OPTION_END 0x00
daniele 3:b4047e8a0123 46 #define PICO_TCPOPTLEN_END 1
daniele 3:b4047e8a0123 47 #define PICO_TCP_OPTION_NOOP 0x01
daniele 3:b4047e8a0123 48 #define PICO_TCPOPTLEN_NOOP 1
daniele 3:b4047e8a0123 49 #define PICO_TCP_OPTION_MSS 0x02
daniele 3:b4047e8a0123 50 #define PICO_TCPOPTLEN_MSS 4
daniele 3:b4047e8a0123 51 #define PICO_TCP_OPTION_WS 0x03
daniele 3:b4047e8a0123 52 #define PICO_TCPOPTLEN_WS 3
daniele 3:b4047e8a0123 53 #define PICO_TCP_OPTION_SACK_OK 0x04
daniele 3:b4047e8a0123 54 #define PICO_TCPOPTLEN_SACK_OK 2
daniele 3:b4047e8a0123 55 #define PICO_TCP_OPTION_SACK 0x05
daniele 3:b4047e8a0123 56 #define PICO_TCPOPTLEN_SACK 2 /* Plus the block */
daniele 3:b4047e8a0123 57 #define PICO_TCP_OPTION_TIMESTAMP 0x08
daniele 3:b4047e8a0123 58 #define PICO_TCPOPTLEN_TIMESTAMP 10
daniele 3:b4047e8a0123 59
daniele 3:b4047e8a0123 60 /* TCP flags */
daniele 3:b4047e8a0123 61 #define PICO_TCP_FIN 0x01
daniele 3:b4047e8a0123 62 #define PICO_TCP_SYN 0x02
daniele 3:b4047e8a0123 63 #define PICO_TCP_RST 0x04
daniele 3:b4047e8a0123 64 #define PICO_TCP_PSH 0x08
daniele 3:b4047e8a0123 65 #define PICO_TCP_ACK 0x10
daniele 3:b4047e8a0123 66 #define PICO_TCP_URG 0x20
daniele 3:b4047e8a0123 67 #define PICO_TCP_ECN 0x40
daniele 3:b4047e8a0123 68 #define PICO_TCP_CWR 0x80
daniele 3:b4047e8a0123 69
daniele 3:b4047e8a0123 70
daniele 3:b4047e8a0123 71
daniele 3:b4047e8a0123 72 struct __attribute__((packed)) pico_tcp_option
daniele 3:b4047e8a0123 73 {
daniele 3:b4047e8a0123 74 uint8_t kind;
daniele 3:b4047e8a0123 75 uint8_t len;
daniele 3:b4047e8a0123 76 #if 0
daniele 3:b4047e8a0123 77 union {
daniele 3:b4047e8a0123 78 uint16_t mss;
daniele 3:b4047e8a0123 79 uint8_t wshift;
daniele 3:b4047e8a0123 80 struct {
daniele 3:b4047e8a0123 81 uint32_t tsval;
daniele 3:b4047e8a0123 82 uint32_t tsecr;
daniele 3:b4047e8a0123 83 } timestamp;
daniele 3:b4047e8a0123 84 } data;
daniele 3:b4047e8a0123 85 #endif
daniele 3:b4047e8a0123 86 };
daniele 3:b4047e8a0123 87
daniele 3:b4047e8a0123 88 struct pico_socket *pico_tcp_open(void);
daniele 3:b4047e8a0123 89 int pico_tcp_read(struct pico_socket *s, void *buf, int len);
daniele 3:b4047e8a0123 90 int pico_tcp_initconn(struct pico_socket *s);
daniele 3:b4047e8a0123 91 int pico_tcp_input(struct pico_socket *s, struct pico_frame *f);
daniele 3:b4047e8a0123 92 uint16_t pico_tcp_checksum_ipv4(struct pico_frame *f);
daniele 3:b4047e8a0123 93 int pico_tcp_overhead(struct pico_socket *s);
daniele 3:b4047e8a0123 94 int pico_tcp_output(struct pico_socket *s, int loop_score);
daniele 3:b4047e8a0123 95 int pico_tcp_queue_in_is_empty(struct pico_socket *s);
daniele 3:b4047e8a0123 96 int pico_tcp_reply_rst(struct pico_frame *f);
daniele 3:b4047e8a0123 97
daniele 3:b4047e8a0123 98 #endif