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");

--
You received this message because you are subscribed to the Google Groups 
"lusca-commit" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/lusca-commit?hl=en.

Reply via email to