summaryrefslogtreecommitdiff
path: root/isisd/isis_pfpacket.c
diff options
context:
space:
mode:
authorChristian Franke <chris@opensourcerouting.org>2015-11-12 14:24:28 +0100
committerDonald Sharp <sharpd@cumulusnetworks.com>2016-03-29 20:26:34 -0400
commitcfd1f27b7103854a6c25fd0e05ee286ce01d62e9 (patch)
treed3ee1d766d74798da8cbd6eed582ca5a21607353 /isisd/isis_pfpacket.c
parent0232bb72339c600b8f624aec82bd436aac27eff4 (diff)
isisd: make send_lsp more robust
Signed-off-by: Christian Franke <chris@opensourcerouting.org> Tested-by: NetDEF CI System <cisystem@netdef.org>
Diffstat (limited to 'isisd/isis_pfpacket.c')
-rw-r--r--isisd/isis_pfpacket.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/isisd/isis_pfpacket.c b/isisd/isis_pfpacket.c
index 1bc5f763cd..46c8edd68c 100644
--- a/isisd/isis_pfpacket.c
+++ b/isisd/isis_pfpacket.c
@@ -26,6 +26,7 @@
#include <netpacket/packet.h>
#include "log.h"
+#include "network.h"
#include "stream.h"
#include "if.h"
@@ -367,8 +368,14 @@ isis_send_pdu_bcast (struct isis_circuit *circuit, int level)
iov[1].iov_base = circuit->snd_stream->data;
iov[1].iov_len = stream_get_endp (circuit->snd_stream);
- sendmsg (circuit->fd, &msg, 0);
-
+ if (sendmsg(circuit->fd, &msg, 0) < 0)
+ {
+ zlog_warn("IS-IS pfpacket: could not transmit packet on %s: %s",
+ circuit->interface->name, safe_strerror(errno));
+ if (ERRNO_IO_RETRY(errno))
+ return ISIS_WARNING;
+ return ISIS_ERROR;
+ }
return ISIS_OK;
}
@@ -376,6 +383,7 @@ int
isis_send_pdu_p2p (struct isis_circuit *circuit, int level)
{
struct sockaddr_ll sa;
+ ssize_t rv;
stream_set_getp (circuit->snd_stream, 0);
memset (&sa, 0, sizeof (struct sockaddr_ll));
@@ -391,11 +399,18 @@ isis_send_pdu_p2p (struct isis_circuit *circuit, int level)
/* lets try correcting the protocol */
sa.sll_protocol = htons (0x00FE);
- sendto (circuit->fd, circuit->snd_stream->data,
- stream_get_endp (circuit->snd_stream), 0,
- (struct sockaddr *) &sa,
- sizeof (struct sockaddr_ll));
-
+ rv = sendto(circuit->fd, circuit->snd_stream->data,
+ stream_get_endp (circuit->snd_stream), 0,
+ (struct sockaddr *) &sa,
+ sizeof (struct sockaddr_ll));
+ if (rv < 0)
+ {
+ zlog_warn("IS-IS pfpacket: could not transmit packet on %s: %s",
+ circuit->interface->name, safe_strerror(errno));
+ if (ERRNO_IO_RETRY(errno))
+ return ISIS_WARNING;
+ return ISIS_ERROR;
+ }
return ISIS_OK;
}