uint8_t connect(SOCKET s, uint8_t *destinationIp, uint16_t destinationPort) { uint16_t i; char buffer[59]; uint8_t h=0; memcpy(_SOCKETS[s].destinationIp, destinationIp, 4); _SOCKETS[s].destinationPort = destinationPort; make_arp_request((uint8_t*)buffer, destinationIp); _SOCKETS[s].clientState = ARP_REQUEST_SENT; #ifdef ETHERSHIELD_DEBUG ethershieldDebug("Sent ARP request.\r\n"); #endif for (i = 0; _SOCKETS[s].clientState != GOT_MAC && i < MAX_ITERATIONS; i++) { flushSockets(); //it'll fill destinationMac on socket struct for(h=0; h<ARP_CACHE_SIZE; h++) if(arp_table.n > h) if(memcmp(destinationIp, arp_table.t[h].ipAddr, 4) == 0) _SOCKETS[s].clientState = GOT_MAC; } if (_SOCKETS[s].clientState != GOT_MAC) { return 0; } #ifdef ETHERSHIELD_DEBUG ethershieldDebug("MAC received, sending TCP SYN.\r\n"); #endif tcp_client_send_packet((uint8_t*)buffer, destinationPort, sourcePort++, TCP_FLAG_SYN_V, 1, 1, 0, 0, _SOCKETS[s].destinationMac, destinationIp); _SOCKETS[s].clientState = TCP_SYN_SENT; #ifdef ETHERSHIELD_DEBUG ethershieldDebug("TCP SYN sent.\r\n"); #endif for (i = 0; _SOCKETS[s].clientState != SOCK_ESTABLISHED && i < MAX_ITERATIONS; i++) { flushSockets(); } return _SOCKETS[s].clientState == SOCK_ESTABLISHED; //TODO: Maybe use a timeout instead of MAX_ITERATIONS to receive SYN+ACK }
void EtherShield::ES_tcp_client_send_packet(uint8_t *buf,uint16_t dest_port, uint16_t src_port, uint8_t flags, uint8_t max_segment_size, uint8_t clear_seqck, uint16_t next_ack_num, uint16_t dlength, uint8_t *dest_mac, uint8_t *dest_ip){ tcp_client_send_packet(buf, dest_port, src_port, flags, max_segment_size, clear_seqck, next_ack_num, dlength,dest_mac,dest_ip); }