mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-07-27 10:04:18 +00:00
Merge pull request #432 from opensourcerouting/ldpd-link-detect
ldpd: respect link-detect configuration
This commit is contained in:
commit
cae31a9fe0
@ -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);
|
||||||
|
@ -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) {
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user