On 2012-11-02, Andrew Klettke <aklet...@opticfusion.net> wrote:
Just upgraded to 5.2 on one of our backup firewalls, and we are having
issues with hosts that are being checked with ICMP:
This should have been fixed post-5.2, please try this diff against
/usr/src/usr.sbin/relayd and let me know how it goes.
(also at http://junkpile.org/relayd.icmp.diff)
Index: check_icmp.c
===================================================================
RCS file: /cvs/src/usr.sbin/relayd/check_icmp.c,v
retrieving revision 1.31
diff -u -p -r1.31 check_icmp.c
--- check_icmp.c 9 May 2011 12:08:47 -0000 1.31
+++ check_icmp.c 5 Nov 2012 17:18:30 -0000
@@ -172,6 +172,7 @@ send_icmp(int s, short event, void *arg)
socklen_t slen;
int i = 0, ttl, mib[4];
size_t len;
+ u_int32_t id;
if (event == EV_TIMEOUT) {
icmp_checks_timeout(cie, HCE_ICMP_WRITE_TIMEOUT);
@@ -208,18 +209,18 @@ send_icmp(int s, short event, void *arg)
continue;
i++;
to = (struct sockaddr *)&host->conf.ss;
+ id = htonl(host->conf.id);
+
if (cie->af == AF_INET) {
icp->icmp_seq = htons(i);
icp->icmp_cksum = 0;
- memcpy(icp->icmp_data, &host->conf.id,
- sizeof(host->conf.id));
+ icp->icmp_mask = id;
icp->icmp_cksum = in_cksum((u_short *)icp,
sizeof(packet));
} else {
icp6->icmp6_seq = htons(i);
icp6->icmp6_cksum = 0;
- memcpy(packet + sizeof(*icp6), &host->conf.id,
- sizeof(host->conf.id));
+ memcpy(packet + sizeof(*icp6), &id, sizeof(id));
icp6->icmp6_cksum = in_cksum((u_short *)icp6,
sizeof(packet));
}
@@ -270,7 +271,7 @@ recv_icmp(int s, short event, void *arg)
u_int16_t icpid;
struct host *host;
ssize_t r;
- objid_t id;
+ u_int32_t id;
if (event == EV_TIMEOUT) {
icmp_checks_timeout(cie, HCE_ICMP_READ_TIMEOUT);
@@ -279,6 +280,7 @@ recv_icmp(int s, short event, void *arg)
bzero(&packet, sizeof(packet));
bzero(&ss, sizeof(ss));
+ slen = sizeof(ss);
r = recvfrom(s, packet, sizeof(packet), 0,
(struct sockaddr *)&ss, &slen);
@@ -291,7 +293,7 @@ recv_icmp(int s, short event, void *arg)
if (cie->af == AF_INET) {
icp = (struct icmp *)(packet + sizeof(struct ip));
icpid = ntohs(icp->icmp_id);
- memcpy(&id, icp->icmp_data, sizeof(id));
+ id = icp->icmp_mask;
} else {
icp6 = (struct icmp6_hdr *)packet;
icpid = ntohs(icp6->icmp6_id);
@@ -299,6 +301,7 @@ recv_icmp(int s, short event, void *arg)
}
if (icpid != cie->env->sc_id)
goto retry;
+ id = ntohl(id);
host = host_find(cie->env, id);
if (host == NULL) {
log_warn("%s: ping for unknown host received", __func__);