summaryrefslogtreecommitdiff
path: root/usr.sbin/eigrpd
diff options
context:
space:
mode:
authorRenato Westphal <renato@cvs.openbsd.org>2015-10-05 01:59:34 +0000
committerRenato Westphal <renato@cvs.openbsd.org>2015-10-05 01:59:34 +0000
commit2a26a16179c6f1f78ed5298704d0ea56585df541 (patch)
tree69699760c61c0ed913bfb5330aa5412fa54e9905 /usr.sbin/eigrpd
parent767311b3a231c0d330c10ec8eab112926394912a (diff)
When the SIA state is declared for a given destination, reset the
adjacency with the unresponsive neighbor(s).
Diffstat (limited to 'usr.sbin/eigrpd')
-rw-r--r--usr.sbin/eigrpd/eigrpe.c13
-rw-r--r--usr.sbin/eigrpd/eigrpe.h8
-rw-r--r--usr.sbin/eigrpd/hello.c8
-rw-r--r--usr.sbin/eigrpd/interface.c4
-rw-r--r--usr.sbin/eigrpd/rde.c10
-rw-r--r--usr.sbin/eigrpd/rde.h4
-rw-r--r--usr.sbin/eigrpd/rde_dual.c12
-rw-r--r--usr.sbin/eigrpd/rtp.c4
-rw-r--r--usr.sbin/eigrpd/tlv.c14
9 files changed, 51 insertions, 26 deletions
diff --git a/usr.sbin/eigrpd/eigrpe.c b/usr.sbin/eigrpd/eigrpe.c
index 8370655a86c..e5c3a249914 100644
--- a/usr.sbin/eigrpd/eigrpe.c
+++ b/usr.sbin/eigrpd/eigrpe.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: eigrpe.c,v 1.2 2015/10/04 23:00:10 renato Exp $ */
+/* $OpenBSD: eigrpe.c,v 1.3 2015/10/05 01:59:33 renato Exp $ */
/*
* Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
@@ -533,6 +533,17 @@ eigrpe_dispatch_rde(int fd, short event, void *bula)
break;
}
break;
+ case IMSG_NEIGHBOR_DOWN:
+ nbr = nbr_find_peerid(imsg.hdr.peerid);
+ if (nbr == NULL) {
+ log_debug("%s: cannot find rde neighbor",
+ __func__);
+ break;
+ }
+ /* announce that this neighborship is dead */
+ send_hello(nbr->ei, NULL, 0, 1);
+ nbr_del(nbr);
+ break;
case IMSG_CTL_SHOW_TOPOLOGY:
case IMSG_CTL_END:
control_imsg_relay(&imsg);
diff --git a/usr.sbin/eigrpd/eigrpe.h b/usr.sbin/eigrpd/eigrpe.h
index ea773ed58f7..434c26d6159 100644
--- a/usr.sbin/eigrpd/eigrpe.h
+++ b/usr.sbin/eigrpd/eigrpe.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: eigrpe.h,v 1.2 2015/10/04 23:08:57 renato Exp $ */
+/* $OpenBSD: eigrpe.h,v 1.3 2015/10/05 01:59:33 renato Exp $ */
/*
* Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
@@ -159,7 +159,8 @@ void recv_packet_v4(int, short, void *);
void recv_packet_v6(int, short, void *);
/* tlv.c */
-int gen_parameter_tlv(struct ibuf *, struct eigrp_iface *);
+int gen_parameter_tlv(struct ibuf *, struct eigrp_iface *,
+ int);
int gen_sequence_tlv(struct ibuf *,
struct seq_addr_head *);
int gen_sw_version_tlv(struct ibuf *);
@@ -177,7 +178,8 @@ void metric_encode_mtu(uint8_t *, int);
int metric_decode_mtu(uint8_t *);
/* hello.c */
-void send_hello(struct eigrp_iface *, struct seq_addr_head *, uint32_t);
+void send_hello(struct eigrp_iface *, struct seq_addr_head *, uint32_t,
+ int);
void recv_hello(struct eigrp_iface *, union eigrpd_addr *, struct nbr *,
struct tlv_parameter *);
diff --git a/usr.sbin/eigrpd/hello.c b/usr.sbin/eigrpd/hello.c
index 401e5b4f6b2..c422cdfe21f 100644
--- a/usr.sbin/eigrpd/hello.c
+++ b/usr.sbin/eigrpd/hello.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: hello.c,v 1.1 2015/10/02 04:26:47 renato Exp $ */
+/* $OpenBSD: hello.c,v 1.2 2015/10/05 01:59:33 renato Exp $ */
/*
* Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
@@ -28,7 +28,7 @@
void
send_hello(struct eigrp_iface *ei, struct seq_addr_head *seq_addr_list,
- uint32_t mcast_seq)
+ uint32_t mcast_seq, int peerterm)
{
struct eigrp *eigrp = ei->eigrp;
struct ibuf *buf;
@@ -42,7 +42,7 @@ send_hello(struct eigrp_iface *ei, struct seq_addr_head *seq_addr_list,
if (gen_eigrp_hdr(buf, EIGRP_OPC_HELLO, flags, 0, eigrp->as))
goto fail;
- if (gen_parameter_tlv(buf, ei))
+ if (gen_parameter_tlv(buf, ei, peerterm))
goto fail;
if (gen_sw_version_tlv(buf))
@@ -95,7 +95,7 @@ recv_hello(struct eigrp_iface *ei, union eigrpd_addr *src, struct nbr *nbr,
nbr = nbr_new(ei, src, ntohs(tp->holdtime), 0);
/* send an expedited hello */
- send_hello(ei, NULL, 0);
+ send_hello(ei, NULL, 0, 0);
send_update(nbr->ei, nbr, EIGRP_HDR_FLAG_INIT, 0, NULL);
}
diff --git a/usr.sbin/eigrpd/interface.c b/usr.sbin/eigrpd/interface.c
index db0e6dfc708..b7f4bec0dba 100644
--- a/usr.sbin/eigrpd/interface.c
+++ b/usr.sbin/eigrpd/interface.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: interface.c,v 1.2 2015/10/04 23:00:10 renato Exp $ */
+/* $OpenBSD: interface.c,v 1.3 2015/10/05 01:59:33 renato Exp $ */
/*
* Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
@@ -431,7 +431,7 @@ eigrp_if_hello_timer(int fd, short event, void *arg)
struct eigrp_iface *ei = arg;
struct timeval tv;
- send_hello(ei, NULL, 0);
+ send_hello(ei, NULL, 0, 0);
/* reschedule hello_timer */
timerclear(&tv);
diff --git a/usr.sbin/eigrpd/rde.c b/usr.sbin/eigrpd/rde.c
index 1e142ab7165..704231af6fe 100644
--- a/usr.sbin/eigrpd/rde.c
+++ b/usr.sbin/eigrpd/rde.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rde.c,v 1.2 2015/10/04 23:00:10 renato Exp $ */
+/* $OpenBSD: rde.c,v 1.3 2015/10/05 01:59:33 renato Exp $ */
/*
* Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
@@ -241,7 +241,7 @@ rde_dispatch_imsg(int fd, short event, void *bula)
rde_check_link_down_nbr(nbr);
rde_flush_queries();
- rde_nbr_del(rde_nbr_find(imsg.hdr.peerid));
+ rde_nbr_del(rde_nbr_find(imsg.hdr.peerid), 0);
break;
case IMSG_RECV_UPDATE_INIT:
nbr = rde_nbr_find(imsg.hdr.peerid);
@@ -473,9 +473,9 @@ rde_instance_del(struct eigrp *eigrp)
/* clear nbrs */
RB_FOREACH_SAFE(nbr, rde_nbr_head, &rde_nbrs, safe)
if (nbr->eigrp == eigrp)
- rde_nbr_del(nbr);
- rde_nbr_del(eigrp->rnbr_redist);
- rde_nbr_del(eigrp->rnbr_summary);
+ rde_nbr_del(nbr, 0);
+ rde_nbr_del(eigrp->rnbr_redist, 0);
+ rde_nbr_del(eigrp->rnbr_summary, 0);
free(eigrp);
}
diff --git a/usr.sbin/eigrpd/rde.h b/usr.sbin/eigrpd/rde.h
index ba491a53142..47adebb642f 100644
--- a/usr.sbin/eigrpd/rde.h
+++ b/usr.sbin/eigrpd/rde.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: rde.h,v 1.1 2015/10/02 04:26:47 renato Exp $ */
+/* $OpenBSD: rde.h,v 1.2 2015/10/05 01:59:33 renato Exp $ */
/*
* Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
@@ -140,7 +140,7 @@ void rt_dump(struct ctl_show_topology_req *, pid_t);
/* rde_nbr.c */
struct rde_nbr *rde_nbr_find(uint32_t);
struct rde_nbr *rde_nbr_new(uint32_t, struct rde_nbr *);
-void rde_nbr_del(struct rde_nbr *);
+void rde_nbr_del(struct rde_nbr *, int);
/* rde_dual.c */
int dual_fsm(struct rt_node *, enum dual_event);
diff --git a/usr.sbin/eigrpd/rde_dual.c b/usr.sbin/eigrpd/rde_dual.c
index c49efbf3d3f..a397669233f 100644
--- a/usr.sbin/eigrpd/rde_dual.c
+++ b/usr.sbin/eigrpd/rde_dual.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rde_dual.c,v 1.3 2015/10/04 23:00:10 renato Exp $ */
+/* $OpenBSD: rde_dual.c,v 1.4 2015/10/05 01:59:33 renato Exp $ */
/*
* Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
@@ -434,7 +434,7 @@ reply_active_timer(int fd, short event, void *arg)
log_debug("%s: neighbor %s is stuck in active",
log_addr(nbr->eigrp->af, &nbr->addr));
- rde_nbr_del(reply->nbr);
+ rde_nbr_del(reply->nbr, 1);
}
void
@@ -475,7 +475,7 @@ reply_sia_timer(int fd, short event, void *arg)
if (reply->siaquery_sent > 0 && reply->siareply_recv == 0) {
log_debug("%s: neighbor %s is stuck in active",
log_addr(nbr->eigrp->af, &nbr->addr));
- rde_nbr_del(nbr);
+ rde_nbr_del(nbr, 1);
return;
}
@@ -1239,10 +1239,14 @@ rde_nbr_new(uint32_t peerid, struct rde_nbr *new)
}
void
-rde_nbr_del(struct rde_nbr *nbr)
+rde_nbr_del(struct rde_nbr *nbr, int send_peerterm)
{
struct reply_node *reply;
+ if (send_peerterm)
+ rde_imsg_compose_eigrpe(IMSG_NEIGHBOR_DOWN, nbr->peerid,
+ 0, NULL, 0);
+
while((reply = TAILQ_FIRST(&nbr->rijk)) != NULL)
reply_outstanding_remove(reply);
diff --git a/usr.sbin/eigrpd/rtp.c b/usr.sbin/eigrpd/rtp.c
index 556da6bb6f9..a11cbaf20a5 100644
--- a/usr.sbin/eigrpd/rtp.c
+++ b/usr.sbin/eigrpd/rtp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rtp.c,v 1.1 2015/10/02 04:26:47 renato Exp $ */
+/* $OpenBSD: rtp.c,v 1.2 2015/10/05 01:59:33 renato Exp $ */
/*
* Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
@@ -192,7 +192,7 @@ rtp_send_mcast(struct eigrp_iface *ei, struct ibuf *buf)
TAILQ_INSERT_TAIL(&seq_addr_list, sa, entry);
}
- send_hello(ei, &seq_addr_list, eigrp->seq_num);
+ send_hello(ei, &seq_addr_list, eigrp->seq_num, 0);
seq_addr_list_clr(&seq_addr_list);
}
send_packet(ei, NULL, flags, buf);
diff --git a/usr.sbin/eigrpd/tlv.c b/usr.sbin/eigrpd/tlv.c
index c6670752da1..54953366378 100644
--- a/usr.sbin/eigrpd/tlv.c
+++ b/usr.sbin/eigrpd/tlv.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tlv.c,v 1.3 2015/10/04 23:08:57 renato Exp $ */
+/* $OpenBSD: tlv.c,v 1.4 2015/10/05 01:59:33 renato Exp $ */
/*
* Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
@@ -29,13 +29,21 @@
#include "eigrpe.h"
int
-gen_parameter_tlv(struct ibuf *buf, struct eigrp_iface *ei)
+gen_parameter_tlv(struct ibuf *buf, struct eigrp_iface *ei, int peerterm)
{
struct tlv_parameter tp;
tp.type = htons(TLV_TYPE_PARAMETER);
tp.length = htons(TLV_TYPE_PARAMETER_LEN);
- memcpy(tp.kvalues, ei->eigrp->kvalues, 6);
+ if (peerterm) {
+ tp.kvalues[0] = 255;
+ tp.kvalues[1] = 255;
+ tp.kvalues[2] = 255;
+ tp.kvalues[3] = 255;
+ tp.kvalues[4] = 255;
+ tp.kvalues[5] = 0;
+ } else
+ memcpy(tp.kvalues, ei->eigrp->kvalues, 6);
tp.holdtime = htons(ei->hello_holdtime);
return (ibuf_add(buf, &tp, sizeof(tp)));