void flow_entry_remove(struct flow_entry *entry, uint8_t reason) { if (entry->send_removed) { flow_entry_update(entry); { struct ofl_msg_flow_removed msg = {{.type = OFPT_FLOW_REMOVED}, .reason = reason, .stats = entry->stats}; dp_send_message(entry->dp, (struct ofl_msg_header *)&msg, NULL); }
void flow_table_stats(struct flow_table *table, struct ofl_msg_stats_request_flow *msg, struct ofl_flow_stats ***stats, size_t *stats_size, size_t *stats_num) { struct flow_entry *entry; LIST_FOR_EACH(entry, struct flow_entry, match_node, &table->match_entries) { if ((msg->out_port == OFPP_ANY || flow_entry_has_out_port(entry, msg->out_port)) && (msg->out_group == OFPG_ANY || flow_entry_has_out_group(entry, msg->out_group)) && match_std_nonstrict((struct ofl_match *)msg->match, (struct ofl_match *)entry->stats->match)) { flow_entry_update(entry); if ((*stats_size) == (*stats_num)) { (*stats) = xrealloc(*stats, (sizeof(struct ofl_flow_stats *)) * (*stats_size) * 2); *stats_size *= 2; } (*stats)[(*stats_num)] = entry->stats; (*stats_num)++; } } }