summaryrefslogtreecommitdiff
path: root/lib/plist.c
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2016-09-29 20:24:49 -0400
committerDonald Sharp <sharpd@cumulusnetworks.com>2016-09-29 20:24:49 -0400
commit69b5e938fe50a59ea8bb77e6d29a5e16ec55776c (patch)
tree3e707e79cd638beeb0023774021eeb9f0293c182 /lib/plist.c
parentbb5ea4a6d799a7b38d05dc0df44678b278915942 (diff)
parent8d62b1417ee85862a85454f635168e5e3fcf682d (diff)
Merge remote-tracking branch 'origin/cmaster' into cmaster-next
Diffstat (limited to 'lib/plist.c')
-rw-r--r--lib/plist.c32
1 files changed, 23 insertions, 9 deletions
diff --git a/lib/plist.c b/lib/plist.c
index 336c55a084..cab5d0dba9 100644
--- a/lib/plist.c
+++ b/lib/plist.c
@@ -899,7 +899,7 @@ vty_prefix_list_install (struct vty *vty, afi_t afi, const char *name,
struct prefix_list *plist;
struct prefix_list_entry *pentry;
struct prefix_list_entry *dup;
- struct prefix p;
+ struct prefix p, p_tmp;
int any = 0;
int seqnum = -1;
int lenum = 0;
@@ -945,6 +945,11 @@ vty_prefix_list_install (struct vty *vty, afi_t afi, const char *name,
vty_out (vty, "%% Malformed IPv4 prefix%s", VTY_NEWLINE);
return CMD_WARNING;
}
+
+ /* make a copy to verify prefix matches mask length */
+ prefix_copy (&p_tmp, &p);
+ apply_mask_ipv4 ((struct prefix_ipv4 *) &p_tmp);
+
break;
case AFI_IP6:
if (strncmp ("any", prefix, strlen (prefix)) == 0)
@@ -962,6 +967,11 @@ vty_prefix_list_install (struct vty *vty, afi_t afi, const char *name,
vty_out (vty, "%% Malformed IPv6 prefix%s", VTY_NEWLINE);
return CMD_WARNING;
}
+
+ /* make a copy to verify prefix matches mask length */
+ prefix_copy (&p_tmp, &p);
+ apply_mask_ipv6 ((struct prefix_ipv6 *) &p_tmp);
+
break;
case AFI_ETHER:
default:
@@ -970,6 +980,18 @@ vty_prefix_list_install (struct vty *vty, afi_t afi, const char *name,
break;
}
+ /* If prefix has bits not under the mask, adjust it to fit */
+ if (!prefix_same (&p_tmp, &p))
+ {
+ char buf[PREFIX2STR_BUFFER];
+ char buf_tmp[PREFIX2STR_BUFFER];
+ prefix2str(&p, buf, sizeof(buf));
+ prefix2str(&p_tmp, buf_tmp, sizeof(buf_tmp));
+ zlog_warn ("Prefix-list %s prefix changed from %s to %s to match length",
+ name, buf, buf_tmp);
+ p = p_tmp;
+ }
+
/* ge and le check. */
if (genum && (genum <= p.prefixlen))
return vty_invalid_prefix_range (vty, prefix);
@@ -995,14 +1017,6 @@ vty_prefix_list_install (struct vty *vty, afi_t afi, const char *name,
if (dup)
{
prefix_list_entry_free (pentry);
- vty_out (vty, "%% Insertion failed - prefix-list entry exists:%s",
- VTY_NEWLINE);
- vty_out (vty, " seq %u %s %s", dup->seq, typestr, prefix);
- if (! any && genum)
- vty_out (vty, " ge %d", genum);
- if (! any && lenum)
- vty_out (vty, " le %d", lenum);
- vty_out (vty, "%s", VTY_NEWLINE);
return CMD_SUCCESS;
}