af-packet: don't check ifstate per send call in IPS

Instead just accept that the socket state leads to `sendto` errors.
So print at most one error per socket.
pull/6633/head
Victor Julien 4 years ago committed by Victor Julien
parent dab036727f
commit c7ad3f8d30

@ -417,6 +417,7 @@ static void AFPPeerUpdate(AFPThreadVars *ptv)
(void)SC_ATOMIC_SET(ptv->mpeer->if_idx, AFPGetIfnumByDev(ptv->socket, ptv->iface, 0)); (void)SC_ATOMIC_SET(ptv->mpeer->if_idx, AFPGetIfnumByDev(ptv->socket, ptv->iface, 0));
(void)SC_ATOMIC_SET(ptv->mpeer->socket, ptv->socket); (void)SC_ATOMIC_SET(ptv->mpeer->socket, ptv->socket);
(void)SC_ATOMIC_SET(ptv->mpeer->state, ptv->afp_state); (void)SC_ATOMIC_SET(ptv->mpeer->state, ptv->afp_state);
(void)SC_ATOMIC_SET(ptv->mpeer->send_errors, 0);
} }
/** /**
@ -639,9 +640,6 @@ static void AFPWritePacket(Packet *p, int version)
} }
} }
if (SC_ATOMIC_GET(p->afp_v.peer->state) == AFP_STATE_DOWN)
return;
if (p->ethh == NULL) { if (p->ethh == NULL) {
SCLogWarning(SC_ERR_INVALID_VALUE, "Should have an Ethernet header"); SCLogWarning(SC_ERR_INVALID_VALUE, "Should have an Ethernet header");
return; return;
@ -661,10 +659,11 @@ static void AFPWritePacket(Packet *p, int version)
if (sendto(socket, GET_PKT_DATA(p), GET_PKT_LEN(p), 0, (struct sockaddr *)&socket_address, if (sendto(socket, GET_PKT_DATA(p), GET_PKT_LEN(p), 0, (struct sockaddr *)&socket_address,
sizeof(struct sockaddr_ll)) < 0) { sizeof(struct sockaddr_ll)) < 0) {
SCLogWarning(SC_ERR_SOCKET, "Sending packet failed on socket %d: %s", if (SC_ATOMIC_ADD(p->afp_v.peer->send_errors, 1) == 0) {
socket, SCLogWarning(SC_ERR_SOCKET, "sending packet failed on socket %d: %s", socket,
strerror(errno)); strerror(errno));
} }
}
if (p->afp_v.peer->flags & AFP_SOCK_PROTECT) if (p->afp_v.peer->flags & AFP_SOCK_PROTECT)
SCMutexUnlock(&p->afp_v.peer->sock_protect); SCMutexUnlock(&p->afp_v.peer->sock_protect);
} }

@ -124,6 +124,7 @@ typedef struct AFPPeer_ {
SC_ATOMIC_DECLARE(int, socket); SC_ATOMIC_DECLARE(int, socket);
SC_ATOMIC_DECLARE(int, sock_usage); SC_ATOMIC_DECLARE(int, sock_usage);
SC_ATOMIC_DECLARE(int, if_idx); SC_ATOMIC_DECLARE(int, if_idx);
SC_ATOMIC_DECLARE(uint64_t, send_errors);
int flags; int flags;
SCMutex sock_protect; SCMutex sock_protect;
int turn; /**< Field used to store initialisation order. */ int turn; /**< Field used to store initialisation order. */

Loading…
Cancel
Save