Merge pull request #5851 from volta-networks/feat_ldp_oc_review

ldpd: adding support for LDP ordered label distribution control
This commit is contained in:
Renato Westphal 2020-03-23 10:55:20 -03:00 committed by GitHub
commit 1a3ff5236c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
78 changed files with 3643 additions and 13 deletions

View File

@ -108,6 +108,11 @@ LDP Configuration
The following command located under MPLS router node configures the MPLS
router-id of the local device.
.. index:: [no] ordered-control
.. clicmd:: [no] ordered-control
Configure LDP Ordered Label Distribution Control.
.. index:: [no] address-family [ipv4 | ipv6]
.. clicmd:: [no] address-family [ipv4 | ipv6]

View File

@ -61,6 +61,8 @@ static void lde_label_list_init(void);
static int lde_get_label_chunk(void);
static void on_get_label_chunk_response(uint32_t start, uint32_t end);
static uint32_t lde_get_next_label(void);
static bool lde_fec_connected(const struct fec_node *);
static bool lde_fec_outside_mpls_network(const struct fec_node *);
RB_GENERATE(nbr_tree, lde_nbr, entry, lde_nbr_compare)
RB_GENERATE(lde_map_head, lde_map, entry, lde_map_compare)
@ -658,18 +660,31 @@ lde_acl_check(char *acl_name, int af, union ldpd_addr *addr, uint8_t prefixlen)
return ldp_acl_request(iev_main_sync, acl_name, af, addr, prefixlen);
}
static bool lde_fec_connected(const struct fec_node *fn)
{
struct fec_nh *fnh;
LIST_FOREACH(fnh, &fn->nexthops, entry)
if (fnh->flags & F_FEC_NH_CONNECTED)
return true;
return false;
}
static bool lde_fec_outside_mpls_network(const struct fec_node *fn)
{
struct fec_nh *fnh;
LIST_FOREACH(fnh, &fn->nexthops, entry)
if (!(fnh->flags & F_FEC_NH_NO_LDP))
return false;
return true;
}
uint32_t
lde_update_label(struct fec_node *fn)
{
struct fec_nh *fnh;
int connected = 0;
LIST_FOREACH(fnh, &fn->nexthops, entry) {
if (fnh->flags & F_FEC_NH_CONNECTED) {
connected = 1;
break;
}
}
/* should we allocate a label for this fec? */
switch (fn->fec.type) {
@ -695,7 +710,14 @@ lde_update_label(struct fec_node *fn)
break;
}
if (connected) {
/*
* If connected interface act as egress for fec.
* If LDP is not configured on an interface but there
* are other NHs with interfaces configured with LDP
* then don't act as an egress for the fec, otherwise
* act as an egress for the fec
*/
if (lde_fec_connected(fn) || lde_fec_outside_mpls_network(fn)) {
/* choose implicit or explicit-null depending on configuration */
switch (fn->fec.type) {
case FEC_TYPE_IPV4:
@ -735,6 +757,13 @@ lde_send_change_klabel(struct fec_node *fn, struct fec_nh *fnh)
struct zapi_pw zpw;
struct l2vpn_pw *pw;
/*
* Ordered Control: don't program label into HW until a
* labelmap msg has been received from upstream router
*/
if (fnh->flags & F_FEC_NH_DEFER)
return;
switch (fn->fec.type) {
case FEC_TYPE_IPV4:
memset(&kr, 0, sizeof(kr));
@ -901,6 +930,27 @@ lde_send_labelmapping(struct lde_nbr *ln, struct fec_node *fn, int single)
struct lde_req *lre;
struct map map;
struct l2vpn_pw *pw;
struct fec_nh *fnh;
bool allow = false;
/*
* Ordered Control: do not send a labelmap msg until
* a labelmap message is received from downstream router
* and don't send labelmap back to downstream router
*/
if (ldeconf->flags & F_LDPD_ORDERED_CONTROL) {
LIST_FOREACH(fnh, &fn->nexthops, entry) {
if (fnh->flags & F_FEC_NH_DEFER)
continue;
if (lde_address_find(ln, fnh->af, &fnh->nexthop))
return;
allow = true;
break;
}
if (!allow)
return;
}
/*
* We shouldn't send a new label mapping if we have a pending
@ -1241,6 +1291,7 @@ lde_nbr_del(struct lde_nbr *ln)
struct fec_node *fn;
struct fec_nh *fnh;
struct l2vpn_pw *pw;
struct lde_nbr *lnbr;
if (ln == NULL)
return;
@ -1256,6 +1307,25 @@ lde_nbr_del(struct lde_nbr *ln)
if (!lde_address_find(ln, fnh->af,
&fnh->nexthop))
continue;
/*
* Ordered Control: must mark any non-connected
* NH to wait until we receive a labelmap msg
* before installing in kernel and sending to
* peer, must do this as NHs are not removed
* when lsps go down. Also send label withdraw
* to other neighbors for all fecs from neighbor
* going down
*/
if (ldeconf->flags & F_LDPD_ORDERED_CONTROL) {
fnh->flags |= F_FEC_NH_DEFER;
RB_FOREACH(lnbr, nbr_tree, &lde_nbrs) {
if (ln->peerid == lnbr->peerid)
continue;
lde_send_labelwithdraw(lnbr, fn, NULL, NULL);
}
}
break;
case FEC_TYPE_PWID:
if (f->u.pwid.lsr_id.s_addr != ln->id.s_addr)

View File

@ -114,6 +114,8 @@ struct fec_nh {
};
#define F_FEC_NH_NEW 0x01
#define F_FEC_NH_CONNECTED 0x02
#define F_FEC_NH_DEFER 0x04 /* running ordered control */
#define F_FEC_NH_NO_LDP 0x08 /* no ldp on this interface */
struct fec_node {
struct fec fec;

View File

@ -20,6 +20,7 @@
#include <zebra.h>
#include "ldpd.h"
#include "ldpe.h"
#include "lde.h"
#include "log.h"
@ -325,6 +326,7 @@ lde_kernel_insert(struct fec *fec, int af, union ldpd_addr *nexthop,
{
struct fec_node *fn;
struct fec_nh *fnh;
struct iface *iface;
fn = (struct fec_node *)fec_find(&ft, fec);
if (fn == NULL)
@ -333,9 +335,21 @@ lde_kernel_insert(struct fec *fec, int af, union ldpd_addr *nexthop,
fn->data = data;
fnh = fec_nh_find(fn, af, nexthop, ifindex, route_type, route_instance);
if (fnh == NULL)
if (fnh == NULL) {
fnh = fec_nh_add(fn, af, nexthop, ifindex, route_type,
route_instance);
/*
* Ordered Control: if not a connected route and not a route
* learned over an interface not running LDP and not a PW
* then mark to wait until we receive labelmap msg before
* installing in kernel and sending to peer
*/
iface = if_lookup(ldeconf, ifindex);
if ((ldeconf->flags & F_LDPD_ORDERED_CONTROL) &&
!connected && iface != NULL && fec->type != FEC_TYPE_PWID)
fnh->flags |= F_FEC_NH_DEFER;
}
fnh->flags |= F_FEC_NH_NEW;
if (connected)
fnh->flags |= F_FEC_NH_CONNECTED;
@ -374,15 +388,25 @@ lde_kernel_update(struct fec *fec)
struct fec_nh *fnh, *safe;
struct lde_nbr *ln;
struct lde_map *me;
struct iface *iface;
fn = (struct fec_node *)fec_find(&ft, fec);
if (fn == NULL)
return;
LIST_FOREACH_SAFE(fnh, &fn->nexthops, entry, safe) {
if (fnh->flags & F_FEC_NH_NEW)
if (fnh->flags & F_FEC_NH_NEW) {
fnh->flags &= ~F_FEC_NH_NEW;
else {
/*
* if LDP configured on interface or a static route
* clear flag else treat fec as a connected route
*/
iface = if_lookup(ldeconf,fnh->ifindex);
if (iface || fnh->route_type == ZEBRA_ROUTE_STATIC)
fnh->flags &=~F_FEC_NH_NO_LDP;
else
fnh->flags |= F_FEC_NH_NO_LDP;
} else {
lde_send_delete_klabel(fn, fnh);
fec_nh_del(fnh);
}
@ -445,6 +469,7 @@ lde_check_mapping(struct map *map, struct lde_nbr *ln)
struct lde_req *lre;
struct lde_map *me;
struct l2vpn_pw *pw;
bool send_map = false;
lde_map2fec(map, ln->id, &fec);
@ -525,6 +550,15 @@ lde_check_mapping(struct map *map, struct lde_nbr *ln)
if (!lde_address_find(ln, fnh->af, &fnh->nexthop))
continue;
/*
* Ordered Control: labelmap msg received from
* NH so clear flag and send labelmap msg to
* peer
*/
if (ldeconf->flags & F_LDPD_ORDERED_CONTROL) {
send_map = true;
fnh->flags &= ~F_FEC_NH_DEFER;
}
fnh->remote_label = map->label;
lde_send_change_klabel(fn, fnh);
break;
@ -558,6 +592,15 @@ lde_check_mapping(struct map *map, struct lde_nbr *ln)
* loop detection. LMp.28 - LMp.30 are unnecessary because we are
* merging capable.
*/
/*
* Ordered Control: just received a labelmap for this fec from NH so
* need to send labelmap to all peers
* LMp.20 - LMp21 Execute procedure to send Label Mapping
*/
if (send_map && fn->local_label != NO_LABEL)
RB_FOREACH(ln, nbr_tree, &lde_nbrs)
lde_send_labelmapping(ln, fn, 1);
}
void
@ -757,6 +800,7 @@ lde_check_withdraw(struct map *map, struct lde_nbr *ln)
struct fec_nh *fnh;
struct lde_map *me;
struct l2vpn_pw *pw;
struct lde_nbr *lnbr;
/* wildcard label withdraw */
if (map->type == MAP_TYPE_WILDCARD ||
@ -803,6 +847,26 @@ lde_check_withdraw(struct map *map, struct lde_nbr *ln)
if (me && (map->label == NO_LABEL || map->label == me->map.label))
/* LWd.4: remove record of previously received lbl mapping */
lde_map_del(ln, me, 0);
/* Ordered Control: additional withdraw steps */
if (ldeconf->flags & F_LDPD_ORDERED_CONTROL) {
/* LWd.8: for each neighbor other that src of withdraw msg */
RB_FOREACH(lnbr, nbr_tree, &lde_nbrs) {
if (ln->peerid == lnbr->peerid)
continue;
/* LWd.9: check if previously sent a label mapping */
me = (struct lde_map *)fec_find(&lnbr->sent_map,
&fn->fec);
/*
* LWd.10: does label sent to peer "map" to withdraw
* label
*/
if (me)
/* LWd.11: send label withdraw */
lde_send_labelwithdraw(lnbr, fn, NULL, NULL);
}
}
}
void
@ -813,6 +877,7 @@ lde_check_withdraw_wcard(struct map *map, struct lde_nbr *ln)
struct fec_nh *fnh;
struct lde_map *me;
struct l2vpn_pw *pw;
struct lde_nbr *lnbr;
/* LWd.2: send label release */
lde_send_labelrelease(ln, NULL, map, map->label);
@ -859,6 +924,26 @@ lde_check_withdraw_wcard(struct map *map, struct lde_nbr *ln)
* label mapping
*/
lde_map_del(ln, me, 0);
/* Ordered Control: additional withdraw steps */
if (ldeconf->flags & F_LDPD_ORDERED_CONTROL) {
/* LWd.8: for each neighbor other that src of withdraw msg */
RB_FOREACH(lnbr, nbr_tree, &lde_nbrs) {
if (ln->peerid == lnbr->peerid)
continue;
/* LWd.9: check if previously sent a label mapping */
me = (struct lde_map *)fec_find(&lnbr->sent_map,
&fn->fec);
/*
* LWd.10: does label sent to peer "map" to withdraw
* label
*/
if (me)
/* LWd.11: send label withdraw */
lde_send_labelwithdraw(lnbr, fn, NULL, NULL);
}
}
}
}

View File

@ -52,6 +52,7 @@ int ldp_vty_label_expnull(struct vty *, const char *, const char *);
int ldp_vty_label_accept(struct vty *, const char *, const char *, const char *);
int ldp_vty_ttl_security(struct vty *, const char *);
int ldp_vty_router_id(struct vty *, const char *, struct in_addr);
int ldp_vty_ordered_control(struct vty *, const char *);
int ldp_vty_ds_cisco_interop(struct vty *, const char *);
int ldp_vty_trans_pref_ipv4(struct vty *, const char *);
int ldp_vty_neighbor_password(struct vty *, const char *, struct in_addr, const char *);

View File

@ -221,6 +221,15 @@ DEFPY (ldp_router_id,
return (ldp_vty_router_id(vty, no, address));
}
DEFPY (ldp_ordered_control,
ldp_ordered_control_cmd,
"[no] ordered-control",
NO_STR
"Configure LDP ordered label distribution control mode\n")
{
return (ldp_vty_ordered_control(vty, no));
}
DEFPY (ldp_discovery_targeted_hello_accept,
ldp_discovery_targeted_hello_accept_cmd,
"[no] discovery targeted-hello accept [from <(1-199)|(1300-2699)|WORD>$from_acl]",
@ -807,6 +816,7 @@ ldp_vty_init (void)
install_element(LDP_NODE, &ldp_neighbor_session_holdtime_cmd);
install_element(LDP_NODE, &ldp_neighbor_ttl_security_cmd);
install_element(LDP_NODE, &ldp_router_id_cmd);
install_element(LDP_NODE, &ldp_ordered_control_cmd);
install_element(LDP_IPV4_NODE, &ldp_discovery_link_holdtime_cmd);
install_element(LDP_IPV4_NODE, &ldp_discovery_targeted_holdtime_cmd);

View File

@ -278,6 +278,9 @@ ldp_config_write(struct vty *vty)
if (ldpd_conf->flags & F_LDPD_DS_CISCO_INTEROP)
vty_out (vty, " dual-stack cisco-interop\n");
if (ldpd_conf->flags & F_LDPD_ORDERED_CONTROL)
vty_out (vty, " ordered-control\n");
RB_FOREACH(nbrp, nbrp_head, &ldpd_conf->nbrp_tree) {
if (nbrp->flags & F_NBRP_KEEPALIVE)
vty_out (vty, " neighbor %s session holdtime %u\n",
@ -996,6 +999,19 @@ ldp_vty_router_id(struct vty *vty, const char *negate, struct in_addr address)
return (CMD_SUCCESS);
}
int
ldp_vty_ordered_control(struct vty *vty, const char *negate)
{
if (negate)
vty_conf->flags &= ~F_LDPD_ORDERED_CONTROL;
else
vty_conf->flags |= F_LDPD_ORDERED_CONTROL;
ldp_config_apply(vty, vty_conf);
return (CMD_SUCCESS);
}
int
ldp_vty_ds_cisco_interop(struct vty *vty, const char * negate)
{

View File

@ -1285,6 +1285,14 @@ merge_global(struct ldpd_conf *conf, struct ldpd_conf *xconf)
conf->rtr_id = xconf->rtr_id;
}
/*
* Configuration of ordered-control or independent-control
* requires resetting all neighborships.
*/
if ((conf->flags & F_LDPD_ORDERED_CONTROL) !=
(xconf->flags & F_LDPD_ORDERED_CONTROL))
ldpe_reset_nbrs(AF_UNSPEC);
conf->lhello_holdtime = xconf->lhello_holdtime;
conf->lhello_interval = xconf->lhello_interval;
conf->thello_holdtime = xconf->thello_holdtime;

View File

@ -511,6 +511,8 @@ DECLARE_QOBJ_TYPE(ldpd_conf)
#define F_LDPD_NO_FIB_UPDATE 0x0001
#define F_LDPD_DS_CISCO_INTEROP 0x0002
#define F_LDPD_ENABLED 0x0004
#define F_LDPD_ORDERED_CONTROL 0x0008
struct ldpd_af_global {
struct thread *disc_ev;

View File

@ -0,0 +1,25 @@
hostname r1
log file ldpd.log
!
debug mpls ldp zebra
debug mpls ldp event
debug mpls ldp errors
debug mpls ldp messages recv
debug mpls ldp messages sent
debug mpls ldp discovery hello recv
debug mpls ldp discovery hello sent
!
mpls ldp
router-id 1.1.1.1
ordered-control
!
address-family ipv4
discovery transport-address 1.1.1.1
label local allocate host-routes
!
interface r1-eth0
!
!
!
line vty
!

View File

@ -0,0 +1,7 @@
hostname r1
log file ospfd.log
!
router ospf
router-id 1.1.1.1
network 0.0.0.0/0 area 0
!

View File

@ -0,0 +1,12 @@
{
"neighbors":{
"2.2.2.2":[
{
"priority":1,
"state":"Full\/DR",
"address":"10.0.1.2",
"ifaceName":"r1-eth0:10.0.1.1"
}
]
}
}

View File

@ -0,0 +1,171 @@
{
"1.1.1.1/32":[
{
"prefix":"1.1.1.1/32",
"protocol":"ospf",
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":1,
"interfaceName":"lo",
"active":true
}
]
},
{
"prefix":"1.1.1.1/32",
"protocol":"connected",
"selected":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":1,
"interfaceName":"lo",
"active":true
}
]
}
],
"2.2.2.2/32":[
{
"prefix":"2.2.2.2/32",
"protocol":"ospf",
"selected":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.1.2",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r1-eth0",
"active":true
}
]
}
],
"3.3.3.3/32":[
{
"prefix":"3.3.3.3/32",
"protocol":"ospf",
"selected":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.1.2",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r1-eth0",
"active":true
}
]
}
],
"4.4.4.4/32":[
{
"prefix":"4.4.4.4/32",
"protocol":"ospf",
"selected":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.1.2",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r1-eth0",
"active":true
}
]
}
],
"10.0.1.0/24":[
{
"prefix":"10.0.1.0/24",
"protocol":"ospf",
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":2,
"interfaceName":"r1-eth0",
"active":true
}
]
},
{
"prefix":"10.0.1.0/24",
"protocol":"connected",
"selected":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":2,
"interfaceName":"r1-eth0",
"active":true
}
]
}
],
"10.0.2.0/24":[
{
"prefix":"10.0.2.0/24",
"protocol":"ospf",
"selected":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.1.2",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r1-eth0",
"active":true
}
]
}
],
"10.0.3.0/24":[
{
"prefix":"10.0.3.0/24",
"protocol":"ospf",
"selected":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.1.2",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r1-eth0",
"active":true
}
]
}
],
"123.0.1.0/24":[
{
"prefix":"123.0.1.0/24",
"protocol":"ospf",
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":2,
"interfaceName":"r1-eth0",
"active":true
}
]
},
{
"prefix":"123.0.1.0/24",
"protocol":"connected",
"selected":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":2,
"interfaceName":"r1-eth0",
"active":true
}
]
}
]
}

