Merge pull request #432 from opensourcerouting/ldpd-link-detect

ldpd: respect link-detect configuration
This commit is contained in:
Donald Sharp 2017-05-01 14:17:14 -04:00 committed by GitHub
commit cae31a9fe0
4 changed files with 16 additions and 22 deletions

View File

@ -31,7 +31,7 @@ static struct if_addr *if_addr_new(struct kaddr *);
static struct if_addr *if_addr_lookup(struct if_addr_head *, struct kaddr *); static struct if_addr *if_addr_lookup(struct if_addr_head *, struct kaddr *);
static int if_start(struct iface *, int); static int if_start(struct iface *, int);
static int if_reset(struct iface *, int); static int if_reset(struct iface *, int);
static void if_update_af(struct iface_af *, int); static void if_update_af(struct iface_af *);
static int if_hello_timer(struct thread *); static int if_hello_timer(struct thread *);
static void if_start_hello_timer(struct iface_af *); static void if_start_hello_timer(struct iface_af *);
static void if_stop_hello_timer(struct iface_af *); static void if_stop_hello_timer(struct iface_af *);
@ -139,7 +139,7 @@ if_update_info(struct iface *iface, struct kif *kif)
/* get index and flags */ /* get index and flags */
iface->ifindex = kif->ifindex; iface->ifindex = kif->ifindex;
iface->flags = kif->flags; iface->operative = kif->operative;
} }
struct iface_af * struct iface_af *
@ -325,7 +325,7 @@ if_reset(struct iface *iface, int af)
} }
static void static void
if_update_af(struct iface_af *ia, int link_ok) if_update_af(struct iface_af *ia)
{ {
int addr_ok = 0, socket_ok, rtr_id_ok; int addr_ok = 0, socket_ok, rtr_id_ok;
struct if_addr *if_addr; struct if_addr *if_addr;
@ -363,14 +363,15 @@ if_update_af(struct iface_af *ia, int link_ok)
rtr_id_ok = 0; rtr_id_ok = 0;
if (ia->state == IF_STA_DOWN) { if (ia->state == IF_STA_DOWN) {
if (!ia->enabled || !link_ok || !addr_ok || !socket_ok || if (!ia->enabled || !ia->iface->operative || !addr_ok ||
!rtr_id_ok) !socket_ok || !rtr_id_ok)
return; return;
ia->state = IF_STA_ACTIVE; ia->state = IF_STA_ACTIVE;
if_start(ia->iface, ia->af); if_start(ia->iface, ia->af);
} else if (ia->state == IF_STA_ACTIVE) { } else if (ia->state == IF_STA_ACTIVE) {
if (ia->enabled && link_ok && addr_ok && socket_ok && rtr_id_ok) if (ia->enabled && ia->iface->operative && addr_ok &&
socket_ok && rtr_id_ok)
return; return;
ia->state = IF_STA_DOWN; ia->state = IF_STA_DOWN;
@ -381,14 +382,10 @@ if_update_af(struct iface_af *ia, int link_ok)
void void
ldp_if_update(struct iface *iface, int af) ldp_if_update(struct iface *iface, int af)
{ {
int link_ok;
link_ok = (iface->flags & IFF_UP) && (iface->flags & IFF_RUNNING);
if (af == AF_INET || af == AF_UNSPEC) if (af == AF_INET || af == AF_UNSPEC)
if_update_af(&iface->ipv4, link_ok); if_update_af(&iface->ipv4);
if (af == AF_INET6 || af == AF_UNSPEC) if (af == AF_INET6 || af == AF_UNSPEC)
if_update_af(&iface->ipv6, link_ok); if_update_af(&iface->ipv6);
} }
void void
@ -463,7 +460,6 @@ if_to_ctl(struct iface_af *ia)
memcpy(ictl.name, ia->iface->name, sizeof(ictl.name)); memcpy(ictl.name, ia->iface->name, sizeof(ictl.name));
ictl.ifindex = ia->iface->ifindex; ictl.ifindex = ia->iface->ifindex;
ictl.state = ia->state; ictl.state = ia->state;
ictl.flags = ia->iface->flags;
ictl.type = ia->iface->type; ictl.type = ia->iface->type;
ictl.hello_holdtime = if_get_hello_holdtime(ia); ictl.hello_holdtime = if_get_hello_holdtime(ia);
ictl.hello_interval = if_get_hello_interval(ia); ictl.hello_interval = if_get_hello_interval(ia);

View File

@ -142,7 +142,7 @@ void
l2vpn_if_update_info(struct l2vpn_if *lif, struct kif *kif) l2vpn_if_update_info(struct l2vpn_if *lif, struct kif *kif)
{ {
lif->ifindex = kif->ifindex; lif->ifindex = kif->ifindex;
lif->flags = kif->flags; lif->operative = kif->operative;
memcpy(lif->mac, kif->mac, sizeof(lif->mac)); memcpy(lif->mac, kif->mac, sizeof(lif->mac));
} }
@ -154,7 +154,7 @@ l2vpn_if_update(struct l2vpn_if *lif)
struct map fec; struct map fec;
struct nbr *nbr; struct nbr *nbr;
if ((lif->flags & IFF_UP) && (lif->flags & IFF_RUNNING)) if (lif->operative)
return; return;
RB_FOREACH(pw, l2vpn_pw_head, &l2vpn->pw_tree) { RB_FOREACH(pw, l2vpn_pw_head, &l2vpn->pw_tree) {

View File

@ -64,7 +64,7 @@ ifp2kif(struct interface *ifp, struct kif *kif)
memset(kif, 0, sizeof(*kif)); memset(kif, 0, sizeof(*kif));
strlcpy(kif->ifname, ifp->name, sizeof(kif->ifname)); strlcpy(kif->ifname, ifp->name, sizeof(kif->ifname));
kif->ifindex = ifp->ifindex; kif->ifindex = ifp->ifindex;
kif->flags = ifp->flags; kif->operative = if_is_operative(ifp);
if (ifp->ll_type == ZEBRA_LLT_ETHER) if (ifp->ll_type == ZEBRA_LLT_ETHER)
memcpy(kif->mac, ifp->hw_addr, ETHER_ADDR_LEN); memcpy(kif->mac, ifp->hw_addr, ETHER_ADDR_LEN);
} }
@ -257,7 +257,6 @@ ldp_interface_status_change(int command, struct zclient *zclient,
struct connected *ifc; struct connected *ifc;
struct kif kif; struct kif kif;
struct kaddr ka; struct kaddr ka;
int link_new;
/* /*
* zebra_interface_state_read() updates interface structure in * zebra_interface_state_read() updates interface structure in
@ -272,8 +271,7 @@ ldp_interface_status_change(int command, struct zclient *zclient,
ifp2kif(ifp, &kif); ifp2kif(ifp, &kif);
main_imsg_compose_both(IMSG_IFSTATUS, &kif, sizeof(kif)); main_imsg_compose_both(IMSG_IFSTATUS, &kif, sizeof(kif));
link_new = (ifp->flags & IFF_UP) && (ifp->flags & IFF_RUNNING); if (if_is_operative(ifp)) {
if (link_new) {
for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, ifc)) { for (ALL_LIST_ELEMENTS_RO(ifp->connected, node, ifc)) {
ifc2kaddr(ifp, ifc, &ka); ifc2kaddr(ifp, ifc, &ka);
main_imsg_compose_ldpe(IMSG_NEWADDR, 0, &ka, main_imsg_compose_ldpe(IMSG_NEWADDR, 0, &ka,

View File

@ -298,7 +298,7 @@ struct iface {
struct if_addr_head addr_list; struct if_addr_head addr_list;
struct in6_addr linklocal; struct in6_addr linklocal;
enum iface_type type; enum iface_type type;
uint16_t flags; int operative;
struct iface_af ipv4; struct iface_af ipv4;
struct iface_af ipv6; struct iface_af ipv6;
QOBJ_FIELDS QOBJ_FIELDS
@ -380,7 +380,7 @@ struct l2vpn_if {
struct l2vpn *l2vpn; struct l2vpn *l2vpn;
char ifname[IF_NAMESIZE]; char ifname[IF_NAMESIZE];
unsigned int ifindex; unsigned int ifindex;
uint16_t flags; int operative;
uint8_t mac[ETHER_ADDR_LEN]; uint8_t mac[ETHER_ADDR_LEN];
QOBJ_FIELDS QOBJ_FIELDS
}; };
@ -552,6 +552,7 @@ struct kif {
char ifname[IF_NAMESIZE]; char ifname[IF_NAMESIZE];
unsigned short ifindex; unsigned short ifindex;
int flags; int flags;
int operative;
uint8_t mac[ETHER_ADDR_LEN]; uint8_t mac[ETHER_ADDR_LEN];
int mtu; int mtu;
}; };
@ -569,7 +570,6 @@ struct ctl_iface {
char name[IF_NAMESIZE]; char name[IF_NAMESIZE];
unsigned int ifindex; unsigned int ifindex;
int state; int state;
uint16_t flags;
enum iface_type type; enum iface_type type;
uint16_t hello_holdtime; uint16_t hello_holdtime;
uint16_t hello_interval; uint16_t hello_interval;