forked from Mirror/frr
lib: straighten out ORF prefix list support
BGP ORF prefix lists are in a separate namespace; this was previously hooked up with a special-purpose AFI value. This is a little kludgy for extension, hence this splits it off. Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
parent
a38401b6af
commit
c7da3d50b3
|
@ -1104,7 +1104,7 @@ bgp_stop (struct peer *peer)
|
|||
if ((peer->status == OpenConfirm) || (peer->status == Established)) {
|
||||
/* ORF received prefix-filter pnt */
|
||||
sprintf (orf_name, "%s.%d.%d", peer->host, afi, safi);
|
||||
prefix_bgp_orf_remove_all (orf_name);
|
||||
prefix_bgp_orf_remove_all (afi, orf_name);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1892,7 +1892,7 @@ bgp_route_refresh_receive (struct peer *peer, bgp_size_t size)
|
|||
{
|
||||
if (bgp_debug_neighbor_events(peer))
|
||||
zlog_debug ("%s rcvd Remove-All pfxlist ORF request", peer->host);
|
||||
prefix_bgp_orf_remove_all (name);
|
||||
prefix_bgp_orf_remove_all (afi, name);
|
||||
break;
|
||||
}
|
||||
ok = ((u_int32_t)(p_end - p_pnt) >= sizeof(u_int32_t)) ;
|
||||
|
@ -1952,12 +1952,12 @@ bgp_route_refresh_receive (struct peer *peer, bgp_size_t size)
|
|||
{
|
||||
zlog_info ("%s Received misformatted prefixlist ORF."
|
||||
" Remove All pfxlist", peer->host);
|
||||
prefix_bgp_orf_remove_all (name);
|
||||
prefix_bgp_orf_remove_all (afi, name);
|
||||
break;
|
||||
}
|
||||
}
|
||||
peer->orf_plist[afi][safi] =
|
||||
prefix_list_lookup (AFI_ORF_PREFIX, name);
|
||||
prefix_list_lookup (afi, name);
|
||||
}
|
||||
stream_forward_getp (s, orf_len);
|
||||
}
|
||||
|
|
|
@ -807,7 +807,7 @@ peer_af_flag_reset (struct peer *peer, afi_t afi, safi_t safi)
|
|||
/* Clear ORF info */
|
||||
peer->orf_plist[afi][safi] = NULL;
|
||||
sprintf (orf_name, "%s.%d.%d", peer->host, afi, safi);
|
||||
prefix_bgp_orf_remove_all (orf_name);
|
||||
prefix_bgp_orf_remove_all (afi, orf_name);
|
||||
|
||||
/* Set default neighbor send-community. */
|
||||
if (! bgp_option_check (BGP_OPT_CONFIG_CISCO))
|
||||
|
|
149
lib/plist.c
149
lib/plist.c
|
@ -86,7 +86,17 @@ static struct prefix_master prefix_master_ipv6 =
|
|||
#endif /* HAVE_IPV6*/
|
||||
|
||||
/* Static structure of BGP ORF prefix_list's master. */
|
||||
static struct prefix_master prefix_master_orf =
|
||||
static struct prefix_master prefix_master_orf_v4 =
|
||||
{
|
||||
{NULL, NULL},
|
||||
{NULL, NULL},
|
||||
1,
|
||||
NULL,
|
||||
NULL,
|
||||
};
|
||||
|
||||
/* Static structure of BGP ORF prefix_list's master. */
|
||||
static struct prefix_master prefix_master_orf_v6 =
|
||||
{
|
||||
{NULL, NULL},
|
||||
{NULL, NULL},
|
||||
|
@ -96,16 +106,12 @@ static struct prefix_master prefix_master_orf =
|
|||
};
|
||||
|
||||
static struct prefix_master *
|
||||
prefix_master_get (afi_t afi)
|
||||
prefix_master_get (afi_t afi, int orf)
|
||||
{
|
||||
if (afi == AFI_IP)
|
||||
return &prefix_master_ipv4;
|
||||
#ifdef HAVE_IPV6
|
||||
else if (afi == AFI_IP6)
|
||||
return &prefix_master_ipv6;
|
||||
#endif /* HAVE_IPV6 */
|
||||
else if (afi == AFI_ORF_PREFIX)
|
||||
return &prefix_master_orf;
|
||||
return orf ? &prefix_master_orf_v4 : &prefix_master_ipv4;
|
||||
if (afi == AFI_IP6)
|
||||
return orf ? &prefix_master_orf_v6 : &prefix_master_ipv6;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -115,8 +121,8 @@ const char *prefix_list_name (struct prefix_list *plist)
|
|||
}
|
||||
|
||||
/* Lookup prefix_list from list of prefix_list by name. */
|
||||
struct prefix_list *
|
||||
prefix_list_lookup (afi_t afi, const char *name)
|
||||
static struct prefix_list *
|
||||
prefix_list_lookup_do (afi_t afi, int orf, const char *name)
|
||||
{
|
||||
struct prefix_list *plist;
|
||||
struct prefix_master *master;
|
||||
|
@ -124,7 +130,7 @@ prefix_list_lookup (afi_t afi, const char *name)
|
|||
if (name == NULL)
|
||||
return NULL;
|
||||
|
||||
master = prefix_master_get (afi);
|
||||
master = prefix_master_get (afi, orf);
|
||||
if (master == NULL)
|
||||
return NULL;
|
||||
|
||||
|
@ -139,6 +145,18 @@ prefix_list_lookup (afi_t afi, const char *name)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
struct prefix_list *
|
||||
prefix_list_lookup (afi_t afi, const char *name)
|
||||
{
|
||||
return prefix_list_lookup_do (afi, 0, name);
|
||||
}
|
||||
|
||||
struct prefix_list *
|
||||
prefix_bgp_orf_lookup (afi_t afi, const char *name)
|
||||
{
|
||||
return prefix_list_lookup_do (afi, 1, name);
|
||||
}
|
||||
|
||||
static struct prefix_list *
|
||||
prefix_list_new (void)
|
||||
{
|
||||
|
@ -172,7 +190,7 @@ prefix_list_entry_free (struct prefix_list_entry *pentry)
|
|||
/* Insert new prefix list to list of prefix_list. Each prefix_list
|
||||
is sorted by the name. */
|
||||
static struct prefix_list *
|
||||
prefix_list_insert (afi_t afi, const char *name)
|
||||
prefix_list_insert (afi_t afi, int orf, const char *name)
|
||||
{
|
||||
unsigned int i;
|
||||
long number;
|
||||
|
@ -181,7 +199,7 @@ prefix_list_insert (afi_t afi, const char *name)
|
|||
struct prefix_list_list *list;
|
||||
struct prefix_master *master;
|
||||
|
||||
master = prefix_master_get (afi);
|
||||
master = prefix_master_get (afi, orf);
|
||||
if (master == NULL)
|
||||
return NULL;
|
||||
|
||||
|
@ -262,14 +280,14 @@ prefix_list_insert (afi_t afi, const char *name)
|
|||
}
|
||||
|
||||
static struct prefix_list *
|
||||
prefix_list_get (afi_t afi, const char *name)
|
||||
prefix_list_get (afi_t afi, int orf, const char *name)
|
||||
{
|
||||
struct prefix_list *plist;
|
||||
|
||||
plist = prefix_list_lookup (afi, name);
|
||||
plist = prefix_list_lookup_do (afi, orf, name);
|
||||
|
||||
if (plist == NULL)
|
||||
plist = prefix_list_insert (afi, name);
|
||||
plist = prefix_list_insert (afi, orf, name);
|
||||
return plist;
|
||||
}
|
||||
|
||||
|
@ -740,7 +758,7 @@ vty_prefix_list_install (struct vty *vty, afi_t afi, const char *name,
|
|||
lenum = 0;
|
||||
|
||||
/* Get prefix_list with name. */
|
||||
plist = prefix_list_get (afi, name);
|
||||
plist = prefix_list_get (afi, 0, name);
|
||||
|
||||
/* Make prefix entry. */
|
||||
pentry = prefix_list_entry_make (&p, type, seqnum, lenum, genum, any);
|
||||
|
@ -995,7 +1013,7 @@ vty_show_prefix_list (struct vty *vty, afi_t afi, const char *name,
|
|||
struct prefix_master *master;
|
||||
int seqnum = 0;
|
||||
|
||||
master = prefix_master_get (afi);
|
||||
master = prefix_master_get (afi, 0);
|
||||
if (master == NULL)
|
||||
return CMD_WARNING;
|
||||
|
||||
|
@ -1113,7 +1131,7 @@ vty_clear_prefix_list (struct vty *vty, afi_t afi, const char *name,
|
|||
int ret;
|
||||
struct prefix p;
|
||||
|
||||
master = prefix_master_get (afi);
|
||||
master = prefix_master_get (afi, 0);
|
||||
if (master == NULL)
|
||||
return CMD_WARNING;
|
||||
|
||||
|
@ -1568,7 +1586,7 @@ DEFUN (ip_prefix_list_description,
|
|||
{
|
||||
struct prefix_list *plist;
|
||||
|
||||
plist = prefix_list_get (AFI_IP, argv[0]);
|
||||
plist = prefix_list_get (AFI_IP, 0, argv[0]);
|
||||
|
||||
if (plist->desc)
|
||||
{
|
||||
|
@ -2164,7 +2182,7 @@ DEFUN (ipv6_prefix_list_description,
|
|||
{
|
||||
struct prefix_list *plist;
|
||||
|
||||
plist = prefix_list_get (AFI_IP6, argv[0]);
|
||||
plist = prefix_list_get (AFI_IP6, 0, argv[0]);
|
||||
|
||||
if (plist->desc)
|
||||
{
|
||||
|
@ -2359,7 +2377,7 @@ config_write_prefix_afi (afi_t afi, struct vty *vty)
|
|||
struct prefix_master *master;
|
||||
int write = 0;
|
||||
|
||||
master = prefix_master_get (afi);
|
||||
master = prefix_master_get (afi, 0);
|
||||
if (master == NULL)
|
||||
return 0;
|
||||
|
||||
|
@ -2502,7 +2520,7 @@ prefix_bgp_orf_set (char *name, afi_t afi, struct orf_prefix *orfp,
|
|||
if (orfp->ge && orfp->le == (afi == AFI_IP ? 32 : 128))
|
||||
orfp->le = 0;
|
||||
|
||||
plist = prefix_list_get (AFI_ORF_PREFIX, name);
|
||||
plist = prefix_list_get (afi, 1, name);
|
||||
if (! plist)
|
||||
return CMD_WARNING;
|
||||
|
||||
|
@ -2536,11 +2554,11 @@ prefix_bgp_orf_set (char *name, afi_t afi, struct orf_prefix *orfp,
|
|||
}
|
||||
|
||||
void
|
||||
prefix_bgp_orf_remove_all (char *name)
|
||||
prefix_bgp_orf_remove_all (afi_t afi, char *name)
|
||||
{
|
||||
struct prefix_list *plist;
|
||||
|
||||
plist = prefix_list_lookup (AFI_ORF_PREFIX, name);
|
||||
plist = prefix_bgp_orf_lookup (afi, name);
|
||||
if (plist)
|
||||
prefix_list_delete (plist);
|
||||
}
|
||||
|
@ -2555,7 +2573,7 @@ prefix_bgp_show_prefix_list (struct vty *vty, afi_t afi, char *name, u_char use_
|
|||
json_object *json_prefix = NULL;
|
||||
json_object *json_list = NULL;
|
||||
|
||||
plist = prefix_list_lookup (AFI_ORF_PREFIX, name);
|
||||
plist = prefix_bgp_orf_lookup (afi, name);
|
||||
if (! plist)
|
||||
return 0;
|
||||
|
||||
|
@ -2626,13 +2644,13 @@ prefix_bgp_show_prefix_list (struct vty *vty, afi_t afi, char *name, u_char use_
|
|||
}
|
||||
|
||||
static void
|
||||
prefix_list_reset_orf (void)
|
||||
prefix_list_reset_afi (afi_t afi, int orf)
|
||||
{
|
||||
struct prefix_list *plist;
|
||||
struct prefix_list *next;
|
||||
struct prefix_master *master;
|
||||
|
||||
master = prefix_master_get (AFI_ORF_PREFIX);
|
||||
master = prefix_master_get (afi, orf);
|
||||
if (master == NULL)
|
||||
return;
|
||||
|
||||
|
@ -2672,38 +2690,6 @@ config_write_prefix_ipv4 (struct vty *vty)
|
|||
return config_write_prefix_afi (AFI_IP, vty);
|
||||
}
|
||||
|
||||
static void
|
||||
prefix_list_reset_ipv4 (void)
|
||||
{
|
||||
struct prefix_list *plist;
|
||||
struct prefix_list *next;
|
||||
struct prefix_master *master;
|
||||
|
||||
master = prefix_master_get (AFI_IP);
|
||||
if (master == NULL)
|
||||
return;
|
||||
|
||||
for (plist = master->num.head; plist; plist = next)
|
||||
{
|
||||
next = plist->next;
|
||||
prefix_list_delete (plist);
|
||||
}
|
||||
for (plist = master->str.head; plist; plist = next)
|
||||
{
|
||||
next = plist->next;
|
||||
prefix_list_delete (plist);
|
||||
}
|
||||
|
||||
assert (master->num.head == NULL);
|
||||
assert (master->num.tail == NULL);
|
||||
|
||||
assert (master->str.head == NULL);
|
||||
assert (master->str.tail == NULL);
|
||||
|
||||
master->seqnum = 1;
|
||||
master->recent = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
prefix_list_init_ipv4 (void)
|
||||
{
|
||||
|
@ -2781,38 +2767,6 @@ config_write_prefix_ipv6 (struct vty *vty)
|
|||
return config_write_prefix_afi (AFI_IP6, vty);
|
||||
}
|
||||
|
||||
static void
|
||||
prefix_list_reset_ipv6 (void)
|
||||
{
|
||||
struct prefix_list *plist;
|
||||
struct prefix_list *next;
|
||||
struct prefix_master *master;
|
||||
|
||||
master = prefix_master_get (AFI_IP6);
|
||||
if (master == NULL)
|
||||
return;
|
||||
|
||||
for (plist = master->num.head; plist; plist = next)
|
||||
{
|
||||
next = plist->next;
|
||||
prefix_list_delete (plist);
|
||||
}
|
||||
for (plist = master->str.head; plist; plist = next)
|
||||
{
|
||||
next = plist->next;
|
||||
prefix_list_delete (plist);
|
||||
}
|
||||
|
||||
assert (master->num.head == NULL);
|
||||
assert (master->num.tail == NULL);
|
||||
|
||||
assert (master->str.head == NULL);
|
||||
assert (master->str.tail == NULL);
|
||||
|
||||
master->seqnum = 1;
|
||||
master->recent = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
prefix_list_init_ipv6 (void)
|
||||
{
|
||||
|
@ -2888,9 +2842,8 @@ prefix_list_init ()
|
|||
void
|
||||
prefix_list_reset ()
|
||||
{
|
||||
prefix_list_reset_ipv4 ();
|
||||
#ifdef HAVE_IPV6
|
||||
prefix_list_reset_ipv6 ();
|
||||
#endif /* HAVE_IPV6 */
|
||||
prefix_list_reset_orf ();
|
||||
prefix_list_reset_afi (AFI_IP, 0);
|
||||
prefix_list_reset_afi (AFI_IP6, 0);
|
||||
prefix_list_reset_afi (AFI_IP, 1);
|
||||
prefix_list_reset_afi (AFI_IP6, 1);
|
||||
}
|
||||
|
|
|
@ -23,8 +23,6 @@
|
|||
#ifndef _QUAGGA_PLIST_H
|
||||
#define _QUAGGA_PLIST_H
|
||||
|
||||
#define AFI_ORF_PREFIX 65535
|
||||
|
||||
enum prefix_list_type
|
||||
{
|
||||
PREFIX_DENY,
|
||||
|
@ -51,11 +49,12 @@ extern const char *prefix_list_name (struct prefix_list *);
|
|||
extern struct prefix_list *prefix_list_lookup (afi_t, const char *);
|
||||
extern enum prefix_list_type prefix_list_apply (struct prefix_list *, void *);
|
||||
|
||||
extern struct prefix_list *prefix_bgp_orf_lookup (afi_t, const char *);
|
||||
extern struct stream * prefix_bgp_orf_entry (struct stream *,
|
||||
struct prefix_list *,
|
||||
u_char, u_char, u_char);
|
||||
extern int prefix_bgp_orf_set (char *, afi_t, struct orf_prefix *, int, int);
|
||||
extern void prefix_bgp_orf_remove_all (char *);
|
||||
extern void prefix_bgp_orf_remove_all (afi_t, char *);
|
||||
extern int prefix_bgp_show_prefix_list (struct vty *, afi_t, char *, u_char);
|
||||
|
||||
#endif /* _QUAGGA_PLIST_H */
|
||||
|
|
Loading…
Reference in a new issue