View File

@ -0,0 +1,55 @@
{
"bindings":[
{
"addressFamily":"ipv4",
"prefix":"1.1.1.1/32",
"neighborId":"0.0.0.0",
"localLabel":"imp-null",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"2.2.2.2/32",
"neighborId":"2.2.2.2",
"remoteLabel":"imp-null",
"inUse":1
},
{
"addressFamily":"ipv4",
"prefix":"3.3.3.3/32",
"neighborId":"2.2.2.2",
"inUse":1
},
{
"addressFamily":"ipv4",
"prefix":"4.4.4.4/32",
"neighborId":"0.0.0.0",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"10.0.1.0/24",
"neighborId":"2.2.2.2",
"localLabel":"-",
"remoteLabel":"imp-null",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"10.0.2.0/24",
"neighborId":"2.2.2.2",
"localLabel":"-",
"remoteLabel":"imp-null",
"inUse":1
},
{
"addressFamily":"ipv4",
"prefix":"10.0.3.0/24",
"neighborId":"2.2.2.2",
"localLabel":"-",
"inUse":1
}
]
}

View File

@ -0,0 +1,11 @@
{
"adjacencies":[
{
"addressFamily":"ipv4",
"neighborId":"2.2.2.2",
"type":"link",
"interface":"r1-eth0",
"helloHoldtime":15
}
]
}

