summaryrefslogtreecommitdiff
path: root/ldpd
diff options
context:
space:
mode:
authorRenato Westphal <renato@opensourcerouting.org>2017-04-19 19:31:19 -0300
committerRenato Westphal <renato@opensourcerouting.org>2017-06-05 12:23:48 -0300
commit9b2868bc019b15a878b3b08d165194b8c00b0e63 (patch)
tree53b6041e4d877608653d65fe055a436fa5686867 /ldpd
parent3dcdcbb478d760208e7d82241bbdc359e9479475 (diff)
ldpd: accept notifications during the session establishment process
If we don't do this, we'll never trigger the backoff exponential timer since it's impossible to distinguish between Initialization NAK's and general errors. Also: * Implement some missing bits from RFC 5036; * remove superfluous log message in session_shutdown() (send_notification() logs that we're sending a fatal notification). Regression introduced by commit 8819fc3. Fixes the following ANVL LDP regressions: 6.19 and 6.21. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
Diffstat (limited to 'ldpd')
-rw-r--r--ldpd/notification.c10
-rw-r--r--ldpd/packet.c4
2 files changed, 12 insertions, 2 deletions
diff --git a/ldpd/notification.c b/ldpd/notification.c
index f10faa4a54..4a5f3c8fa4 100644
--- a/ldpd/notification.c
+++ b/ldpd/notification.c
@@ -237,6 +237,16 @@ recv_notification(struct nbr *nbr, char *buf, uint16_t len)
if (nbr->state == NBR_STA_OPENSENT)
nbr_start_idtimer(nbr);
+ /*
+ * RFC 5036 - Section 3.5.1.1:
+ * "When an LSR receives a Shutdown message during session
+ * initialization, it SHOULD transmit a Shutdown message and
+ * then close the transport connection".
+ */
+ if (nbr->state != NBR_STA_OPER && nm.status_code == S_SHUTDOWN)
+ send_notification(nbr->tcp, S_SHUTDOWN,
+ msg.id, msg.type);
+
nbr_fsm(nbr, NBR_EVT_CLOSE_SESSION);
return (-1);
}
diff --git a/ldpd/packet.c b/ldpd/packet.c
index 46893b992b..75e1a9a027 100644
--- a/ldpd/packet.c
+++ b/ldpd/packet.c
@@ -519,6 +519,8 @@ session_read(struct thread *thread)
return (0);
}
break;
+ case MSG_TYPE_NOTIFICATION:
+ break;
default:
if (nbr->state != NBR_STA_OPER) {
session_shutdown(nbr, S_SHUTDOWN,
@@ -661,8 +663,6 @@ session_shutdown(struct nbr *nbr, uint32_t status, uint32_t msg_id,
case NBR_STA_OPENREC:
case NBR_STA_OPENSENT:
case NBR_STA_OPER:
- log_debug("%s: lsr-id %s", __func__, inet_ntoa(nbr->id));
-
send_notification(nbr->tcp, status, msg_id, msg_type);
nbr_fsm(nbr, NBR_EVT_CLOSE_SESSION);