- Fix the stupid mess we created when making this from the cmake branch
[reactos.git] / lib / drivers / ip / network / routines.c
index 1c01c1b..44aa276 100644 (file)
@@ -54,9 +54,46 @@ static VOID DisplayIPHeader(
       ((IPHeader->DstAddr >> 16) & 0xFF), ((IPHeader->DstAddr >> 24) & 0xFF));
 }
 
+static VOID DisplayTCPHeader(
+    PCHAR Header,
+    UINT Length)
+{
+    /* FIXME: IPv4 only */
+    PIPv4_HEADER IPHeader = (PIPv4_HEADER)Header;
+    PTCPv4_HEADER TCPHeader;
+
+    if (IPHeader->Protocol != IPPROTO_TCP) {
+        DbgPrint("This is not a TCP datagram. Protocol is %d\n", IPHeader->Protocol);
+        return;
+    }
+
+    TCPHeader = (PTCPv4_HEADER)((PCHAR)IPHeader + (IPHeader->VerIHL & 0x0F) * 4);
+
+    DbgPrint("TCP header:\n");
+    DbgPrint("  SourcePort: %d\n", WN2H(TCPHeader->SourcePort));
+    DbgPrint("  DestinationPort: %d\n", WN2H(TCPHeader->DestinationPort));
+    DbgPrint("  SequenceNumber: 0x%x\n", DN2H(TCPHeader->SequenceNumber));
+    DbgPrint("  AckNumber: 0x%x\n", DN2H(TCPHeader->AckNumber));
+    DbgPrint("  DataOffset: 0x%x (0x%x) 32-bit words\n", TCPHeader->DataOffset, TCPHeader->DataOffset >> 4);
+    DbgPrint("  Flags: 0x%x (0x%x)\n", TCPHeader->Flags, TCPHeader->Flags & 0x3F);
+    if ((TCPHeader->Flags & TCP_URG) > 0) DbgPrint("    TCP_URG - Urgent Pointer field significant\n");
+    if ((TCPHeader->Flags & TCP_ACK) > 0) DbgPrint("    TCP_ACK - Acknowledgement field significant\n");
+    if ((TCPHeader->Flags & TCP_PSH) > 0) DbgPrint("    TCP_PSH - Push Function\n");
+    if ((TCPHeader->Flags & TCP_RST) > 0) DbgPrint("    TCP_RST - Reset the connection\n");
+    if ((TCPHeader->Flags & TCP_SYN) > 0) DbgPrint("    TCP_SYN - Synchronize sequence numbers\n");
+    if ((TCPHeader->Flags & TCP_FIN) > 0) DbgPrint("    TCP_FIN - No more data from sender\n");
+    DbgPrint("  Window: 0x%x\n", WN2H(TCPHeader->Window));
+    DbgPrint("  Checksum: 0x%x\n", WN2H(TCPHeader->Checksum));
+    DbgPrint("  Urgent: 0x%x\n", WN2H(TCPHeader->Urgent));
+}
+
+
 VOID DisplayTCPPacket(
     PIP_PACKET IPPacket)
 {
+    UINT Length;
+    PCHAR Buffer;
+
     if ((DbgQueryDebugFilterState(DPFLTR_TCPIP_ID, DEBUG_PBUFFER | DPFLTR_MASK) != TRUE) ||
         (DbgQueryDebugFilterState(DPFLTR_TCPIP_ID, DEBUG_TCP | DPFLTR_MASK) != TRUE)) {
         return;
@@ -75,6 +112,20 @@ VOID DisplayTCPPacket(
     TI_DbgPrint(MIN_TRACE, ("TotalSize (%d).\n", IPPacket->TotalSize));
     TI_DbgPrint(MIN_TRACE, ("ContigSize (%d).\n", IPPacket->ContigSize));
     TI_DbgPrint(MIN_TRACE, ("NdisPacket (0x%X).\n", IPPacket->NdisPacket));
+
+    if (IPPacket->NdisPacket) {
+        NdisQueryPacket(IPPacket->NdisPacket, NULL, NULL, NULL, &Length);
+        Buffer = ExAllocatePool(NonPagedPool, Length);
+        if (Buffer) {
+            Length = CopyPacketToBuffer(Buffer, IPPacket->NdisPacket, 0, Length);
+            DisplayTCPHeader(Buffer, Length);
+            ExFreePool(Buffer);
+        }
+    } else {
+        Buffer = IPPacket->Header;
+        Length = IPPacket->ContigSize;
+        DisplayTCPHeader(Buffer, Length);
+    }
 }
 #endif