mirror of
				https://git.proxmox.com/git/mirror_frr
				synced 2025-11-04 03:29:06 +00:00 
			
		
		
		
	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 New Issue
	
	Block a user