mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-16 00:25:01 +00:00
Merge branch 'cmaster' of ssh://stash.cumulusnetworks.com:7999/quag/quagga into cmaster
This commit is contained in:
commit
c4a24efd88
@ -1104,7 +1104,7 @@ bgp_stop (struct peer *peer)
|
|||||||
if ((peer->status == OpenConfirm) || (peer->status == Established)) {
|
if ((peer->status == OpenConfirm) || (peer->status == Established)) {
|
||||||
/* ORF received prefix-filter pnt */
|
/* ORF received prefix-filter pnt */
|
||||||
sprintf (orf_name, "%s.%d.%d", peer->host, afi, safi);
|
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))
|
if (bgp_debug_neighbor_events(peer))
|
||||||
zlog_debug ("%s rcvd Remove-All pfxlist ORF request", peer->host);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
ok = ((u_int32_t)(p_end - p_pnt) >= sizeof(u_int32_t)) ;
|
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."
|
zlog_info ("%s Received misformatted prefixlist ORF."
|
||||||
" Remove All pfxlist", peer->host);
|
" Remove All pfxlist", peer->host);
|
||||||
prefix_bgp_orf_remove_all (name);
|
prefix_bgp_orf_remove_all (afi, name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
peer->orf_plist[afi][safi] =
|
peer->orf_plist[afi][safi] =
|
||||||
prefix_list_lookup (AFI_ORF_PREFIX, name);
|
prefix_list_lookup (afi, name);
|
||||||
}
|
}
|
||||||
stream_forward_getp (s, orf_len);
|
stream_forward_getp (s, orf_len);
|
||||||
}
|
}
|
||||||
|
@ -643,26 +643,48 @@ DEFUN (router_bgp,
|
|||||||
struct bgp *bgp;
|
struct bgp *bgp;
|
||||||
const char *name = NULL;
|
const char *name = NULL;
|
||||||
|
|
||||||
VTY_GET_INTEGER_RANGE ("AS", as, argv[0], 1, BGP_AS4_MAX);
|
// "router bgp" without an ASN
|
||||||
|
if (argc < 1)
|
||||||
if (argc == 2)
|
|
||||||
name = argv[1];
|
|
||||||
|
|
||||||
ret = bgp_get (&bgp, &as, name);
|
|
||||||
switch (ret)
|
|
||||||
{
|
{
|
||||||
case BGP_ERR_MULTIPLE_INSTANCE_NOT_SET:
|
bgp = bgp_get_default();
|
||||||
vty_out (vty, "Please specify 'bgp multiple-instance' first%s",
|
|
||||||
VTY_NEWLINE);
|
if (bgp == NULL)
|
||||||
return CMD_WARNING;
|
{
|
||||||
case BGP_ERR_AS_MISMATCH:
|
vty_out (vty, "%% No BGP process is configured%s", VTY_NEWLINE);
|
||||||
vty_out (vty, "BGP is already running; AS is %u%s", as, VTY_NEWLINE);
|
return CMD_WARNING;
|
||||||
return CMD_WARNING;
|
}
|
||||||
case BGP_ERR_INSTANCE_MISMATCH:
|
|
||||||
vty_out (vty, "BGP view name and AS number mismatch%s", VTY_NEWLINE);
|
if (listcount(bm->bgp) > 1)
|
||||||
vty_out (vty, "BGP instance is already running; AS is %u%s",
|
{
|
||||||
as, VTY_NEWLINE);
|
vty_out (vty, "%% Multiple BGP processes are configured%s", VTY_NEWLINE);
|
||||||
return CMD_WARNING;
|
return CMD_WARNING;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// "router bgp X"
|
||||||
|
else
|
||||||
|
{
|
||||||
|
VTY_GET_INTEGER_RANGE ("AS", as, argv[0], 1, BGP_AS4_MAX);
|
||||||
|
|
||||||
|
if (argc == 2)
|
||||||
|
name = argv[1];
|
||||||
|
|
||||||
|
ret = bgp_get (&bgp, &as, name);
|
||||||
|
switch (ret)
|
||||||
|
{
|
||||||
|
case BGP_ERR_MULTIPLE_INSTANCE_NOT_SET:
|
||||||
|
vty_out (vty, "Please specify 'bgp multiple-instance' first%s",
|
||||||
|
VTY_NEWLINE);
|
||||||
|
return CMD_WARNING;
|
||||||
|
case BGP_ERR_AS_MISMATCH:
|
||||||
|
vty_out (vty, "BGP is already running; AS is %u%s", as, VTY_NEWLINE);
|
||||||
|
return CMD_WARNING;
|
||||||
|
case BGP_ERR_INSTANCE_MISMATCH:
|
||||||
|
vty_out (vty, "BGP view name and AS number mismatch%s", VTY_NEWLINE);
|
||||||
|
vty_out (vty, "BGP instance is already running; AS is %u%s",
|
||||||
|
as, VTY_NEWLINE);
|
||||||
|
return CMD_WARNING;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
vty->node = BGP_NODE;
|
vty->node = BGP_NODE;
|
||||||
@ -680,6 +702,12 @@ ALIAS (router_bgp,
|
|||||||
"BGP view\n"
|
"BGP view\n"
|
||||||
"view name\n")
|
"view name\n")
|
||||||
|
|
||||||
|
ALIAS (router_bgp,
|
||||||
|
router_bgp_noasn_cmd,
|
||||||
|
"router bgp",
|
||||||
|
ROUTER_STR
|
||||||
|
BGP_STR)
|
||||||
|
|
||||||
/* "no router bgp" commands. */
|
/* "no router bgp" commands. */
|
||||||
DEFUN (no_router_bgp,
|
DEFUN (no_router_bgp,
|
||||||
no_router_bgp_cmd,
|
no_router_bgp_cmd,
|
||||||
@ -12590,6 +12618,7 @@ bgp_vty_init (void)
|
|||||||
/* "router bgp" commands. */
|
/* "router bgp" commands. */
|
||||||
install_element (CONFIG_NODE, &router_bgp_cmd);
|
install_element (CONFIG_NODE, &router_bgp_cmd);
|
||||||
install_element (CONFIG_NODE, &router_bgp_view_cmd);
|
install_element (CONFIG_NODE, &router_bgp_view_cmd);
|
||||||
|
install_element (CONFIG_NODE, &router_bgp_noasn_cmd);
|
||||||
|
|
||||||
/* "no router bgp" commands. */
|
/* "no router bgp" commands. */
|
||||||
install_element (CONFIG_NODE, &no_router_bgp_cmd);
|
install_element (CONFIG_NODE, &no_router_bgp_cmd);
|
||||||
|
@ -13,7 +13,7 @@ WITHOUT ANY WARRANTY; without even the implied warranty of
|
|||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
General Public License for more details.
|
General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GN5U General Public License
|
||||||
along with GNU Zebra; see the file COPYING. If not, write to the Free
|
along with GNU Zebra; see the file COPYING. If not, write to the Free
|
||||||
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
02111-1307, USA. */
|
02111-1307, USA. */
|
||||||
@ -807,7 +807,7 @@ peer_af_flag_reset (struct peer *peer, afi_t afi, safi_t safi)
|
|||||||
/* Clear ORF info */
|
/* Clear ORF info */
|
||||||
peer->orf_plist[afi][safi] = NULL;
|
peer->orf_plist[afi][safi] = NULL;
|
||||||
sprintf (orf_name, "%s.%d.%d", peer->host, afi, safi);
|
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. */
|
/* Set default neighbor send-community. */
|
||||||
if (! bgp_option_check (BGP_OPT_CONFIG_CISCO))
|
if (! bgp_option_check (BGP_OPT_CONFIG_CISCO))
|
||||||
@ -5144,7 +5144,7 @@ peer_prefix_list_update (struct prefix_list *plist)
|
|||||||
* Update the prefix-list on update groups.
|
* Update the prefix-list on update groups.
|
||||||
*/
|
*/
|
||||||
update_group_policy_update(bgp, BGP_POLICY_PREFIX_LIST,
|
update_group_policy_update(bgp, BGP_POLICY_PREFIX_LIST,
|
||||||
plist ? plist->name : NULL, 0, 0);
|
plist ? prefix_list_name(plist) : NULL, 0, 0);
|
||||||
|
|
||||||
for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
|
for (ALL_LIST_ELEMENTS (bgp->peer, node, nnode, peer))
|
||||||
{
|
{
|
||||||
|
@ -32,6 +32,9 @@ pkginclude_HEADERS = \
|
|||||||
workqueue.h route_types.h libospf.h nexthop.h json.h \
|
workqueue.h route_types.h libospf.h nexthop.h json.h \
|
||||||
ptm_lib.h csv.h bfd.h vrf.h
|
ptm_lib.h csv.h bfd.h vrf.h
|
||||||
|
|
||||||
|
noinst_HEADERS = \
|
||||||
|
plist_int.h
|
||||||
|
|
||||||
EXTRA_DIST = \
|
EXTRA_DIST = \
|
||||||
regex.c regex-gnu.h \
|
regex.c regex-gnu.h \
|
||||||
queue.h \
|
queue.h \
|
||||||
|
@ -50,6 +50,7 @@ struct memory_list memory_list_lib[] =
|
|||||||
{ MTYPE_PREFIX_LIST, "Prefix List" },
|
{ MTYPE_PREFIX_LIST, "Prefix List" },
|
||||||
{ MTYPE_PREFIX_LIST_ENTRY, "Prefix List Entry" },
|
{ MTYPE_PREFIX_LIST_ENTRY, "Prefix List Entry" },
|
||||||
{ MTYPE_PREFIX_LIST_STR, "Prefix List Str" },
|
{ MTYPE_PREFIX_LIST_STR, "Prefix List Str" },
|
||||||
|
{ MTYPE_PREFIX_LIST_TRIE, "Prefix List Trie Table" },
|
||||||
{ MTYPE_ROUTE_MAP, "Route map" },
|
{ MTYPE_ROUTE_MAP, "Route map" },
|
||||||
{ MTYPE_ROUTE_MAP_NAME, "Route map name" },
|
{ MTYPE_ROUTE_MAP_NAME, "Route map name" },
|
||||||
{ MTYPE_ROUTE_MAP_INDEX, "Route map index" },
|
{ MTYPE_ROUTE_MAP_INDEX, "Route map index" },
|
||||||
|
422
lib/plist.c
422
lib/plist.c
@ -32,24 +32,26 @@
|
|||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "routemap.h"
|
#include "routemap.h"
|
||||||
|
|
||||||
/* Each prefix-list's entry. */
|
#include "plist_int.h"
|
||||||
struct prefix_list_entry
|
|
||||||
{
|
|
||||||
int seq;
|
|
||||||
|
|
||||||
int le;
|
/* not currently changeable, code assumes bytes further down */
|
||||||
int ge;
|
#define PLC_BITS 8
|
||||||
|
#define PLC_LEN (1 << PLC_BITS)
|
||||||
|
#define PLC_MAXLEVELV4 2 /* /24 for IPv4 */
|
||||||
|
#define PLC_MAXLEVELV6 4 /* /48 for IPv6 */
|
||||||
|
#define PLC_MAXLEVEL 4 /* max(v4,v6) */
|
||||||
|
|
||||||
enum prefix_list_type type;
|
struct pltrie_entry {
|
||||||
|
union {
|
||||||
|
struct pltrie_table *next_table;
|
||||||
|
struct prefix_list_entry *final_chain;
|
||||||
|
};
|
||||||
|
|
||||||
int any;
|
struct prefix_list_entry *up_chain;
|
||||||
struct prefix prefix;
|
};
|
||||||
|
|
||||||
unsigned long refcnt;
|
struct pltrie_table {
|
||||||
unsigned long hitcnt;
|
struct pltrie_entry entries[PLC_LEN];
|
||||||
|
|
||||||
struct prefix_list_entry *next;
|
|
||||||
struct prefix_list_entry *prev;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* List of struct prefix_list. */
|
/* List of struct prefix_list. */
|
||||||
@ -79,6 +81,9 @@ struct prefix_master
|
|||||||
|
|
||||||
/* Hook function which is executed when prefix_list is deleted. */
|
/* Hook function which is executed when prefix_list is deleted. */
|
||||||
void (*delete_hook) (struct prefix_list *);
|
void (*delete_hook) (struct prefix_list *);
|
||||||
|
|
||||||
|
/* number of bytes that have a trie level */
|
||||||
|
size_t trie_depth;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Static structure of IPv4 prefix_list's master. */
|
/* Static structure of IPv4 prefix_list's master. */
|
||||||
@ -89,6 +94,8 @@ static struct prefix_master prefix_master_ipv4 =
|
|||||||
1,
|
1,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
|
NULL,
|
||||||
|
PLC_MAXLEVELV4,
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef HAVE_IPV6
|
#ifdef HAVE_IPV6
|
||||||
@ -100,36 +107,53 @@ static struct prefix_master prefix_master_ipv6 =
|
|||||||
1,
|
1,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
|
NULL,
|
||||||
|
PLC_MAXLEVELV6,
|
||||||
};
|
};
|
||||||
#endif /* HAVE_IPV6*/
|
#endif /* HAVE_IPV6*/
|
||||||
|
|
||||||
/* Static structure of BGP ORF prefix_list's master. */
|
/* 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},
|
||||||
{NULL, NULL},
|
{NULL, NULL},
|
||||||
1,
|
1,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
|
NULL,
|
||||||
|
PLC_MAXLEVELV4,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Static structure of BGP ORF prefix_list's master. */
|
||||||
|
static struct prefix_master prefix_master_orf_v6 =
|
||||||
|
{
|
||||||
|
{NULL, NULL},
|
||||||
|
{NULL, NULL},
|
||||||
|
1,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
PLC_MAXLEVELV6,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct prefix_master *
|
static struct prefix_master *
|
||||||
prefix_master_get (afi_t afi)
|
prefix_master_get (afi_t afi, int orf)
|
||||||
{
|
{
|
||||||
if (afi == AFI_IP)
|
if (afi == AFI_IP)
|
||||||
return &prefix_master_ipv4;
|
return orf ? &prefix_master_orf_v4 : &prefix_master_ipv4;
|
||||||
#ifdef HAVE_IPV6
|
if (afi == AFI_IP6)
|
||||||
else if (afi == AFI_IP6)
|
return orf ? &prefix_master_orf_v6 : &prefix_master_ipv6;
|
||||||
return &prefix_master_ipv6;
|
|
||||||
#endif /* HAVE_IPV6 */
|
|
||||||
else if (afi == AFI_ORF_PREFIX)
|
|
||||||
return &prefix_master_orf;
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *prefix_list_name (struct prefix_list *plist)
|
||||||
|
{
|
||||||
|
return plist->name;
|
||||||
|
}
|
||||||
|
|
||||||
/* Lookup prefix_list from list of prefix_list by name. */
|
/* Lookup prefix_list from list of prefix_list by name. */
|
||||||
struct prefix_list *
|
static struct prefix_list *
|
||||||
prefix_list_lookup (afi_t afi, const char *name)
|
prefix_list_lookup_do (afi_t afi, int orf, const char *name)
|
||||||
{
|
{
|
||||||
struct prefix_list *plist;
|
struct prefix_list *plist;
|
||||||
struct prefix_master *master;
|
struct prefix_master *master;
|
||||||
@ -137,7 +161,7 @@ prefix_list_lookup (afi_t afi, const char *name)
|
|||||||
if (name == NULL)
|
if (name == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
master = prefix_master_get (afi);
|
master = prefix_master_get (afi, orf);
|
||||||
if (master == NULL)
|
if (master == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@ -152,6 +176,18 @@ prefix_list_lookup (afi_t afi, const char *name)
|
|||||||
return NULL;
|
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 *
|
static struct prefix_list *
|
||||||
prefix_list_new (void)
|
prefix_list_new (void)
|
||||||
{
|
{
|
||||||
@ -185,7 +221,7 @@ prefix_list_entry_free (struct prefix_list_entry *pentry)
|
|||||||
/* Insert new prefix list to list of prefix_list. Each prefix_list
|
/* Insert new prefix list to list of prefix_list. Each prefix_list
|
||||||
is sorted by the name. */
|
is sorted by the name. */
|
||||||
static struct prefix_list *
|
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;
|
unsigned int i;
|
||||||
long number;
|
long number;
|
||||||
@ -194,7 +230,7 @@ prefix_list_insert (afi_t afi, const char *name)
|
|||||||
struct prefix_list_list *list;
|
struct prefix_list_list *list;
|
||||||
struct prefix_master *master;
|
struct prefix_master *master;
|
||||||
|
|
||||||
master = prefix_master_get (afi);
|
master = prefix_master_get (afi, orf);
|
||||||
if (master == NULL)
|
if (master == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@ -202,6 +238,7 @@ prefix_list_insert (afi_t afi, const char *name)
|
|||||||
plist = prefix_list_new ();
|
plist = prefix_list_new ();
|
||||||
plist->name = XSTRDUP (MTYPE_PREFIX_LIST_STR, name);
|
plist->name = XSTRDUP (MTYPE_PREFIX_LIST_STR, name);
|
||||||
plist->master = master;
|
plist->master = master;
|
||||||
|
plist->trie = XCALLOC (MTYPE_PREFIX_LIST_TRIE, sizeof (struct pltrie_table));
|
||||||
|
|
||||||
/* If name is made by all digit character. We treat it as
|
/* If name is made by all digit character. We treat it as
|
||||||
number. */
|
number. */
|
||||||
@ -275,14 +312,14 @@ prefix_list_insert (afi_t afi, const char *name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct prefix_list *
|
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;
|
struct prefix_list *plist;
|
||||||
|
|
||||||
plist = prefix_list_lookup (afi, name);
|
plist = prefix_list_lookup_do (afi, orf, name);
|
||||||
|
|
||||||
if (plist == NULL)
|
if (plist == NULL)
|
||||||
plist = prefix_list_insert (afi, name);
|
plist = prefix_list_insert (afi, orf, name);
|
||||||
return plist;
|
return plist;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -335,6 +372,8 @@ prefix_list_delete (struct prefix_list *plist)
|
|||||||
if (plist->name)
|
if (plist->name)
|
||||||
XFREE (MTYPE_PREFIX_LIST_STR, plist->name);
|
XFREE (MTYPE_PREFIX_LIST_STR, plist->name);
|
||||||
|
|
||||||
|
XFREE (MTYPE_PREFIX_LIST_TRIE, plist->trie);
|
||||||
|
|
||||||
prefix_list_free (plist);
|
prefix_list_free (plist);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -435,11 +474,88 @@ prefix_list_entry_lookup (struct prefix_list *plist, struct prefix *prefix,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
trie_walk_affected (size_t validbits, struct pltrie_table *table, uint8_t byte,
|
||||||
|
struct prefix_list_entry *object,
|
||||||
|
void (*fn)(struct prefix_list_entry *object,
|
||||||
|
struct prefix_list_entry **updptr))
|
||||||
|
{
|
||||||
|
uint8_t mask;
|
||||||
|
uint16_t bwalk;
|
||||||
|
|
||||||
|
if (validbits > PLC_BITS)
|
||||||
|
{
|
||||||
|
fn (object, &table->entries[byte].final_chain);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mask = (1 << (8 - validbits)) - 1;
|
||||||
|
for (bwalk = byte & ~mask; bwalk <= byte + mask; bwalk++)
|
||||||
|
{
|
||||||
|
fn (object, &table->entries[bwalk].up_chain);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void trie_uninstall_fn (struct prefix_list_entry *object,
|
||||||
|
struct prefix_list_entry **updptr)
|
||||||
|
{
|
||||||
|
for (; *updptr; updptr = &(*updptr)->next_best)
|
||||||
|
if (*updptr == object)
|
||||||
|
{
|
||||||
|
*updptr = object->next_best;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
trie_table_empty (struct pltrie_table *table)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
for (i = 0; i < PLC_LEN; i++)
|
||||||
|
if (table->entries[i].next_table || table->entries[i].final_chain)
|
||||||
|
return 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
size_t validbits = pentry->prefix.prefixlen;
|
||||||
|
struct pltrie_table *table, **tables[PLC_MAXLEVEL];
|
||||||
|
|
||||||
|
table = plist->trie;
|
||||||
|
for (depth = 0; validbits > PLC_BITS && depth < maxdepth - 1; depth++)
|
||||||
|
{
|
||||||
|
uint8_t byte = bytes[depth];
|
||||||
|
assert (table->entries[byte].next_table);
|
||||||
|
|
||||||
|
tables[depth + 1] = &table->entries[byte].next_table;
|
||||||
|
table = table->entries[byte].next_table;
|
||||||
|
|
||||||
|
validbits -= PLC_BITS;
|
||||||
|
}
|
||||||
|
|
||||||
|
trie_walk_affected (validbits, table, bytes[depth], pentry, trie_uninstall_fn);
|
||||||
|
|
||||||
|
for (; depth > 0; depth--)
|
||||||
|
if (trie_table_empty (*tables[depth]))
|
||||||
|
{
|
||||||
|
XFREE (MTYPE_PREFIX_LIST_TRIE, *tables[depth]);
|
||||||
|
*tables[depth] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
prefix_list_entry_delete (struct prefix_list *plist,
|
prefix_list_entry_delete (struct prefix_list *plist,
|
||||||
struct prefix_list_entry *pentry,
|
struct prefix_list_entry *pentry,
|
||||||
int update_list)
|
int update_list)
|
||||||
{
|
{
|
||||||
|
prefix_list_trie_del (plist, pentry);
|
||||||
|
|
||||||
if (plist == NULL || pentry == NULL)
|
if (plist == NULL || pentry == NULL)
|
||||||
return;
|
return;
|
||||||
if (pentry->prev)
|
if (pentry->prev)
|
||||||
@ -468,6 +584,52 @@ prefix_list_entry_delete (struct prefix_list *plist,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void trie_install_fn (struct prefix_list_entry *object,
|
||||||
|
struct prefix_list_entry **updptr)
|
||||||
|
{
|
||||||
|
while (*updptr)
|
||||||
|
{
|
||||||
|
if (*updptr == object)
|
||||||
|
return;
|
||||||
|
if ((*updptr)->prefix.prefixlen < object->prefix.prefixlen)
|
||||||
|
break;
|
||||||
|
if ((*updptr)->seq > object->seq)
|
||||||
|
break;
|
||||||
|
updptr = &(*updptr)->next_best;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!object->next_best)
|
||||||
|
object->next_best = *updptr;
|
||||||
|
else
|
||||||
|
assert (object->next_best == *updptr || !*updptr);
|
||||||
|
|
||||||
|
*updptr = object;
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
size_t validbits = pentry->prefix.prefixlen;
|
||||||
|
struct pltrie_table *table;
|
||||||
|
|
||||||
|
table = plist->trie;
|
||||||
|
while (validbits > PLC_BITS && depth > 1)
|
||||||
|
{
|
||||||
|
if (!table->entries[*bytes].next_table)
|
||||||
|
table->entries[*bytes].next_table = XCALLOC (MTYPE_PREFIX_LIST_TRIE,
|
||||||
|
sizeof(struct pltrie_table));
|
||||||
|
table = table->entries[*bytes].next_table;
|
||||||
|
bytes++;
|
||||||
|
depth--;
|
||||||
|
validbits -= PLC_BITS;
|
||||||
|
}
|
||||||
|
|
||||||
|
trie_walk_affected (validbits, table, *bytes, pentry, trie_install_fn);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
prefix_list_entry_add (struct prefix_list *plist,
|
prefix_list_entry_add (struct prefix_list *plist,
|
||||||
struct prefix_list_entry *pentry)
|
struct prefix_list_entry *pentry)
|
||||||
@ -479,15 +641,20 @@ prefix_list_entry_add (struct prefix_list *plist,
|
|||||||
if (pentry->seq == -1)
|
if (pentry->seq == -1)
|
||||||
pentry->seq = prefix_new_seq_get (plist);
|
pentry->seq = prefix_new_seq_get (plist);
|
||||||
|
|
||||||
/* Is there any same seq prefix list entry? */
|
if (plist->tail && pentry->seq > plist->tail->seq)
|
||||||
replace = prefix_seq_check (plist, pentry->seq);
|
point = NULL;
|
||||||
if (replace)
|
else
|
||||||
prefix_list_entry_delete (plist, replace, 0);
|
{
|
||||||
|
/* Is there any same seq prefix list entry? */
|
||||||
|
replace = prefix_seq_check (plist, pentry->seq);
|
||||||
|
if (replace)
|
||||||
|
prefix_list_entry_delete (plist, replace, 0);
|
||||||
|
|
||||||
/* Check insert point. */
|
/* Check insert point. */
|
||||||
for (point = plist->head; point; point = point->next)
|
for (point = plist->head; point; point = point->next)
|
||||||
if (point->seq >= pentry->seq)
|
if (point->seq >= pentry->seq)
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* In case of this is the first element of the list. */
|
/* In case of this is the first element of the list. */
|
||||||
pentry->next = point;
|
pentry->next = point;
|
||||||
@ -513,6 +680,8 @@ prefix_list_entry_add (struct prefix_list *plist,
|
|||||||
plist->tail = pentry;
|
plist->tail = pentry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
prefix_list_trie_add (plist, pentry);
|
||||||
|
|
||||||
/* Increment count. */
|
/* Increment count. */
|
||||||
plist->count++;
|
plist->count++;
|
||||||
|
|
||||||
@ -570,10 +739,13 @@ prefix_list_entry_match (struct prefix_list_entry *pentry, struct prefix *p)
|
|||||||
enum prefix_list_type
|
enum prefix_list_type
|
||||||
prefix_list_apply (struct prefix_list *plist, void *object)
|
prefix_list_apply (struct prefix_list *plist, void *object)
|
||||||
{
|
{
|
||||||
struct prefix_list_entry *pentry;
|
struct prefix_list_entry *pentry, *pbest = NULL;
|
||||||
struct prefix *p;
|
|
||||||
|
|
||||||
p = (struct prefix *) object;
|
struct prefix *p = (struct prefix *) object;
|
||||||
|
uint8_t *byte = &p->u.prefix;
|
||||||
|
size_t depth = plist->master->trie_depth;
|
||||||
|
size_t validbits = p->prefixlen;
|
||||||
|
struct pltrie_table *table;
|
||||||
|
|
||||||
if (plist == NULL)
|
if (plist == NULL)
|
||||||
return PREFIX_DENY;
|
return PREFIX_DENY;
|
||||||
@ -581,17 +753,45 @@ prefix_list_apply (struct prefix_list *plist, void *object)
|
|||||||
if (plist->count == 0)
|
if (plist->count == 0)
|
||||||
return PREFIX_PERMIT;
|
return PREFIX_PERMIT;
|
||||||
|
|
||||||
for (pentry = plist->head; pentry; pentry = pentry->next)
|
table = plist->trie;
|
||||||
|
while (1)
|
||||||
{
|
{
|
||||||
pentry->refcnt++;
|
for (pentry = table->entries[*byte].up_chain; pentry; pentry = pentry->next_best)
|
||||||
if (prefix_list_entry_match (pentry, p))
|
{
|
||||||
{
|
if (pbest && pbest->seq < pentry->seq)
|
||||||
pentry->hitcnt++;
|
continue;
|
||||||
return pentry->type;
|
if (prefix_list_entry_match (pentry, p))
|
||||||
}
|
pbest = pentry;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (validbits <= PLC_BITS)
|
||||||
|
break;
|
||||||
|
validbits -= PLC_BITS;
|
||||||
|
|
||||||
|
if (--depth)
|
||||||
|
{
|
||||||
|
if (!table->entries[*byte].next_table)
|
||||||
|
break;
|
||||||
|
|
||||||
|
table = table->entries[*byte].next_table;
|
||||||
|
byte++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (pentry = table->entries[*byte].final_chain; pentry; pentry = pentry->next_best)
|
||||||
|
{
|
||||||
|
if (pbest && pbest->seq < pentry->seq)
|
||||||
|
continue;
|
||||||
|
if (prefix_list_entry_match (pentry, p))
|
||||||
|
pbest = pentry;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return PREFIX_DENY;
|
if (pbest == NULL)
|
||||||
|
return PREFIX_DENY;
|
||||||
|
|
||||||
|
return pbest->type;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __attribute__ ((unused))
|
static void __attribute__ ((unused))
|
||||||
@ -634,6 +834,10 @@ static struct prefix_list_entry *
|
|||||||
prefix_entry_dup_check (struct prefix_list *plist,
|
prefix_entry_dup_check (struct prefix_list *plist,
|
||||||
struct prefix_list_entry *new)
|
struct prefix_list_entry *new)
|
||||||
{
|
{
|
||||||
|
size_t depth, maxdepth = plist->master->trie_depth;
|
||||||
|
uint8_t byte, *bytes = &new->prefix.u.prefix;
|
||||||
|
size_t validbits = new->prefix.prefixlen;
|
||||||
|
struct pltrie_table *table;
|
||||||
struct prefix_list_entry *pentry;
|
struct prefix_list_entry *pentry;
|
||||||
int seq = 0;
|
int seq = 0;
|
||||||
|
|
||||||
@ -642,7 +846,24 @@ prefix_entry_dup_check (struct prefix_list *plist,
|
|||||||
else
|
else
|
||||||
seq = new->seq;
|
seq = new->seq;
|
||||||
|
|
||||||
for (pentry = plist->head; pentry; pentry = pentry->next)
|
table = plist->trie;
|
||||||
|
for (depth = 0; validbits > PLC_BITS && depth < maxdepth - 1; depth++)
|
||||||
|
{
|
||||||
|
byte = bytes[depth];
|
||||||
|
if (!table->entries[byte].next_table)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
table = table->entries[byte].next_table;
|
||||||
|
validbits -= PLC_BITS;
|
||||||
|
}
|
||||||
|
|
||||||
|
byte = bytes[depth];
|
||||||
|
if (validbits > PLC_BITS)
|
||||||
|
pentry = table->entries[byte].final_chain;
|
||||||
|
else
|
||||||
|
pentry = table->entries[byte].up_chain;
|
||||||
|
|
||||||
|
for (; pentry; pentry = pentry->next_best)
|
||||||
{
|
{
|
||||||
if (prefix_same (&pentry->prefix, &new->prefix)
|
if (prefix_same (&pentry->prefix, &new->prefix)
|
||||||
&& pentry->type == new->type
|
&& pentry->type == new->type
|
||||||
@ -753,7 +974,7 @@ vty_prefix_list_install (struct vty *vty, afi_t afi, const char *name,
|
|||||||
lenum = 0;
|
lenum = 0;
|
||||||
|
|
||||||
/* Get prefix_list with name. */
|
/* Get prefix_list with name. */
|
||||||
plist = prefix_list_get (afi, name);
|
plist = prefix_list_get (afi, 0, name);
|
||||||
|
|
||||||
/* Make prefix entry. */
|
/* Make prefix entry. */
|
||||||
pentry = prefix_list_entry_make (&p, type, seqnum, lenum, genum, any);
|
pentry = prefix_list_entry_make (&p, type, seqnum, lenum, genum, any);
|
||||||
@ -1008,7 +1229,7 @@ vty_show_prefix_list (struct vty *vty, afi_t afi, const char *name,
|
|||||||
struct prefix_master *master;
|
struct prefix_master *master;
|
||||||
int seqnum = 0;
|
int seqnum = 0;
|
||||||
|
|
||||||
master = prefix_master_get (afi);
|
master = prefix_master_get (afi, 0);
|
||||||
if (master == NULL)
|
if (master == NULL)
|
||||||
return CMD_WARNING;
|
return CMD_WARNING;
|
||||||
|
|
||||||
@ -1126,7 +1347,7 @@ vty_clear_prefix_list (struct vty *vty, afi_t afi, const char *name,
|
|||||||
int ret;
|
int ret;
|
||||||
struct prefix p;
|
struct prefix p;
|
||||||
|
|
||||||
master = prefix_master_get (afi);
|
master = prefix_master_get (afi, 0);
|
||||||
if (master == NULL)
|
if (master == NULL)
|
||||||
return CMD_WARNING;
|
return CMD_WARNING;
|
||||||
|
|
||||||
@ -1581,7 +1802,7 @@ DEFUN (ip_prefix_list_description,
|
|||||||
{
|
{
|
||||||
struct prefix_list *plist;
|
struct prefix_list *plist;
|
||||||
|
|
||||||
plist = prefix_list_get (AFI_IP, argv[0]);
|
plist = prefix_list_get (AFI_IP, 0, argv[0]);
|
||||||
|
|
||||||
if (plist->desc)
|
if (plist->desc)
|
||||||
{
|
{
|
||||||
@ -2177,7 +2398,7 @@ DEFUN (ipv6_prefix_list_description,
|
|||||||
{
|
{
|
||||||
struct prefix_list *plist;
|
struct prefix_list *plist;
|
||||||
|
|
||||||
plist = prefix_list_get (AFI_IP6, argv[0]);
|
plist = prefix_list_get (AFI_IP6, 0, argv[0]);
|
||||||
|
|
||||||
if (plist->desc)
|
if (plist->desc)
|
||||||
{
|
{
|
||||||
@ -2372,7 +2593,7 @@ config_write_prefix_afi (afi_t afi, struct vty *vty)
|
|||||||
struct prefix_master *master;
|
struct prefix_master *master;
|
||||||
int write = 0;
|
int write = 0;
|
||||||
|
|
||||||
master = prefix_master_get (afi);
|
master = prefix_master_get (afi, 0);
|
||||||
if (master == NULL)
|
if (master == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -2515,7 +2736,7 @@ prefix_bgp_orf_set (char *name, afi_t afi, struct orf_prefix *orfp,
|
|||||||
if (orfp->ge && orfp->le == (afi == AFI_IP ? 32 : 128))
|
if (orfp->ge && orfp->le == (afi == AFI_IP ? 32 : 128))
|
||||||
orfp->le = 0;
|
orfp->le = 0;
|
||||||
|
|
||||||
plist = prefix_list_get (AFI_ORF_PREFIX, name);
|
plist = prefix_list_get (afi, 1, name);
|
||||||
if (! plist)
|
if (! plist)
|
||||||
return CMD_WARNING;
|
return CMD_WARNING;
|
||||||
|
|
||||||
@ -2549,11 +2770,11 @@ prefix_bgp_orf_set (char *name, afi_t afi, struct orf_prefix *orfp,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
prefix_bgp_orf_remove_all (char *name)
|
prefix_bgp_orf_remove_all (afi_t afi, char *name)
|
||||||
{
|
{
|
||||||
struct prefix_list *plist;
|
struct prefix_list *plist;
|
||||||
|
|
||||||
plist = prefix_list_lookup (AFI_ORF_PREFIX, name);
|
plist = prefix_bgp_orf_lookup (afi, name);
|
||||||
if (plist)
|
if (plist)
|
||||||
prefix_list_delete (plist);
|
prefix_list_delete (plist);
|
||||||
}
|
}
|
||||||
@ -2568,7 +2789,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_prefix = NULL;
|
||||||
json_object *json_list = NULL;
|
json_object *json_list = NULL;
|
||||||
|
|
||||||
plist = prefix_list_lookup (AFI_ORF_PREFIX, name);
|
plist = prefix_bgp_orf_lookup (afi, name);
|
||||||
if (! plist)
|
if (! plist)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -2639,13 +2860,13 @@ prefix_bgp_show_prefix_list (struct vty *vty, afi_t afi, char *name, u_char use_
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
prefix_list_reset_orf (void)
|
prefix_list_reset_afi (afi_t afi, int orf)
|
||||||
{
|
{
|
||||||
struct prefix_list *plist;
|
struct prefix_list *plist;
|
||||||
struct prefix_list *next;
|
struct prefix_list *next;
|
||||||
struct prefix_master *master;
|
struct prefix_master *master;
|
||||||
|
|
||||||
master = prefix_master_get (AFI_ORF_PREFIX);
|
master = prefix_master_get (afi, orf);
|
||||||
if (master == NULL)
|
if (master == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -2685,38 +2906,6 @@ config_write_prefix_ipv4 (struct vty *vty)
|
|||||||
return config_write_prefix_afi (AFI_IP, 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
|
static void
|
||||||
prefix_list_init_ipv4 (void)
|
prefix_list_init_ipv4 (void)
|
||||||
{
|
{
|
||||||
@ -2794,38 +2983,6 @@ config_write_prefix_ipv6 (struct vty *vty)
|
|||||||
return config_write_prefix_afi (AFI_IP6, 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
|
static void
|
||||||
prefix_list_init_ipv6 (void)
|
prefix_list_init_ipv6 (void)
|
||||||
{
|
{
|
||||||
@ -2901,9 +3058,8 @@ prefix_list_init ()
|
|||||||
void
|
void
|
||||||
prefix_list_reset ()
|
prefix_list_reset ()
|
||||||
{
|
{
|
||||||
prefix_list_reset_ipv4 ();
|
prefix_list_reset_afi (AFI_IP, 0);
|
||||||
#ifdef HAVE_IPV6
|
prefix_list_reset_afi (AFI_IP6, 0);
|
||||||
prefix_list_reset_ipv6 ();
|
prefix_list_reset_afi (AFI_IP, 1);
|
||||||
#endif /* HAVE_IPV6 */
|
prefix_list_reset_afi (AFI_IP6, 1);
|
||||||
prefix_list_reset_orf ();
|
|
||||||
}
|
}
|
||||||
|
31
lib/plist.h
31
lib/plist.h
@ -23,38 +23,13 @@
|
|||||||
#ifndef _QUAGGA_PLIST_H
|
#ifndef _QUAGGA_PLIST_H
|
||||||
#define _QUAGGA_PLIST_H
|
#define _QUAGGA_PLIST_H
|
||||||
|
|
||||||
#define AFI_ORF_PREFIX 65535
|
|
||||||
|
|
||||||
enum prefix_list_type
|
enum prefix_list_type
|
||||||
{
|
{
|
||||||
PREFIX_DENY,
|
PREFIX_DENY,
|
||||||
PREFIX_PERMIT,
|
PREFIX_PERMIT,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum prefix_name_type
|
struct prefix_list;
|
||||||
{
|
|
||||||
PREFIX_TYPE_STRING,
|
|
||||||
PREFIX_TYPE_NUMBER
|
|
||||||
};
|
|
||||||
|
|
||||||
struct prefix_list
|
|
||||||
{
|
|
||||||
char *name;
|
|
||||||
char *desc;
|
|
||||||
|
|
||||||
struct prefix_master *master;
|
|
||||||
|
|
||||||
enum prefix_name_type type;
|
|
||||||
|
|
||||||
int count;
|
|
||||||
int rangecount;
|
|
||||||
|
|
||||||
struct prefix_list_entry *head;
|
|
||||||
struct prefix_list_entry *tail;
|
|
||||||
|
|
||||||
struct prefix_list *next;
|
|
||||||
struct prefix_list *prev;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct orf_prefix
|
struct orf_prefix
|
||||||
{
|
{
|
||||||
@ -70,14 +45,16 @@ extern void prefix_list_reset (void);
|
|||||||
extern void prefix_list_add_hook (void (*func) (struct prefix_list *));
|
extern void prefix_list_add_hook (void (*func) (struct prefix_list *));
|
||||||
extern void prefix_list_delete_hook (void (*func) (struct prefix_list *));
|
extern void prefix_list_delete_hook (void (*func) (struct prefix_list *));
|
||||||
|
|
||||||
|
extern const char *prefix_list_name (struct prefix_list *);
|
||||||
extern struct prefix_list *prefix_list_lookup (afi_t, const char *);
|
extern struct prefix_list *prefix_list_lookup (afi_t, const char *);
|
||||||
extern enum prefix_list_type prefix_list_apply (struct prefix_list *, void *);
|
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 *,
|
extern struct stream * prefix_bgp_orf_entry (struct stream *,
|
||||||
struct prefix_list *,
|
struct prefix_list *,
|
||||||
u_char, u_char, u_char);
|
u_char, u_char, u_char);
|
||||||
extern int prefix_bgp_orf_set (char *, afi_t, struct orf_prefix *, int, int);
|
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);
|
extern int prefix_bgp_show_prefix_list (struct vty *, afi_t, char *, u_char);
|
||||||
|
|
||||||
#endif /* _QUAGGA_PLIST_H */
|
#endif /* _QUAGGA_PLIST_H */
|
||||||
|
78
lib/plist_int.h
Normal file
78
lib/plist_int.h
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
* Prefix list internal definitions.
|
||||||
|
* Copyright (C) 1999 Kunihiro Ishiguro
|
||||||
|
*
|
||||||
|
* This file is part of GNU Zebra.
|
||||||
|
*
|
||||||
|
* GNU Zebra is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published
|
||||||
|
* by the Free Software Foundation; either version 2, or (at your
|
||||||
|
* option) any later version.
|
||||||
|
*
|
||||||
|
* GNU Zebra is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GNU Zebra; see the file COPYING. If not, write to the
|
||||||
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
* Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _QUAGGA_PLIST_INT_H
|
||||||
|
#define _QUAGGA_PLIST_INT_H
|
||||||
|
|
||||||
|
enum prefix_name_type
|
||||||
|
{
|
||||||
|
PREFIX_TYPE_STRING,
|
||||||
|
PREFIX_TYPE_NUMBER
|
||||||
|
};
|
||||||
|
|
||||||
|
struct pltrie_table;
|
||||||
|
|
||||||
|
struct prefix_list
|
||||||
|
{
|
||||||
|
char *name;
|
||||||
|
char *desc;
|
||||||
|
|
||||||
|
struct prefix_master *master;
|
||||||
|
|
||||||
|
enum prefix_name_type type;
|
||||||
|
|
||||||
|
int count;
|
||||||
|
int rangecount;
|
||||||
|
|
||||||
|
struct prefix_list_entry *head;
|
||||||
|
struct prefix_list_entry *tail;
|
||||||
|
|
||||||
|
struct pltrie_table *trie;
|
||||||
|
|
||||||
|
struct prefix_list *next;
|
||||||
|
struct prefix_list *prev;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Each prefix-list's entry. */
|
||||||
|
struct prefix_list_entry
|
||||||
|
{
|
||||||
|
int seq;
|
||||||
|
|
||||||
|
int le;
|
||||||
|
int ge;
|
||||||
|
|
||||||
|
enum prefix_list_type type;
|
||||||
|
|
||||||
|
int any;
|
||||||
|
struct prefix prefix;
|
||||||
|
|
||||||
|
unsigned long refcnt;
|
||||||
|
unsigned long hitcnt;
|
||||||
|
|
||||||
|
struct prefix_list_entry *next;
|
||||||
|
struct prefix_list_entry *prev;
|
||||||
|
|
||||||
|
/* up the chain for best match search */
|
||||||
|
struct prefix_list_entry *next_best;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* _QUAGGA_PLIST_INT_H */
|
@ -158,6 +158,8 @@ extern struct ospf6_lsa_handler unknown_handler;
|
|||||||
#define OSPF6_LSA_IS_KNOWN(type) \
|
#define OSPF6_LSA_IS_KNOWN(type) \
|
||||||
(ospf6_get_lsa_handler (type) != &unknown_handler ? 1 : 0)
|
(ospf6_get_lsa_handler (type) != &unknown_handler ? 1 : 0)
|
||||||
|
|
||||||
|
extern vector ospf6_lsa_handler_vector;
|
||||||
|
|
||||||
/* Macro for LSA Origination */
|
/* Macro for LSA Origination */
|
||||||
/* addr is (struct prefix *) */
|
/* addr is (struct prefix *) */
|
||||||
#define CONTINUE_IF_ADDRESS_LINKLOCAL(debug,addr) \
|
#define CONTINUE_IF_ADDRESS_LINKLOCAL(debug,addr) \
|
||||||
|
@ -40,6 +40,11 @@
|
|||||||
#include "ospf6_flood.h"
|
#include "ospf6_flood.h"
|
||||||
#include "ospf6d.h"
|
#include "ospf6d.h"
|
||||||
#include "ospf6_bfd.h"
|
#include "ospf6_bfd.h"
|
||||||
|
#include "ospf6_abr.h"
|
||||||
|
#include "ospf6_asbr.h"
|
||||||
|
#include "ospf6_lsa.h"
|
||||||
|
#include "ospf6_spf.h"
|
||||||
|
#include "ospf6_zebra.h"
|
||||||
|
|
||||||
unsigned char conf_debug_ospf6_neighbor = 0;
|
unsigned char conf_debug_ospf6_neighbor = 0;
|
||||||
|
|
||||||
@ -987,6 +992,50 @@ ALIAS (no_debug_ospf6_neighbor,
|
|||||||
"Debug OSPFv3 Neighbor Event\n"
|
"Debug OSPFv3 Neighbor Event\n"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
DEFUN (no_debug_ospf6,
|
||||||
|
no_debug_ospf6_cmd,
|
||||||
|
"no debug ospf6",
|
||||||
|
NO_STR
|
||||||
|
DEBUG_STR
|
||||||
|
OSPF6_STR)
|
||||||
|
{
|
||||||
|
u_int i;
|
||||||
|
struct ospf6_lsa_handler *handler = NULL;
|
||||||
|
|
||||||
|
OSPF6_DEBUG_ABR_OFF ();
|
||||||
|
OSPF6_DEBUG_ASBR_OFF ();
|
||||||
|
OSPF6_DEBUG_BROUTER_OFF ();
|
||||||
|
OSPF6_DEBUG_BROUTER_SPECIFIC_ROUTER_OFF ();
|
||||||
|
OSPF6_DEBUG_BROUTER_SPECIFIC_AREA_OFF ();
|
||||||
|
OSPF6_DEBUG_FLOODING_OFF ();
|
||||||
|
OSPF6_DEBUG_INTERFACE_OFF ();
|
||||||
|
|
||||||
|
for (i = 0; i < vector_active (ospf6_lsa_handler_vector); i++)
|
||||||
|
{
|
||||||
|
handler = vector_slot (ospf6_lsa_handler_vector, i);
|
||||||
|
|
||||||
|
if (handler != NULL)
|
||||||
|
{
|
||||||
|
UNSET_FLAG (handler->debug, OSPF6_LSA_DEBUG);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < 6; i++)
|
||||||
|
OSPF6_DEBUG_MESSAGE_OFF (i, OSPF6_DEBUG_NEIGHBOR_STATE | OSPF6_DEBUG_NEIGHBOR_EVENT);
|
||||||
|
|
||||||
|
OSPF6_DEBUG_NEIGHBOR_OFF (OSPF6_DEBUG_NEIGHBOR_STATE | OSPF6_DEBUG_NEIGHBOR_EVENT);
|
||||||
|
OSPF6_DEBUG_ROUTE_OFF (OSPF6_DEBUG_ROUTE_TABLE);
|
||||||
|
OSPF6_DEBUG_ROUTE_OFF (OSPF6_DEBUG_ROUTE_INTRA);
|
||||||
|
OSPF6_DEBUG_ROUTE_OFF (OSPF6_DEBUG_ROUTE_INTER);
|
||||||
|
OSPF6_DEBUG_ROUTE_OFF (OSPF6_DEBUG_ROUTE_MEMORY);
|
||||||
|
OSPF6_DEBUG_SPF_OFF (OSPF6_DEBUG_SPF_PROCESS);
|
||||||
|
OSPF6_DEBUG_SPF_OFF (OSPF6_DEBUG_SPF_TIME);
|
||||||
|
OSPF6_DEBUG_SPF_OFF (OSPF6_DEBUG_SPF_DATABASE);
|
||||||
|
OSPF6_DEBUG_ZEBRA_OFF (OSPF6_DEBUG_ZEBRA_SEND | OSPF6_DEBUG_ZEBRA_RECV);
|
||||||
|
|
||||||
|
return CMD_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
config_write_ospf6_debug_neighbor (struct vty *vty)
|
config_write_ospf6_debug_neighbor (struct vty *vty)
|
||||||
{
|
{
|
||||||
@ -1007,10 +1056,12 @@ install_element_ospf6_debug_neighbor (void)
|
|||||||
install_element (ENABLE_NODE, &debug_ospf6_neighbor_detail_cmd);
|
install_element (ENABLE_NODE, &debug_ospf6_neighbor_detail_cmd);
|
||||||
install_element (ENABLE_NODE, &no_debug_ospf6_neighbor_cmd);
|
install_element (ENABLE_NODE, &no_debug_ospf6_neighbor_cmd);
|
||||||
install_element (ENABLE_NODE, &no_debug_ospf6_neighbor_detail_cmd);
|
install_element (ENABLE_NODE, &no_debug_ospf6_neighbor_detail_cmd);
|
||||||
|
install_element (ENABLE_NODE, &no_debug_ospf6_cmd);
|
||||||
install_element (CONFIG_NODE, &debug_ospf6_neighbor_cmd);
|
install_element (CONFIG_NODE, &debug_ospf6_neighbor_cmd);
|
||||||
install_element (CONFIG_NODE, &debug_ospf6_neighbor_detail_cmd);
|
install_element (CONFIG_NODE, &debug_ospf6_neighbor_detail_cmd);
|
||||||
install_element (CONFIG_NODE, &no_debug_ospf6_neighbor_cmd);
|
install_element (CONFIG_NODE, &no_debug_ospf6_neighbor_cmd);
|
||||||
install_element (CONFIG_NODE, &no_debug_ospf6_neighbor_detail_cmd);
|
install_element (CONFIG_NODE, &no_debug_ospf6_neighbor_detail_cmd);
|
||||||
|
install_element (CONFIG_NODE, &no_debug_ospf6_cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -155,6 +155,9 @@ ospf6_create (void)
|
|||||||
|
|
||||||
o->ref_bandwidth = OSPF6_REFERENCE_BANDWIDTH;
|
o->ref_bandwidth = OSPF6_REFERENCE_BANDWIDTH;
|
||||||
|
|
||||||
|
/* Enable "log-adjacency-changes" */
|
||||||
|
SET_FLAG(o->config_flags, OSPF6_LOG_ADJACENCY_CHANGES);
|
||||||
|
|
||||||
return o;
|
return o;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -349,13 +352,14 @@ DEFUN (ospf6_log_adjacency_changes,
|
|||||||
struct ospf6 *ospf6 = vty->index;
|
struct ospf6 *ospf6 = vty->index;
|
||||||
|
|
||||||
SET_FLAG(ospf6->config_flags, OSPF6_LOG_ADJACENCY_CHANGES);
|
SET_FLAG(ospf6->config_flags, OSPF6_LOG_ADJACENCY_CHANGES);
|
||||||
|
UNSET_FLAG(ospf6->config_flags, OSPF6_LOG_ADJACENCY_DETAIL);
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFUN (ospf6_log_adjacency_changes_detail,
|
DEFUN (ospf6_log_adjacency_changes_detail,
|
||||||
ospf6_log_adjacency_changes_detail_cmd,
|
ospf6_log_adjacency_changes_detail_cmd,
|
||||||
"log-adjacency-changes detail",
|
"log-adjacency-changes detail",
|
||||||
"Log changes in adjacency state\n"
|
"Log changes in adjacency state\n"
|
||||||
"Log all state changes\n")
|
"Log all state changes\n")
|
||||||
{
|
{
|
||||||
struct ospf6 *ospf6 = vty->index;
|
struct ospf6 *ospf6 = vty->index;
|
||||||
@ -368,7 +372,7 @@ DEFUN (ospf6_log_adjacency_changes_detail,
|
|||||||
DEFUN (no_ospf6_log_adjacency_changes,
|
DEFUN (no_ospf6_log_adjacency_changes,
|
||||||
no_ospf6_log_adjacency_changes_cmd,
|
no_ospf6_log_adjacency_changes_cmd,
|
||||||
"no log-adjacency-changes",
|
"no log-adjacency-changes",
|
||||||
NO_STR
|
NO_STR
|
||||||
"Log changes in adjacency state\n")
|
"Log changes in adjacency state\n")
|
||||||
{
|
{
|
||||||
struct ospf6 *ospf6 = vty->index;
|
struct ospf6 *ospf6 = vty->index;
|
||||||
@ -381,13 +385,14 @@ DEFUN (no_ospf6_log_adjacency_changes,
|
|||||||
DEFUN (no_ospf6_log_adjacency_changes_detail,
|
DEFUN (no_ospf6_log_adjacency_changes_detail,
|
||||||
no_ospf6_log_adjacency_changes_detail_cmd,
|
no_ospf6_log_adjacency_changes_detail_cmd,
|
||||||
"no log-adjacency-changes detail",
|
"no log-adjacency-changes detail",
|
||||||
NO_STR
|
NO_STR
|
||||||
"Log changes in adjacency state\n"
|
"Log changes in adjacency state\n"
|
||||||
"Log all state changes\n")
|
"Log all state changes\n")
|
||||||
{
|
{
|
||||||
struct ospf6 *ospf6 = vty->index;
|
struct ospf6 *ospf6 = vty->index;
|
||||||
|
|
||||||
UNSET_FLAG(ospf6->config_flags, OSPF6_LOG_ADJACENCY_DETAIL);
|
UNSET_FLAG(ospf6->config_flags, OSPF6_LOG_ADJACENCY_DETAIL);
|
||||||
|
UNSET_FLAG(ospf6->config_flags, OSPF6_LOG_ADJACENCY_CHANGES);
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -949,10 +954,12 @@ config_write_ospf6 (struct vty *vty)
|
|||||||
/* log-adjacency-changes flag print. */
|
/* log-adjacency-changes flag print. */
|
||||||
if (CHECK_FLAG(ospf6->config_flags, OSPF6_LOG_ADJACENCY_CHANGES))
|
if (CHECK_FLAG(ospf6->config_flags, OSPF6_LOG_ADJACENCY_CHANGES))
|
||||||
{
|
{
|
||||||
vty_out(vty, " log-adjacency-changes");
|
|
||||||
if (CHECK_FLAG(ospf6->config_flags, OSPF6_LOG_ADJACENCY_DETAIL))
|
if (CHECK_FLAG(ospf6->config_flags, OSPF6_LOG_ADJACENCY_DETAIL))
|
||||||
vty_out(vty, " detail");
|
vty_out(vty, " log-adjacency-changes detail%s", VTY_NEWLINE);
|
||||||
vty_out(vty, "%s", VTY_NEWLINE);
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vty_out(vty, " no log-adjacency-changes%s", VTY_NEWLINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ospf6->ref_bandwidth != OSPF6_REFERENCE_BANDWIDTH)
|
if (ospf6->ref_bandwidth != OSPF6_REFERENCE_BANDWIDTH)
|
||||||
|
@ -1922,6 +1922,64 @@ DEFUN (no_debug_ospf_instance_nssa,
|
|||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEFUN (no_debug_ospf,
|
||||||
|
no_debug_ospf_cmd,
|
||||||
|
"no debug ospf",
|
||||||
|
NO_STR
|
||||||
|
DEBUG_STR
|
||||||
|
OSPF_STR)
|
||||||
|
{
|
||||||
|
int flag = OSPF_DEBUG_SEND | OSPF_DEBUG_RECV | OSPF_DEBUG_DETAIL;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (vty->node == CONFIG_NODE)
|
||||||
|
{
|
||||||
|
CONF_DEBUG_OFF (event, EVENT);
|
||||||
|
CONF_DEBUG_OFF (nssa, NSSA);
|
||||||
|
DEBUG_OFF (ism, ISM_EVENTS);
|
||||||
|
DEBUG_OFF (ism, ISM_STATUS);
|
||||||
|
DEBUG_OFF (ism, ISM_TIMERS);
|
||||||
|
DEBUG_OFF (lsa, LSA);
|
||||||
|
DEBUG_OFF (lsa, LSA_FLOODING);
|
||||||
|
DEBUG_OFF (lsa, LSA_GENERATE);
|
||||||
|
DEBUG_OFF (lsa, LSA_INSTALL);
|
||||||
|
DEBUG_OFF (lsa, LSA_REFRESH);
|
||||||
|
DEBUG_OFF (nsm, NSM);
|
||||||
|
DEBUG_OFF (nsm, NSM_EVENTS);
|
||||||
|
DEBUG_OFF (nsm, NSM_STATUS);
|
||||||
|
DEBUG_OFF (nsm, NSM_TIMERS);
|
||||||
|
DEBUG_OFF (zebra, ZEBRA);
|
||||||
|
DEBUG_OFF (zebra, ZEBRA_INTERFACE);
|
||||||
|
DEBUG_OFF (zebra, ZEBRA_REDISTRIBUTE);
|
||||||
|
|
||||||
|
for (i = 0; i < 5; i++)
|
||||||
|
DEBUG_PACKET_OFF (i, flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < 5; i++)
|
||||||
|
TERM_DEBUG_PACKET_OFF (i, flag);
|
||||||
|
|
||||||
|
TERM_DEBUG_OFF (event, EVENT);
|
||||||
|
TERM_DEBUG_OFF (ism, ISM);
|
||||||
|
TERM_DEBUG_OFF (ism, ISM_EVENTS);
|
||||||
|
TERM_DEBUG_OFF (ism, ISM_STATUS);
|
||||||
|
TERM_DEBUG_OFF (ism, ISM_TIMERS);
|
||||||
|
TERM_DEBUG_OFF (lsa, LSA);
|
||||||
|
TERM_DEBUG_OFF (lsa, LSA_FLOODING);
|
||||||
|
TERM_DEBUG_OFF (lsa, LSA_GENERATE);
|
||||||
|
TERM_DEBUG_OFF (lsa, LSA_INSTALL);
|
||||||
|
TERM_DEBUG_OFF (lsa, LSA_REFRESH);
|
||||||
|
TERM_DEBUG_OFF (nsm, NSM);
|
||||||
|
TERM_DEBUG_OFF (nsm, NSM_EVENTS);
|
||||||
|
TERM_DEBUG_OFF (nsm, NSM_STATUS);
|
||||||
|
TERM_DEBUG_OFF (nsm, NSM_TIMERS);
|
||||||
|
TERM_DEBUG_OFF (nssa, NSSA);
|
||||||
|
TERM_DEBUG_OFF (zebra, ZEBRA);
|
||||||
|
TERM_DEBUG_OFF (zebra, ZEBRA_INTERFACE);
|
||||||
|
TERM_DEBUG_OFF (zebra, ZEBRA_REDISTRIBUTE);
|
||||||
|
|
||||||
|
return CMD_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
show_debugging_ospf_common (struct vty *vty, struct ospf *ospf)
|
show_debugging_ospf_common (struct vty *vty, struct ospf *ospf)
|
||||||
@ -2254,6 +2312,7 @@ debug_init ()
|
|||||||
install_element (ENABLE_NODE, &no_debug_ospf_instance_zebra_cmd);
|
install_element (ENABLE_NODE, &no_debug_ospf_instance_zebra_cmd);
|
||||||
install_element (ENABLE_NODE, &no_debug_ospf_instance_event_cmd);
|
install_element (ENABLE_NODE, &no_debug_ospf_instance_event_cmd);
|
||||||
install_element (ENABLE_NODE, &no_debug_ospf_instance_nssa_cmd);
|
install_element (ENABLE_NODE, &no_debug_ospf_instance_nssa_cmd);
|
||||||
|
install_element (ENABLE_NODE, &no_debug_ospf_cmd);
|
||||||
|
|
||||||
install_element (CONFIG_NODE, &debug_ospf_packet_send_recv_detail_cmd);
|
install_element (CONFIG_NODE, &debug_ospf_packet_send_recv_detail_cmd);
|
||||||
install_element (CONFIG_NODE, &debug_ospf_packet_send_recv_cmd);
|
install_element (CONFIG_NODE, &debug_ospf_packet_send_recv_cmd);
|
||||||
@ -2308,4 +2367,5 @@ debug_init ()
|
|||||||
install_element (CONFIG_NODE, &no_debug_ospf_instance_zebra_cmd);
|
install_element (CONFIG_NODE, &no_debug_ospf_instance_zebra_cmd);
|
||||||
install_element (CONFIG_NODE, &no_debug_ospf_instance_event_cmd);
|
install_element (CONFIG_NODE, &no_debug_ospf_instance_event_cmd);
|
||||||
install_element (CONFIG_NODE, &no_debug_ospf_instance_nssa_cmd);
|
install_element (CONFIG_NODE, &no_debug_ospf_instance_nssa_cmd);
|
||||||
|
install_element (CONFIG_NODE, &no_debug_ospf_cmd);
|
||||||
}
|
}
|
||||||
|
@ -2310,6 +2310,7 @@ DEFUN (ospf_log_adjacency_changes,
|
|||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
|
|
||||||
SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
|
SET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
|
||||||
|
UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2357,6 +2358,7 @@ DEFUN (no_ospf_log_adjacency_changes_detail,
|
|||||||
if (!ospf)
|
if (!ospf)
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
|
|
||||||
|
UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES);
|
||||||
UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
|
UNSET_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL);
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -9515,11 +9517,13 @@ ospf_config_write (struct vty *vty)
|
|||||||
/* log-adjacency-changes flag print. */
|
/* log-adjacency-changes flag print. */
|
||||||
if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES))
|
if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_CHANGES))
|
||||||
{
|
{
|
||||||
vty_out(vty, " log-adjacency-changes");
|
|
||||||
if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL))
|
if (CHECK_FLAG(ospf->config, OSPF_LOG_ADJACENCY_DETAIL))
|
||||||
vty_out(vty, " detail");
|
vty_out(vty, " log-adjacency-changes detail%s", VTY_NEWLINE);
|
||||||
vty_out(vty, "%s", VTY_NEWLINE);
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vty_out(vty, " no log-adjacency-changes%s", VTY_NEWLINE);
|
||||||
|
}
|
||||||
|
|
||||||
/* RFC1583 compatibility flag print -- Compatible with CISCO 12.1. */
|
/* RFC1583 compatibility flag print -- Compatible with CISCO 12.1. */
|
||||||
if (CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
|
if (CHECK_FLAG (ospf->config, OSPF_RFC1583_COMPATIBLE))
|
||||||
|
@ -1399,7 +1399,7 @@ ospf_prefix_list_update (struct prefix_list *plist)
|
|||||||
{
|
{
|
||||||
/* Update filter-list in. */
|
/* Update filter-list in. */
|
||||||
if (PREFIX_NAME_IN (area))
|
if (PREFIX_NAME_IN (area))
|
||||||
if (strcmp (PREFIX_NAME_IN (area), plist->name) == 0)
|
if (strcmp (PREFIX_NAME_IN (area), prefix_list_name (plist)) == 0)
|
||||||
{
|
{
|
||||||
PREFIX_LIST_IN (area) =
|
PREFIX_LIST_IN (area) =
|
||||||
prefix_list_lookup (AFI_IP, PREFIX_NAME_IN (area));
|
prefix_list_lookup (AFI_IP, PREFIX_NAME_IN (area));
|
||||||
@ -1408,7 +1408,7 @@ ospf_prefix_list_update (struct prefix_list *plist)
|
|||||||
|
|
||||||
/* Update filter-list out. */
|
/* Update filter-list out. */
|
||||||
if (PREFIX_NAME_OUT (area))
|
if (PREFIX_NAME_OUT (area))
|
||||||
if (strcmp (PREFIX_NAME_OUT (area), plist->name) == 0)
|
if (strcmp (PREFIX_NAME_OUT (area), prefix_list_name (plist)) == 0)
|
||||||
{
|
{
|
||||||
PREFIX_LIST_IN (area) =
|
PREFIX_LIST_IN (area) =
|
||||||
prefix_list_lookup (AFI_IP, PREFIX_NAME_OUT (area));
|
prefix_list_lookup (AFI_IP, PREFIX_NAME_OUT (area));
|
||||||
|
@ -287,6 +287,8 @@ ospf_new (u_short instance)
|
|||||||
new->oi_write_q = list_new ();
|
new->oi_write_q = list_new ();
|
||||||
new->write_oi_count = OSPF_WRITE_INTERFACE_COUNT_DEFAULT;
|
new->write_oi_count = OSPF_WRITE_INTERFACE_COUNT_DEFAULT;
|
||||||
|
|
||||||
|
/* Enable "log-adjacency-changes" */
|
||||||
|
SET_FLAG(new->config, OSPF_LOG_ADJACENCY_CHANGES);
|
||||||
return new;
|
return new;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,6 +39,7 @@ $ignore{'"router ospf"'} = "ignore";
|
|||||||
$ignore{'"router ospf <1-65535>"'} = "ignore";
|
$ignore{'"router ospf <1-65535>"'} = "ignore";
|
||||||
$ignore{'"router ospf6"'} = "ignore";
|
$ignore{'"router ospf6"'} = "ignore";
|
||||||
$ignore{'"router babel"'} = "ignore";
|
$ignore{'"router babel"'} = "ignore";
|
||||||
|
$ignore{'"router bgp"'} = "ignore";
|
||||||
$ignore{'"router bgp " "<1-4294967295>"'} = "ignore";
|
$ignore{'"router bgp " "<1-4294967295>"'} = "ignore";
|
||||||
$ignore{'"router bgp " "<1-4294967295>" " view WORD"'} = "ignore";
|
$ignore{'"router bgp " "<1-4294967295>" " view WORD"'} = "ignore";
|
||||||
$ignore{'"router isis WORD"'} = "ignore";
|
$ignore{'"router isis WORD"'} = "ignore";
|
||||||
|
@ -1041,6 +1041,13 @@ DEFUNSH (VTYSH_BGPD,
|
|||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ALIAS_SH (VTYSH_BGPD,
|
||||||
|
router_bgp,
|
||||||
|
router_bgp_asn_cmd,
|
||||||
|
"router bgp",
|
||||||
|
ROUTER_STR
|
||||||
|
BGP_STR)
|
||||||
|
|
||||||
ALIAS_SH (VTYSH_BGPD,
|
ALIAS_SH (VTYSH_BGPD,
|
||||||
router_bgp,
|
router_bgp,
|
||||||
router_bgp_view_cmd,
|
router_bgp_view_cmd,
|
||||||
@ -2817,6 +2824,7 @@ vtysh_init_vty (void)
|
|||||||
install_element (CONFIG_NODE, &router_babel_cmd);
|
install_element (CONFIG_NODE, &router_babel_cmd);
|
||||||
install_element (CONFIG_NODE, &router_isis_cmd);
|
install_element (CONFIG_NODE, &router_isis_cmd);
|
||||||
install_element (CONFIG_NODE, &router_bgp_cmd);
|
install_element (CONFIG_NODE, &router_bgp_cmd);
|
||||||
|
install_element (CONFIG_NODE, &router_bgp_asn_cmd);
|
||||||
install_element (CONFIG_NODE, &router_bgp_view_cmd);
|
install_element (CONFIG_NODE, &router_bgp_view_cmd);
|
||||||
install_element (BGP_NODE, &address_family_vpnv4_cmd);
|
install_element (BGP_NODE, &address_family_vpnv4_cmd);
|
||||||
install_element (BGP_NODE, &address_family_vpnv4_unicast_cmd);
|
install_element (BGP_NODE, &address_family_vpnv4_unicast_cmd);
|
||||||
|
Loading…
Reference in New Issue
Block a user