summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.sbin/ldpd/hello.c18
-rw-r--r--usr.sbin/ldpd/ldpd.h3
-rw-r--r--usr.sbin/ldpd/ldpe.c3
-rw-r--r--usr.sbin/ldpd/ldpe.h3
-rw-r--r--usr.sbin/ldpd/neighbor.c3
5 files changed, 23 insertions, 7 deletions
diff --git a/usr.sbin/ldpd/hello.c b/usr.sbin/ldpd/hello.c
index c8ae8d205b3..42278036f89 100644
--- a/usr.sbin/ldpd/hello.c
+++ b/usr.sbin/ldpd/hello.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: hello.c,v 1.48 2016/06/13 20:13:34 renato Exp $ */
+/* $OpenBSD: hello.c,v 1.49 2016/06/13 23:01:37 renato Exp $ */
/*
* Copyright (c) 2013, 2016 Renato Westphal <renato@openbsd.org>
@@ -88,6 +88,7 @@ send_hello(enum hello_type type, struct iface_af *ia, struct tnbr *tnbr)
default:
fatalx("send_hello: unknown af");
}
+ size += sizeof(struct hello_prms_opt4_tlv);
if (ldp_is_dual_stack(leconf))
size += sizeof(struct hello_prms_opt4_tlv);
@@ -119,6 +120,9 @@ send_hello(enum hello_type type, struct iface_af *ia, struct tnbr *tnbr)
fatalx("send_hello: unknown af");
}
+ gen_opt4_hello_prms_tlv(buf, TLV_TYPE_CONFIG,
+ htonl(global.conf_seqnum));
+
/*
* RFC 7552 - Section 6.1.1:
* "A Dual-stack LSR (i.e., an LSR supporting Dual-stack LDP for a peer)
@@ -145,7 +149,7 @@ recv_hello(struct in_addr lsr_id, struct ldp_msg *lm, int af,
int ds_tlv;
union ldpd_addr trans_addr;
uint32_t scope_id = 0;
- uint32_t conf_number;
+ uint32_t conf_seqnum;
uint16_t trans_pref;
int r;
struct hello_source source;
@@ -178,7 +182,7 @@ recv_hello(struct in_addr lsr_id, struct ldp_msg *lm, int af,
len -= r;
r = tlv_decode_opt_hello_prms(buf, len, &tlvs_rcvd, af, &trans_addr,
- &conf_number, &trans_pref);
+ &conf_seqnum, &trans_pref);
if (r == -1) {
log_debug("%s: lsr-id %s: failed to decode optional params",
__func__, inet_ntoa(lsr_id));
@@ -353,6 +357,14 @@ recv_hello(struct in_addr lsr_id, struct ldp_msg *lm, int af,
(trans_pref == DUAL_STACK_LDPOV6 && af != AF_INET6))))
nbr = nbr_new(lsr_id, af, ds_tlv, &trans_addr, scope_id);
+ /* update neighbor's configuration sequence number */
+ if (nbr && (tlvs_rcvd & F_HELLO_TLV_RCVD_CONF)) {
+ if (conf_seqnum > nbr->conf_seqnum &&
+ nbr_pending_idtimer(nbr))
+ nbr_stop_idtimer(nbr);
+ nbr->conf_seqnum = conf_seqnum;
+ }
+
/* always update the holdtime to properly handle runtime changes */
switch (source.type) {
case HELLO_LINK:
diff --git a/usr.sbin/ldpd/ldpd.h b/usr.sbin/ldpd/ldpd.h
index b02eab3c013..3c59cc19783 100644
--- a/usr.sbin/ldpd/ldpd.h
+++ b/usr.sbin/ldpd/ldpd.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: ldpd.h,v 1.76 2016/05/23 19:20:55 renato Exp $ */
+/* $OpenBSD: ldpd.h,v 1.77 2016/06/13 23:01:37 renato Exp $ */
/*
* Copyright (c) 2013, 2016 Renato Westphal <renato@openbsd.org>
@@ -396,6 +396,7 @@ struct ldpd_global {
time_t uptime;
struct ldpd_af_global ipv4;
struct ldpd_af_global ipv6;
+ uint32_t conf_seqnum;
int pfkeysock;
struct if_addr_head addr_list;
LIST_HEAD(, adj) adj_list;
diff --git a/usr.sbin/ldpd/ldpe.c b/usr.sbin/ldpd/ldpe.c
index 50b051d277f..51fe0b9b864 100644
--- a/usr.sbin/ldpd/ldpe.c
+++ b/usr.sbin/ldpd/ldpe.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ldpe.c,v 1.65 2016/06/13 20:15:58 renato Exp $ */
+/* $OpenBSD: ldpe.c,v 1.66 2016/06/13 23:01:37 renato Exp $ */
/*
* Copyright (c) 2013, 2016 Renato Westphal <renato@openbsd.org>
@@ -438,6 +438,7 @@ ldpe_dispatch_main(int fd, short event, void *bula)
case IMSG_RECONF_END:
merge_config(leconf, nconf);
nconf = NULL;
+ global.conf_seqnum++;
break;
case IMSG_CTL_KROUTE:
case IMSG_CTL_KROUTE_ADDR:
diff --git a/usr.sbin/ldpd/ldpe.h b/usr.sbin/ldpd/ldpe.h
index 62341870b52..dfdb19f3a99 100644
--- a/usr.sbin/ldpd/ldpe.h
+++ b/usr.sbin/ldpd/ldpe.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: ldpe.h,v 1.60 2016/06/13 20:19:40 renato Exp $ */
+/* $OpenBSD: ldpe.h,v 1.61 2016/06/13 23:01:37 renato Exp $ */
/*
* Copyright (c) 2013, 2016 Renato Westphal <renato@openbsd.org>
@@ -89,6 +89,7 @@ struct nbr {
time_t uptime;
int fd;
int state;
+ uint32_t conf_seqnum;
int idtimer_cnt;
uint16_t keepalive;
uint16_t max_pdu_len;
diff --git a/usr.sbin/ldpd/neighbor.c b/usr.sbin/ldpd/neighbor.c
index 4b607c0ce3f..8f8cf4fe003 100644
--- a/usr.sbin/ldpd/neighbor.c
+++ b/usr.sbin/ldpd/neighbor.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: neighbor.c,v 1.73 2016/06/13 20:19:40 renato Exp $ */
+/* $OpenBSD: neighbor.c,v 1.74 2016/06/13 23:01:37 renato Exp $ */
/*
* Copyright (c) 2013, 2016 Renato Westphal <renato@openbsd.org>
@@ -244,6 +244,7 @@ nbr_new(struct in_addr id, int af, int ds_tlv, union ldpd_addr *addr,
nbr->laddr = (ldp_af_conf_get(leconf, af))->trans_addr;
nbr->raddr = *addr;
nbr->raddr_scope = scope_id;
+ nbr->conf_seqnum = 0;
LIST_FOREACH(adj, &global.adj_list, global_entry) {
if (adj->lsr_id.s_addr == nbr->id.s_addr) {