[lusca-cache] r14919 committed - migrate the ICMP setup/teardown code into libpinger/.

4 views
Skip to first unread message

codesite...@google.com

unread,
Jul 14, 2011, 10:32:40 AM7/14/11
to lusca-...@googlegroups.com
Revision: 14919
Author: adrian.chadd
Date: Thu Jul 14 07:32:19 2011
Log: migrate the ICMP setup/teardown code into libpinger/.


http://code.google.com/p/lusca-cache/source/detail?r=14919

Modified:
/playpen/LUSCA_HEAD_ipv6/libpinger/icmp_v4.c
/playpen/LUSCA_HEAD_ipv6/libpinger/icmp_v4.h
/playpen/LUSCA_HEAD_ipv6/src/pinger.c

=======================================
--- /playpen/LUSCA_HEAD_ipv6/libpinger/icmp_v4.c Thu Jul 14 06:11:23 2011
+++ /playpen/LUSCA_HEAD_ipv6/libpinger/icmp_v4.c Thu Jul 14 07:32:19 2011
@@ -39,6 +39,7 @@
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
+#include <netdb.h>

#if !defined(_SQUID_WIN32_)

@@ -60,9 +61,6 @@

#define PINGER_TIMEOUT 5

-static SOCKET socket_to_squid = -1;
-#define socket_from_squid socket_to_squid
-
#else /* _SQUID_MSWIN */

/* Cygwin */
@@ -74,9 +72,6 @@

#define PINGER_TIMEOUT 10

-static int socket_from_squid = 0;
-static int socket_to_squid = 1;
-
#endif /* _SQUID_MSWIN_ */

