static int test_stats_entry_setup_from_add(void) { of_flow_add_t *add; of_flow_stats_entry_t *entry; of_match_t m1, m2; of_list_action_t *list; of_list_action_t list_out; TEST_ASSERT((add = of_flow_add_new(OF_VERSION_1_0)) != NULL); TEST_ASSERT((entry = of_flow_stats_entry_new(OF_VERSION_1_0)) != NULL); TEST_ASSERT(of_flow_add_OF_VERSION_1_0_populate(add, 1) != 0); TEST_ASSERT(of_flow_add_match_get(add, &m1) == 0); TEST_ASSERT(of_flow_stats_entry_setup_from_flow_add(entry, add, NULL) == 0); TEST_ASSERT(of_flow_stats_entry_match_get(entry, &m2) == 0); TEST_ASSERT(memcmp(&m1, &m2, sizeof(m1)) == 0); of_flow_add_delete(add); of_flow_stats_entry_delete(entry); /* @todo check action lists agree */ /* Same with an external action list */ TEST_ASSERT((add = of_flow_add_new(OF_VERSION_1_0)) != NULL); TEST_ASSERT((entry = of_flow_stats_entry_new(OF_VERSION_1_0)) != NULL); TEST_ASSERT(of_flow_add_OF_VERSION_1_0_populate(add, 1) != 0); TEST_ASSERT(of_flow_add_match_get(add, &m1) == 0); list = of_list_action_new(OF_VERSION_1_0); TEST_ASSERT(list != NULL); TEST_ASSERT(of_list_action_OF_VERSION_1_0_populate(list, 1) != 0); /* Verify matches agree */ TEST_ASSERT(of_flow_stats_entry_setup_from_flow_add(entry, add, list) == 0); TEST_ASSERT(of_flow_stats_entry_match_get(entry, &m2) == 0); TEST_ASSERT(memcmp(&m1, &m2, sizeof(m1)) == 0); of_list_action_init(&list_out, OF_VERSION_1_0, 0, 1); of_flow_stats_entry_actions_bind(entry, &list_out); /* Verify lists agree */ TEST_ASSERT(list->length == list_out.length); TEST_ASSERT(memcmp(WBUF_BUF(list->wire_object.wbuf), WBUF_BUF(list_out.wire_object.wbuf), list->length)); of_flow_add_delete(add); of_list_action_delete(list); of_flow_stats_entry_delete(entry); return TEST_PASS; }
static int test_list_limits(void) { of_flow_stats_reply_t *obj = of_flow_stats_reply_new(OF_VERSION_1_0); of_list_flow_stats_entry_t list; of_flow_stats_entry_t *element = of_flow_stats_entry_new(OF_VERSION_1_0); int i = 0; of_flow_stats_reply_entries_bind(obj, &list); ASSERT(element != NULL); while (1) { int rv = of_list_flow_stats_entry_append(&list, element); ASSERT(rv == OF_ERROR_NONE || rv == OF_ERROR_RESOURCE); if (rv != OF_ERROR_NONE) { break; } i++; } ASSERT(i == 744); of_flow_stats_entry_delete(element); of_flow_stats_reply_delete(obj); return TEST_PASS; }
/* Generated from of10/flow_stats_reply.data */ static int test_of10_flow_stats_reply(void) { uint8_t binary[] = { 0x01, 0x11, 0x00, 0xe4, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x68, 0x03, 0x00, 0x00, 0x3f, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x64, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe8, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x70, 0x04, 0x00, 0x00, 0x3f, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x64, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe8, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00, 0x00, }; of_object_t *obj; obj = of_flow_stats_reply_new(OF_VERSION_1_0); of_flow_stats_reply_flags_set(obj, 0); of_flow_stats_reply_xid_set(obj, 6); { of_object_t *entries = of_list_flow_stats_entry_new(OF_VERSION_1_0); { of_object_t *elem = of_flow_stats_entry_new(OF_VERSION_1_0); of_flow_stats_entry_byte_count_set(elem, 1000); of_flow_stats_entry_cookie_set(elem, 81985529216486895); of_flow_stats_entry_duration_nsec_set(elem, 2); of_flow_stats_entry_duration_sec_set(elem, 1); of_flow_stats_entry_hard_timeout_set(elem, 10); of_flow_stats_entry_idle_timeout_set(elem, 5); of_flow_stats_entry_packet_count_set(elem, 10); of_flow_stats_entry_priority_set(elem, 100); of_flow_stats_entry_table_id_set(elem, 3); { of_match_t match = { OF_VERSION_1_0 }; of_flow_stats_entry_match_set(elem, &match); } { of_object_t *actions = of_list_action_new(OF_VERSION_1_0); { of_object_t *elem = of_action_output_new(OF_VERSION_1_0); of_action_output_max_len_set(elem, 0); of_action_output_port_set(elem, 1); of_list_append(actions, elem); of_object_delete(elem); } { of_object_t *elem = of_action_output_new(OF_VERSION_1_0); of_action_output_max_len_set(elem, 0); of_action_output_port_set(elem, 2); of_list_append(actions, elem); of_object_delete(elem); } of_flow_stats_entry_actions_set(elem, actions); of_object_delete(actions); } of_list_append(entries, elem); of_object_delete(elem); } { of_object_t *elem = of_flow_stats_entry_new(OF_VERSION_1_0); of_flow_stats_entry_byte_count_set(elem, 1000); of_flow_stats_entry_cookie_set(elem, 81985529216486895); of_flow_stats_entry_duration_nsec_set(elem, 2); of_flow_stats_entry_duration_sec_set(elem, 1); of_flow_stats_entry_hard_timeout_set(elem, 10); of_flow_stats_entry_idle_timeout_set(elem, 5); of_flow_stats_entry_packet_count_set(elem, 10); of_flow_stats_entry_priority_set(elem, 100); of_flow_stats_entry_table_id_set(elem, 4); { of_match_t match = { OF_VERSION_1_0 }; of_flow_stats_entry_match_set(elem, &match); } { of_object_t *actions = of_list_action_new(OF_VERSION_1_0); { of_object_t *elem = of_action_output_new(OF_VERSION_1_0); of_action_output_max_len_set(elem, 0); of_action_output_port_set(elem, 1); of_list_append(actions, elem); of_object_delete(elem); } { of_object_t *elem = of_action_output_new(OF_VERSION_1_0); of_action_output_max_len_set(elem, 0); of_action_output_port_set(elem, 2); of_list_append(actions, elem); of_object_delete(elem); } { of_object_t *elem = of_action_output_new(OF_VERSION_1_0); of_action_output_max_len_set(elem, 0); of_action_output_port_set(elem, 3); of_list_append(actions, elem); of_object_delete(elem); } of_flow_stats_entry_actions_set(elem, actions); of_object_delete(actions); } of_list_append(entries, elem); of_object_delete(elem); } of_flow_stats_reply_entries_set(obj, entries); of_object_delete(entries); } if (sizeof(binary) != WBUF_CURRENT_BYTES(OF_OBJECT_TO_WBUF(obj)) || memcmp(binary, WBUF_BUF(OF_OBJECT_TO_WBUF(obj)), sizeof(binary))) { show_failure(binary, sizeof(binary), WBUF_BUF(OF_OBJECT_TO_WBUF(obj)), WBUF_CURRENT_BYTES(OF_OBJECT_TO_WBUF(obj))); of_object_delete(obj); return TEST_FAIL; } of_object_delete(obj); return TEST_PASS; }
/* Generated from of10/flow_stats_entry.data */ static int test_of10_flow_stats_entry(void) { uint8_t binary[] = { 0x00, 0x68, 0x03, 0x00, 0x00, 0x30, 0x00, 0xe2, 0x00, 0x03, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xa8, 0x03, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x64, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe8, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, }; of_object_t *obj; obj = of_flow_stats_entry_new(OF_VERSION_1_0); { of_object_t list; of_flow_stats_entry_actions_bind(obj, &list); { of_object_t *obj = of_action_output_new(OF_VERSION_1_0); of_action_output_max_len_set(obj, 0); of_action_output_port_set(obj, 1); of_list_append(&list, obj); of_object_delete(obj); } { of_object_t *obj = of_action_output_new(OF_VERSION_1_0); of_action_output_max_len_set(obj, 0); of_action_output_port_set(obj, 2); of_list_append(&list, obj); of_object_delete(obj); } } of_flow_stats_entry_byte_count_set(obj, 1000); of_flow_stats_entry_cookie_set(obj, 81985529216486895); of_flow_stats_entry_duration_nsec_set(obj, 2); of_flow_stats_entry_duration_sec_set(obj, 1); of_flow_stats_entry_hard_timeout_set(obj, 10); of_flow_stats_entry_idle_timeout_set(obj, 5); { of_match_t match = { OF_VERSION_1_0 }; match.fields.in_port = 3; match.fields.eth_src = (of_mac_addr_t) { { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab } }; match.fields.eth_dst = (of_mac_addr_t) { { 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67 } }; match.fields.eth_type = 0x800; match.fields.ipv4_src = 0xc0a8037f; match.fields.ipv4_dst = 0xffffffff; OF_MATCH_MASK_IN_PORT_EXACT_SET(&match); OF_MATCH_MASK_ETH_SRC_EXACT_SET(&match); OF_MATCH_MASK_ETH_DST_EXACT_SET(&match); OF_MATCH_MASK_ETH_TYPE_EXACT_SET(&match); //OF_MATCH_MASK_VLAN_VID_EXACT_SET(&match); //OF_MATCH_MASK_VLAN_PCP_EXACT_SET(&match); OF_MATCH_MASK_ETH_TYPE_EXACT_SET(&match); //OF_MATCH_MASK_IP_DSCP_EXACT_SET(&match); //OF_MATCH_MASK_IP_PROTO_EXACT_SET(&match); OF_MATCH_MASK_IPV4_SRC_EXACT_SET(&match); OF_MATCH_MASK_IPV4_DST_EXACT_SET(&match); //OF_MATCH_MASK_TCP_SRC_EXACT_SET(&match); //OF_MATCH_MASK_TCP_DST_EXACT_SET(&match); of_flow_stats_entry_match_set(obj, &match); } of_flow_stats_entry_packet_count_set(obj, 10); of_flow_stats_entry_priority_set(obj, 100); of_flow_stats_entry_table_id_set(obj, 3); if (sizeof(binary) != WBUF_CURRENT_BYTES(OF_OBJECT_TO_WBUF(obj)) || memcmp(binary, WBUF_BUF(OF_OBJECT_TO_WBUF(obj)), sizeof(binary))) { show_failure(binary, sizeof(binary), WBUF_BUF(OF_OBJECT_TO_WBUF(obj)), WBUF_CURRENT_BYTES(OF_OBJECT_TO_WBUF(obj))); of_object_delete(obj); return TEST_FAIL; } of_object_delete(obj); return TEST_PASS; }