View File

@ -0,0 +1,10 @@
{
"neighbors":[
{
"addressFamily":"ipv4",
"neighborId":"2.2.2.2",
"state":"OPERATIONAL",
"transportAddress":"2.2.2.2"
}
]
}

View File

@ -0,0 +1,17 @@
log file zebra.log
!
hostname r1
!
interface lo
ip address 1.1.1.1/32
!
interface r1-eth0
description to sw0
ip address 10.0.1.1/24
ip address 123.0.1.1/24
!
ip forwarding
!
!
line vty
!

View File

@ -0,0 +1,28 @@
hostname r2
log file ldpd.log
!
debug mpls ldp zebra
debug mpls ldp event
debug mpls ldp errors
debug mpls ldp messages recv
debug mpls ldp messages sent
debug mpls ldp discovery hello recv
debug mpls ldp discovery hello sent
!
mpls ldp
router-id 2.2.2.2
ordered-control
!
address-family ipv4
discovery transport-address 2.2.2.2
!
interface r2-eth0
!
interface r2-eth1
!
interface r2-eth2
!
!
!
line vty
!

View File

@ -0,0 +1,7 @@
hostname r2
log file ospfd.log
!
router ospf
router-id 2.2.2.2
network 0.0.0.0/0 area 0
!

View File

@ -0,0 +1,31 @@
{
"neighbors":{
"1.1.1.1":[
{
"priority":1,
"state":"Full\/Backup",
"address":"10.0.1.1",
"ifaceName":"r2-eth0:10.0.1.2",
"retransmitCounter":0,
"requestCounter":0,
"dbSummaryCounter":0
}
],
"3.3.3.3":[
{
"priority":1,
"state":"Full\/Backup",
"address":"10.0.2.3",
"ifaceName":"r2-eth1:10.0.2.2"
}
],
"4.4.4.4":[
{
"priority":1,
"state":"Full\/DR",
"address":"10.0.2.4",
"ifaceName":"r2-eth1:10.0.2.2"
}
]
}
}

View File

@ -0,0 +1,209 @@
{
"1.1.1.1/32":[
{
"prefix":"1.1.1.1/32",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":10,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.1.1",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r2-eth0",
"active":true
}
]
}
],
"2.2.2.2/32":[
{
"prefix":"2.2.2.2/32",
"protocol":"ospf",
"distance":110,
"metric":0,
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":1,
"interfaceName":"lo",
"active":true
}
]
},
{
"prefix":"2.2.2.2/32",
"protocol":"connected",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":1,
"interfaceName":"lo",
"active":true
}
]
}
],
"3.3.3.3/32":[
{
"prefix":"3.3.3.3/32",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":10,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.3",
"afi":"ipv4",
"interfaceIndex":3,
"interfaceName":"r2-eth1",
"active":true
}
]
}
],
"4.4.4.4/32":[
{
"prefix":"4.4.4.4/32",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":10,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.4",
"afi":"ipv4",
"interfaceIndex":3,
"interfaceName":"r2-eth1",
"active":true
}
]
}
],
"10.0.1.0\/24":[
{
"prefix":"10.0.1.0\/24",
"protocol":"ospf",
"distance":110,
"metric":10,
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":2,
"interfaceName":"r2-eth0",
"active":true
}
]
},
{
"prefix":"10.0.1.0\/24",
"protocol":"connected",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":2,
"interfaceName":"r2-eth0",
"active":true
}
]
}
],
"10.0.2.0\/24":[
{
"prefix":"10.0.2.0\/24",
"protocol":"ospf",
"distance":110,
"metric":10,
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":3,
"interfaceName":"r2-eth1",
"active":true
}
]
},
{
"prefix":"10.0.2.0\/24",
"protocol":"connected",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":3,
"interfaceName":"r2-eth1",
"active":true
}
]
}
],
"10.0.3.0\/24":[
{
"prefix":"10.0.3.0\/24",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":20,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.3",
"afi":"ipv4",
"interfaceIndex":3,
"interfaceName":"r2-eth1",
"active":true
}
]
}
],
"123.0.1.0\/24":[
{
"prefix":"123.0.1.0\/24",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":20,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.1.1",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r2-eth0",
"active":true
}
]
}
]
}

View File

@ -0,0 +1,63 @@
{
"bindings":[
{
"addressFamily":"ipv4",
"prefix":"1.1.1.1/32",
"neighborId":"1.1.1.1",
"remoteLabel":"imp-null",
"inUse":1
},
{
"addressFamily":"ipv4",
"prefix":"2.2.2.2/32",
"neighborId":"0.0.0.0",
"localLabel":"imp-null",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"3.3.3.3/32",
"neighborId":"3.3.3.3",
"remoteLabel":"imp-null",
"inUse":1
},
{
"addressFamily":"ipv4",
"prefix":"4.4.4.4/32",
"neighborId":"0.0.0.0",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"10.0.1.0/24",
"neighborId":"0.0.0.0",
"localLabel":"imp-null",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"10.0.2.0/24",
"neighborId":"3.3.3.3",
"localLabel":"imp-null",
"remoteLabel":"imp-null",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"10.0.3.0/24",
"neighborId":"3.3.3.3",
"remoteLabel":"imp-null",
"inUse":1
},
{
"addressFamily":"ipv4",
"prefix":"123.0.1.0/24",
"neighborId":"0.0.0.0",
"remoteLabel":"-",
"inUse":0
}
]
}

View File

@ -0,0 +1,18 @@
{
"adjacencies":[
{
"addressFamily":"ipv4",
"neighborId":"1.1.1.1",
"type":"link",
"interface":"r2-eth0",
"helloHoldtime":15
},
{
"addressFamily":"ipv4",
"neighborId":"3.3.3.3",
"type":"link",
"interface":"r2-eth1",
"helloHoldtime":15
}
]
}

View File

@ -0,0 +1,16 @@
{
"neighbors":[
{
"addressFamily":"ipv4",
"neighborId":"1.1.1.1",
"state":"OPERATIONAL",
"transportAddress":"1.1.1.1"
},
{
"addressFamily":"ipv4",
"neighborId":"3.3.3.3",
"state":"OPERATIONAL",
"transportAddress":"3.3.3.3"
}
]
}

View File

@ -0,0 +1,27 @@
log file zebra.log
!
hostname r2
!
interface lo
ip address 2.2.2.2/32
!
interface r2-eth0
description to sw0
ip address 10.0.1.2/24
! no link-detect
!
interface r2-eth1
description to sw1
ip address 10.0.2.2/24
! no link-detect
!
interface r2-eths2
description to sw2
ip address 10.0.3.2/24
! no link-detect
!
ip forwarding
!
!
line vty
!

View File

@ -0,0 +1,24 @@
hostname r3
log file ldpd.log
!
debug mpls ldp zebra
debug mpls ldp event
debug mpls ldp errors
debug mpls ldp messages recv
debug mpls ldp messages sent
debug mpls ldp discovery hello recv
debug mpls ldp discovery hello sent
!
mpls ldp
router-id 3.3.3.3
ordered-control
!
address-family ipv4
discovery transport-address 3.3.3.3
!
interface r3-eth0
!
!
!
line vty
!

View File