#endif /* _SQUID_WIN32_ */
@@ -159,8 +154,8 @@
* packet and fires it off.
*/
void
-pingerv4SendEcho(int icmp_sock, struct in_addr to, int opcode, char
*payload,
- int len)
+pingerv4SendEcho(struct pingerv4_state *state, struct in_addr to,
+ int opcode, char *payload, int len)
{
LOCAL_ARRAY(char, pkt, MAX_PKT_SZ);
struct icmphdr *icmp = NULL;
@@ -180,8 +175,8 @@
icmp->icmp_type = ICMP_ECHO;
icmp->icmp_code = 0;
icmp->icmp_cksum = 0;
- icmp->icmp_id = icmp_ident;
- icmp->icmp_seq = (u_short) icmp_pkts_sent++;
+ icmp->icmp_id = state->icmp_ident;
+ icmp->icmp_seq = (u_short) state->icmp_pkts_sent++;

/* The ICMP payload is the entire 'payload' + 'len' */
/* The caller will setup the tmimestamp and icmpEchoData */
@@ -201,7 +196,7 @@
S.sin_addr = to;
S.sin_port = 0;
assert(icmp_pktsize <= MAX_PKT_SZ);
- sendto(icmp_sock,
+ sendto(state->icmp_sock,
pkt,
icmp_pktsize,
0,
@@ -218,7 +213,7 @@
* the ICMP response payload; *len is set to the payload length.
*/
char *
-pingerv4RecvEcho(int icmp_sock, int *icmp_type, int *payload_len,
+pingerv4RecvEcho(struct pingerv4_state *state, int *icmp_type, int
*payload_len,
struct in_addr *src, int *hops)
{
int n;
@@ -235,7 +230,7 @@
pkt = xmalloc(MAX_PKT_SZ);
fromlen = sizeof(from);

- n = recvfrom(icmp_sock,
+ n = recvfrom(state->icmp_sock,
pkt,
MAX_PKT_SZ,
0,
@@ -262,7 +257,7 @@
debug(42, 9) ("%s: icmp_type=%d\n", __func__, icmp->icmp_type);
return NULL;
}
- if (icmp->icmp_id != icmp_ident) {
+ if (icmp->icmp_id != state->icmp_ident) {
debug(42, 9) ("%s: icmp_id=%d, ident should be %d\n", __func__,
icmp->icmp_id, icmp_ident);
return NULL;
@@ -280,3 +275,36 @@
/* There may be no payload; the caller should check len first */
return (pkt + iphdrlen + sizeof(struct icmphdr));
}
+
+void
+pingerv4_state_init(struct pingerv4_state *state, int icmp_ident)
+{
+ state->icmp_sock = -1;
+ state->icmp_pkts_sent = 0;
+ state->icmp_ident = icmp_ident;
+}
+
+int
+pingerv4_open_icmpsock(struct pingerv4_state *state)
+{
+ struct protoent *proto = NULL;
+ if ((proto = getprotobyname("icmp")) == 0) {
+ debug(42, 0) ("pingerOpen: unknown protocol: icmp\n");
+ return 0;
+ }
+
+ state->icmp_sock = socket(PF_INET, SOCK_RAW, proto->p_proto);
+ if (state->icmp_sock < 0) {
+ debug(42, 0) ("pingerOpen: icmp_sock: %s\n", xstrerror());
+ return 0;
+ }
+ return 1;
+}
+
+void
+pingerv4_close_icmpsock(struct pingerv4_state *state)
+{
+ close(state->icmp_sock);
+ state->icmp_sock = -1;
+}
+
=======================================
--- /playpen/LUSCA_HEAD_ipv6/libpinger/icmp_v4.h Thu Jul 14 06:11:23 2011
+++ /playpen/LUSCA_HEAD_ipv6/libpinger/icmp_v4.h Thu Jul 14 07:32:19 2011
@@ -90,13 +90,20 @@

extern const char *icmpPktStr[];

-extern int icmp_ident;
-extern int icmp_pkts_sent;
-
-extern void pingerv4SendEcho(int sock, struct in_addr to, int opcode,
- char *payload, int len);
-
-extern char * pingerv4RecvEcho(int icmp_sock, int *icmp_type, int
*payload_len,
- struct in_addr *src, int *hops);
+struct pingerv4_state {
+ int icmp_ident;
+ int icmp_pkts_sent;
+ int icmp_sock;
+};
+
+extern void pingerv4SendEcho(struct pingerv4_state *, struct in_addr to,
+ int opcode, char *payload, int len);
+
+extern char * pingerv4RecvEcho(struct pingerv4_state *, int *icmp_type,
+ int *payload_len, struct in_addr *src, int *hops);
+
+extern void pingerv4_state_init(struct pingerv4_state *, int icmp_ident);
+extern int pingerv4_open_icmpsock(struct pingerv4_state *);
+extern void pingerv4_close_icmpsock(struct pingerv4_state *);

#endif /* __LIBPINGER_ICMP_V4_H__ */
=======================================
--- /playpen/LUSCA_HEAD_ipv6/src/pinger.c Thu Jul 14 06:11:23 2011
+++ /playpen/LUSCA_HEAD_ipv6/src/pinger.c Thu Jul 14 07:32:19 2011
@@ -112,10 +112,12 @@
}
#endif /* ifdef _SQUID_MSWIN_ */

+
+struct pingerv4_state v4_state;
+
void
pingerOpen(void)
{
- struct protoent *proto = NULL;
#ifdef _SQUID_MSWIN_
WSADATA wsaData;
WSAPROTOCOL_INFO wpi;
@@ -131,6 +133,7 @@
setmode(0, O_BINARY);
setmode(1, O_BINARY);
x = read(0, buf, sizeof(wpi));
+
if (x < sizeof(wpi)) {
getCurrentTime();
debug(42, 0) ("pingerOpen: read: FD 0: %s\n", xstrerror());
@@ -149,16 +152,7 @@
}
xmemcpy(&PS, buf, sizeof(PS));
#endif
- if ((proto = getprotobyname("icmp")) == 0) {
- debug(42, 0) ("pingerOpen: unknown protocol: icmp\n");
- exit(1);
- }
- icmp_sock = socket(PF_INET, SOCK_RAW, proto->p_proto);
- if (icmp_sock < 0) {
- debug(42, 0) ("pingerOpen: icmp_sock: %s\n", xstrerror());
- exit(1);
- }
- icmp_ident = getpid() & 0xffff;
+
debug(42, 0) ("pingerOpen: ICMP socket opened\n");
#ifdef _SQUID_MSWIN_
socket_to_squid =
@@ -197,14 +191,12 @@
void
pingerClose(void)
{
- close(icmp_sock);
+ pingerv4_close_icmpsock(&v4_state);
#ifdef _SQUID_MSWIN_
shutdown(socket_to_squid, SD_BOTH);
close(socket_to_squid);
socket_to_squid = -1;
#endif
- icmp_sock = -1;
- icmp_ident = 0;
}

static void
@@ -226,7 +218,7 @@
icmp_pktsize += MIN(len, MAX_PAYLOAD);
}

- pingerv4SendEcho(icmp_sock, to, opcode, (char *) &echo, icmp_pktsize);
+ pingerv4SendEcho(&v4_state, to, opcode, (char *) &echo, icmp_pktsize);
pingerLog(ICMP_ECHO, to, 0, 0);
}

@@ -248,7 +240,7 @@

debug(42, 9) ("%s: called\n", __func__);

- pkt = pingerv4RecvEcho(icmp_sock, &icmp_type, &payload_len,
+ pkt = pingerv4RecvEcho(&v4_state, &icmp_type, &payload_len,
&from, &hops);
debug(42, 9) ("%s: returned %p\n", __func__, pkt);

@@ -361,7 +353,14 @@
_db_init(debug_args);
_db_set_stderr_debug(1);

+ /* Open the IPC sockets */
pingerOpen();
+
+ /* Setup the IPv4 ICMP socket */
+ pingerv4_state_init(&v4_state, getpid() & 0xffff);
+ if (! pingerv4_open_icmpsock(&v4_state))
+ exit(1);
+
setgid(getgid());
setuid(getuid());

@@ -370,8 +369,8 @@
tv.tv_usec = 0;
FD_ZERO(&R);
FD_SET(socket_from_squid, &R);
- FD_SET(icmp_sock, &R);
- x = select(icmp_sock + 1, &R, NULL, NULL, &tv);
+ FD_SET(v4_state.icmp_sock, &R);
+ x = select(v4_state.icmp_sock + 1, &R, NULL, NULL, &tv);
getCurrentTime();
if (x < 0 && errno == EINTR)
continue;
@@ -385,7 +384,7 @@
pingerClose();
exit(1);
}
- if (FD_ISSET(icmp_sock, &R))
+ if (FD_ISSET(v4_state.icmp_sock, &R))
pingerRecv();
if (PINGER_TIMEOUT + last_check_time < squid_curtime) {
debug(42, 2) ("pinger: timeout occured\n");

Reply all
Reply to author
Forward
0 new messages