diff options
author | David Doan <daviddoan@Davids-MacBook-Pro-70.local> | 2023-11-09 12:19:38 -0500 |
---|---|---|
committer | David Doan <daviddoan@Davids-MacBook-Pro-70.local> | 2023-11-09 12:19:38 -0500 |
commit | 641862e3d1cf499b4265c90241f897f62645718a (patch) | |
tree | 384c3c6a37751dee8ad6590e0598cfad94f87e9a | |
parent | a787b00605d8f89e0978eb9956b516296c85d0e3 (diff) |
sending changes
-rw-r--r-- | pkg/ipstack/ipstack.go | 78 | ||||
-rwxr-xr-x | vhost | bin | 3191006 -> 3179481 bytes | |||
-rwxr-xr-x | 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, Binary files differBinary files differ |