static void test_insert_existing_same_priority_wildcards_entry_succeeds() { oxm_matches *alice = create_oxm_matches(); set_alice_match_entry( alice ); oxm_matches *alice_wildcards = create_oxm_matches(); set_alice_wildcards_entry( alice_wildcards ); assert_true( insert_match_entry( alice_wildcards, DEFAULT_PRIORITY, xstrdup( ALICE_MATCH_SERVICE_NAME ) ) ); oxm_matches *bob = create_oxm_matches(); set_bob_match_entry( bob ); oxm_matches *bob_wildcards = create_oxm_matches(); set_bob_wildcards_entry( bob_wildcards ); assert_true( insert_match_entry( bob_wildcards, DEFAULT_PRIORITY, xstrdup( BOB_MATCH_SERVICE_NAME ) ) ); void *data0 = lookup_match_strict_entry( bob_wildcards, DEFAULT_PRIORITY ); assert_true( data0 != NULL ); assert_string_equal( ( char * ) data0, BOB_MATCH_SERVICE_NAME ); void *data1 = lookup_match_entry( bob ); assert_true( data1 != NULL ); assert_string_equal( ( char * ) data1, BOB_MATCH_SERVICE_NAME ); assert_true( data0 == data1 ); oxm_matches *any_wildcards = create_oxm_matches(); set_any_wildcards_entry( any_wildcards ); assert_true( insert_match_entry( any_wildcards, DEFAULT_PRIORITY, xstrdup( ANY_MATCH_SERVICE_NAME ) ) ); oxm_matches *carol = create_oxm_matches(); set_carol_match_entry( carol ); oxm_matches *carol_wildcards = create_oxm_matches(); set_carol_wildcards_entry( carol_wildcards ); assert_true( insert_match_entry( carol_wildcards, DEFAULT_PRIORITY, xstrdup( CAROL_MATCH_SERVICE_NAME ) ) ); data0 = lookup_match_strict_entry( carol_wildcards, DEFAULT_PRIORITY ); assert_true( data0 != NULL ); assert_string_equal( ( char * ) data0, CAROL_MATCH_SERVICE_NAME ); data1 = lookup_match_entry( carol ); assert_true( data1 != NULL ); assert_string_equal( ( char * ) data1, ANY_MATCH_SERVICE_NAME ); assert_true( data0 != data1 ); data1 = lookup_match_entry( alice ); assert_true( data1 != NULL ); assert_string_equal( ( char * ) data1, ALICE_MATCH_SERVICE_NAME ); data1 = lookup_match_entry( bob ); assert_true( data1 != NULL ); assert_string_equal( ( char * ) data1, BOB_MATCH_SERVICE_NAME ); XFREE( delete_match_strict_entry( alice_wildcards, DEFAULT_PRIORITY ) ); XFREE( delete_match_strict_entry( bob_wildcards, DEFAULT_PRIORITY ) ); XFREE( delete_match_strict_entry( carol_wildcards, DEFAULT_PRIORITY ) ); XFREE( delete_match_strict_entry( any_wildcards, DEFAULT_PRIORITY ) ); delete_oxm_matches( alice ); delete_oxm_matches( alice_wildcards ); delete_oxm_matches( bob ); delete_oxm_matches( bob_wildcards ); delete_oxm_matches( carol ); delete_oxm_matches( carol_wildcards ); delete_oxm_matches( any_wildcards ); }
static void test_insert_lowest_priority_wildcards_entry_succeeds() { oxm_matches *alice = create_oxm_matches(); set_alice_match_entry( alice ); oxm_matches *alice_wildcards = create_oxm_matches(); set_alice_wildcards_entry( alice_wildcards ); assert_true( insert_match_entry( alice_wildcards, DEFAULT_PRIORITY, xstrdup( ALICE_MATCH_SERVICE_NAME ) ) ); oxm_matches *bob_wildcards = create_oxm_matches(); set_bob_wildcards_entry( bob_wildcards ); assert_true( insert_match_entry( bob_wildcards, LOW_PRIORITY, xstrdup( BOB_MATCH_SERVICE_NAME ) ) ); void *data0 = lookup_match_strict_entry( alice_wildcards, DEFAULT_PRIORITY ); assert_true( data0 != NULL ); assert_string_equal( ( char * ) data0, ALICE_MATCH_SERVICE_NAME ); void *data1 = lookup_match_entry( alice ); assert_true( data1 != NULL ); assert_string_equal( ( char * ) data1, ALICE_MATCH_SERVICE_NAME ); assert_true( data0 == data1 ); oxm_matches *lldp_wildcards = create_oxm_matches(); set_lldp_wildcards_entry( lldp_wildcards ); assert_true( insert_match_entry( lldp_wildcards, LOW_PRIORITY, xstrdup( LLDP_MATCH_SERVICE_NAME ) ) ); data0 = lookup_match_strict_entry( alice_wildcards, DEFAULT_PRIORITY ); assert_true( data0 != NULL ); assert_string_equal( ( char * ) data0, ALICE_MATCH_SERVICE_NAME ); data1 = lookup_match_entry( alice ); assert_true( data1 != NULL ); assert_string_equal( ( char * ) data1, ALICE_MATCH_SERVICE_NAME ); assert_true( data0 == data1 ); oxm_matches *any_wildcards = create_oxm_matches(); set_any_wildcards_entry( any_wildcards ); assert_true( insert_match_entry( any_wildcards, LOW_PRIORITY, xstrdup( ANY_MATCH_SERVICE_NAME ) ) ); data0 = lookup_match_strict_entry( alice_wildcards, DEFAULT_PRIORITY ); assert_true( data0 != NULL ); assert_string_equal( ( char * ) data0, ALICE_MATCH_SERVICE_NAME ); data1 = lookup_match_entry( alice ); assert_true( data1 != NULL ); assert_string_equal( ( char * ) data1, ALICE_MATCH_SERVICE_NAME ); assert_true( data0 == data1 ); XFREE( delete_match_strict_entry( alice_wildcards, DEFAULT_PRIORITY ) ); XFREE( delete_match_strict_entry( bob_wildcards, LOW_PRIORITY ) ); XFREE( delete_match_strict_entry( lldp_wildcards, LOW_PRIORITY ) ); XFREE( delete_match_strict_entry( any_wildcards, LOW_PRIORITY ) ); delete_oxm_matches( alice ); delete_oxm_matches( alice_wildcards ); delete_oxm_matches( bob_wildcards ); delete_oxm_matches( lldp_wildcards ); delete_oxm_matches( any_wildcards ); }
static void test_update_nonexistent_wildcards_entry_fails() { oxm_matches *carol = create_oxm_matches(); set_carol_match_entry( carol ); oxm_matches *carol_wildcards = create_oxm_matches(); set_carol_wildcards_entry( carol_wildcards ); assert_true( !update_match_entry( carol_wildcards, DEFAULT_PRIORITY, xstrdup( CAROL_MATCH_OTHER_SERVICE_NAME ) ) ); oxm_matches *alice_wildcards = create_oxm_matches(); set_alice_match_entry( alice_wildcards ); assert_true( insert_match_entry( alice_wildcards, DEFAULT_PRIORITY, xstrdup( ALICE_MATCH_SERVICE_NAME ) ) ); assert_true( !update_match_entry( carol_wildcards, DEFAULT_PRIORITY, xstrdup( CAROL_MATCH_OTHER_SERVICE_NAME ) ) ); void *data = lookup_match_strict_entry( carol_wildcards, DEFAULT_PRIORITY ); assert_true( data == NULL ); data = lookup_match_entry( carol ); assert_true( data == NULL ); XFREE( delete_match_strict_entry( alice_wildcards, DEFAULT_PRIORITY ) ); delete_oxm_matches( carol ); delete_oxm_matches( carol_wildcards ); delete_oxm_matches( alice_wildcards ); }
static void test_insert_wildcards_entry_into_empty_table_succeeds() { oxm_matches *alice = create_oxm_matches(); set_alice_match_entry( alice ); oxm_matches *alice_wildcards = create_oxm_matches(); set_alice_wildcards_entry( alice_wildcards ); assert_true( insert_match_entry( alice_wildcards, DEFAULT_PRIORITY, xstrdup( ALICE_MATCH_SERVICE_NAME ) ) ); oxm_matches *bob = create_oxm_matches(); set_bob_match_entry( bob ); void *data0 = lookup_match_strict_entry( alice_wildcards, DEFAULT_PRIORITY ); assert_true( data0 != NULL ); assert_string_equal( ( char * ) data0, ALICE_MATCH_SERVICE_NAME ); void *data1 = lookup_match_entry( alice ); assert_true( data1 != NULL ); assert_string_equal( ( char * ) data1, ALICE_MATCH_SERVICE_NAME ); assert_true( data0 == data1 ); assert_true( lookup_match_entry( bob ) == NULL ); void *data2 = delete_match_strict_entry( alice_wildcards, DEFAULT_PRIORITY ); assert_true( data2 != NULL ); assert_string_equal( ( char * ) data2, ALICE_MATCH_SERVICE_NAME ); assert_true( data1 == data2 ); XFREE( data2 ); delete_oxm_matches( alice ); delete_oxm_matches( alice_wildcards ); delete_oxm_matches( bob ); }
static void test_lookup_match_strict_entry_dies_if_not_initialized() { assert_true( _match_table_head == NULL ); oxm_matches *alice = create_oxm_matches(); set_alice_match_entry( alice ); expect_assert_failure( lookup_match_strict_entry( alice, DEFAULT_PRIORITY ) ); delete_oxm_matches( alice ); }
static void test_update_exact_wildcards_succeeds() { oxm_matches *carol = create_oxm_matches(); set_carol_match_entry( carol ); oxm_matches *carol_wildcards = create_oxm_matches(); set_carol_wildcards_entry( carol_wildcards ); assert_true( insert_match_entry( carol_wildcards, DEFAULT_PRIORITY, xstrdup( CAROL_MATCH_SERVICE_NAME ) ) ); void *data = lookup_match_strict_entry( carol_wildcards, DEFAULT_PRIORITY ); assert_true( data != NULL ); assert_string_equal( ( char * ) data, CAROL_MATCH_SERVICE_NAME ); data = lookup_match_entry( carol ); assert_true( data != NULL ); assert_string_equal( ( char * ) data, CAROL_MATCH_SERVICE_NAME ); assert_true( update_match_entry( carol_wildcards, DEFAULT_PRIORITY, xstrdup( CAROL_MATCH_OTHER_SERVICE_NAME ) ) ); data = lookup_match_strict_entry( carol_wildcards, DEFAULT_PRIORITY ); assert_true( data != NULL ); assert_string_equal( ( char * ) data, CAROL_MATCH_OTHER_SERVICE_NAME ); data = lookup_match_entry( carol ); assert_true( data != NULL ); assert_string_equal( ( char * ) data, CAROL_MATCH_OTHER_SERVICE_NAME ); assert_true( update_match_entry( carol_wildcards, DEFAULT_PRIORITY, xstrdup( CAROL_MATCH_SERVICE_NAME ) ) ); data = lookup_match_strict_entry( carol_wildcards, DEFAULT_PRIORITY ); assert_true( data != NULL ); assert_string_equal( ( char * ) data, CAROL_MATCH_SERVICE_NAME ); data = lookup_match_entry( carol ); assert_true( data != NULL ); assert_string_equal( ( char * ) data, CAROL_MATCH_SERVICE_NAME ); XFREE( delete_match_strict_entry( carol_wildcards, DEFAULT_PRIORITY ) ); delete_oxm_matches( carol ); delete_oxm_matches( carol_wildcards ); }
static void test_reinsert_of_deleted_lowhest_priority_wildcards_entry_succeeds() { oxm_matches *carol = create_oxm_matches(); set_carol_match_entry( carol ); oxm_matches *carol_wildcards = create_oxm_matches(); set_carol_wildcards_entry( carol_wildcards ); assert_true( insert_match_entry( carol_wildcards, LOW_PRIORITY, xstrdup( CAROL_MATCH_SERVICE_NAME ) ) ); XFREE( delete_match_strict_entry( carol_wildcards, LOW_PRIORITY ) ); void *data = lookup_match_strict_entry( carol, LOW_PRIORITY ); assert_true( data == NULL ); data = lookup_match_entry( carol ); assert_true( data == NULL ); assert_true( insert_match_entry( carol_wildcards, LOW_PRIORITY, xstrdup( CAROL_MATCH_OTHER_SERVICE_NAME ) ) ); data = lookup_match_entry( carol ); assert_true( data != NULL ); assert_string_equal( ( char * ) data, CAROL_MATCH_OTHER_SERVICE_NAME ); XFREE( delete_match_strict_entry( carol_wildcards, LOW_PRIORITY ) ); delete_oxm_matches( carol ); delete_oxm_matches( carol_wildcards ); }
static void handle_dump_filter_request( const messenger_context_handle *handle, dump_packetin_filter_request *request ) { assert( handle != NULL ); assert( request != NULL ); buffer *buf = alloc_buffer_with_length( 2048 ); dump_packetin_filter_reply *reply = append_back_buffer( buf, offsetof( dump_packetin_filter_reply, entries ) ); reply->status = PACKETIN_FILTER_OPERATION_SUCCEEDED; reply->n_entries = 0; struct ofp_match match; ntoh_match( &match, &request->criteria.match ); uint16_t priority = ntohs( request->criteria.priority ); if ( request->flags & PACKETIN_FILTER_FLAG_MATCH_STRICT ) { list_element *services = lookup_match_strict_entry( match, priority ); while ( services != NULL ) { if ( strcmp( services->data, request->criteria.service_name ) == 0 ) { packetin_filter_entry *entry = append_back_buffer( buf, sizeof( packetin_filter_entry ) ); reply->n_entries++; entry->match = request->criteria.match; entry->priority = request->criteria.priority; strncpy( entry->service_name, services->data, sizeof( entry->service_name ) ); entry->service_name[ sizeof( entry->service_name ) - 1 ] = '\0'; } services = services->next; } } else { map_match_table( match, dump_filter_walker, buf ); } reply->n_entries = htonl( reply->n_entries ); bool ret = send_reply_message( handle, MESSENGER_DUMP_PACKETIN_FILTER_REPLY, buf->data, buf->length ); free_buffer( buf ); if ( ret == false ) { error( "Failed to send a dump packetin filter reply." ); } }
static bool add_packetin_match_entry( struct ofp_match match, uint16_t priority, const char *service_name ) { bool ( *insert_or_update_match_entry )( struct ofp_match, uint16_t, void * ) = update_match_entry; list_element *services = lookup_match_strict_entry( match, priority ); if ( services == NULL ) { insert_or_update_match_entry = insert_match_entry; create_list( &services ); } else { list_element *element; for ( element = services; element != NULL; element = element->next ) { if ( strcmp( element->data, service_name ) == 0 ) { char match_string[ 256 ]; match_to_string( &match, match_string, sizeof( match_string ) ); warn( "match entry already exists ( match = [%s], service_name = [%s] )", match_string, service_name ); return false; } } } append_to_tail( &services, xstrdup( service_name ) ); insert_or_update_match_entry( match, priority, services ); return true; }