Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions keepalived/check/check_ping.c
Original file line number Diff line number Diff line change
Expand Up @@ -419,9 +419,12 @@ icmp_ping_thread(thread_ref_t thread)
static void
icmp_connect_thread(thread_ref_t thread)
{
socklen_t addrlen;
checker_t *checker = THREAD_ARG(thread);
ping_check_t *ping_checker = CHECKER_ARG(checker);
conn_opts_t *co = checker->co;
const sockaddr_t *bind_addr = &co->bindto;

int fd;
int size = SOCK_RECV_BUFF;

Expand Down Expand Up @@ -453,6 +456,28 @@ icmp_connect_thread(thread_ref_t thread)
return;
}

/* Bind socket */
if (co->bind_if[0]) {
if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, co->bind_if, (unsigned)strlen(co->bind_if) + 1) < 0) {
log_message(LOG_INFO, "Checker can't bind to device %s: %s", co->bind_if, strerror(errno));
/* Is this correct. Should we return connect_error? */
thread_add_timer(thread->master, icmp_connect_thread, checker,
checker->delay_loop);
return;
}
}

if (PTR_CAST_CONST(struct sockaddr, bind_addr)->sa_family != AF_UNSPEC) {
addrlen = sizeof(*bind_addr);
if (bind(fd, PTR_CAST_CONST(struct sockaddr, bind_addr), addrlen) != 0) {
log_message(LOG_INFO, "bind failed. errno: %d, error: %s", errno, strerror(errno));
/* Is this correct. Should we return connect_error? */
thread_add_timer(thread->master, icmp_connect_thread, checker,
checker->delay_loop);
return;
}
}

if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size)))
log_message(LOG_INFO, "setsockopt SO_RCVBUF for socket %d failed (%d) - %m", fd, errno);

Expand Down
9 changes: 8 additions & 1 deletion keepalived/core/layer4.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,14 +104,14 @@ socket_bind_connect(int fd, conn_opts_t *co)
}
#endif

/* Bind socket */
if (co->bind_if[0]) {
if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, co->bind_if, (unsigned)strlen(co->bind_if) + 1) < 0) {
log_message(LOG_INFO, "Checker can't bind to device %s: %s", co->bind_if, strerror(errno));
return connect_error;
}
}

/* Bind socket */
if (PTR_CAST_CONST(struct sockaddr, bind_addr)->sa_family != AF_UNSPEC) {
addrlen = sizeof(*bind_addr);
if (bind(fd, PTR_CAST_CONST(struct sockaddr, bind_addr), addrlen) != 0) {
Expand Down Expand Up @@ -256,6 +256,13 @@ udp_bind_connect(int fd, conn_opts_t *co, uint8_t *payload, uint16_t payload_len
#endif

/* Bind socket */
if (co->bind_if[0]) {
if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, co->bind_if, (unsigned)strlen(co->bind_if) + 1) < 0) {
log_message(LOG_INFO, "Checker can't bind to device %s: %s", co->bind_if, strerror(errno));
return connect_error;
}
}

if (PTR_CAST_CONST(struct sockaddr, bind_addr)->sa_family != AF_UNSPEC) {
addrlen = sizeof(*bind_addr);
if (bind(fd, PTR_CAST_CONST(struct sockaddr, bind_addr), addrlen) != 0) {
Expand Down
Loading