Merge pull request #1500 from opensourcerouting/ldpd-fixes

ldpd: small improvements
This commit is contained in:
Donald Sharp 2017-12-04 09:06:09 -05:00 committed by GitHub
commit 0e21e01c4f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 49 additions and 13 deletions

View File

@ -295,17 +295,26 @@ int
l2vpn_pw_ok(struct l2vpn_pw *pw, struct fec_nh *fnh) l2vpn_pw_ok(struct l2vpn_pw *pw, struct fec_nh *fnh)
{ {
/* check for a remote label */ /* check for a remote label */
if (fnh->remote_label == NO_LABEL) if (fnh->remote_label == NO_LABEL) {
log_warnx("%s: pseudowire %s: no remote label", __func__,
pw->ifname);
return (0); return (0);
}
/* MTUs must match */ /* MTUs must match */
if (pw->l2vpn->mtu != pw->remote_mtu) if (pw->l2vpn->mtu != pw->remote_mtu) {
log_warnx("%s: pseudowire %s: MTU mismatch detected", __func__,
pw->ifname);
return (0); return (0);
}
/* check pw status if applicable */ /* check pw status if applicable */
if ((pw->flags & F_PW_STATUSTLV) && if ((pw->flags & F_PW_STATUSTLV) &&
pw->remote_status != PW_FORWARDING) pw->remote_status != PW_FORWARDING) {
log_warnx("%s: pseudowire %s: remote end is down", __func__,
pw->ifname);
return (0); return (0);
}
return (1); return (1);
} }
@ -550,7 +559,8 @@ l2vpn_pw_ctl(pid_t pid)
sizeof(pwctl.ifname)); sizeof(pwctl.ifname));
pwctl.pwid = pw->pwid; pwctl.pwid = pw->pwid;
pwctl.lsr_id = pw->lsr_id; pwctl.lsr_id = pw->lsr_id;
if (pw->local_status == PW_FORWARDING && if (pw->enabled &&
pw->local_status == PW_FORWARDING &&
pw->remote_status == PW_FORWARDING) pw->remote_status == PW_FORWARDING)
pwctl.status = 1; pwctl.status = 1;

View File

@ -767,11 +767,12 @@ lde_send_change_klabel(struct fec_node *fn, struct fec_nh *fnh)
sizeof(kr)); sizeof(kr));
break; break;
case FEC_TYPE_PWID: case FEC_TYPE_PWID:
if (fn->local_label == NO_LABEL || pw = (struct l2vpn_pw *) fn->data;
if (!pw || fn->local_label == NO_LABEL ||
fnh->remote_label == NO_LABEL) fnh->remote_label == NO_LABEL)
return; return;
pw = (struct l2vpn_pw *) fn->data; pw->enabled = true;
pw2zpw(pw, &zpw); pw2zpw(pw, &zpw);
zpw.local_label = fn->local_label; zpw.local_label = fn->local_label;
zpw.remote_label = fnh->remote_label; zpw.remote_label = fnh->remote_label;
@ -818,6 +819,10 @@ lde_send_delete_klabel(struct fec_node *fn, struct fec_nh *fnh)
break; break;
case FEC_TYPE_PWID: case FEC_TYPE_PWID:
pw = (struct l2vpn_pw *) fn->data; pw = (struct l2vpn_pw *) fn->data;
if (!pw)
return;
pw->enabled = false;
pw2zpw(pw, &zpw); pw2zpw(pw, &zpw);
zpw.local_label = fn->local_label; zpw.local_label = fn->local_label;
zpw.remote_label = fnh->remote_label; zpw.remote_label = fnh->remote_label;

View File

@ -450,18 +450,38 @@ ldp_zebra_read_route(int command, struct zclient *zclient, zebra_size_t length,
/* loop through all the nexthops */ /* loop through all the nexthops */
for (i = 0; i < api.nexthop_num; i++) { for (i = 0; i < api.nexthop_num; i++) {
api_nh = &api.nexthops[i]; api_nh = &api.nexthops[i];
switch (api_nh->type) {
switch (kr.af) { case NEXTHOP_TYPE_IPV4:
case AF_INET: if (kr.af != AF_INET)
continue;
kr.nexthop.v4 = api_nh->gate.ipv4; kr.nexthop.v4 = api_nh->gate.ipv4;
kr.ifindex = 0;
break; break;
case AF_INET6: case NEXTHOP_TYPE_IPV4_IFINDEX:
if (kr.af != AF_INET)
continue;
kr.nexthop.v4 = api_nh->gate.ipv4;
kr.ifindex = api_nh->ifindex;
break;
case NEXTHOP_TYPE_IPV6:
if (kr.af != AF_INET6)
continue;
kr.nexthop.v6 = api_nh->gate.ipv6; kr.nexthop.v6 = api_nh->gate.ipv6;
kr.ifindex = 0;
break;
case NEXTHOP_TYPE_IPV6_IFINDEX:
if (kr.af != AF_INET6)
continue;
kr.nexthop.v6 = api_nh->gate.ipv6;
kr.ifindex = api_nh->ifindex;
break;
case NEXTHOP_TYPE_IFINDEX:
if (!(kr.flags & F_CONNECTED))
continue;
break; break;
default: default:
break; continue;
} }
kr.ifindex = api_nh->ifindex;;
debug_zebra_in("route %s %s/%d nexthop %s ifindex %u (%s)", debug_zebra_in("route %s %s/%d nexthop %s ifindex %u (%s)",
(add) ? "add" : "delete", log_addr(kr.af, &kr.prefix), (add) ? "add" : "delete", log_addr(kr.af, &kr.prefix),

View File

@ -409,6 +409,7 @@ struct l2vpn_pw {
uint32_t pwid; uint32_t pwid;
char ifname[IF_NAMESIZE]; char ifname[IF_NAMESIZE];
unsigned int ifindex; unsigned int ifindex;
bool enabled;
uint32_t remote_group; uint32_t remote_group;
uint16_t remote_mtu; uint16_t remote_mtu;
uint32_t local_status; uint32_t local_status;

View File

@ -73,7 +73,7 @@ struct zebra_pw *zebra_pw_add(struct zebra_vrf *zvrf, const char *ifname,
pw->protocol = protocol; pw->protocol = protocol;
pw->vrf_id = zvrf_id(zvrf); pw->vrf_id = zvrf_id(zvrf);
pw->client = client; pw->client = client;
pw->status = PW_STATUS_UP; pw->status = PW_STATUS_DOWN;
pw->local_label = MPLS_NO_LABEL; pw->local_label = MPLS_NO_LABEL;
pw->remote_label = MPLS_NO_LABEL; pw->remote_label = MPLS_NO_LABEL;
pw->flags = F_PSEUDOWIRE_CWORD; pw->flags = F_PSEUDOWIRE_CWORD;