diff options
author | Renato Westphal <renato@cvs.openbsd.org> | 2016-01-15 12:36:42 +0000 |
---|---|---|
committer | Renato Westphal <renato@cvs.openbsd.org> | 2016-01-15 12:36:42 +0000 |
commit | 5b3c09374d9d177f39604e370a448ce925336710 (patch) | |
tree | 608e129048d36b7dd098223df7c2ded198ca7162 /usr.sbin/eigrpd | |
parent | cdef30eca1ef68efc4b5bc6abcbf706b01f1ee94 (diff) |
Add support for manually clearing neighbors.
Diffstat (limited to 'usr.sbin/eigrpd')
-rw-r--r-- | usr.sbin/eigrpd/control.c | 9 | ||||
-rw-r--r-- | usr.sbin/eigrpd/eigrpd.h | 3 | ||||
-rw-r--r-- | usr.sbin/eigrpd/eigrpe.c | 4 | ||||
-rw-r--r-- | usr.sbin/eigrpd/eigrpe.h | 7 | ||||
-rw-r--r-- | usr.sbin/eigrpd/hello.c | 36 | ||||
-rw-r--r-- | usr.sbin/eigrpd/interface.c | 4 | ||||
-rw-r--r-- | usr.sbin/eigrpd/neighbor.c | 29 | ||||
-rw-r--r-- | usr.sbin/eigrpd/rde_dual.c | 6 | ||||
-rw-r--r-- | usr.sbin/eigrpd/rtp.c | 4 |
9 files changed, 83 insertions, 19 deletions
diff --git a/usr.sbin/eigrpd/control.c b/usr.sbin/eigrpd/control.c index ff5a1f03bd1..1b1e08f951a 100644 --- a/usr.sbin/eigrpd/control.c +++ b/usr.sbin/eigrpd/control.c @@ -1,4 +1,4 @@ -/* $OpenBSD: control.c,v 1.3 2015/12/13 18:55:53 renato Exp $ */ +/* $OpenBSD: control.c,v 1.4 2016/01/15 12:36:41 renato Exp $ */ /* * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> @@ -281,6 +281,13 @@ control_dispatch_imsg(int fd, short event, void *bula) case IMSG_CTL_SHOW_STATS: eigrpe_stats_ctl(c); break; + case IMSG_CTL_CLEAR_NBR: + if (imsg.hdr.len != IMSG_HEADER_SIZE + + sizeof(struct ctl_nbr)) + break; + + nbr_clear_ctl(imsg.data); + break; case IMSG_CTL_LOG_VERBOSE: if (imsg.hdr.len != IMSG_HEADER_SIZE + sizeof(verbose)) diff --git a/usr.sbin/eigrpd/eigrpd.h b/usr.sbin/eigrpd/eigrpd.h index a2d1db7dae8..dd4bc9f3fef 100644 --- a/usr.sbin/eigrpd/eigrpd.h +++ b/usr.sbin/eigrpd/eigrpd.h @@ -1,4 +1,4 @@ -/* $OpenBSD: eigrpd.h,v 1.6 2015/12/13 18:55:53 renato Exp $ */ +/* $OpenBSD: eigrpd.h,v 1.7 2016/01/15 12:36:41 renato Exp $ */ /* * Copyright (c) 2015 Renato Westphal <renato@openbsd.org> @@ -72,6 +72,7 @@ enum imsg_type { IMSG_CTL_SHOW_NBR, IMSG_CTL_SHOW_TOPOLOGY, IMSG_CTL_SHOW_STATS, + IMSG_CTL_CLEAR_NBR, IMSG_CTL_FIB_COUPLE, IMSG_CTL_FIB_DECOUPLE, IMSG_CTL_IFACE, diff --git a/usr.sbin/eigrpd/eigrpe.c b/usr.sbin/eigrpd/eigrpe.c index 1955558ed69..577c2191afb 100644 --- a/usr.sbin/eigrpd/eigrpe.c +++ b/usr.sbin/eigrpd/eigrpe.c @@ -1,4 +1,4 @@ -/* $OpenBSD: eigrpe.c,v 1.11 2016/01/15 12:32:34 renato Exp $ */ +/* $OpenBSD: eigrpe.c,v 1.12 2016/01/15 12:36:41 renato Exp $ */ /* * Copyright (c) 2015 Renato Westphal <renato@openbsd.org> @@ -545,7 +545,7 @@ eigrpe_dispatch_rde(int fd, short event, void *bula) break; } /* announce that this neighborship is dead */ - send_hello(nbr->ei, NULL, 0, 1); + send_peerterm(nbr); nbr_del(nbr); break; case IMSG_CTL_SHOW_TOPOLOGY: diff --git a/usr.sbin/eigrpd/eigrpe.h b/usr.sbin/eigrpd/eigrpe.h index e142ea89d92..a021983330a 100644 --- a/usr.sbin/eigrpd/eigrpe.h +++ b/usr.sbin/eigrpd/eigrpe.h @@ -1,4 +1,4 @@ -/* $OpenBSD: eigrpe.h,v 1.6 2016/01/15 12:32:34 renato Exp $ */ +/* $OpenBSD: eigrpe.h,v 1.7 2016/01/15 12:36:41 renato Exp $ */ /* * Copyright (c) 2015 Renato Westphal <renato@openbsd.org> @@ -130,6 +130,7 @@ void nbr_update_peerid(struct nbr *); struct nbr *nbr_find(struct eigrp_iface *, union eigrpd_addr *); struct nbr *nbr_find_peerid(uint32_t); struct ctl_nbr *nbr_to_ctl(struct nbr *); +void nbr_clear_ctl(struct ctl_nbr *); void nbr_timeout(int, short, void *); void nbr_start_timeout(struct nbr *); void nbr_stop_timeout(struct nbr *); @@ -179,8 +180,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, - int); +void send_hello(struct eigrp_iface *, struct seq_addr_head *, uint32_t); +void send_peerterm(struct nbr *); 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 90828653981..36b08c8af9d 100644 --- a/usr.sbin/eigrpd/hello.c +++ b/usr.sbin/eigrpd/hello.c @@ -1,4 +1,4 @@ -/* $OpenBSD: hello.c,v 1.3 2016/01/15 12:32:34 renato Exp $ */ +/* $OpenBSD: hello.c,v 1.4 2016/01/15 12:36:41 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, int peerterm) + uint32_t mcast_seq) { 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, peerterm)) + if (gen_parameter_tlv(buf, ei, 0)) goto fail; if (gen_sw_version_tlv(buf)) @@ -65,6 +65,34 @@ fail: } void +send_peerterm(struct nbr *nbr) +{ + struct eigrp *eigrp = nbr->ei->eigrp; + struct ibuf *buf; + uint8_t flags = 0; + + if ((buf = ibuf_dynamic(PKG_DEF_SIZE, + IP_MAXPACKET - sizeof(struct ip))) == NULL) + fatal("send_hello"); + + /* EIGRP header */ + if (gen_eigrp_hdr(buf, EIGRP_OPC_HELLO, flags, 0, eigrp->as)) + goto fail; + + if (gen_parameter_tlv(buf, nbr->ei, 1)) + goto fail; + + /* send unreliably */ + send_packet(nbr->ei, nbr, 0, buf); + ibuf_free(buf); + return; +fail: + log_warnx("%s: failed to send message", __func__); + ibuf_free(buf); +} + + +void recv_hello(struct eigrp_iface *ei, union eigrpd_addr *src, struct nbr *nbr, struct tlv_parameter *tp) { @@ -95,7 +123,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, 0); + send_hello(ei, NULL, 0); send_update(nbr->ei, nbr, EIGRP_HDR_FLAG_INIT, NULL); } diff --git a/usr.sbin/eigrpd/interface.c b/usr.sbin/eigrpd/interface.c index 09c323bfc41..3f8437a6057 100644 --- a/usr.sbin/eigrpd/interface.c +++ b/usr.sbin/eigrpd/interface.c @@ -1,4 +1,4 @@ -/* $OpenBSD: interface.c,v 1.10 2016/01/15 12:25:43 renato Exp $ */ +/* $OpenBSD: interface.c,v 1.11 2016/01/15 12:36:41 renato Exp $ */ /* * Copyright (c) 2015 Renato Westphal <renato@openbsd.org> @@ -453,7 +453,7 @@ eigrp_if_hello_timer(int fd, short event, void *arg) struct eigrp_iface *ei = arg; struct timeval tv; - send_hello(ei, NULL, 0, 0); + send_hello(ei, NULL, 0); /* reschedule hello_timer */ timerclear(&tv); diff --git a/usr.sbin/eigrpd/neighbor.c b/usr.sbin/eigrpd/neighbor.c index 0cee4aa3450..b88f4b0da69 100644 --- a/usr.sbin/eigrpd/neighbor.c +++ b/usr.sbin/eigrpd/neighbor.c @@ -1,4 +1,4 @@ -/* $OpenBSD: neighbor.c,v 1.4 2016/01/15 12:23:45 renato Exp $ */ +/* $OpenBSD: neighbor.c,v 1.5 2016/01/15 12:36:41 renato Exp $ */ /* * Copyright (c) 2015 Renato Westphal <renato@openbsd.org> @@ -225,6 +225,33 @@ nbr_to_ctl(struct nbr *nbr) return (&nctl); } +void +nbr_clear_ctl(struct ctl_nbr *nctl) +{ + struct eigrp *eigrp; + struct nbr *nbr, *safe; + + TAILQ_FOREACH(eigrp, &econf->instances, entry) { + if (nctl->af && nctl->af != eigrp->af) + continue; + if (nctl->as && nctl->as != eigrp->as) + continue; + + RB_FOREACH_SAFE(nbr, nbr_addr_head, &eigrp->nbrs, safe) { + if (nbr->flags & (F_EIGRP_NBR_PENDING|F_EIGRP_NBR_SELF)) + continue; + if (eigrp_addrisset(nctl->af, &nctl->addr) && + eigrp_addrcmp(nctl->af, &nctl->addr, &nbr->addr)) + continue; + + log_debug("%s: neighbor %s manually cleared", __func__, + log_addr(nbr->ei->eigrp->af, &nbr->addr)); + send_peerterm(nbr); + nbr_del(nbr); + } + } +} + /* timers */ /* ARGSUSED */ diff --git a/usr.sbin/eigrpd/rde_dual.c b/usr.sbin/eigrpd/rde_dual.c index 02fdb555565..483986d3330 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.13 2016/01/15 12:23:45 renato Exp $ */ +/* $OpenBSD: rde_dual.c,v 1.14 2016/01/15 12:36:41 renato Exp $ */ /* * Copyright (c) 2015 Renato Westphal <renato@openbsd.org> @@ -1300,11 +1300,11 @@ rde_nbr_new(uint32_t peerid, struct rde_nbr *new) } void -rde_nbr_del(struct rde_nbr *nbr, int send_peerterm) +rde_nbr_del(struct rde_nbr *nbr, int peerterm) { struct reply_node *reply; - if (send_peerterm) + if (peerterm) rde_imsg_compose_eigrpe(IMSG_NEIGHBOR_DOWN, nbr->peerid, 0, NULL, 0); diff --git a/usr.sbin/eigrpd/rtp.c b/usr.sbin/eigrpd/rtp.c index 5a5f3bdc139..8ef01d8ec4c 100644 --- a/usr.sbin/eigrpd/rtp.c +++ b/usr.sbin/eigrpd/rtp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: rtp.c,v 1.3 2015/10/21 03:48:09 renato Exp $ */ +/* $OpenBSD: rtp.c,v 1.4 2016/01/15 12:36:41 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, 0); + send_hello(ei, &seq_addr_list, eigrp->seq_num); seq_addr_list_clr(&seq_addr_list); } send_packet(ei, NULL, flags, buf); |