bool test_tcp_closed_state_handle_6( void )
{
    struct sk_buff *skb;
    struct session_entry *session;
    struct tuple tuple;
    bool success = true;

    if (!init_tuple_for_test_ipv6( &tuple, IPPROTO_TCP ))
    	return false;
    if (!(skb = init_packet_type_for_test( PACKET_TYPE_V6_SYN )))
        return false;

    success &= assert_true(tcp_closed_state_handle( skb, &tuple ), "V6 syn-result");

    session = session_get( &tuple );
    success &= assert_not_null(session, "V6 syn-session.");
    if (session)
    	success &= assert_equals_u8(V6_INIT, session->state, "V6 syn-state");
    kfree_skb(skb);

    return success;
}
Esempio n. 2
0
/**
 * Assumes that "tuple" represents a TCP packet, and filters and updates based on it.
 * Encapsulates the TCP state machine.
 *
 * This is RFC 6146 section 3.5.2.
 */
static verdict tcp(struct packet *pkt, struct tuple *tuple)
{
	struct session_entry *session;
	int error;

	error = sessiondb_get(tuple, &session);
	if (error != 0 && error != -ESRCH) {
		log_debug("Error code %d while trying to find a TCP session.", error);
		inc_stats(pkt, IPSTATS_MIB_INDISCARDS);
		return VERDICT_DROP;
	}

	if (error == -ESRCH)
		return tcp_closed_state_handle(pkt, tuple);

	log_session(session);
	error = sessiondb_tcp_state_machine(pkt, session);
	session_return(session);
	if (error) {
		inc_stats(pkt, IPSTATS_MIB_INDISCARDS);
		return VERDICT_DROP;
	}
	return VERDICT_CONTINUE;
}