Beispiel #1
0
	def sendACK(rxp_socket): 
		print "Sending ACK!"

		header = RxPPacketHeader()
		header.src_port = rxp_socket.source_address[1]
		header.dst_port = rxp_socket.destination_address[1]
		header.ack_flag = 1
		header.ack_number = rxp_socket.ack_number

		packet = RxPPacket(header)

		rxp_socket.sendPacket(packet)
Beispiel #2
0
	def sendSYN(rxp_socket):
		print "Sending SYN! from socket", rxp_socket

		header = RxPPacketHeader()
		header.src_port = rxp_socket.source_address[1]
		header.dst_port = rxp_socket.destination_address[1]
		header.syn_flag = 1

		packet = RxPPacket(header)

		number_of_resends = RxPPacket.MAX_RESEND_LIMIT

		while number_of_resends > 0:
			print "Attempt #", (RxPPacket.MAX_RESEND_LIMIT - number_of_resends) + 1
			rxp_socket.sendPacket(packet)
			try:
				address, packet = rxp_socket.receivePacket(RxPPacket.MAX_PACKET_SIZE)

				print "Verifying packet"

				if not packet.verifyPacket(): #invalid checksum
					print("Incorrect checksum for sent data ack. Discarding packet")
					number_of_resends -= 1
				elif packet.header.syn_flag == 0 or packet.header.ack_flag == 0:
					print("Not a SYN ACK! Discarding")
					number_of_resends -= 1
				else:
					print("Received succesful SYN ACK")
					return packet
			except Exception as e:
				if str(e) == "timed out": 
					print("Sending SYN timed out. " + str(number_of_resends - 1) + " attempts remaining")
					number_of_resends -= 1
				elif str(e).find("EOFError"):
					print("Packet was mangled! resending!")
					number_of_resends -= 1
				else:
					print "Grr"
					print str(e)
					raise e
		raise RxPException("Sending SYN failed!")

		return None
Beispiel #3
0
	def sendSYNACK(rxp_socket): 
		print "Sending SYNACK!"

		header = RxPPacketHeader()
		header.src_port = rxp_socket.source_address[1]
		header.dst_port = rxp_socket.destination_address[1]
		header.syn_flag = 1
		header.ack_flag = 1

		packet = RxPPacket(header)

		number_of_resends = RxPPacket.MAX_RESEND_LIMIT

		while number_of_resends > 0:

			rxp_socket.sendPacket(packet)

			try:
				address, packet = rxp_socket.receivePacket(RxPPacket.MAX_PACKET_SIZE)

				if not packet.verifyPacket(): #invalid checksum
					print("Incorrect checksum for sent data ack. Discarding packet")
					number_of_resends -= 1
				elif packet.header.syn_flag == 1 or packet.header.ack_flag == 0:
					print("Not a ACK! Discarding")
					number_of_resends -= 1
				else:
					print("Received succesful ACK to our SYNACK")
					return packet
			except Exception as e:
				if str(e) == "timed out": 
					print("Sending SYN timed out. " + str(number_of_resends) + " resends remaining")
					number_of_resends -= 1
				else: 
					raise e
				

		return None
Beispiel #4
0
	def sendData(rxp_socket, data):
		if not rxp_socket.state == SocketState.CONNECTED:
			raise RxPException("sendData: Socket not connected!")
		
		# break data into chunks
		data_chunks = deque()

		packet_payload_length = RxPPacket.MAX_PAYLOAD_LENGTH
		numberOfPackets = int(len(data) / packet_payload_length)
		if len(data) % packet_payload_length > 0:
			numberOfPackets += 1

		print("Preparing " + str(numberOfPackets) + " packets to send")
		for i in range(numberOfPackets):
			start_index = int(packet_payload_length * i)
			end_index = int(start_index + packet_payload_length)

			if i + 1 == numberOfPackets:
				data_chunks.append(data[start_index:])
			else:
				data_chunks.append(data[start_index:end_index])


		# these are the acual packets that we need to send
		packets_to_send = deque()

		for data_item in data_chunks:
			is_last_packet = (data_item == data_chunks[-1])

			header = RxPPacketHeader()
			header.src_port = rxp_socket.source_address[1]
			header.dst_port = rxp_socket.destination_address[1]
			header.rcv_window = rxp_socket.receive_window_size

			if is_last_packet:
				header.lst_flag = 1

			header.seq_number = rxp_socket.seq_number
			rxp_socket.seq_number += 1 # todo wrap sequence number if needed

			packet = RxPPacket(header, data_item)
			packets_to_send.append(packet)

		# these are the packets that we know are sent but haven't been acked yet
		packets_to_be_acked = deque()

		window_size = rxp_socket.receive_window_size
		cur_seq_number = packets_to_send[0].header.seq_number

		print ("Sending packets for data: ", data)
		while len(packets_to_send) > 0:


			while window_size > 0 and len(packets_to_send) > 0:
				packet = packets_to_send.popleft()

				rxp_socket.sendPacket(packet)
				window_size -= 1
				packets_to_be_acked.append(packet)

			# collect acks
			try:
				address, packet = rxp_socket.receivePacket(RxPPacket.MAX_PACKET_SIZE)

				if not packet.verifyPacket: #invalid checksum
					print("Incorrect checksum for sent data ack. Discarding packet")
					window_size += 1
				else:
					# valid packet
					print("Validating packet!")
					if packet.header.ack_number == cur_seq_number and packet.header.ack_flag > 0:
						print("Received desired ack: ", cur_seq_number)
						if len(packets_to_be_acked) > 0:
							break
						packets_to_be_acked.popleft()
						cur_seq_number += 1
						window_size += 1
						window_size *= 2
					else:
						print("Received sent packet ack but not one we were looking for")
						print(str(packet.header.ack_number) + " vs " + str(cur_seq_number))
						if packet.header.seq_number > cur_seq_number:
							print("Sequence number is greater than looking for")
							window_size += 1
						else:
							packets_to_send.extendleft(packets_to_be_acked)
							packets_to_be_acked.clear()
							print ("Receive duplicate packet. Discarding")
				

			except Exception as e:
				if str(e) == "timed out": 
					print("Socket timeout for sent ack receive--resending")
					# need to send packet
					window_size = 3