107 lines
3.6 KiB
C
107 lines
3.6 KiB
C
![]() |
/*********************************************************************
|
||
|
PicoTCP. Copyright (c) 2012-2017 Altran Intelligent Systems. Some rights reserved.
|
||
|
See COPYING, LICENSE.GPLv2 and LICENSE.GPLv3 for usage.
|
||
|
|
||
|
.
|
||
|
|
||
|
*********************************************************************/
|
||
|
#ifndef INCLUDE_PICO_TCP
|
||
|
#define INCLUDE_PICO_TCP
|
||
|
#include "pico_addressing.h"
|
||
|
#include "pico_protocol.h"
|
||
|
#include "pico_socket.h"
|
||
|
|
||
|
extern struct pico_protocol pico_proto_tcp;
|
||
|
|
||
|
PACKED_STRUCT_DEF pico_tcp_hdr {
|
||
|
struct pico_trans trans;
|
||
|
uint32_t seq;
|
||
|
uint32_t ack;
|
||
|
uint8_t len;
|
||
|
uint8_t flags;
|
||
|
uint16_t rwnd;
|
||
|
uint16_t crc;
|
||
|
uint16_t urgent;
|
||
|
};
|
||
|
|
||
|
PACKED_STRUCT_DEF tcp_pseudo_hdr_ipv4
|
||
|
{
|
||
|
struct pico_ip4 src;
|
||
|
struct pico_ip4 dst;
|
||
|
uint16_t tcp_len;
|
||
|
uint8_t res;
|
||
|
uint8_t proto;
|
||
|
};
|
||
|
|
||
|
#define PICO_TCPHDR_SIZE 20
|
||
|
#define PICO_SIZE_TCPOPT_SYN 20
|
||
|
#define PICO_SIZE_TCPHDR (uint32_t)(sizeof(struct pico_tcp_hdr))
|
||
|
|
||
|
/* TCP options */
|
||
|
#define PICO_TCP_OPTION_END 0x00
|
||
|
#define PICO_TCPOPTLEN_END 1u
|
||
|
#define PICO_TCP_OPTION_NOOP 0x01
|
||
|
#define PICO_TCPOPTLEN_NOOP 1
|
||
|
#define PICO_TCP_OPTION_MSS 0x02
|
||
|
#define PICO_TCPOPTLEN_MSS 4
|
||
|
#define PICO_TCP_OPTION_WS 0x03
|
||
|
#define PICO_TCPOPTLEN_WS 3u
|
||
|
#define PICO_TCP_OPTION_SACK_OK 0x04
|
||
|
#define PICO_TCPOPTLEN_SACK_OK 2
|
||
|
#define PICO_TCP_OPTION_SACK 0x05
|
||
|
#define PICO_TCPOPTLEN_SACK 2 /* Plus the block */
|
||
|
#define PICO_TCP_OPTION_TIMESTAMP 0x08
|
||
|
#define PICO_TCPOPTLEN_TIMESTAMP 10u
|
||
|
|
||
|
/* TCP flags */
|
||
|
#define PICO_TCP_FIN 0x01u
|
||
|
#define PICO_TCP_SYN 0x02u
|
||
|
#define PICO_TCP_RST 0x04u
|
||
|
#define PICO_TCP_PSH 0x08u
|
||
|
#define PICO_TCP_ACK 0x10u
|
||
|
#define PICO_TCP_URG 0x20u
|
||
|
#define PICO_TCP_ECN 0x40u
|
||
|
#define PICO_TCP_CWR 0x80u
|
||
|
|
||
|
#define PICO_TCP_SYNACK (PICO_TCP_SYN | PICO_TCP_ACK)
|
||
|
#define PICO_TCP_PSHACK (PICO_TCP_PSH | PICO_TCP_ACK)
|
||
|
#define PICO_TCP_FINACK (PICO_TCP_FIN | PICO_TCP_ACK)
|
||
|
#define PICO_TCP_FINPSHACK (PICO_TCP_FIN | PICO_TCP_PSH | PICO_TCP_ACK)
|
||
|
#define PICO_TCP_RSTACK (PICO_TCP_RST | PICO_TCP_ACK)
|
||
|
|
||
|
|
||
|
PACKED_STRUCT_DEF pico_tcp_option
|
||
|
{
|
||
|
uint8_t kind;
|
||
|
uint8_t len;
|
||
|
};
|
||
|
|
||
|
struct pico_socket *pico_tcp_open(uint16_t family);
|
||
|
uint32_t pico_tcp_read(struct pico_socket *s, void *buf, uint32_t len);
|
||
|
int pico_tcp_initconn(struct pico_socket *s);
|
||
|
int pico_tcp_input(struct pico_socket *s, struct pico_frame *f);
|
||
|
uint16_t pico_tcp_checksum(struct pico_frame *f);
|
||
|
uint16_t pico_tcp_checksum_ipv4(struct pico_frame *f);
|
||
|
#ifdef PICO_SUPPORT_IPV6
|
||
|
uint16_t pico_tcp_checksum_ipv6(struct pico_frame *f);
|
||
|
#endif
|
||
|
uint16_t pico_tcp_overhead(struct pico_socket *s);
|
||
|
int pico_tcp_output(struct pico_socket *s, int loop_score);
|
||
|
int pico_tcp_queue_in_is_empty(struct pico_socket *s);
|
||
|
int pico_tcp_reply_rst(struct pico_frame *f);
|
||
|
void pico_tcp_cleanup_queues(struct pico_socket *sck);
|
||
|
void pico_tcp_notify_closing(struct pico_socket *sck);
|
||
|
void pico_tcp_flags_update(struct pico_frame *f, struct pico_socket *s);
|
||
|
int pico_tcp_set_bufsize_in(struct pico_socket *s, uint32_t value);
|
||
|
int pico_tcp_set_bufsize_out(struct pico_socket *s, uint32_t value);
|
||
|
int pico_tcp_get_bufsize_in(struct pico_socket *s, uint32_t *value);
|
||
|
int pico_tcp_get_bufsize_out(struct pico_socket *s, uint32_t *value);
|
||
|
int pico_tcp_set_keepalive_probes(struct pico_socket *s, uint32_t value);
|
||
|
int pico_tcp_set_keepalive_intvl(struct pico_socket *s, uint32_t value);
|
||
|
int pico_tcp_set_keepalive_time(struct pico_socket *s, uint32_t value);
|
||
|
int pico_tcp_set_linger(struct pico_socket *s, uint32_t value);
|
||
|
uint16_t pico_tcp_get_socket_mss(struct pico_socket *s);
|
||
|
int pico_tcp_check_listen_close(struct pico_socket *s);
|
||
|
|
||
|
#endif
|