net: partial implementation of tcp
[quarnos.git] / resources / net / tcp_client_socket.cpp
blob26c2299787b5c21701aa278aa691934c7f550e0a
1 #include "tcp_client_socket.h"
3 using namespace net;
5 void tcp_client_socket::connect(const ipv4_addr &addr, int port) {
6 server = addr;
7 server_port = port;
8 client_port = down->acquire_port();
10 // down.cast<tcp>()->listen(client_port, tcp::port_listener::method(this, &tcp_client_socket::receive));
12 sequence_number = 1;
13 negotiation = true;
15 /* TCP three-way handshake
16 * Part I: SYN packet */
17 down.cast<tcp>()->send(addr, port, client_port, buffer::empty, tcp::tcp_syn, sequence_number++, 0);
21 void tcp_client_socket::receive(const ipv4_addr &addr, u16 sender_port, const buffer &data, tcp::tcp_flags flags, int seq, int ack) {
22 if (addr != server || server_port != server_port)
23 return;
25 if (negotiation) {
26 /* In the second part of handshake we should receive SYN/ACK packet */
27 if (flags != (tcp::tcp_syn | tcp::tcp_ack) || ack != sequence_number - 1)
28 return;
29 negotiation = false;
31 /* TCP three-way handshake
32 * Part III: ACK packet */
33 down.cast<tcp>()->send(addr, sender_port, client_port, buffer::empty, tcp::tcp_ack, sequence_number++, seq);
34 return;
38 tcp_client_socket::tcp_client_socket(p<transport_layer> tl) : client_socket(tl) { }
39 tcp_client_socket::~tcp_client_socket() {
40 close();
43 void tcp_client_socket::write(const buffer &data) {
44 down.cast<tcp>()->send(server, server_port, client_port, data, tcp::tcp_none, sequence_number++, ack_number);
47 void tcp_client_socket::read(buffer &data) { }
49 void tcp_client_socket::close() {
50 if (client_port) {
51 // down.cast<tcp>()->remove_listener(client_port, tcp::port_listener::method(this, &tcp_client_socket::receive));
52 down->release_port(client_port);
53 client_port = 0;