int ofl_msg_free_meter_mod(struct ofl_msg_meter_mod * msg, bool with_bands){ if (with_bands) { OFL_UTILS_FREE_ARR_FUN(msg->bands, msg->meter_bands_num, ofl_structs_free_meter_bands); } free(msg); return 0; }
void meter_entry_destroy(struct meter_entry *entry) { struct flow_ref_entry *ref, *next; // remove all referencing flows LIST_FOR_EACH_SAFE(ref, next, struct flow_ref_entry, node, &entry->flow_refs) { flow_entry_remove(ref->entry, OFPRR_METER_DELETE);// METER_DELETE ??????? // Note: the flow_ref_entryf will be destroyed after a chain of calls in flow_entry_remove } OFL_UTILS_FREE_ARR_FUN(entry->config->bands, entry->config->meter_bands_num, ofl_structs_free_meter_bands); free(entry->config); OFL_UTILS_FREE_ARR(entry->stats->band_stats, entry->stats->meter_bands_num); free(entry->stats); free(entry); }
/* Frees the OFlib stats reply message along with any dynamically allocated * structures. */ static int ofl_msg_free_stats_reply(struct ofl_msg_stats_reply_header *msg, struct ofl_exp *exp, char *errbuf) { switch (msg->type) { case OFPST_DESC: { struct ofl_msg_stats_reply_desc *stat = (struct ofl_msg_stats_reply_desc *)msg; free(stat->mfr_desc); free(stat->hw_desc); free(stat->sw_desc); free(stat->serial_num); free(stat->dp_desc); break; } case OFPST_FLOW: { struct ofl_msg_stats_reply_flow *stat = (struct ofl_msg_stats_reply_flow *)msg; OFL_UTILS_FREE_ARR_FUN3(stat->stats, stat->stats_num, ofl_structs_free_flow_stats, exp, errbuf); //TODO error break; } case OFPST_AGGREGATE: { break; } case OFPST_TABLE: { struct ofl_msg_stats_reply_table *stat = (struct ofl_msg_stats_reply_table *)msg; OFL_UTILS_FREE_ARR_FUN(stat->stats, stat->stats_num, ofl_structs_free_table_stats); break; } case OFPST_PORT: { struct ofl_msg_stats_reply_port *stat = (struct ofl_msg_stats_reply_port *)msg; OFL_UTILS_FREE_ARR(stat->stats, stat->stats_num); break; } case OFPST_QUEUE: { struct ofl_msg_stats_reply_queue *stat = (struct ofl_msg_stats_reply_queue *)msg; OFL_UTILS_FREE_ARR(stat->stats, stat->stats_num); break; } case OFPST_GROUP: { struct ofl_msg_stats_reply_group *stat = (struct ofl_msg_stats_reply_group *)msg; OFL_UTILS_FREE_ARR_FUN(stat->stats, stat->stats_num, ofl_structs_free_group_stats); break; } case OFPST_GROUP_DESC: { struct ofl_msg_stats_reply_group_desc *stat = (struct ofl_msg_stats_reply_group_desc *)msg; OFL_UTILS_FREE_ARR_FUN3(stat->stats, stat->stats_num, ofl_structs_free_group_desc_stats, exp, errbuf); //TODO error break; } case OFPST_EXPERIMENTER: { if (exp == NULL || exp->stats || exp->stats->reply_free == NULL) { if (errbuf != NULL) { snprintf(errbuf, OFL_ERRBUF_SIZE, "Trying to free EXPERIMENTER stats reply, but no callback was given."); } free(msg); return -1; } exp->stats->reply_free(msg); return 0; } default: { return -1; } } free(msg); return 0; }
int ofl_msg_free(struct ofl_msg_header *msg, struct ofl_exp *exp, char *errbuf) { switch (msg->type) { case OFPT_HELLO: { break; } case OFPT_ERROR: { return ofl_msg_free_error((struct ofl_msg_error *)msg); } case OFPT_ECHO_REQUEST: case OFPT_ECHO_REPLY: { free(((struct ofl_msg_echo *)msg)->data); break; } case OFPT_EXPERIMENTER: { if (exp == NULL || exp->msg == NULL || exp->msg->free == NULL) { if (errbuf != NULL) { snprintf(errbuf, OFL_ERRBUF_SIZE, "Trying to free EXPERIMENTER message, but no callback was given"); } free(msg); return -1; } exp->msg->free((struct ofl_msg_experimenter *)msg); return 0; } case OFPT_FEATURES_REQUEST: { break; } case OFPT_FEATURES_REPLY: { struct ofl_msg_features_reply *rep = (struct ofl_msg_features_reply *)msg; OFL_UTILS_FREE_ARR_FUN(rep->ports, rep->ports_num, ofl_structs_free_port); break; } case OFPT_GET_CONFIG_REQUEST: { break; } case OFPT_GET_CONFIG_REPLY: { free(((struct ofl_msg_get_config_reply *)msg)->config); break; } case OFPT_SET_CONFIG: { free(((struct ofl_msg_set_config *)msg)->config); break; } case OFPT_PACKET_IN: { free(((struct ofl_msg_packet_in *)msg)->data); break; } case OFPT_FLOW_REMOVED: { return ofl_msg_free_flow_removed((struct ofl_msg_flow_removed *)msg, true, exp, errbuf); break; } case OFPT_PORT_STATUS: { free(((struct ofl_msg_port_status *)msg)->desc); break; } case OFPT_PACKET_OUT: { return ofl_msg_free_packet_out((struct ofl_msg_packet_out *)msg, true, exp, errbuf); } case OFPT_FLOW_MOD: { return ofl_msg_free_flow_mod((struct ofl_msg_flow_mod *)msg, true, true, exp, errbuf); } case OFPT_GROUP_MOD: { return ofl_msg_free_group_mod((struct ofl_msg_group_mod *)msg, true, exp, errbuf); } case OFPT_PORT_MOD: case OFPT_TABLE_MOD: { break; } case OFPT_PROCESSOR_MOD: { return ofl_msg_free_processor_mod((struct ofl_msg_processor_mod *)msg, errbuf);; } case OFPT_PROCESSOR_CTRL: { return ofl_msg_free_processor_ctrl((struct ofl_msg_processor_ctrl *)msg, errbuf);; } case OFPT_STATS_REQUEST: { return ofl_msg_free_stats_request((struct ofl_msg_stats_request_header *)msg, exp, errbuf); } case OFPT_STATS_REPLY: { return ofl_msg_free_stats_reply((struct ofl_msg_stats_reply_header *)msg, exp, errbuf); } case OFPT_BARRIER_REQUEST: case OFPT_BARRIER_REPLY: case OFPT_QUEUE_GET_CONFIG_REQUEST: { break; } case OFPT_QUEUE_GET_CONFIG_REPLY: { struct ofl_msg_queue_get_config_reply *mod = (struct ofl_msg_queue_get_config_reply *)msg; OFL_UTILS_FREE_ARR_FUN(mod->queues, mod->queues_num, ofl_structs_free_packet_queue); break; } } free(msg); return 0; }
int ofl_msg_free(struct ofl_msg_header *msg, struct ofl_exp *exp) { switch (msg->type) { case OFPT_HELLO: { break; } case OFPT_ERROR: { return ofl_msg_free_error((struct ofl_msg_error *)msg); } case OFPT_ECHO_REQUEST: case OFPT_ECHO_REPLY: { free(((struct ofl_msg_echo *)msg)->data); break; } case OFPT_EXPERIMENTER: { if (exp == NULL || exp->msg == NULL || exp->msg->free == NULL) { OFL_LOG_WARN(LOG_MODULE, "Trying to free EXPERIMENTER message, but no callback was given"); break; } exp->msg->free((struct ofl_msg_experimenter *)msg); return 0; } case OFPT_FEATURES_REQUEST: { break; } case OFPT_FEATURES_REPLY: { break; } case OFPT_GET_CONFIG_REQUEST: { break; } case OFPT_GET_CONFIG_REPLY: { free(((struct ofl_msg_get_config_reply *)msg)->config); break; } case OFPT_SET_CONFIG: { free(((struct ofl_msg_set_config *)msg)->config); break; } case OFPT_PACKET_IN: { ofl_structs_free_match(((struct ofl_msg_packet_in *)msg)->match,NULL); free(((struct ofl_msg_packet_in *)msg)->data); break; } case OFPT_FLOW_REMOVED: { return ofl_msg_free_flow_removed((struct ofl_msg_flow_removed *)msg, true, exp); break; } case OFPT_PORT_STATUS: { free(((struct ofl_msg_port_status *)msg)->desc); break; } case OFPT_PACKET_OUT: { return ofl_msg_free_packet_out((struct ofl_msg_packet_out *)msg, true, exp); } case OFPT_FLOW_MOD: { return ofl_msg_free_flow_mod((struct ofl_msg_flow_mod *)msg, true, true, exp); } case OFPT_GROUP_MOD: { return ofl_msg_free_group_mod((struct ofl_msg_group_mod *)msg, true, exp); } case OFPT_PORT_MOD: case OFPT_TABLE_MOD: { break; } case OFPT_MULTIPART_REQUEST: { return ofl_msg_free_multipart_request((struct ofl_msg_multipart_request_header *)msg, exp); } case OFPT_MULTIPART_REPLY: { return ofl_msg_free_multipart_reply((struct ofl_msg_multipart_reply_header *)msg, exp); } case OFPT_BARRIER_REQUEST: case OFPT_BARRIER_REPLY: case OFPT_QUEUE_GET_CONFIG_REQUEST: { break; } case OFPT_ROLE_REPLY: case OFPT_ROLE_REQUEST:{ break; } case OFPT_GET_ASYNC_REPLY: case OFPT_SET_ASYNC: case OFPT_GET_ASYNC_REQUEST:{ break; } case OFPT_METER_MOD:{ return ofl_msg_free_meter_mod((struct ofl_msg_meter_mod*)msg, true); } case OFPT_QUEUE_GET_CONFIG_REPLY: { struct ofl_msg_queue_get_config_reply *mod = (struct ofl_msg_queue_get_config_reply *)msg; OFL_UTILS_FREE_ARR_FUN(mod->queues, mod->queues_num, ofl_structs_free_packet_queue); break; } } free(msg); return 0; }
/* Frees the OFlib stats reply message along with any dynamically allocated * structures. */ static int ofl_msg_free_multipart_reply(struct ofl_msg_multipart_reply_header *msg, struct ofl_exp *exp) { switch (msg->type) { case OFPMP_DESC: { struct ofl_msg_reply_desc *stat = (struct ofl_msg_reply_desc *) msg; free(stat->mfr_desc); free(stat->hw_desc); free(stat->sw_desc); free(stat->serial_num); free(stat->dp_desc); break; } case OFPMP_FLOW: { struct ofl_msg_multipart_reply_flow *stat = (struct ofl_msg_multipart_reply_flow *)msg; OFL_UTILS_FREE_ARR_FUN2(stat->stats, stat->stats_num, ofl_structs_free_flow_stats, exp); } case OFPMP_AGGREGATE: { break; } case OFPMP_TABLE: { struct ofl_msg_multipart_reply_table *stat = (struct ofl_msg_multipart_reply_table *)msg; OFL_UTILS_FREE_ARR_FUN(stat->stats, stat->stats_num, ofl_structs_free_table_stats); break; } case OFPMP_PORT_STATS: { struct ofl_msg_multipart_reply_port *stat = (struct ofl_msg_multipart_reply_port *)msg; OFL_UTILS_FREE_ARR(stat->stats, stat->stats_num); break; } case OFPMP_QUEUE: { struct ofl_msg_multipart_reply_queue *stat = (struct ofl_msg_multipart_reply_queue *)msg; OFL_UTILS_FREE_ARR(stat->stats, stat->stats_num); break; } case OFPMP_GROUP: { struct ofl_msg_multipart_reply_group *stat = (struct ofl_msg_multipart_reply_group *)msg; OFL_UTILS_FREE_ARR_FUN(stat->stats, stat->stats_num, ofl_structs_free_group_stats); break; } case OFPMP_METER:{ struct ofl_msg_multipart_reply_meter *stat = (struct ofl_msg_multipart_reply_meter*)msg; OFL_UTILS_FREE_ARR_FUN(stat->stats, stat->stats_num, ofl_structs_free_meter_stats); break; } case OFPMP_METER_CONFIG:{ struct ofl_msg_multipart_reply_meter_conf *conf = (struct ofl_msg_multipart_reply_meter_conf *)msg; OFL_UTILS_FREE_ARR_FUN(conf->stats, conf->stats_num, ofl_structs_free_meter_config); break; } case OFPMP_METER_FEATURES:{ struct ofl_msg_multipart_reply_meter_features *feat = (struct ofl_msg_multipart_reply_meter_features *)msg; free(feat->features); break; } case OFPMP_GROUP_DESC: { struct ofl_msg_multipart_reply_group_desc *stat = (struct ofl_msg_multipart_reply_group_desc *)msg; OFL_UTILS_FREE_ARR_FUN2(stat->stats, stat->stats_num, ofl_structs_free_group_desc_stats, exp); break; } case OFPMP_PORT_DESC:{ struct ofl_msg_multipart_reply_port_desc *stat = (struct ofl_msg_multipart_reply_port_desc *)msg; OFL_UTILS_FREE_ARR_FUN(stat->stats, stat->stats_num, ofl_structs_free_port); break; } case OFPMP_TABLE_FEATURES:{ struct ofl_msg_multipart_reply_table_features *m = (struct ofl_msg_multipart_reply_table_features *)msg; OFL_UTILS_FREE_ARR_FUN2(m->table_features, m->tables_num, ofl_structs_free_table_features, exp); break; } case OFPMP_EXPERIMENTER: { if (exp == NULL || exp->stats || exp->stats->reply_free == NULL) { OFL_LOG_WARN(LOG_MODULE, "Trying to free EXPERIMENTER stats reply, but no callback was given."); break; } exp->stats->reply_free(msg); return 0; } case OFPMP_GROUP_FEATURES:{ break; } default: { return -1; } } free(msg); return 0; }