@ -0,0 +1,8 @@
hostname r3
password 1
log file ospfd.log
!
router ospf
router-id 3.3.3.3
network 0.0.0.0/0 area 0
!

View File

@ -0,0 +1,20 @@
{
"neighbors":{
"2.2.2.2":[
{
"priority":1,
"state":"Full\/DROther",
"address":"10.0.2.2",
"ifaceName":"r3-eth0:10.0.2.3"
}
],
"4.4.4.4":[
{
"priority":1,
"state":"Full\/DR",
"address":"10.0.2.4",
"ifaceName":"r3-eth0:10.0.2.3"
}
]
}
}

View File

@ -0,0 +1,209 @@
{
"1.1.1.1/32":[
{
"prefix":"1.1.1.1/32",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":20,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.2",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r3-eth0",
"active":true
}
]
}
],
"2.2.2.2/32":[
{
"prefix":"2.2.2.2/32",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":10,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.2",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r3-eth0",
"active":true
}
]
}
],
"3.3.3.3/32":[
{
"prefix":"3.3.3.3/32",
"protocol":"ospf",
"distance":110,
"metric":0,
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":1,
"interfaceName":"lo",
"active":true
}
]
},
{
"prefix":"3.3.3.3/32",
"protocol":"connected",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":1,
"interfaceName":"lo",
"active":true
}
]
}
],
"4.4.4.4/32":[
{
"prefix":"4.4.4.4/32",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":10,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.4",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r3-eth0",
"active":true
}
]
}
],
"10.0.1.0\/24":[
{
"prefix":"10.0.1.0\/24",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":20,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.2",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r3-eth0",
"active":true
}
]
}
],
"10.0.2.0\/24":[
{
"prefix":"10.0.2.0\/24",
"protocol":"ospf",
"distance":110,
"metric":10,
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":2,
"interfaceName":"r3-eth0",
"active":true
}
]
},
{
"prefix":"10.0.2.0\/24",
"protocol":"connected",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":2,
"interfaceName":"r3-eth0",
"active":true
}
]
}
],
"10.0.3.0\/24":[
{
"prefix":"10.0.3.0\/24",
"protocol":"ospf",
"distance":110,
"metric":10,
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":3,
"interfaceName":"r3-eth1",
"active":true
}
]
},
{
"prefix":"10.0.3.0\/24",
"protocol":"connected",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":3,
"interfaceName":"r3-eth1",
"active":true
}
]
}
],
"123.0.1.0\/24":[
{
"prefix":"123.0.1.0\/24",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":30,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.2",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r3-eth0",
"active":true
}
]
}
]
}

View File

@ -0,0 +1,62 @@
{
"bindings":[
{
"addressFamily":"ipv4",
"prefix":"1.1.1.1/32",
"neighborId":"2.2.2.2",
"inUse":1
},
{
"addressFamily":"ipv4",
"prefix":"2.2.2.2/32",
"neighborId":"2.2.2.2",
"remoteLabel":"imp-null",
"inUse":1
},
{
"addressFamily":"ipv4",
"prefix":"3.3.3.3/32",
"neighborId":"0.0.0.0",
"localLabel":"imp-null",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"4.4.4.4/32",
"neighborId":"0.0.0.0",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"10.0.1.0/24",
"neighborId":"2.2.2.2",
"remoteLabel":"imp-null",
"inUse":1
},
{
"addressFamily":"ipv4",
"prefix":"10.0.2.0/24",
"neighborId":"2.2.2.2",
"localLabel":"imp-null",
"remoteLabel":"imp-null",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"10.0.3.0/24",
"neighborId":"0.0.0.0",
"localLabel":"imp-null",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"123.0.1.0/24",
"neighborId":"0.0.0.0",
"remoteLabel":"-",
"inUse":0
}
]
}

View File

@ -0,0 +1,11 @@
{
"adjacencies":[
{
"addressFamily":"ipv4",
"neighborId":"2.2.2.2",
"type":"link",
"interface":"r3-eth0",
"helloHoldtime":15
}
]
}

View File

@ -0,0 +1,10 @@
{
"neighbors":[
{
"addressFamily":"ipv4",
"neighborId":"2.2.2.2",
"state":"OPERATIONAL",
"transportAddress":"2.2.2.2"
}
]
}

View File

@ -0,0 +1,22 @@
log file zebra.log
!
hostname r3
!
interface lo
ip address 3.3.3.3/32
!
interface r3-eth0
description to sw1
ip address 10.0.2.3/24
! no link-detect
!
interface r3-eth1
description to sw2
ip address 10.0.3.3/24
! no link-detect
!
ip forwarding
!
!
line vty
!

View File

@ -0,0 +1,24 @@
hostname r4
log file ldpd.log
!
debug mpls ldp zebra
debug mpls ldp event
debug mpls ldp errors
debug mpls ldp messages recv
debug mpls ldp messages sent
debug mpls ldp discovery hello recv
debug mpls ldp discovery hello sent
!
mpls ldp
router-id 4.4.4.4
ordered-control
!
address-family ipv4
discovery transport-address 4.4.4.4
!
!interface r4-eth0
!
!
!
line vty
!

View File

@ -0,0 +1,7 @@
hostname r4
log file ospfd.log
!
router ospf
router-id 4.4.4.4
network 0.0.0.0/0 area 0
!

View File

@ -0,0 +1,21 @@
{
"neighbors":{
"2.2.2.2":[
{
"priority":1,
"state":"Full\/DROther",
"address":"10.0.2.2",
"ifaceName":"r4-eth0:10.0.2.4"
}
],
"3.3.3.3":[
{
"priority":1,
"state":"Full\/Backup",
"address":"10.0.2.3",
"ifaceName":"r4-eth0:10.0.2.4"
}
]
}
}

View File

@ -0,0 +1,196 @@
{
"1.1.1.1/32":[
{
"prefix":"1.1.1.1/32",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":20,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.2",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r4-eth0",
"active":true
}
]
}
],
"2.2.2.2/32":[
{
"prefix":"2.2.2.2/32",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":10,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.2",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r4-eth0",
"active":true
}
]
}
],
"3.3.3.3/32":[
{
"prefix":"3.3.3.3/32",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":10,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.3",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r4-eth0",
"active":true
}
]
}
],
"4.4.4.4/32":[
{
"prefix":"4.4.4.4/32",
"protocol":"ospf",
"distance":110,
"metric":0,
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":1,
"interfaceName":"lo",
"active":true
}
]
},
{
"prefix":"4.4.4.4/32",
"protocol":"connected",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":1,
"interfaceName":"lo",
"active":true
}
]
}
],
"10.0.1.0\/24":[
{
"prefix":"10.0.1.0\/24",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":20,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.2",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r4-eth0",
"active":true
}
]
}
],
"10.0.2.0\/24":[
{
"prefix":"10.0.2.0\/24",
"protocol":"ospf",
"distance":110,
"metric":10,
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":2,
"interfaceName":"r4-eth0",
"active":true
}
]
},
{
"prefix":"10.0.2.0\/24",
"protocol":"connected",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":2,
"interfaceName":"r4-eth0",
"active":true
}
]
}
],
"10.0.3.0\/24":[
{
"prefix":"10.0.3.0\/24",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":20,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.3",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r4-eth0",
"active":true
}
]
}
],
"123.0.1.0\/24":[
{
"prefix":"123.0.1.0\/24",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":30,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.2",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r4-eth0",
"active":true
}
]
}
]
}

View File

@ -0,0 +1,68 @@
{
"bindings":[
{
"addressFamily":"ipv4",
"prefix":"1.1.1.1/32",
"neighborId":"0.0.0.0",
"localLabel":"imp-null",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"2.2.2.2/32",
"neighborId":"0.0.0.0",
"localLabel":"imp-null",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"3.3.3.3/32",
"neighborId":"0.0.0.0",
"localLabel":"imp-null",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"4.4.4.4/32",
"neighborId":"0.0.0.0",
"localLabel":"imp-null",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"10.0.1.0/24",
"neighborId":"0.0.0.0",
"localLabel":"imp-null",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"10.0.2.0/24",
"neighborId":"0.0.0.0",
"localLabel":"imp-null",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"10.0.3.0/24",
"neighborId":"0.0.0.0",
"localLabel":"imp-null",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"123.0.1.0/24",
"neighborId":"0.0.0.0",
"localLabel":"imp-null",
"remoteLabel":"-",
"inUse":0
}
]
}

View File

@ -0,0 +1,2 @@
{
}

View File

@ -0,0 +1,2 @@
{
}

View File

@ -0,0 +1,17 @@
log file zebra.log
!
hostname r4
!
interface lo
ip address 4.4.4.4/32
!
interface r4-eth0
description to sw1
ip address 10.0.2.4/24
! no link-detect
!
ip forwarding
!
!
line vty
!

View File

