summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrenato <renato@openbsd.org>2016-01-15 12:32:34 +0000
committerrenato <renato@openbsd.org>2016-01-15 12:32:34 +0000
commit5c6a958ce604809ab105c39d2db340bacf32b667 (patch)
tree2993346349ed2183d69f569b0c7821cd390c9fb4
parentSplit TLV constants into subcomponents to simplify the code. (diff)
downloadwireguard-openbsd-5c6a958ce604809ab105c39d2db340bacf32b667.tar.xz
wireguard-openbsd-5c6a958ce604809ab105c39d2db340bacf32b667.zip
Do not set the EoT flag in the last startup update.
Unfortunately we don't have enough information to support the NSF feature, the EIGRP draft is missing a lot of information in this regard. The EoT flag is used as part of EIGRP NSF to announce the end of the startup process with a neighbor. The problem is that, when we set this flag, the Cisco neighbors will assume that we support NSF, which is not true. When this happens, these routers expect us to do things that we don't know, and weird things can happen. So let's play safe and just ignore this flag for now.
-rw-r--r--usr.sbin/eigrpd/eigrpe.c7
-rw-r--r--usr.sbin/eigrpd/eigrpe.h4
-rw-r--r--usr.sbin/eigrpd/hello.c4
-rw-r--r--usr.sbin/eigrpd/update.c31
4 files changed, 9 insertions, 37 deletions
diff --git a/usr.sbin/eigrpd/eigrpe.c b/usr.sbin/eigrpd/eigrpe.c
index df9f1d61536..1955558ed69 100644
--- a/usr.sbin/eigrpd/eigrpe.c
+++ b/usr.sbin/eigrpd/eigrpe.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: eigrpe.c,v 1.10 2015/12/13 18:55:53 renato Exp $ */
+/* $OpenBSD: eigrpe.c,v 1.11 2016/01/15 12:32:34 renato Exp $ */
/*
* Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
@@ -500,8 +500,7 @@ eigrpe_dispatch_rde(int fd, short event, void *bula)
switch (imsg.hdr.type) {
case IMSG_SEND_UPDATE_END:
- send_update(nbr->ei, nbr, 0, 1,
- &nbr->update_list);
+ send_update(nbr->ei, nbr, 0, &nbr->update_list);
message_list_clr(&nbr->update_list);
break;
case IMSG_SEND_REPLY_END:
@@ -529,7 +528,7 @@ eigrpe_dispatch_rde(int fd, short event, void *bula)
switch (imsg.hdr.type) {
case IMSG_SEND_MUPDATE_END:
- send_update(ei, NULL, 0, 0, &ei->update_list);
+ send_update(ei, NULL, 0, &ei->update_list);
message_list_clr(&ei->update_list);
break;
case IMSG_SEND_MQUERY_END:
diff --git a/usr.sbin/eigrpd/eigrpe.h b/usr.sbin/eigrpd/eigrpe.h
index 89d2f0d7454..e142ea89d92 100644
--- a/usr.sbin/eigrpd/eigrpe.h
+++ b/usr.sbin/eigrpd/eigrpe.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: eigrpe.h,v 1.5 2016/01/15 12:29:29 renato Exp $ */
+/* $OpenBSD: eigrpe.h,v 1.6 2016/01/15 12:32:34 renato Exp $ */
/*
* Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
@@ -185,7 +185,7 @@ void recv_hello(struct eigrp_iface *, union eigrpd_addr *, struct nbr *,
struct tlv_parameter *);
/* update.c */
-void send_update(struct eigrp_iface *, struct nbr *, uint32_t, int,
+void send_update(struct eigrp_iface *, struct nbr *, uint32_t,
struct rinfo_head *);
void recv_update(struct nbr *, struct rinfo_head *, uint32_t);
diff --git a/usr.sbin/eigrpd/hello.c b/usr.sbin/eigrpd/hello.c
index c422cdfe21f..90828653981 100644
--- a/usr.sbin/eigrpd/hello.c
+++ b/usr.sbin/eigrpd/hello.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: hello.c,v 1.2 2015/10/05 01:59:33 renato Exp $ */
+/* $OpenBSD: hello.c,v 1.3 2016/01/15 12:32:34 renato Exp $ */
/*
* Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
@@ -97,6 +97,6 @@ recv_hello(struct eigrp_iface *ei, union eigrpd_addr *src, struct nbr *nbr,
/* send an expedited hello */
send_hello(ei, NULL, 0, 0);
- send_update(nbr->ei, nbr, EIGRP_HDR_FLAG_INIT, 0, NULL);
+ send_update(nbr->ei, nbr, EIGRP_HDR_FLAG_INIT, NULL);
}
}
diff --git a/usr.sbin/eigrpd/update.c b/usr.sbin/eigrpd/update.c
index 8f071921c10..7511ec4cd2a 100644
--- a/usr.sbin/eigrpd/update.c
+++ b/usr.sbin/eigrpd/update.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: update.c,v 1.2 2015/10/04 23:00:10 renato Exp $ */
+/* $OpenBSD: update.c,v 1.3 2016/01/15 12:32:34 renato Exp $ */
/*
* Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
@@ -31,14 +31,13 @@ extern struct eigrpd_conf *econf;
void
send_update(struct eigrp_iface *ei, struct nbr *nbr, uint32_t flags,
- int startup, struct rinfo_head *rinfo_list)
+ struct rinfo_head *rinfo_list)
{
struct eigrp *eigrp = ei->eigrp;
struct ibuf *buf;
struct rinfo_entry *re;
int size;
int route_len;
- struct eigrp_hdr *eigrp_hdr;
/* don't exceed the interface's mtu */
do {
@@ -81,14 +80,6 @@ send_update(struct eigrp_iface *ei, struct nbr *nbr, uint32_t flags,
}
} while (!TAILQ_EMPTY(rinfo_list));
- /* set the EOT flag in the last startup update */
- if (startup) {
- if ((eigrp_hdr = ibuf_seek(buf, 0, sizeof(*eigrp_hdr))) == NULL)
- fatalx("send_update: buf_seek failed");
- eigrp_hdr->flags = ntohl(eigrp_hdr->flags) | EIGRP_HDR_FLAG_EOT;
- eigrp_hdr->flags = htonl(eigrp_hdr->flags);
- }
-
rtp_send(ei, nbr, buf);
return;
fail:
@@ -111,24 +102,6 @@ recv_update(struct nbr *nbr, struct rinfo_head *rinfo_list, uint32_t flags)
if (nbr->flags & F_EIGRP_NBR_PENDING)
nbr_init(nbr);
- else if (!(flags & EIGRP_HDR_FLAG_RS))
- /*
- * This is not in the draft, but apparently if a Cisco
- * device sends an INIT Update it expects to receive
- * an INIT Update as well, otherwise it triggers the
- * "stuck in INIT state" error and discards subsequent
- * packets. However, there is an exception: when the
- * "clear ip eigrp neighbors soft" command is issued
- * on a Cisco device, the "Restart Flag" is also set
- * in the EIGRP header. In this case the Cisco device
- * doesn't expect to receive an INIT Update otherwise
- * the adjacency will flap. Unfortunately it looks
- * like that there is some kind of initialization
- * FSM implemented in the Cisco devices that is not
- * documented in the draft.
- */
- send_update(nbr->ei, nbr, EIGRP_HDR_FLAG_INIT,
- 0, NULL);
/*
* The INIT flag instructs us to advertise all of our routes,