Definiciones | |
Longitud de encabezados | |
#define | TCP_HEADER_LEN 20 |
#define | TCP_OPTION_LEN 4 |
Constantes de las Flags | |
Define los valores de SYN, FIN, ACK, etc | |
#define | TCP_FLAG_FIN_V 0x01 |
#define | TCP_FLAG_SYN_V 0x02 |
#define | TCP_FLAG_RST_V 0x04 |
#define | TCP_FLAG_PSH_V 0x08 |
#define | TCP_FLAG_ACK_V 0x10 |
#define | TCP_FLAG_URG_V 0x20 |
#define | TCP_FLAG_ECE_V 0x40 |
#define | TCP_FLAG_CWR_V 0x80 |
Puerto por defecto | |
#define | TCP_AVR_PORT_V 8080 |
#define | TCP_AVR_PORT_H_V (UDP_AVR_PORT_V>>8) |
#define | TCP_AVR_PORT_L_V (UDP_AVR_PORT_V&0xff) |
Campos de TCP | |
#define | TCP_SRC_PORT_H_P 0x22 |
#define | TCP_SRC_PORT_L_P 0x23 |
#define | TCP_DST_PORT_H_P 0x24 |
#define | TCP_DST_PORT_L_P 0x25 |
#define | TCP_SEQ_P 0x26 |
#define | TCP_SEQACK_P 0x2A |
#define | TCP_HEADER_LEN_P 0x2E |
#define | TCP_FLAGS_P 0x2F |
#define | TCP_WINDOWSIZE_H_P 0x30 |
#define | TCP_WINDOWSIZE_L_P 0x31 |
#define | TCP_CHECKSUM_H_P 0x32 |
#define | TCP_CHECKSUM_L_P 0x33 |
#define | TCP_URGENT_PTR_H_P 0x34 |
#define | TCP_URGENT_PTR_L_P 0x35 |
#define | TCP_OPTIONS_P 0x36 |
#define | TCP_DATA_P 0x36 |
Funciones | |
WORD | tcp_get_dlength (BYTE *rxtx_buffer) |
Devuelve el largo de datos de un paq. TCP . | |
BYTE | tcp_get_hlength (BYTE *rxtx_buffer) |
Devuelve el largo del encabezado de un paq. TCP . | |
WORD | tcp_puts_data (BYTE *rxtx_buffer, BYTE *data, WORD offset) |
Coloca datos de RAM en un paq. TCP Los coloca con un OFFSET respecto al inicio del campo de datos . | |
WORD | tcp_puts_data_p (BYTE *rxtx_buffer, PGM_P data, WORD offset) |
Coloca datos de program memory en un paq. TCP Los coloca con un OFFSET respecto al inicio del campo de datos . | |
void | tcp_send_packet (BYTE *rxtx_buffer, WORD_BYTES dest_port, WORD_BYTES src_port, BYTE flags, BYTE max_segment_size, BYTE clear_seqack, WORD next_ack_num, WORD dlength, BYTE *dest_mac, BYTE *dest_ip) |
Envio de paquetes TCP . |
Se definen los campos y valores tipicos de los paquetes TCP.
#define TCP_AVR_PORT_H_V (UDP_AVR_PORT_V>>8) |
#define TCP_AVR_PORT_L_V (UDP_AVR_PORT_V&0xff) |
#define TCP_AVR_PORT_V 8080 |
#define TCP_CHECKSUM_H_P 0x32 |
#define TCP_CHECKSUM_L_P 0x33 |
#define TCP_DATA_P 0x36 |
#define TCP_DST_PORT_H_P 0x24 |
#define TCP_DST_PORT_L_P 0x25 |
#define TCP_FLAG_ACK_V 0x10 |
#define TCP_FLAG_CWR_V 0x80 |
#define TCP_FLAG_ECE_V 0x40 |
#define TCP_FLAG_FIN_V 0x01 |
#define TCP_FLAG_PSH_V 0x08 |
#define TCP_FLAG_RST_V 0x04 |
#define TCP_FLAG_SYN_V 0x02 |
#define TCP_FLAG_URG_V 0x20 |
#define TCP_FLAGS_P 0x2F |
#define TCP_HEADER_LEN 20 |
#define TCP_HEADER_LEN_P 0x2E |
#define TCP_OPTION_LEN 4 |
#define TCP_OPTIONS_P 0x36 |
#define TCP_SEQ_P 0x26 |
#define TCP_SEQACK_P 0x2A |
#define TCP_SRC_PORT_H_P 0x22 |
#define TCP_SRC_PORT_L_P 0x23 |
#define TCP_URGENT_PTR_H_P 0x34 |
#define TCP_URGENT_PTR_L_P 0x35 |
#define TCP_WINDOWSIZE_H_P 0x30 |
#define TCP_WINDOWSIZE_L_P 0x31 |
Devuelve el largo de datos de un paq. TCP
.
rxtx_buffer | puntero al paquete TCP. |
Devuelve el largo del encabezado de un paq. TCP
.
rxtx_buffer | puntero al paquete TCP. |
Coloca datos de RAM en un paq. TCP
Los coloca con un OFFSET respecto al inicio del campo de datos
.
rxtx_buffer | el puntero al paquete en que se colocaran los datos. | |
data | el puntero a los datos a colocar | |
offset | el OFFSET respecto al origen del campo de datos |
Coloca datos de program memory en un paq. TCP
Los coloca con un OFFSET respecto al inicio del campo de datos
.
rxtx_buffer | el puntero al paquete en que se colocaran los datos. | |
data | el puntero a los datos a colocar | |
offset | el OFFSET respecto al origen del campo de datos |
void tcp_send_packet | ( | BYTE * | rxtx_buffer, | |
WORD_BYTES | dest_port, | |||
WORD_BYTES | src_port, | |||
BYTE | flags, | |||
BYTE | max_segment_size, | |||
BYTE | clear_seqack, | |||
WORD | next_ack_num, | |||
WORD | dlength, | |||
BYTE * | dest_mac, | |||
BYTE * | dest_ip | |||
) |
Envio de paquetes TCP
.
Conexion normal:
1) envio SYN con SEQ=n
2)me responden SYN con SEQ=m y ACK n+1
3)retorno SEQ=n+1 ACK m+1
con esto quedan inicializadas las conexiones de ambos lados. Es importante definir quien es el que establece y corta la conexion.
rxtx_buffer | puntero al buffer | |
dest_port | puerto de destino | |
src_port | puerto de origen | |
flags | ||
max_segment_size | ||
clear_seqack | indica si se limpia o no seq. ack. | |
next_ack_num | siguiente numero a ser reconocido | |
dlength | largo del campo de datos | |
dest_mac | MAC de destino | |
dest_ip | IP de destino |
generate ethernet header
sequence numbers: add the rel ack num to SEQACK
copy the acknum sent to us into the sequence number
initial tcp sequence number setup maximum segment size require to setup first packet is receive or transmit only
initial sequence number
setup maximum segment size
setup tcp header length 24 bytes: 6*32/8 = 24
generate ip header and checksum
clear sequence ack number before send tcp SYN packet
setup tcp flags
setup destination port
setup source port
setup maximum windows size
setup urgend pointer (not used -> 0)
clear old checksum and calculate new checksum
send packet to ethernet media