Return error message when a flow can't be added due to full tables.
authorJustin Pettit <jpettit@nicira.com>
Tue, 14 Oct 2008 00:49:34 +0000 (17:49 -0700)
committerJustin Pettit <jpettit@nicira.com>
Tue, 14 Oct 2008 00:49:45 +0000 (17:49 -0700)
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.

datapath/forward.c
include/openflow.h
lib/ofp-print.c
switch/datapath.c

index f28ac2b9606e754216833ab6c4d022c8afd97585..ea53d15454041d0e5447eaa2d10857b63f62b689 100644 (file)
@@ -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) {
index 2a5f8b9129c913d6fab2dcbb39aea106893e4cd5..b067811e7502aa9b4d450945ed00b5089e5399a8 100644 (file)
@@ -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;
index 9dcb8b1b5dfbbd42d7079a58a339ceeceffa64ba..75f5b5cc89ccfff0697148217869310e3c296e24 100644 (file)
@@ -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)
 
index ce9c31e27915596d684f7edf26fff58093e4f782..9ec768d62f896a98dd45ccbd16755b4bb96d690a 100644 (file)
@@ -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;