@ -0,0 +1,76 @@
## Color coding:
#########################
## Main FRR: #f08080 red
## Switches: #d0e0d0 gray
## RIP: #19e3d9 Cyan
## RIPng: #fcb314 dark yellow
## OSPFv2: #32b835 Green
## OSPFv3: #19e3d9 Cyan
## ISIS IPv4 #fcb314 dark yellow
## ISIS IPv6 #9a81ec purple
## BGP IPv4 #eee3d3 beige
## BGP IPv6 #fdff00 yellow
##### Colors (see http://www.color-hex.com/)
graph template {
label="Test Topology - LDP-OC 1";
# Routers
r1 [
shape=doubleoctagon,
label="r1",
fillcolor="#f08080",
style=filled,
];
r2 [
shape=doubleoctagon
label="r2",
fillcolor="#f08080",
style=filled,
];
r3 [
shape=doubleoctagon
label="r3",
fillcolor="#f08080",
style=filled,
];
r4 [
shape=doubleoctagon
label="r4",
fillcolor="#f08080",
style=filled,
];
# Switches
s0 [
shape=oval,
label="10.0.1.0/24",
fillcolor="#d0e0d0",
style=filled,
];
s1 [
shape=oval,
label="10.0.2.0/24",
fillcolor="#d0e0d0",
style=filled,
];
s2 [
shape=oval,
label="10.0.3.0/24",
fillcolor="#d0e0d0",
style=filled,
];
# Connections
r1 -- s0 [label="eth0"];
r2 -- s0 [label="eth0"];
r2 -- s1 [label="eth1"];
r3 -- s1 [label="eth0"];
r4 -- s1 [label="eth0"];
r2 -- s2 [label="eth2"];
r3 -- s2 [label="eth1"];
}

View File

@ -0,0 +1,227 @@
#!/usr/bin/env python
#
# test_ldp_oc_acl_topo1.py
# Part of NetDEF Topology Tests
#
# Copyright (c) 2020 by Volta Networks
#
# Permission to use, copy, modify, and/or distribute this software
# for any purpose with or without fee is hereby granted, provided
# that the above copyright notice and this permission notice appear
# in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND NETDEF DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NETDEF BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
# DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
# OF THIS SOFTWARE.
#
"""
test_ldp_oc_acl_topo1.py: Simple FRR/Quagga LDP Test
+---------+
| r1 |
| 1.1.1.1 |
+----+----+
| .1 r1-eth0
|
~~~~~~~~~~~~~
~~ sw0 ~~
~~ 10.0.1.0/24 ~~
~~~~~~~~~~~~~
|10.0.1.0/24
|
| .2 r2-eth0
+----+----+
| r2 |
| 2.2.2.2 |
+--+---+--+
r2-eth2 .2 | | .2 r2-eth1
______/ \______
/ \
~~~~~~~~~~~~~ ~~~~~~~~~~~~~
~~ sw2 ~~ ~~ sw1 ~~
~~ 10.0.3.0/24 ~~ ~~ 10.0.2.0/24 ~~
~~~~~~~~~~~~~ ~~~~~~~~~~~~~
| / |
\ _________/ |
\ / \
r3-eth1 .3 | | .3 r3-eth0 | .4 r4-eth0
+----+--+---+ +----+----+
| r3 | | r4 |
| 3.3.3.3 | | 4.4.4.4 |
+-----------+ +---------+
"""
import os
import sys
import pytest
import json
from time import sleep
from functools import partial
# Save the Current Working Directory to find configuration files.
CWD = os.path.dirname(os.path.realpath(__file__))
sys.path.append(os.path.join(CWD, '../'))
# pylint: disable=C0413
# Import topogen and topotest helpers
from lib import topotest
from lib.topogen import Topogen, TopoRouter, get_topogen
from lib.topolog import logger
# Required to instantiate the topology builder class.
from mininet.topo import Topo
class TemplateTopo(Topo):
"Test topology builder"
def build(self, *_args, **_opts):
"Build function"
tgen = get_topogen(self)
#
# Define FRR Routers
#
for router in ['r1', 'r2', 'r3', 'r4']:
tgen.add_router(router)
#
# Define connections
#
switch = tgen.add_switch('s0')
switch.add_link(tgen.gears['r1'])
switch.add_link(tgen.gears['r2'])
switch = tgen.add_switch('s1')
switch.add_link(tgen.gears['r2'])
switch.add_link(tgen.gears['r3'])
switch.add_link(tgen.gears['r4'])
switch = tgen.add_switch('s2')
switch.add_link(tgen.gears['r2'])
switch.add_link(tgen.gears['r3'])
def setup_module(mod):
"Sets up the pytest environment"
tgen = Topogen(TemplateTopo, mod.__name__)
tgen.start_topology()
router_list = tgen.routers()
# For all registered routers, load the zebra configuration file
for rname, router in router_list.iteritems():
router.load_config(
TopoRouter.RD_ZEBRA,
os.path.join(CWD, '{}/zebra.conf'.format(rname))
)
# Don't start ospfd and ldpd in the CE nodes
if router.name[0] == 'r':
router.load_config(
TopoRouter.RD_OSPF,
os.path.join(CWD, '{}/ospfd.conf'.format(rname))
)
router.load_config(
TopoRouter.RD_LDP,
os.path.join(CWD, '{}/ldpd.conf'.format(rname))
)
tgen.start_router()
def teardown_module(mod):
"Teardown the pytest environment"
tgen = get_topogen()
# This function tears down the whole topology.
tgen.stop_topology()
def router_compare_json_output(rname, command, reference):
"Compare router JSON output"
logger.info('Comparing router "%s" "%s" output', rname, command)
tgen = get_topogen()
filename = '{}/{}/{}'.format(CWD, rname, reference)
expected = json.loads(open(filename).read())
# Run test function until we get an result. Wait at most 80 seconds.
test_func = partial(topotest.router_json_cmp,
tgen.gears[rname], command, expected)
_, diff = topotest.run_and_expect(test_func, None, count=160, wait=0.5)
assertmsg = '"{}" JSON output mismatches the expected result'.format(rname)
assert diff is None, assertmsg
def test_ospf_convergence():
logger.info("Test: check OSPF adjacencies")
tgen = get_topogen()
# Skip if previous fatal error condition is raised
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
for rname in ['r1', 'r2', 'r3', 'r4']:
router_compare_json_output(rname, "show ip ospf neighbor json", "show_ip_ospf_neighbor.json")
def test_rib():
logger.info("Test: verify RIB")
tgen = get_topogen()
# Skip if previous fatal error condition is raised
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
for rname in ['r1', 'r2', 'r3', 'r4']:
router_compare_json_output(rname, "show ip route json", "show_ip_route.ref")
def test_ldp_adjacencies():
logger.info("Test: verify LDP adjacencies")
tgen = get_topogen()
# Skip if previous fatal error condition is raised
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
for rname in ['r1', 'r2', 'r3', 'r4']:
router_compare_json_output(rname, "show mpls ldp discovery json", "show_ldp_discovery.ref")
def test_ldp_neighbors():
logger.info("Test: verify LDP neighbors")
tgen = get_topogen()
# Skip if previous fatal error condition is raised
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
for rname in ['r1', 'r2', 'r3', 'r4']:
router_compare_json_output(rname, "show mpls ldp neighbor json", "show_ldp_neighbor.ref")
def test_ldp_bindings():
logger.info("Test: verify LDP bindings")
tgen = get_topogen()
# Skip if previous fatal error condition is raised
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
for rname in ['r1', 'r2', 'r3', 'r4']:
router_compare_json_output(rname, "show mpls ldp binding json", "show_ldp_binding.ref")
# Memory leak test template
def test_memory_leak():
"Run the memory leak test and report results."
tgen = get_topogen()
if not tgen.is_memleak_enabled():
pytest.skip('Memory leak test/report is disabled')
tgen.report_memory_leaks()
if __name__ == '__main__':
args = ["-s"] + sys.argv[1:]
sys.exit(pytest.main(args))

View File

@ -0,0 +1,24 @@
hostname r1
log file ldpd.log
!
debug mpls ldp zebra
debug mpls ldp event
debug mpls ldp errors
debug mpls ldp messages recv
debug mpls ldp messages sent
debug mpls ldp discovery hello recv
debug mpls ldp discovery hello sent
!
mpls ldp
router-id 1.1.1.1
ordered-control
!
address-family ipv4
discovery transport-address 1.1.1.1
!
interface r1-eth0
!
!
!
line vty
!

View File

@ -0,0 +1,7 @@
hostname r1
log file ospfd.log
!
router ospf
router-id 1.1.1.1
network 0.0.0.0/0 area 0
!

View File

@ -0,0 +1,12 @@
{
"neighbors":{
"2.2.2.2":[
{
"priority":1,
"state":"Full\/DR",
"address":"10.0.1.2",
"ifaceName":"r1-eth0:10.0.1.1"
}
]
}
}

View File

