Adding check to ensure acl_id matches existing acl_id in abf_policy_update 24/18824/2
authorParixit Gokhale <pgokhale@cisco.com>
Thu, 11 Apr 2019 21:00:52 +0000 (14:00 -0700)
committerParixit Gokhale <pgokhale@cisco.com>
Thu, 11 Apr 2019 22:32:53 +0000 (15:32 -0700)
Change-Id: Ia86387ca5a52d6b4b9e5aff0c01c92df13a5dde5
Signed-off-by: Parixit Gokhale <pgokhale@cisco.com>
src/plugins/abf/abf_api.c
src/plugins/abf/abf_policy.c
src/plugins/abf/abf_policy.h

index 9da0839..a951fe6 100644 (file)
@@ -111,12 +111,12 @@ vl_api_abf_policy_add_del_t_handler (vl_api_abf_policy_add_del_t * mp)
 
   if (mp->is_add)
     {
-      abf_policy_update (ntohl (mp->policy.policy_id),
-                        ntohl (mp->policy.acl_index), paths);
+      rv = abf_policy_update (ntohl (mp->policy.policy_id),
+                             ntohl (mp->policy.acl_index), paths);
     }
   else
     {
-      abf_policy_delete (ntohl (mp->policy.policy_id), paths);
+      rv = abf_policy_delete (ntohl (mp->policy.policy_id), paths);
     }
 done:
   vec_free (paths);
index c411f3b..458bf1b 100644 (file)
@@ -76,7 +76,7 @@ abf_policy_find (u32 policy_id)
 }
 
 
-void
+int
 abf_policy_update (u32 policy_id,
                   u32 acl_index, const fib_route_path_t * rpaths)
 {
@@ -128,6 +128,11 @@ abf_policy_update (u32 policy_id,
 
       ap = abf_policy_get (api);
       old_pl = ap->ap_pl;
+      if (ap->ap_acl != acl_index)
+       {
+         /* Should change this error code to something more descriptive */
+         return (VNET_API_ERROR_INVALID_VALUE);
+       }
 
       if (FIB_NODE_INDEX_INVALID != old_pl)
        {
@@ -155,6 +160,7 @@ abf_policy_update (u32 policy_id,
 
       fib_walk_sync (abf_policy_fib_node_type, api, &ctx);
     }
+  return (0);
 }
 
 static void
@@ -184,7 +190,7 @@ abf_policy_delete (u32 policy_id, const fib_route_path_t * rpaths)
       /*
        * no such policy
        */
-      return (-1);
+      return (VNET_API_ERROR_INVALID_VALUE);
     }
   else
     {
@@ -242,6 +248,7 @@ abf_policy_cmd (vlib_main_t * vm,
   u32 acl_index, policy_id;
   fib_route_path_t *rpaths = NULL, rpath;
   u32 is_del;
+  int rv = 0;
 
   is_del = 0;
   acl_index = INDEX_INVALID;
@@ -283,7 +290,14 @@ abf_policy_cmd (vlib_main_t * vm,
          return 0;
        }
 
-      abf_policy_update (policy_id, acl_index, rpaths);
+      rv = abf_policy_update (policy_id, acl_index, rpaths);
+      /* Should change this error code to something more descriptive */
+      if (rv == VNET_API_ERROR_INVALID_VALUE)
+       {
+         vlib_cli_output (vm,
+                          "ACL index must match existing ACL index in policy");
+         return 0;
+       }
     }
   else
     {
index 724611e..7d890ab 100644 (file)
@@ -82,10 +82,10 @@ extern fib_node_type_t abf_policy_fib_node_type;
  * @param policy_id User defined Policy ID
  * @param acl_index The ACL the policy with match on
  * @param rpaths The set of paths to add to the forwarding set
+ * @return error code
  */
-extern void abf_policy_update (u32 policy_id,
-                              u32 acl_index,
-                              const fib_route_path_t * rpaths);
+extern int abf_policy_update (u32 policy_id,
+                             u32 acl_index, const fib_route_path_t * rpaths);
 
 /**
  * Delete paths from an ABF Policy. If no more paths exist, the policy