def test_sends_reset(): """The connection should send a RST packet when it's closed.""" listener = MockListener() packet_log = rdpcap("test/inputs/tiniest-session.pcap") listener, conn = create_session(packet_log) conn._close() syn_ack = packet_log[1] listener.dispatch(syn_ack) last_packet = listener.received_packets[-1] assert last_packet.sprintf("%TCP.flags%") == "R"
def test_reset(): listener = MockListener() packet_log = rdpcap("test/inputs/tiniest-session.pcap") listener, conn = create_session(packet_log) syn_ack = packet_log[1] listener.dispatch(syn_ack) reset = syn_ack.copy() reset.payload.payload.flags = "R" reset.seq += 1 listener.dispatch(reset) assert conn.state == "CLOSED"
def test_bind_handshake(): packet_log = rdpcap("test/inputs/tiniest-session.pcap") syn, syn_ack, ack, client_fin_ack, server_fin_ack, client_ack = packet_log listener = MockListener() conn = TCPSocket(listener) conn.seq = syn_ack.seq conn.bind(syn.payload.dst, syn.dport) listener.dispatch(syn) listener.dispatch(ack) assert len(listener.received_packets) == 1 assert conn.state == "ESTABLISHED" check_mostly_same(listener.received_packets[0], syn_ack)
def test_closes_on_reset(): """The connection should close when it receives a RST packet""" listener = MockListener() packet_log = rdpcap("test/inputs/tiniest-session.pcap") listener, conn = create_session(packet_log) syn_ack = packet_log[1] listener.dispatch(syn_ack) reset = syn_ack.copy() reset.payload.payload.flags = "R" reset.seq += 1 listener.dispatch(reset) assert conn.state == "CLOSED"
def test_bind_handshake(): """ We can do a handshake when we're the server (someone else initiates the SYN). """ packet_log = rdpcap("test/inputs/tiniest-session.pcap") syn, syn_ack, ack, client_fin_ack, server_fin_ack, client_ack = packet_log listener = MockListener() conn = TCPSocket(listener) conn.seq = syn_ack.seq conn.bind(syn.payload.dst, syn.dport) listener.dispatch(syn) listener.dispatch(ack) assert len(listener.received_packets) == 1 assert conn.state == "ESTABLISHED" check_mostly_same(listener.received_packets[0], syn_ack)
def test_handshake_client(): listener = MockListener() conn = TCPSocket(listener) conn.connect("localhost", 80) initial_seq = conn.seq tcp_packet = TCP(dport=conn.src_port, flags="SA", seq=100, ack=initial_seq + 1) syn_ack = Ether() / IP(dst=conn.src_ip) / tcp_packet listener.dispatch(syn_ack) assert conn.seq == initial_seq + 1 assert conn.state == "ESTABLISHED" # We should have sent exactly two packets # Check that they look okay pkts = listener.received_packets assert len(pkts) == 2 syn, ack = pkts assert ack.seq == syn.seq + 1 assert syn.sprintf("%TCP.flags%") == "S" assert ack.sprintf("%TCP.flags%") == "A"