]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/plist.c
isisd: implemented the 'sequence-number-skipped' notification
[mirror_frr.git] / lib / plist.c
index e1dac46a90f823c2725c3527bdacaec7b3fd109a..ee68fbc0f12bfa57fda07547ec33a0d264508a16 100644 (file)
@@ -396,7 +396,7 @@ static int64_t prefix_new_seq_get(struct prefix_list *plist)
 
        newseq = ((maxseq / 5) * 5) + 5;
 
-       return newseq;
+       return (newseq > UINT_MAX) ? UINT_MAX : newseq;
 }
 
 /* Return prefix list entry which has same seq number. */
@@ -477,7 +477,7 @@ static void prefix_list_trie_del(struct prefix_list *plist,
                                 struct prefix_list_entry *pentry)
 {
        size_t depth, maxdepth = plist->master->trie_depth;
-       uint8_t *bytes = &pentry->prefix.u.prefix;
+       uint8_t *bytes = pentry->prefix.u.val;
        size_t validbits = pentry->prefix.prefixlen;
        struct pltrie_table *table, **tables[PLC_MAXLEVEL];
 
@@ -565,7 +565,7 @@ static void prefix_list_trie_add(struct prefix_list *plist,
                                 struct prefix_list_entry *pentry)
 {
        size_t depth = plist->master->trie_depth;
-       uint8_t *bytes = &pentry->prefix.u.prefix;
+       uint8_t *bytes = pentry->prefix.u.val;
        size_t validbits = pentry->prefix.prefixlen;
        struct pltrie_table *table;
 
@@ -656,7 +656,7 @@ static const char *prefix_list_type_str(struct prefix_list_entry *pentry)
 }
 
 static int prefix_list_entry_match(struct prefix_list_entry *pentry,
-                                  struct prefix *p)
+                                  const struct prefix *p)
 {
        int ret;
 
@@ -683,14 +683,15 @@ static int prefix_list_entry_match(struct prefix_list_entry *pentry,
        return 1;
 }
 
-enum prefix_list_type prefix_list_apply_which_prefix(struct prefix_list *plist,
-                                                    struct prefix **which,
-                                                    void *object)
+enum prefix_list_type prefix_list_apply_which_prefix(
+       struct prefix_list *plist,
+       const struct prefix **which,
+       const void *object)
 {
        struct prefix_list_entry *pentry, *pbest = NULL;
 
-       struct prefix *p = (struct prefix *)object;
-       uint8_t *byte = &p->u.prefix;
+       const struct prefix *p = (const struct prefix *)object;
+       const uint8_t *byte = p->u.val;
        size_t depth;
        size_t validbits = p->prefixlen;
        struct pltrie_table *table;
@@ -774,7 +775,7 @@ static void __attribute__((unused)) prefix_list_print(struct prefix_list *plist)
 
                        printf("  seq %" PRId64 " %s %s/%d", pentry->seq,
                               prefix_list_type_str(pentry),
-                              inet_ntop(p->family, &p->u.prefix, buf, BUFSIZ),
+                              inet_ntop(p->family, p->u.val, buf, BUFSIZ),
                               p->prefixlen);
                        if (pentry->ge)
                                printf(" ge %d", pentry->ge);
@@ -790,7 +791,7 @@ static struct prefix_list_entry *
 prefix_entry_dup_check(struct prefix_list *plist, struct prefix_list_entry *new)
 {
        size_t depth, maxdepth = plist->master->trie_depth;
-       uint8_t byte, *bytes = &new->prefix.u.prefix;
+       uint8_t byte, *bytes = new->prefix.u.val;
        size_t validbits = new->prefix.prefixlen;
        struct pltrie_table *table;
        struct prefix_list_entry *pentry;
@@ -850,6 +851,11 @@ static int vty_prefix_list_install(struct vty *vty, afi_t afi, const char *name,
        int lenum = 0;
        int genum = 0;
 
+       if (name == NULL || prefix == NULL || typestr == NULL) {
+               vty_out(vty, "%% Missing prefix or type\n");
+               return CMD_WARNING_CONFIG_FAILED;
+       }
+
        /* Sequential number. */
        if (seq)
                seqnum = (int64_t)atol(seq);
@@ -924,7 +930,10 @@ static int vty_prefix_list_install(struct vty *vty, afi_t afi, const char *name,
                char buf_tmp[PREFIX2STR_BUFFER];
                prefix2str(&p, buf, sizeof(buf));
                prefix2str(&p_tmp, buf_tmp, sizeof(buf_tmp));
-               zlog_warn(
+               vty_out(vty,
+                       "%% Prefix-list %s prefix changed from %s to %s to match length\n",
+                       name, buf, buf_tmp);
+               zlog_info(
                        "Prefix-list %s prefix changed from %s to %s to match length",
                        name, buf, buf_tmp);
                p = p_tmp;
@@ -1140,7 +1149,7 @@ static void vty_show_prefix_entry(struct vty *vty, afi_t afi,
                                char buf[BUFSIZ];
 
                                vty_out(vty, "%s/%d",
-                                       inet_ntop(p->family, &p->u.prefix, buf,
+                                       inet_ntop(p->family, p->u.val, buf,
                                                  BUFSIZ),
                                        p->prefixlen);
 
@@ -1243,13 +1252,13 @@ static int vty_show_prefix_list_prefix(struct vty *vty, afi_t afi,
                        if (pentry->any)
                                vty_out(vty, "any");
                        else {
-                               struct prefix *p = &pentry->prefix;
+                               struct prefix *pf = &pentry->prefix;
                                char buf[BUFSIZ];
 
                                vty_out(vty, "%s/%d",
-                                       inet_ntop(p->family, &p->u.prefix, buf,
+                                       inet_ntop(pf->family, pf->u.val, buf,
                                                  BUFSIZ),
-                                       p->prefixlen);
+                                       pf->prefixlen);
 
                                if (pentry->ge)
                                        vty_out(vty, " ge %d", pentry->ge);
@@ -1756,7 +1765,7 @@ static int config_write_prefix_afi(afi_t afi, struct vty *vty)
                                char buf[BUFSIZ];
 
                                vty_out(vty, "%s/%d",
-                                       inet_ntop(p->family, &p->u.prefix, buf,
+                                       inet_ntop(p->family, p->u.val, buf,
                                                  BUFSIZ),
                                        p->prefixlen);
 
@@ -1795,7 +1804,7 @@ static int config_write_prefix_afi(afi_t afi, struct vty *vty)
                                char buf[BUFSIZ];
 
                                vty_out(vty, " %s/%d",
-                                       inet_ntop(p->family, &p->u.prefix, buf,
+                                       inet_ntop(p->family, p->u.val, buf,
                                                  BUFSIZ),
                                        p->prefixlen);
 
@@ -1894,7 +1903,7 @@ void prefix_bgp_orf_remove_all(afi_t afi, char *name)
 
 /* return prefix count */
 int prefix_bgp_show_prefix_list(struct vty *vty, afi_t afi, char *name,
-                               uint8_t use_json)
+                               bool use_json)
 {
        struct prefix_list *plist;
        struct prefix_list_entry *pentry;
@@ -1925,7 +1934,7 @@ int prefix_bgp_show_prefix_list(struct vty *vty, afi_t afi, char *name,
                        char buf_b[BUFSIZ];
 
                        sprintf(buf_a, "%s/%d",
-                               inet_ntop(p->family, &p->u.prefix, buf_b,
+                               inet_ntop(p->family, p->u.val, buf_b,
                                          BUFSIZ),
                                p->prefixlen);
 
@@ -1963,7 +1972,7 @@ int prefix_bgp_show_prefix_list(struct vty *vty, afi_t afi, char *name,
                        vty_out(vty, "   seq %" PRId64 " %s %s/%d",
                                pentry->seq,
                                prefix_list_type_str(pentry),
-                               inet_ntop(p->family, &p->u.prefix, buf, BUFSIZ),
+                               inet_ntop(p->family, p->u.val, buf, BUFSIZ),
                                p->prefixlen);
 
                        if (pentry->ge)