瀏覽代碼

IPv4: More work on the TCP implementation.

Reading from the peer now kinda works. Something still going wrong with
sending packets but it's getting closer.
Andreas Kling 6 年之前
父節點
當前提交
be46f1bb1f
共有 3 個文件被更改,包括 27 次插入18 次删除
  1. 17 15
      Kernel/IPv4Socket.cpp
  2. 9 2
      Kernel/NetworkTask.cpp
  3. 1 1
      Userland/tc.cpp

+ 17 - 15
Kernel/IPv4Socket.cpp

@@ -97,25 +97,27 @@ KResult IPv4Socket::connect(const sockaddr* address, socklen_t address_size)
     m_destination_address = IPv4Address((const byte*)&ia.sin_addr.s_addr);
     m_destination_address = IPv4Address((const byte*)&ia.sin_addr.s_addr);
     m_destination_port = ntohs(ia.sin_port);
     m_destination_port = ntohs(ia.sin_port);
 
 
-    if (type() == SOCK_STREAM) {
-        // FIXME: Figure out the adapter somehow differently.
-        auto* adapter = NetworkAdapter::from_ipv4_address(IPv4Address(192, 168, 5, 2));
-        if (!adapter)
-            ASSERT_NOT_REACHED();
+    if (type() != SOCK_STREAM)
+        return KSuccess;
+
+    // FIXME: Figure out the adapter somehow differently.
+    auto* adapter = NetworkAdapter::from_ipv4_address(IPv4Address(192, 168, 5, 2));
+    if (!adapter)
+        ASSERT_NOT_REACHED();
 
 
-        allocate_source_port_if_needed();
+    allocate_source_port_if_needed();
 
 
-        send_tcp_packet(*adapter, TCPFlags::SYN);
-        m_tcp_state = TCPState::Connecting1;
+    m_tcp_sequence_number = 0;
+    m_tcp_ack_number = 0;
 
 
-        current->set_blocked_socket(this);
-        block(Process::BlockedConnect);
-        Scheduler::yield();
+    send_tcp_packet(*adapter, TCPFlags::SYN);
+    m_tcp_state = TCPState::Connecting1;
 
 
-        ASSERT(is_connected());
-        return KSuccess;
-    }
+    current->set_blocked_socket(this);
+    block(Process::BlockedConnect);
+    Scheduler::yield();
 
 
+    ASSERT(is_connected());
     return KSuccess;
     return KSuccess;
 }
 }
 
 
@@ -372,7 +374,7 @@ ssize_t IPv4Socket::recvfrom(void* buffer, size_t buffer_length, int flags, sock
 
 
     if (type() == SOCK_STREAM) {
     if (type() == SOCK_STREAM) {
         auto& tcp_packet = *static_cast<const TCPPacket*>(ipv4_packet.payload());
         auto& tcp_packet = *static_cast<const TCPPacket*>(ipv4_packet.payload());
-        size_t payload_size = packet_buffer.size() - sizeof(TCPPacket);
+        size_t payload_size = packet_buffer.size() - tcp_packet.header_size();
         ASSERT(buffer_length >= payload_size);
         ASSERT(buffer_length >= payload_size);
         if (addr) {
         if (addr) {
             auto& ia = *(sockaddr_in*)addr;
             auto& ia = *(sockaddr_in*)addr;

+ 9 - 2
Kernel/NetworkTask.cpp

@@ -295,15 +295,22 @@ void handle_tcp(const EthernetFrameHeader& eth, int frame_size)
 
 
     size_t payload_size = ipv4_packet.payload_size() - tcp_packet.header_size();
     size_t payload_size = ipv4_packet.payload_size() - tcp_packet.header_size();
 
 
+    if (tcp_packet.ack_number() != socket->tcp_sequence_number()) {
+        kprintf("handle_tcp: ack/seq mismatch: got %u, wanted %u\n", tcp_packet.ack_number(), socket->tcp_sequence_number());
+        return;
+    }
+
     if (tcp_packet.has_syn() && tcp_packet.has_ack()) {
     if (tcp_packet.has_syn() && tcp_packet.has_ack()) {
-        socket->set_tcp_ack_number(socket->tcp_sequence_number() + payload_size + 1);
+        socket->set_tcp_ack_number(tcp_packet.sequence_number() + payload_size + 1);
         socket->send_tcp_packet(*adapter, TCPFlags::ACK);
         socket->send_tcp_packet(*adapter, TCPFlags::ACK);
         socket->set_connected(true);
         socket->set_connected(true);
-        kprintf("Connected!\n");
+        kprintf("handle_tcp: Connection established!\n");
         socket->set_tcp_state(Connected);
         socket->set_tcp_state(Connected);
         return;
         return;
     }
     }
 
 
+    socket->set_tcp_ack_number(socket->tcp_sequence_number() + payload_size);
+
     socket->send_tcp_packet(*adapter, TCPFlags::ACK);
     socket->send_tcp_packet(*adapter, TCPFlags::ACK);
 
 
     socket->did_receive(ByteBuffer::copy((const byte*)&ipv4_packet, sizeof(IPv4Packet) + ipv4_packet.payload_size()));
     socket->did_receive(ByteBuffer::copy((const byte*)&ipv4_packet, sizeof(IPv4Packet) + ipv4_packet.payload_size()));

+ 1 - 1
Userland/tc.cpp

@@ -49,7 +49,7 @@ int main(int argc, char** argv)
     }
     }
 
 
     char buffer[BUFSIZ];
     char buffer[BUFSIZ];
-    const char* msg = "Test message";
+    const char* msg = "Test message!\n";
 
 
     rc = send(fd, (const char*)msg, strlen(msg), 0);
     rc = send(fd, (const char*)msg, strlen(msg), 0);
     if (rc < 0) {
     if (rc < 0) {