diff options
author | sotech117 <michael_foiani@brown.edu> | 2023-11-09 12:34:51 -0500 |
---|---|---|
committer | sotech117 <michael_foiani@brown.edu> | 2023-11-09 12:34:51 -0500 |
commit | 824b5dd6b67d18d4e708f6d9a0273151fe3d5ae1 (patch) | |
tree | 384c3c6a37751dee8ad6590e0598cfad94f87e9a | |
parent | 123562ac8a8b98fabf8669ae7b660d0d9fac176b (diff) | |
parent | f669b080f92f49e28fcb00be5f44d9b342ec9cef (diff) |
Merge branch 'main' of https://github.com/brown-cs1680-f23/iptcp-jailpt2
Merge with david's ack fix.
-rw-r--r-- | pkg/ipstack/ipstack.go | 77 | ||||
-rwxr-xr-x | vhost | bin | 3191134 -> 3179481 bytes | |||
-rwxr-xr-x | vrouter | bin | 3183073 -> 3146532 bytes |
3 files changed, 43 insertions, 34 deletions
diff --git a/pkg/ipstack/ipstack.go b/pkg/ipstack/ipstack.go index 4a5fe30..afe3bc5 100644 --- a/pkg/ipstack/ipstack.go +++ b/pkg/ipstack/ipstack.go @@ -891,36 +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: startingSeqNum, - AckNum: tcpHdr.SeqNum + 1, // FIXME: in the ACK case, this should be plus the size of the data - 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) - break - } // add to table if available mapMutex.Lock() for _, socketEntry := range VHostSocketMaps { @@ -1006,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 { @@ -1512,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 |