]> git.puffer.fish Git - matthieu/frr.git/commitdiff
pimd: reject inconsistent address/mask "ip pim rp command"
authorSarita Patra <saritap@vmware.com>
Fri, 8 Feb 2019 09:35:21 +0000 (01:35 -0800)
committerSarita Patra <saritap@vmware.com>
Fri, 8 Feb 2019 09:35:21 +0000 (01:35 -0800)
Issue: Configure "ip pim rp x.x.x.x 225.0.0.0/4".
Show running config shows "ip pim rp x.x.x.x 224.0.0.0/4"
This is mis-leading.

Root-cause: Internally 225.0.0.0/4 is getting converted to
224.0.0.0/4 group mask, since the prefix length is 4.

Fix: Restrict the user to configure inconsistent group address
mask by throughing a cli error "Inconsistent address and mask".

Signed-off-by: Sarita Patra <saritap@vmware.com>
pimd/pim_cmd.c
pimd/pim_rp.c
pimd/pimd.h

index 2c19d061a84b891e776b788a564ebf71341ef5c3..d2d2445a1553539faa26e48fd11025a8fab248d7 100644 (file)
@@ -5142,6 +5142,12 @@ static int pim_rp_cmd_worker(struct pim_instance *pim, struct vty *vty,
                return CMD_WARNING_CONFIG_FAILED;
        }
 
+       if (result == PIM_GROUP_BAD_ADDR_MASK_COMBO) {
+               vty_out(vty, "%% Inconsistent address and mask: %s\n",
+                       group);
+               return CMD_WARNING_CONFIG_FAILED;
+       }
+
        return CMD_SUCCESS;
 }
 
index 6b76794b75eecdfd6499975c409505fa0a50a9e4..08f2ffc4ea5396794b3d5ae46c41d83c11de8de4 100644 (file)
@@ -345,6 +345,7 @@ int pim_rp_new(struct pim_instance *pim, const char *rp,
        struct rp_info *tmp_rp_info;
        char buffer[BUFSIZ];
        struct prefix nht_p;
+       struct prefix temp;
        struct pim_nexthop_cache pnc;
        struct route_node *rn;
 
@@ -352,8 +353,17 @@ int pim_rp_new(struct pim_instance *pim, const char *rp,
 
        if (group_range == NULL)
                result = str2prefix("224.0.0.0/4", &rp_info->group);
-       else
+       else {
                result = str2prefix(group_range, &rp_info->group);
+               if (result) {
+                       prefix_copy(&temp, &rp_info->group);
+                       apply_mask(&temp);
+                       if (!prefix_same(&rp_info->group, &temp)) {
+                               XFREE(MTYPE_PIM_RP, rp_info);
+                               return PIM_GROUP_BAD_ADDR_MASK_COMBO;
+                       }
+               }
+       }
 
        if (!result) {
                XFREE(MTYPE_PIM_RP, rp_info);
index 73ea9f82c4ec569a9d8c08c90a5c350231f72bda..50c19658dab044f4cc528d369bb8f87c0209d49e 100644 (file)
 /* Remember 32 bits!!! */
 
 /* PIM error codes */
-#define PIM_SUCCESS                0
-#define PIM_GROUP_BAD_ADDRESS     -2
-#define PIM_GROUP_OVERLAP         -3
-#define PIM_GROUP_PFXLIST_OVERLAP -4
-#define PIM_RP_BAD_ADDRESS        -5
-#define PIM_RP_NO_PATH            -6
-#define PIM_RP_NOT_FOUND          -7
-#define PIM_RP_PFXLIST_IN_USE     -8
-#define PIM_IFACE_NOT_FOUND       -9
-#define PIM_UPDATE_SOURCE_DUP     -10
+#define PIM_SUCCESS                      0
+#define PIM_GROUP_BAD_ADDRESS           -2
+#define PIM_GROUP_OVERLAP               -3
+#define PIM_GROUP_PFXLIST_OVERLAP       -4
+#define PIM_RP_BAD_ADDRESS              -5
+#define PIM_RP_NO_PATH                  -6
+#define PIM_RP_NOT_FOUND                -7
+#define PIM_RP_PFXLIST_IN_USE           -8
+#define PIM_IFACE_NOT_FOUND             -9
+#define PIM_UPDATE_SOURCE_DUP           -10
+#define PIM_GROUP_BAD_ADDR_MASK_COMBO   -11
 
 const char *const PIM_ALL_SYSTEMS;
 const char *const PIM_ALL_ROUTERS;