@ -0,0 +1,171 @@
{
"1.1.1.1/32":[
{
"prefix":"1.1.1.1/32",
"protocol":"ospf",
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":1,
"interfaceName":"lo",
"active":true
}
]
},
{
"prefix":"1.1.1.1/32",
"protocol":"connected",
"selected":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":1,
"interfaceName":"lo",
"active":true
}
]
}
],
"2.2.2.2/32":[
{
"prefix":"2.2.2.2/32",
"protocol":"ospf",
"selected":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.1.2",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r1-eth0",
"active":true
}
]
}
],
"3.3.3.3/32":[
{
"prefix":"3.3.3.3/32",
"protocol":"ospf",
"selected":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.1.2",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r1-eth0",
"active":true
}
]
}
],
"4.4.4.4/32":[
{
"prefix":"4.4.4.4/32",
"protocol":"ospf",
"selected":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.1.2",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r1-eth0",
"active":true
}
]
}
],
"10.0.1.0/24":[
{
"prefix":"10.0.1.0/24",
"protocol":"ospf",
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":2,
"interfaceName":"r1-eth0",
"active":true
}
]
},
{
"prefix":"10.0.1.0/24",
"protocol":"connected",
"selected":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":2,
"interfaceName":"r1-eth0",
"active":true
}
]
}
],
"10.0.2.0/24":[
{
"prefix":"10.0.2.0/24",
"protocol":"ospf",
"selected":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.1.2",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r1-eth0",
"active":true
}
]
}
],
"10.0.3.0/24":[
{
"prefix":"10.0.3.0/24",
"protocol":"ospf",
"selected":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.1.2",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r1-eth0",
"active":true
}
]
}
],
"123.0.1.0/24":[
{
"prefix":"123.0.1.0/24",
"protocol":"ospf",
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":2,
"interfaceName":"r1-eth0",
"active":true
}
]
},
{
"prefix":"123.0.1.0/24",
"protocol":"connected",
"selected":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":2,
"interfaceName":"r1-eth0",
"active":true
}
]
}
]
}

View File

@ -0,0 +1,61 @@
{
"bindings":[
{
"addressFamily":"ipv4",
"prefix":"1.1.1.1/32",
"neighborId":"0.0.0.0",
"localLabel":"imp-null",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"2.2.2.2/32",
"neighborId":"2.2.2.2",
"remoteLabel":"imp-null",
"inUse":1
},
{
"addressFamily":"ipv4",
"prefix":"3.3.3.3/32",
"neighborId":"2.2.2.2",
"inUse":1
},
{
"addressFamily":"ipv4",
"prefix":"4.4.4.4/32",
"neighborId":"0.0.0.0",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"10.0.1.0/24",
"neighborId":"2.2.2.2",
"localLabel":"imp-null",
"remoteLabel":"imp-null",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"10.0.2.0/24",
"neighborId":"2.2.2.2",
"remoteLabel":"imp-null",
"inUse":1
},
{
"addressFamily":"ipv4",
"prefix":"10.0.3.0/24",
"neighborId":"2.2.2.2",
"inUse":1
},
{
"addressFamily":"ipv4",
"prefix":"123.0.1.0/24",
"neighborId":"0.0.0.0",
"localLabel":"imp-null",
"remoteLabel":"-",
"inUse":0
}
]
}

View File

@ -0,0 +1,11 @@
{
"adjacencies":[
{
"addressFamily":"ipv4",
"neighborId":"2.2.2.2",
"type":"link",
"interface":"r1-eth0",
"helloHoldtime":15
}
]
}

View File

@ -0,0 +1,10 @@
{
"neighbors":[
{
"addressFamily":"ipv4",
"neighborId":"2.2.2.2",
"state":"OPERATIONAL",
"transportAddress":"2.2.2.2"
}
]
}

View File

@ -0,0 +1,17 @@
log file zebra.log
!
hostname r1
!
interface lo
ip address 1.1.1.1/32
!
interface r1-eth0
description to sw0
ip address 10.0.1.1/24
ip address 123.0.1.1/24
!
ip forwarding
!
!
line vty
!

View File

@ -0,0 +1,28 @@
hostname r2
log file ldpd.log
!
debug mpls ldp zebra
debug mpls ldp event
debug mpls ldp errors
debug mpls ldp messages recv
debug mpls ldp messages sent
debug mpls ldp discovery hello recv
debug mpls ldp discovery hello sent
!
mpls ldp
router-id 2.2.2.2
ordered-control
!
address-family ipv4
discovery transport-address 2.2.2.2
!
interface r2-eth0
!
interface r2-eth1
!
interface r2-eth2
!
!
!
line vty
!

View File

@ -0,0 +1,7 @@
hostname r2
log file ospfd.log
!
router ospf
router-id 2.2.2.2
network 0.0.0.0/0 area 0
!

View File

@ -0,0 +1,31 @@
{
"neighbors":{
"1.1.1.1":[
{
"priority":1,
"state":"Full\/Backup",
"address":"10.0.1.1",
"ifaceName":"r2-eth0:10.0.1.2",
"retransmitCounter":0,
"requestCounter":0,
"dbSummaryCounter":0
}
],
"3.3.3.3":[
{
"priority":1,
"state":"Full\/Backup",
"address":"10.0.2.3",
"ifaceName":"r2-eth1:10.0.2.2"
}
],
"4.4.4.4":[
{
"priority":1,
"state":"Full\/DR",
"address":"10.0.2.4",
"ifaceName":"r2-eth1:10.0.2.2"
}
]
}
}

View File

@ -0,0 +1,209 @@
{
"1.1.1.1/32":[
{
"prefix":"1.1.1.1/32",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":10,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.1.1",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r2-eth0",
"active":true
}
]
}
],
"2.2.2.2/32":[
{
"prefix":"2.2.2.2/32",
"protocol":"ospf",
"distance":110,
"metric":0,
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":1,
"interfaceName":"lo",
"active":true
}
]
},
{
"prefix":"2.2.2.2/32",
"protocol":"connected",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":1,
"interfaceName":"lo",
"active":true
}
]
}
],
"3.3.3.3/32":[
{
"prefix":"3.3.3.3/32",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":10,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.3",
"afi":"ipv4",
"interfaceIndex":3,
"interfaceName":"r2-eth1",
"active":true
}
]
}
],
"4.4.4.4/32":[
{
"prefix":"4.4.4.4/32",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":10,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.4",
"afi":"ipv4",
"interfaceIndex":3,
"interfaceName":"r2-eth1",
"active":true
}
]
}
],
"10.0.1.0\/24":[
{
"prefix":"10.0.1.0\/24",
"protocol":"ospf",
"distance":110,
"metric":10,
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":2,
"interfaceName":"r2-eth0",
"active":true
}
]
},
{
"prefix":"10.0.1.0\/24",
"protocol":"connected",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":2,
"interfaceName":"r2-eth0",
"active":true
}
]
}
],
"10.0.2.0\/24":[
{
"prefix":"10.0.2.0\/24",
"protocol":"ospf",
"distance":110,
"metric":10,
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":3,
"interfaceName":"r2-eth1",
"active":true
}
]
},
{
"prefix":"10.0.2.0\/24",
"protocol":"connected",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":3,
"interfaceName":"r2-eth1",
"active":true
}
]
}
],
"10.0.3.0\/24":[
{
"prefix":"10.0.3.0\/24",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":20,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.3",
"afi":"ipv4",
"interfaceIndex":3,
"interfaceName":"r2-eth1",
"active":true
}
]
}
],
"123.0.1.0\/24":[
{
"prefix":"123.0.1.0\/24",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":20,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.1.1",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r2-eth0",
"active":true
}
]
}
]
}

View File

@ -0,0 +1,63 @@
{
"bindings":[
{
"addressFamily":"ipv4",
"prefix":"1.1.1.1/32",
"neighborId":"1.1.1.1",
"remoteLabel":"imp-null",
"inUse":1
},
{
"addressFamily":"ipv4",
"prefix":"2.2.2.2/32",
"neighborId":"0.0.0.0",
"localLabel":"imp-null",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"3.3.3.3/32",
"neighborId":"3.3.3.3",
"remoteLabel":"imp-null",
"inUse":1
},
{
"addressFamily":"ipv4",
"prefix":"4.4.4.4/32",
"neighborId":"0.0.0.0",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"10.0.1.0/24",
"neighborId":"1.1.1.1",
"localLabel":"imp-null",
"remoteLabel":"imp-null",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"10.0.2.0/24",
"neighborId":"3.3.3.3",
"localLabel":"imp-null",
"remoteLabel":"imp-null",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"10.0.3.0/24",
"neighborId":"3.3.3.3",
"remoteLabel":"imp-null",
"inUse":1
},
{
"addressFamily":"ipv4",
"prefix":"123.0.1.0/24",
"neighborId":"1.1.1.1",
"remoteLabel":"imp-null",
"inUse":1
}
]
}

View File

@ -0,0 +1,18 @@
{
"adjacencies":[
{
"addressFamily":"ipv4",
"neighborId":"1.1.1.1",
"type":"link",
"interface":"r2-eth0",
"helloHoldtime":15
},
{
"addressFamily":"ipv4",
"neighborId":"3.3.3.3",
"type":"link",
"interface":"r2-eth1",
"helloHoldtime":15
}
]
}

View File

@ -0,0 +1,16 @@
{
"neighbors":[
{
"addressFamily":"ipv4",
"neighborId":"1.1.1.1",
"state":"OPERATIONAL",
"transportAddress":"1.1.1.1"
},
{
"addressFamily":"ipv4",
"neighborId":"3.3.3.3",
"state":"OPERATIONAL",
"transportAddress":"3.3.3.3"
}
]
}

View File

@ -0,0 +1,27 @@
log file zebra.log
!
hostname r2
!
interface lo
ip address 2.2.2.2/32
!
interface r2-eth0
description to sw0
ip address 10.0.1.2/24
! no link-detect
!
interface r2-eth1
description to sw1
ip address 10.0.2.2/24
! no link-detect
!
interface r2-eths2
description to sw2
ip address 10.0.3.2/24
! no link-detect
!
ip forwarding
!
!
line vty
!

