diff options
| author | Renato Westphal <renato@opensourcerouting.org> | 2016-03-01 15:27:36 -0300 | 
|---|---|---|
| committer | Donald Sharp <sharpd@cumulusnetworks.com> | 2016-09-23 09:31:05 -0400 | 
| commit | 8429abe0c2f8ee2ef6ed3904c393a4182c4589fc (patch) | |
| tree | bbcaaf66c18c0adffd7ad32c5d6da0cd69d937eb /ldpd/keepalive.c | |
| parent | 27559ebdebb8b6d1e24f7cd2b8541d5cce8e2bb2 (diff) | |
ldpd: copy original sources from OpenBSD (14/09/2016)
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
Diffstat (limited to 'ldpd/keepalive.c')
| -rw-r--r-- | ldpd/keepalive.c | 58 | 
1 files changed, 58 insertions, 0 deletions
diff --git a/ldpd/keepalive.c b/ldpd/keepalive.c new file mode 100644 index 0000000000..4cd49d485b --- /dev/null +++ b/ldpd/keepalive.c @@ -0,0 +1,58 @@ +/*	$OpenBSD$ */ + +/* + * Copyright (c) 2009 Michele Marchetto <michele@openbsd.org> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <sys/types.h> +#include <string.h> + +#include "ldpd.h" +#include "ldpe.h" +#include "log.h" + +void +send_keepalive(struct nbr *nbr) +{ +	struct ibuf	*buf; +	uint16_t	 size; + +	size = LDP_HDR_SIZE + LDP_MSG_SIZE; +	if ((buf = ibuf_open(size)) == NULL) +		fatal(__func__); + +	gen_ldp_hdr(buf, size); +	size -= LDP_HDR_SIZE; +	gen_msg_hdr(buf, MSG_TYPE_KEEPALIVE, size); + +	evbuf_enqueue(&nbr->tcp->wbuf, buf); +} + +int +recv_keepalive(struct nbr *nbr, char *buf, uint16_t len) +{ +	struct ldp_msg msg; + +	memcpy(&msg, buf, sizeof(msg)); +	if (len != LDP_MSG_SIZE) { +		session_shutdown(nbr, S_BAD_MSG_LEN, msg.id, msg.type); +		return (-1); +	} + +	if (nbr->state != NBR_STA_OPER) +		nbr_fsm(nbr, NBR_EVT_KEEPALIVE_RCVD); + +	return (0); +}  | 
