indigo_error_t indigo_port_features_get(of_features_reply_t *features) { indigo_error_t err = INDIGO_ERROR_NONE; of_list_port_desc_t *of_list_port_desc = 0; of_port_desc_t *of_port_desc = 0; uint32_t port = 0, nextPort = 0; OFDPA_ERROR_t ofdpa_rv = OFDPA_E_NONE; LOG_TRACE("%s() called\n",__FUNCTION__); if (features->version < OF_VERSION_1_3) { return INDIGO_ERROR_VERSION; } /* Allocates memory for of_port_desc */ of_port_desc = of_port_desc_new(features->version); if (of_port_desc == NULL) { LOG_ERROR("of_port_desc_new() failed"); return INDIGO_ERROR_RESOURCE; } /* Allocates memory for of_list_port_desc */ of_list_port_desc = of_list_port_desc_new(features->version); if (of_list_port_desc == NULL) { LOG_ERROR("of_list_port_desc_new() failed"); /* free of_list_port_desc */ of_port_desc_delete(of_port_desc); return INDIGO_ERROR_RESOURCE; } ofdpa_rv = ofdpaPortNextGet(port, &nextPort); while(ofdpa_rv == OFDPA_E_NONE) { err = ind_ofdpa_port_features_set(nextPort, of_port_desc); if (err != INDIGO_ERROR_NONE) { LOG_ERROR("Failed to get OpenFlow port stats."); break; } of_list_port_desc_append(of_list_port_desc, of_port_desc); port = nextPort; ofdpa_rv = ofdpaPortNextGet(port, &nextPort); } /* free the allocated memory */ of_port_desc_delete(of_port_desc); of_list_port_desc_delete(of_list_port_desc); return err; }
/* Generated from of10/port_status.data */ static int test_of10_port_status(void) { uint8_t binary[] = { 0x01, 0x0c, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfd, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x66, 0x6f, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, }; of_object_t *obj; obj = of_port_status_new(OF_VERSION_1_0); { of_object_t *desc = of_port_desc_new(OF_VERSION_1_0); of_port_desc_advertised_set(desc, 32); of_port_desc_config_set(desc, 16); of_port_desc_curr_set(desc, 1); { of_mac_addr_t hw_addr = { { 1, 2, 3, 4, 5, 6 } }; of_port_desc_hw_addr_set(desc, hw_addr); } { of_port_name_t name = "foo"; of_port_desc_name_set(desc, name); } of_port_desc_peer_set(desc, 2048); of_port_desc_port_no_set(desc, 65533); of_port_desc_state_set(desc, 512); of_port_desc_supported_set(desc, 512); of_port_status_desc_set(obj, desc); of_object_delete(desc); } of_port_status_reason_set(obj, 1); of_port_status_xid_set(obj, 4); 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; }
/* TODO populate more fields of the port desc */ indigo_error_t indigo_port_features_get( of_features_reply_t *features) { indigo_error_t result = INDIGO_ERROR_NONE; of_list_port_desc_t *of_list_port_desc = 0; of_port_desc_t *of_port_desc = 0; if (features->version >= OF_VERSION_1_3) { return INDIGO_ERROR_NONE; } if ((of_port_desc = of_port_desc_new(features->version)) == 0) { LOG_ERROR("of_port_desc_new() failed"); result = INDIGO_ERROR_UNKNOWN; goto done; } if ((of_list_port_desc = of_list_port_desc_new(features->version)) == 0) { LOG_ERROR("of_list_port_desc_new() failed"); result = INDIGO_ERROR_UNKNOWN; goto done; } int i; for (i = 0; i < IND_OVS_MAX_PORTS; i++) { if (ind_ovs_ports[i]) { port_desc_set(of_port_desc, i); /* TODO error handling */ of_list_port_desc_append(of_list_port_desc, of_port_desc); } } port_desc_set_local(of_port_desc); /* TODO error handling */ of_list_port_desc_append(of_list_port_desc, of_port_desc); if (LOXI_FAILURE(of_features_reply_ports_set(features, of_list_port_desc ) ) ) { LOG_ERROR("of_features_reply_ports_set() failed"); result = INDIGO_ERROR_UNKNOWN; goto done; } done: if (of_list_port_desc) of_list_port_desc_delete(of_list_port_desc); if (of_port_desc) of_port_desc_delete(of_port_desc); return (result); }
static indigo_error_t port_status_notify(of_port_no_t of_port_num, unsigned reason) { indigo_error_t result = INDIGO_ERROR_NONE; of_port_desc_t *of_port_desc = 0; of_port_status_t *of_port_status = 0; of_version_t ctrlr_of_version; if (indigo_cxn_get_async_version(&ctrlr_of_version) != INDIGO_ERROR_NONE) { LOG_TRACE("No active controller connection"); return INDIGO_ERROR_NONE; } if ((of_port_desc = of_port_desc_new(ctrlr_of_version)) == 0) { LOG_ERROR("of_port_desc_new() failed"); result = INDIGO_ERROR_UNKNOWN; goto done; } port_desc_set(of_port_desc, of_port_num); if ((of_port_status = of_port_status_new(ctrlr_of_version)) == 0) { LOG_ERROR("of_port_status_new() failed"); result = INDIGO_ERROR_UNKNOWN; goto done; } of_port_status_reason_set(of_port_status, reason); of_port_status_desc_set(of_port_status, of_port_desc); of_port_desc_delete(of_port_desc); indigo_core_port_status_update(of_port_status); of_port_desc = 0; /* No longer owned */ of_port_status = 0; /* No longer owned */ done: if (of_port_desc) of_port_desc_delete(of_port_desc); if (of_port_status) of_port_status_delete(of_port_status); return (result); }
/* Generated from of10/packet_in.data */ static int test_of10_packet_in(void) { uint8_t binary[] = { 0x01, 0x0a, 0x00, 0x15, 0x12, 0x34, 0x56, 0x78, 0xab, 0xcd, 0xef, 0x01, 0x00, 0x09, 0xff, 0xfe, 0x01, 0x00, 0x61, 0x62, 0x63, }; of_object_t *obj; obj = of_packet_in_new(OF_VERSION_1_0); of_packet_in_buffer_id_set(obj, 2882400001); { of_octets_t data = { .bytes=3, .data=(uint8_t *)"\x61\x62\x63" }; of_packet_in_data_set(obj, &data); } of_packet_in_in_port_set(obj, 65534); of_packet_in_reason_set(obj, 1); of_packet_in_total_len_set(obj, 9); of_packet_in_xid_set(obj, 305419896); 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/packet_out.data */ static int test_of10_packet_out(void) { uint8_t binary[] = { 0x01, 0x0d, 0x00, 0x23, 0x12, 0x34, 0x56, 0x78, 0xab, 0xcd, 0xef, 0x01, 0xff, 0xfe, 0x00, 0x10, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x61, 0x62, 0x63, }; of_object_t *obj; obj = of_packet_out_new(OF_VERSION_1_0); of_packet_out_buffer_id_set(obj, 2882400001); of_packet_out_in_port_set(obj, 65534); of_packet_out_xid_set(obj, 305419896); { of_object_t *list = of_list_action_new(OF_VERSION_1_0); { 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_packet_out_actions_set(obj, list); of_object_delete(list); } { of_octets_t data = { .bytes=3, .data=(uint8_t *)"\x61\x62\x63" }; of_packet_out_data_set(obj, &data); } 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/port_desc.data */ static int test_of10_port_desc(void) { uint8_t binary[] = { 0xff, 0xfd, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x66, 0x6f, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, }; of_object_t *obj; obj = of_port_desc_new(OF_VERSION_1_0); of_port_desc_advertised_set(obj, 32); of_port_desc_config_set(obj, 16); of_port_desc_curr_set(obj, 1); { of_mac_addr_t hw_addr = { { 1, 2, 3, 4, 5, 6 } }; of_port_desc_hw_addr_set(obj, hw_addr); } { of_port_name_t name = "foo"; of_port_desc_name_set(obj, name); } of_port_desc_peer_set(obj, 2048); of_port_desc_port_no_set(obj, 65533); of_port_desc_state_set(obj, 512); of_port_desc_supported_set(obj, 512); 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; }
void ind_ofdpa_port_event_receive(void) { of_port_desc_t *of_port_desc = 0; of_port_status_t *of_port_status = 0; ofdpaPortEvent_t portEventData; int reason = 0; LOG_TRACE("Reading Port Events"); memset(&portEventData, 0, sizeof(portEventData)); while (ofdpaPortEventNextGet(&portEventData) == OFDPA_E_NONE) { LOG_TRACE("client_event: retrieved port event: port no = %d, eventMask = 0x%x, state = %d\n", portEventData.portNum, portEventData.eventMask, portEventData.state); of_port_desc = of_port_desc_new(ofagent_of_version); if (of_port_desc == 0) { LOG_ERROR("of_port_desc_new() failed"); break; } if ((ind_ofdpa_port_desc_set(portEventData.portNum, of_port_desc)) < 0) { LOG_ERROR("ind_ofdpa_port_desc_set() failed"); break; } of_port_status = of_port_status_new(ofagent_of_version); if (of_port_status == 0) { LOG_ERROR("of_port_status_new() failed"); break; } if (portEventData.eventMask & OFDPA_EVENT_PORT_CREATE) { reason = OF_PORT_CHANGE_REASON_ADD; } else if (portEventData.eventMask & OFDPA_EVENT_PORT_DELETE) { reason = OF_PORT_CHANGE_REASON_DELETE; } else if (portEventData.eventMask & OFDPA_EVENT_PORT_STATE) { reason = OF_PORT_CHANGE_REASON_MODIFY; } of_port_status_reason_set(of_port_status, reason); if (of_port_status_desc_set(of_port_status, of_port_desc) < 0) { LOG_ERROR("Unexpected failure setting port desc"); break; } of_port_desc_delete(of_port_desc); indigo_core_port_status_update(of_port_status); of_port_desc = 0; /* No longer owned */ of_port_status = 0; /* No longer owned */ } if (of_port_desc) { of_port_desc_delete(of_port_desc); } return; }
indigo_error_t indigo_port_desc_stats_get(of_port_desc_stats_reply_t *port_desc_stats_reply) { indigo_error_t err = INDIGO_ERROR_NONE; OFDPA_ERROR_t ofdpa_rv = OFDPA_E_NONE; of_port_desc_t *of_port_desc = 0; of_list_port_desc_t *of_list_port_desc = 0; uint32_t port= 0, nextPort = 0; LOG_TRACE("%s() called.", __FUNCTION__); if (port_desc_stats_reply->version < OF_VERSION_1_3) { return INDIGO_ERROR_VERSION; } /* Allocates memory for of_port_desc */ of_port_desc = of_port_desc_new(port_desc_stats_reply->version); if (of_port_desc == NULL) { LOG_ERROR("of_port_desc_new() failed"); return INDIGO_ERROR_RESOURCE; } /* Allocates memory for of_list_port_desc */ of_list_port_desc = of_list_port_desc_new(port_desc_stats_reply->version); if (of_list_port_desc == NULL) { LOG_ERROR("of_list_port_desc_new() failed"); of_port_desc_delete(of_port_desc); return INDIGO_ERROR_RESOURCE; } ofdpa_rv = ofdpaPortNextGet(port, &nextPort); while(ofdpa_rv == OFDPA_E_NONE) { /* Set the port description parameters in LOCI structure (of_port_desc) to be sent in the reply message */ err = ind_ofdpa_port_desc_set(nextPort, of_port_desc); if (err != INDIGO_ERROR_NONE) { LOG_ERROR("Failed to get OpenFlow port description for port %d.", nextPort); break; } if (of_list_port_desc_append(of_list_port_desc, of_port_desc) < 0) { LOG_ERROR("of_list_port_desc_append() failed"); err = INDIGO_ERROR_UNKNOWN; break; } port = nextPort; ofdpa_rv = ofdpaPortNextGet(port, &nextPort); } if (of_port_desc_stats_reply_entries_set(port_desc_stats_reply, of_list_port_desc) < 0) { LOG_ERROR("of_port_desc_stats_reply_entries_set() failed"); err = INDIGO_ERROR_UNKNOWN; } /* free the allocated memory */ of_port_desc_delete(of_port_desc); of_list_port_desc_delete(of_list_port_desc); return err; }