View File

@ -0,0 +1,24 @@
hostname r3
log file ldpd.log
!
debug mpls ldp zebra
debug mpls ldp event
debug mpls ldp errors
debug mpls ldp messages recv
debug mpls ldp messages sent
debug mpls ldp discovery hello recv
debug mpls ldp discovery hello sent
!
mpls ldp
router-id 3.3.3.3
ordered-control
!
address-family ipv4
discovery transport-address 3.3.3.3
!
interface r3-eth0
!
!
!
line vty
!

View File

@ -0,0 +1,8 @@
hostname r3
password 1
log file ospfd.log
!
router ospf
router-id 3.3.3.3
network 0.0.0.0/0 area 0
!

View File

@ -0,0 +1,20 @@
{
"neighbors":{
"2.2.2.2":[
{
"priority":1,
"state":"Full\/DROther",
"address":"10.0.2.2",
"ifaceName":"r3-eth0:10.0.2.3"
}
],
"4.4.4.4":[
{
"priority":1,
"state":"Full\/DR",
"address":"10.0.2.4",
"ifaceName":"r3-eth0:10.0.2.3"
}
]
}
}

View File

@ -0,0 +1,209 @@
{
"1.1.1.1/32":[
{
"prefix":"1.1.1.1/32",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":20,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.2",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r3-eth0",
"active":true
}
]
}
],
"2.2.2.2/32":[
{
"prefix":"2.2.2.2/32",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":10,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.2",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r3-eth0",
"active":true
}
]
}
],
"3.3.3.3/32":[
{
"prefix":"3.3.3.3/32",
"protocol":"ospf",
"distance":110,
"metric":0,
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":1,
"interfaceName":"lo",
"active":true
}
]
},
{
"prefix":"3.3.3.3/32",
"protocol":"connected",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":1,
"interfaceName":"lo",
"active":true
}
]
}
],
"4.4.4.4/32":[
{
"prefix":"4.4.4.4/32",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":10,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.4",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r3-eth0",
"active":true
}
]
}
],
"10.0.1.0\/24":[
{
"prefix":"10.0.1.0\/24",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":20,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.2",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r3-eth0",
"active":true
}
]
}
],
"10.0.2.0\/24":[
{
"prefix":"10.0.2.0\/24",
"protocol":"ospf",
"distance":110,
"metric":10,
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":2,
"interfaceName":"r3-eth0",
"active":true
}
]
},
{
"prefix":"10.0.2.0\/24",
"protocol":"connected",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":2,
"interfaceName":"r3-eth0",
"active":true
}
]
}
],
"10.0.3.0\/24":[
{
"prefix":"10.0.3.0\/24",
"protocol":"ospf",
"distance":110,
"metric":10,
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":3,
"interfaceName":"r3-eth1",
"active":true
}
]
},
{
"prefix":"10.0.3.0\/24",
"protocol":"connected",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":3,
"interfaceName":"r3-eth1",
"active":true
}
]
}
],
"123.0.1.0\/24":[
{
"prefix":"123.0.1.0\/24",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":30,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.2",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r3-eth0",
"active":true
}
]
}
]
}

View File

@ -0,0 +1,61 @@
{
"bindings":[
{
"addressFamily":"ipv4",
"prefix":"1.1.1.1/32",
"neighborId":"2.2.2.2",
"inUse":1
},
{
"addressFamily":"ipv4",
"prefix":"2.2.2.2/32",
"neighborId":"2.2.2.2",
"remoteLabel":"imp-null",
"inUse":1
},
{
"addressFamily":"ipv4",
"prefix":"3.3.3.3/32",
"neighborId":"0.0.0.0",
"localLabel":"imp-null",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"4.4.4.4/32",
"neighborId":"0.0.0.0",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"10.0.1.0/24",
"neighborId":"2.2.2.2",
"remoteLabel":"imp-null",
"inUse":1
},
{
"addressFamily":"ipv4",
"prefix":"10.0.2.0/24",
"neighborId":"2.2.2.2",
"localLabel":"imp-null",
"remoteLabel":"imp-null",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"10.0.3.0/24",
"neighborId":"0.0.0.0",
"localLabel":"imp-null",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"123.0.1.0/24",
"neighborId":"2.2.2.2",
"inUse":1
}
]
}

View File

@ -0,0 +1,11 @@
{
"adjacencies":[
{
"addressFamily":"ipv4",
"neighborId":"2.2.2.2",
"type":"link",
"interface":"r3-eth0",
"helloHoldtime":15
}
]
}

View File

@ -0,0 +1,10 @@
{
"neighbors":[
{
"addressFamily":"ipv4",
"neighborId":"2.2.2.2",
"state":"OPERATIONAL",
"transportAddress":"2.2.2.2"
}
]
}

View File

@ -0,0 +1,22 @@
log file zebra.log
!
hostname r3
!
interface lo
ip address 3.3.3.3/32
!
interface r3-eth0
description to sw1
ip address 10.0.2.3/24
! no link-detect
!
interface r3-eth1
description to sw2
ip address 10.0.3.3/24
! no link-detect
!
ip forwarding
!
!
line vty
!

View File

@ -0,0 +1,24 @@
hostname r4
log file ldpd.log
!
debug mpls ldp zebra
debug mpls ldp event
debug mpls ldp errors
debug mpls ldp messages recv
debug mpls ldp messages sent
debug mpls ldp discovery hello recv
debug mpls ldp discovery hello sent
!
mpls ldp
router-id 4.4.4.4
ordered-control
!
address-family ipv4
discovery transport-address 4.4.4.4
!
!interface r4-eth0
!
!
!
line vty
!

View File

@ -0,0 +1,7 @@
hostname r4
log file ospfd.log
!
router ospf
router-id 4.4.4.4
network 0.0.0.0/0 area 0
!

View File

@ -0,0 +1,21 @@
{
"neighbors":{
"2.2.2.2":[
{
"priority":1,
"state":"Full\/DROther",
"address":"10.0.2.2",
"ifaceName":"r4-eth0:10.0.2.4"
}
],
"3.3.3.3":[
{
"priority":1,
"state":"Full\/Backup",
"address":"10.0.2.3",
"ifaceName":"r4-eth0:10.0.2.4"
}
]
}
}

View File

@ -0,0 +1,196 @@
{
"1.1.1.1/32":[
{
"prefix":"1.1.1.1/32",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":20,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.2",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r4-eth0",
"active":true
}
]
}
],
"2.2.2.2/32":[
{
"prefix":"2.2.2.2/32",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":10,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.2",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r4-eth0",
"active":true
}
]
}
],
"3.3.3.3/32":[
{
"prefix":"3.3.3.3/32",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":10,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.3",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r4-eth0",
"active":true
}
]
}
],
"4.4.4.4/32":[
{
"prefix":"4.4.4.4/32",
"protocol":"ospf",
"distance":110,
"metric":0,
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":1,
"interfaceName":"lo",
"active":true
}
]
},
{
"prefix":"4.4.4.4/32",
"protocol":"connected",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":1,
"interfaceName":"lo",
"active":true
}
]
}
],
"10.0.1.0\/24":[
{
"prefix":"10.0.1.0\/24",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":20,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.2",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r4-eth0",
"active":true
}
]
}
],
"10.0.2.0\/24":[
{
"prefix":"10.0.2.0\/24",
"protocol":"ospf",
"distance":110,
"metric":10,
"nexthops":[
{
"directlyConnected":true,
"interfaceIndex":2,
"interfaceName":"r4-eth0",
"active":true
}
]
},
{
"prefix":"10.0.2.0\/24",
"protocol":"connected",
"selected":true,
"destSelected":true,
"distance":0,
"metric":0,
"installed":true,
"nexthops":[
{
"fib":true,
"directlyConnected":true,
"interfaceIndex":2,
"interfaceName":"r4-eth0",
"active":true
}
]
}
],
"10.0.3.0\/24":[
{
"prefix":"10.0.3.0\/24",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":20,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.3",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r4-eth0",
"active":true
}
]
}
],
"123.0.1.0\/24":[
{
"prefix":"123.0.1.0\/24",
"protocol":"ospf",
"selected":true,
"destSelected":true,
"distance":110,
"metric":30,
"installed":true,
"nexthops":[
{
"fib":true,
"ip":"10.0.2.2",
"afi":"ipv4",
"interfaceIndex":2,
"interfaceName":"r4-eth0",
"active":true
}
]
}
]
}

View File

@ -0,0 +1,68 @@
{
"bindings":[
{
"addressFamily":"ipv4",
"prefix":"1.1.1.1/32",
"neighborId":"0.0.0.0",
"localLabel":"imp-null",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"2.2.2.2/32",
"neighborId":"0.0.0.0",
"localLabel":"imp-null",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"3.3.3.3/32",
"neighborId":"0.0.0.0",
"localLabel":"imp-null",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"4.4.4.4/32",
"neighborId":"0.0.0.0",
"localLabel":"imp-null",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"10.0.1.0/24",
"neighborId":"0.0.0.0",
"localLabel":"imp-null",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"10.0.2.0/24",
"neighborId":"0.0.0.0",
"localLabel":"imp-null",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"10.0.3.0/24",
"neighborId":"0.0.0.0",
"localLabel":"imp-null",
"remoteLabel":"-",
"inUse":0
},
{
"addressFamily":"ipv4",
"prefix":"123.0.1.0/24",
"neighborId":"0.0.0.0",
"localLabel":"imp-null",
"remoteLabel":"-",
"inUse":0
}
]
}

