Return error message when a flow can't be added due to full tables.
When a flow cannot be added to any tables because they are full, send a message with type OFPET_FLOW_MOD_FAILED and code OFPFMFC_ALL_TABLES_FULL.
This commit is contained in:
+5
-1
@@ -240,7 +240,11 @@ add_flow(struct sw_chain *chain, const struct sender *sender,
|
||||
|
||||
/* Act. */
|
||||
error = chain_insert(chain, flow);
|
||||
if (error)
|
||||
if (error == -ENOBUFS) {
|
||||
dp_send_error_msg(chain->dp, sender, OFPET_FLOW_MOD_FAILED,
|
||||
OFPFMFC_ALL_TABLES_FULL, ofm, ntohs(ofm->header.length));
|
||||
goto error_free_flow;
|
||||
} else if (error)
|
||||
goto error_free_flow;
|
||||
error = 0;
|
||||
if (ntohl(ofm->buffer_id) != (uint32_t) -1) {
|
||||
|
||||
+8
-1
@@ -556,7 +556,8 @@ OFP_ASSERT(sizeof(struct ofp_flow_expired) == 72);
|
||||
enum ofp_error_type {
|
||||
OFPET_HELLO_FAILED, /* Hello protocol failed. */
|
||||
OFPET_BAD_REQUEST, /* Request was not understood. */
|
||||
OFPET_BAD_ACTION /* Error in action description. */
|
||||
OFPET_BAD_ACTION, /* Error in action description. */
|
||||
OFPET_FLOW_MOD_FAILED /* Problem modifying flow entry. */
|
||||
};
|
||||
|
||||
/* ofp_error_msg 'code' values for OFPET_HELLO_FAILED. 'data' contains an
|
||||
@@ -587,6 +588,12 @@ enum ofp_bad_action_code {
|
||||
OFPBAC_BAD_ARGUMENT /* Bad action argument. */
|
||||
};
|
||||
|
||||
/* ofp_error_msg 'code' values for OFPET_FLOW_MOD_FAILED. 'data' contains
|
||||
* at least the first 64 bytes of the failed request. */
|
||||
enum ofp_flow_mod_failed_code {
|
||||
OFPFMFC_ALL_TABLES_FULL /* Flow not added because of full tables. */
|
||||
};
|
||||
|
||||
/* OFPT_ERROR: Error message (datapath -> controller). */
|
||||
struct ofp_error_msg {
|
||||
struct ofp_header header;
|
||||
|
||||
@@ -851,6 +851,9 @@ static const struct error_type error_types[] = {
|
||||
ERROR_CODE(OFPET_BAD_ACTION, OFPBAC_BAD_VENDOR),
|
||||
ERROR_CODE(OFPET_BAD_ACTION, OFPBAC_BAD_VENDOR_TYPE),
|
||||
ERROR_CODE(OFPET_BAD_ACTION, OFPBAC_BAD_OUT_PORT),
|
||||
|
||||
ERROR_TYPE(OFPET_FLOW_MOD_FAILED),
|
||||
ERROR_CODE(OFPET_FLOW_MOD_FAILED, OFPFMFC_ALL_TABLES_FULL)
|
||||
};
|
||||
#define N_ERROR_TYPES ARRAY_SIZE(error_types)
|
||||
|
||||
|
||||
+5
-1
@@ -1008,7 +1008,11 @@ add_flow(struct datapath *dp, const struct sender *sender,
|
||||
|
||||
/* Act. */
|
||||
error = chain_insert(dp->chain, flow);
|
||||
if (error) {
|
||||
if (error == -ENOBUFS) {
|
||||
dp_send_error_msg(dp, sender, OFPET_FLOW_MOD_FAILED,
|
||||
OFPFMFC_ALL_TABLES_FULL, ofm, ntohs(ofm->header.length));
|
||||
goto error_free_flow;
|
||||
} else if (error) {
|
||||
goto error_free_flow;
|
||||
}
|
||||
error = 0;
|
||||
|
||||
Reference in New Issue
Block a user