def test_pack(self): p = Packet() p.SEQ = 1 p.ACK = 2 p.src_port = 8080 p.dest_port = 9090 p.set_flags(Packet.Flags.SYN, Packet.Flags.ACK) p.set_payload(b"hello") target = b'\x00\x00\x00\x01\x00\x00\x00\x02\x1f\x90#\x82\x00\x00\x00\x05\x030000000380d489e62c4e775e665acdda1710bb3hello' self.assertEqual(len(p.pack()), len(target)) self.assertEqual(p.pack(), target)
def message_arrived(self, sock: socket.socket, msg: VM_Message): action = msg.payload["action"] data = tuple(msg.payload["data"]) if action == "is_bindable": if self.socket_container.bindable(data): out = dict(status=0, message="Ok", data=None) else: out = dict(status=1, message="Not bindable", data=None) sock.sendall(VM_Message(out).pack()) elif action == "bind": try: curr = InternalSocket(sock, data) self.socket_container.insert(curr) out = dict(status=0, message="Ok", data=None) except ValueError as e: out = dict(status=1, message=str(e), data=None) except: raise RuntimeError("Exception not caught") sock.sendall(VM_Message(out).pack()) elif action == "connect": try: internal_sock = self.socket_container.get_by_unix_sock(sock) except ValueError: self.logger.error("Socket not found in bind table") return p = Packet() p.SEQ = 1 p.ACK = 0 p.set_flags(Packet.Flags.SYN) p.src_port = internal_sock.b_context[1] p.dest_port = data[1] dest_ip = data[0] internal_sock.state = States.SYN_SENT self.push_packet(p, (dest_ip, VM.UDP_PORT)) elif action == "listen": try: internal_sock = self.socket_container.get_by_unix_sock(sock) except ValueError: self.logger.error("Socket not found in bind table") return internal_sock.listen = data[0] internal_sock.state = States.LISTENING out = dict(status=0, message="Ok", data=None) assert sock == internal_sock.unix_sock sock.sendall(VM_Message(out).pack()) elif action == "accept": try: internal_sock = self.socket_container.get_by_unix_sock(sock) self.accept_queue.put((sock, internal_sock)) except: self.logger.error("Socket not found in bind table") return elif action == "send": pass else: raise NotImplementedError