View File

@ -0,0 +1,2 @@
{
}

View File

@ -0,0 +1,2 @@
{
}

View File

@ -0,0 +1,17 @@
log file zebra.log
!
hostname r4
!
interface lo
ip address 4.4.4.4/32
!
interface r4-eth0
description to sw1
ip address 10.0.2.4/24
! no link-detect
!
ip forwarding
!
!
line vty
!

View File

@ -0,0 +1,76 @@
## Color coding:
#########################
## Main FRR: #f08080 red
## Switches: #d0e0d0 gray
## RIP: #19e3d9 Cyan
## RIPng: #fcb314 dark yellow
## OSPFv2: #32b835 Green
## OSPFv3: #19e3d9 Cyan
## ISIS IPv4 #fcb314 dark yellow
## ISIS IPv6 #9a81ec purple
## BGP IPv4 #eee3d3 beige
## BGP IPv6 #fdff00 yellow
##### Colors (see http://www.color-hex.com/)
graph template {
label="Test Topology - LDP-OC 1";
# Routers
r1 [
shape=doubleoctagon,
label="r1",
fillcolor="#f08080",
style=filled,
];
r2 [
shape=doubleoctagon
label="r2",
fillcolor="#f08080",
style=filled,
];
r3 [
shape=doubleoctagon
label="r3",
fillcolor="#f08080",
style=filled,
];
r4 [
shape=doubleoctagon
label="r4",
fillcolor="#f08080",
style=filled,
];
# Switches
s0 [
shape=oval,
label="10.0.1.0/24",
fillcolor="#d0e0d0",
style=filled,
];
s1 [
shape=oval,
label="10.0.2.0/24",
fillcolor="#d0e0d0",
style=filled,
];
s2 [
shape=oval,
label="10.0.3.0/24",
fillcolor="#d0e0d0",
style=filled,
];
# Connections
r1 -- s0 [label="eth0"];
r2 -- s0 [label="eth0"];
r2 -- s1 [label="eth1"];
r3 -- s1 [label="eth0"];
r4 -- s1 [label="eth0"];
r2 -- s2 [label="eth2"];
r3 -- s2 [label="eth1"];
}

View File

@ -0,0 +1,227 @@
#!/usr/bin/env python
#
# test_ldp_oc_topo1.py
# Part of NetDEF Topology Tests
#
# Copyright (c) 2020 by by Volta Networks
#
# Permission to use, copy, modify, and/or distribute this software
# for any purpose with or without fee is hereby granted, provided
# that the above copyright notice and this permission notice appear
# in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND NETDEF DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NETDEF BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
# DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
# WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
# OF THIS SOFTWARE.
#
"""
test_ldp_oc_topo1.py: Simple FRR/Quagga LDP Test
+---------+
| r1 |
| 1.1.1.1 |
+----+----+
| .1 r1-eth0
|
~~~~~~~~~~~~~
~~ sw0 ~~
~~ 10.0.1.0/24 ~~
~~~~~~~~~~~~~
|10.0.1.0/24
|
| .2 r2-eth0
+----+----+
| r2 |
| 2.2.2.2 |
+--+---+--+
r2-eth2 .2 | | .2 r2-eth1
______/ \______
/ \
~~~~~~~~~~~~~ ~~~~~~~~~~~~~
~~ sw2 ~~ ~~ sw1 ~~
~~ 10.0.3.0/24 ~~ ~~ 10.0.2.0/24 ~~
~~~~~~~~~~~~~ ~~~~~~~~~~~~~
| / |
\ _________/ |
\ / \
r3-eth1 .3 | | .3 r3-eth0 | .4 r4-eth0
+----+--+---+ +----+----+
| r3 | | r4 |
| 3.3.3.3 | | 4.4.4.4 |
+-----------+ +---------+
"""
import os
import sys
import pytest
import json
from time import sleep
from functools import partial
# Save the Current Working Directory to find configuration files.
CWD = os.path.dirname(os.path.realpath(__file__))
sys.path.append(os.path.join(CWD, '../'))
# pylint: disable=C0413
# Import topogen and topotest helpers
from lib import topotest
from lib.topogen import Topogen, TopoRouter, get_topogen
from lib.topolog import logger
# Required to instantiate the topology builder class.
from mininet.topo import Topo
class TemplateTopo(Topo):
"Test topology builder"
def build(self, *_args, **_opts):
"Build function"
tgen = get_topogen(self)
#
# Define FRR Routers
#
for router in ['r1', 'r2', 'r3', 'r4']:
tgen.add_router(router)
#
# Define connections
#
switch = tgen.add_switch('s0')
switch.add_link(tgen.gears['r1'])
switch.add_link(tgen.gears['r2'])
switch = tgen.add_switch('s1')
switch.add_link(tgen.gears['r2'])
switch.add_link(tgen.gears['r3'])
switch.add_link(tgen.gears['r4'])
switch = tgen.add_switch('s2')
switch.add_link(tgen.gears['r2'])
switch.add_link(tgen.gears['r3'])
def setup_module(mod):
"Sets up the pytest environment"
tgen = Topogen(TemplateTopo, mod.__name__)
tgen.start_topology()
router_list = tgen.routers()
# For all registered routers, load the zebra configuration file
for rname, router in router_list.iteritems():
router.load_config(
TopoRouter.RD_ZEBRA,
os.path.join(CWD, '{}/zebra.conf'.format(rname))
)
# Don't start ospfd and ldpd in the CE nodes
if router.name[0] == 'r':
router.load_config(
TopoRouter.RD_OSPF,
os.path.join(CWD, '{}/ospfd.conf'.format(rname))
)
router.load_config(
TopoRouter.RD_LDP,
os.path.join(CWD, '{}/ldpd.conf'.format(rname))
)
tgen.start_router()
def teardown_module(mod):
"Teardown the pytest environment"
tgen = get_topogen()
# This function tears down the whole topology.
tgen.stop_topology()
def router_compare_json_output(rname, command, reference):
"Compare router JSON output"
logger.info('Comparing router "%s" "%s" output', rname, command)
tgen = get_topogen()
filename = '{}/{}/{}'.format(CWD, rname, reference)
expected = json.loads(open(filename).read())
# Run test function until we get an result. Wait at most 80 seconds.
test_func = partial(topotest.router_json_cmp,
tgen.gears[rname], command, expected)
_, diff = topotest.run_and_expect(test_func, None, count=160, wait=0.5)
assertmsg = '"{}" JSON output mismatches the expected result'.format(rname)
assert diff is None, assertmsg
def test_ospf_convergence():
logger.info("Test: check OSPF adjacencies")
tgen = get_topogen()
# Skip if previous fatal error condition is raised
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
for rname in ['r1', 'r2', 'r3', 'r4']:
router_compare_json_output(rname, "show ip ospf neighbor json", "show_ip_ospf_neighbor.json")
def test_rib():
logger.info("Test: verify RIB")
tgen = get_topogen()
# Skip if previous fatal error condition is raised
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
for rname in ['r1', 'r2', 'r3', 'r4']:
router_compare_json_output(rname, "show ip route json", "show_ip_route.ref")
def test_ldp_adjacencies():
logger.info("Test: verify LDP adjacencies")
tgen = get_topogen()
# Skip if previous fatal error condition is raised
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
for rname in ['r1', 'r2', 'r3', 'r4']:
router_compare_json_output(rname, "show mpls ldp discovery json", "show_ldp_discovery.ref")
def test_ldp_neighbors():
logger.info("Test: verify LDP neighbors")
tgen = get_topogen()
# Skip if previous fatal error condition is raised
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
for rname in ['r1', 'r2', 'r3', 'r4']:
router_compare_json_output(rname, "show mpls ldp neighbor json", "show_ldp_neighbor.ref")
def test_ldp_bindings():
logger.info("Test: verify LDP bindings")
tgen = get_topogen()
# Skip if previous fatal error condition is raised
if tgen.routers_have_failure():
pytest.skip(tgen.errors)
for rname in ['r1', 'r2', 'r3', 'r4']:
router_compare_json_output(rname, "show mpls ldp binding json", "show_ldp_binding.ref")
# Memory leak test template
def test_memory_leak():
"Run the memory leak test and report results."
tgen = get_topogen()
if not tgen.is_memleak_enabled():
pytest.skip('Memory leak test/report is disabled')
tgen.report_memory_leaks()
if __name__ == '__main__':
args = ["-s"] + sys.argv[1:]
sys.exit(pytest.main(args))

View File

@ -3,3 +3,4 @@ xx as to xx via inet 10.0.1.2 dev r1-eth0 proto xx
xx via inet 10.0.1.2 dev r1-eth0 proto xx
xx via inet 10.0.1.2 dev r1-eth0 proto xx
xx via inet 10.0.1.2 dev r1-eth0 proto xx