From 641862e3d1cf499b4265c90241f897f62645718a Mon Sep 17 00:00:00 2001 From: David Doan Date: Thu, 9 Nov 2023 12:19:38 -0500 Subject: sending changes --- pkg/ipstack/ipstack.go | 78 +++++++++++++++++++++++++++---------------------- vhost | Bin 3191006 -> 3179481 bytes vrouter | Bin 3182993 -> 3146532 bytes 3 files changed, 43 insertions(+), 35 deletions(-) diff --git a/pkg/ipstack/ipstack.go b/pkg/ipstack/ipstack.go index 9ffe34f..afe3bc5 100644 --- a/pkg/ipstack/ipstack.go +++ b/pkg/ipstack/ipstack.go @@ -891,37 +891,6 @@ func HandleTCP(src *Interface, message []byte, hdr *ipv4header.IPv4Header) error // if the SYN flag is set, then send a SYNACK available := false - socketEntry, in := VHostSocketMaps[SocketKey{hdr.Dst.String(), tcpHdr.DstPort, hdr.Src.String(), tcpHdr.SrcPort}] - if !in { - fmt.Println("no socket entry found") - } else if socketEntry.State == Established { - fmt.Println("socket entry found") - - // make ack header - tcpHdr := &header.TCPFields{ - SrcPort: tcpHdr.DstPort, - DstPort: tcpHdr.SrcPort, - SeqNum: tcpHdr.SeqNum, - AckNum: tcpHdr.SeqNum + 1, - DataOffset: 20, - Flags: 0x10, - WindowSize: MAX_WINDOW_SIZE, - Checksum: 0, - UrgentPointer: 0, - } - // make the payload - err := SendTCP(tcpHdr, message, hdr.Dst, hdr.Src) - if err != nil { - fmt.Println(err) - } - ptr := socketEntry.Conn.RecvBuffer.recvNext - l := uint32(len(tcpPayload)) - copy(socketEntry.Conn.RecvBuffer.buffer[ptr:ptr+l], tcpPayload) - socketEntry.Conn.RecvBuffer.recvNext += l - fmt.Println("recvNext: ", socketEntry.Conn.RecvBuffer.recvNext) - fmt.Println("recvBuffer: ", socketEntry.Conn.RecvBuffer.buffer) - break - } // add to table if available mapMutex.Lock() for _, socketEntry := range VHostSocketMaps { @@ -1007,17 +976,56 @@ func HandleTCP(src *Interface, message []byte, hdr *ipv4header.IPv4Header) error fmt.Println("I see an ACK flag") // lookup for socket entry and update its state // set synChan to true (TODO) - key := SocketKey{hdr.Dst.String(), tcpHdr.DstPort, hdr.Src.String(), tcpHdr.SrcPort} - socketEntry, in := VHostSocketMaps[key] + // key := SocketKey{hdr.Dst.String(), tcpHdr.DstPort, hdr.Src.String(), tcpHdr.SrcPort} + // socketEntry, in := VHostSocketMaps[key] + // if !in { + // fmt.Println("no socket entry found") + // } else if socketEntry.State == Established { + // fmt.Println("socket entry found") + // // socketEntry.Conn.RecvBuffer.buffer = append(socketEntry.Conn.RecvBuffer.buffer, tcpPayload...) + // socketEntry.Conn.SendBuffer.una += uint32(len(tcpPayload)) + // break + // } + socketEntry, in := VHostSocketMaps[SocketKey{hdr.Dst.String(), tcpHdr.DstPort, hdr.Src.String(), tcpHdr.SrcPort}] if !in { fmt.Println("no socket entry found") } else if socketEntry.State == Established { + if (len(tcpPayload) == 0) { + break + } fmt.Println("socket entry found") - // socketEntry.Conn.RecvBuffer.buffer = append(socketEntry.Conn.RecvBuffer.buffer, tcpPayload...) + // infinite loop is created here + // make ack header + tcpHdr := &header.TCPFields{ + SrcPort: tcpHdr.DstPort, + DstPort: tcpHdr.SrcPort, + SeqNum: tcpHdr.AckNum, + AckNum: tcpHdr.SeqNum + uint32(len(tcpPayload)), + DataOffset: 20, + Flags: 0x10, + WindowSize: MAX_WINDOW_SIZE, + Checksum: 0, + UrgentPointer: 0, + } + // make the payload + payloadToSend := []byte{} + err := SendTCP(tcpHdr, payloadToSend, hdr.Dst, hdr.Src) + if err != nil { + fmt.Println(err) + } + socketEntry.Conn.SendBuffer.una += uint32(len(tcpPayload)) + + ptr := socketEntry.Conn.RecvBuffer.recvNext + l := uint32(len(tcpPayload)) + copy(socketEntry.Conn.RecvBuffer.buffer[ptr:ptr+l], tcpPayload) + socketEntry.Conn.RecvBuffer.recvNext += l + fmt.Println("recvNext: ", socketEntry.Conn.RecvBuffer.recvNext) + fmt.Println("recvBuffer: ", socketEntry.Conn.RecvBuffer.buffer) break } + mapMutex.Lock() for _, socketEntry := range VHostSocketMaps { if socketEntry.LocalPort == tcpHdr.DstPort && socketEntry.LocalIP == hdr.Dst.String() && socketEntry.State == SYNRECIEVED { @@ -1513,7 +1521,7 @@ func (c *VTCPConn) VWrite(payload []byte) (int, error) { SeqNum: c.SendBuffer.nxt, AckNum: c.SendBuffer.una, DataOffset: 20, - Flags: header.TCPFlagSyn, + Flags: header.TCPFlagAck, WindowSize: uint16(advertisedWindow), Checksum: 0, UrgentPointer: 0, diff --git a/vhost b/vhost index 71946eb..82caaa7 100755 Binary files a/vhost and b/vhost differ diff --git a/vrouter b/vrouter index 707d2d0..e0eee04 100755 Binary files a/vrouter and b/vrouter differ -- cgit v1.2.3-70-g09d2