]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
jumbo mumbo hacking to get new peer_selection working
authorwessels <>
Sat, 1 Mar 1997 04:33:34 +0000 (04:33 +0000)
committerwessels <>
Sat, 1 Mar 1997 04:33:34 +0000 (04:33 +0000)
src/acl.cc
src/errorpage.cc
src/http.cc
src/neighbors.cc
src/peer_select.cc
src/squid.h
src/ssl.cc
src/stat.cc
src/tunnel.cc

index 7da8464cd8c96e0a184ef853a0f1e40abd6c678e..03105242e8d4a03b73a027487cf63dc82020b171 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: acl.cc,v 1.87 1997/02/27 02:57:04 wessels Exp $
+ * $Id: acl.cc,v 1.88 1997/02/28 21:33:34 wessels Exp $
  *
  * DEBUG: section 28    Access Control
  * AUTHOR: Duane Wessels
@@ -1145,10 +1145,10 @@ aclCheckFast(const struct _acl_access *A, aclCheck_t * checklist)
 {
     int allow = 0;
     while (A) {
-        allow = A->allow;
-        if (aclMatchAclList(A->acl_list, checklist))
-            return allow;
-        A = A->next;
+       allow = A->allow;
+       if (aclMatchAclList(A->acl_list, checklist))
+           return allow;
+       A = A->next;
     }
     return !allow;
 }
@@ -1164,38 +1164,38 @@ aclCheck(aclCheck_t * checklist)
        debug(28, 3, "aclCheck: checking '%s'\n", A->cfgline);
        allow = A->allow;
        match = aclMatchAclList(A->acl_list, checklist);
-        if (checklist->state[ACL_DST_IP] == ACL_LOOKUP_NEED) {
-            checklist->state[ACL_DST_IP] = ACL_LOOKUP_PENDING;
-            ipcache_nbgethostbyname(checklist->request->host,
-                -1,
-                aclLookupDstIPDone,
-                checklist);
-            return;
-        } else if (checklist->state[ACL_SRC_DOMAIN] == ACL_LOOKUP_NEED) {
-            checklist->state[ACL_SRC_DOMAIN] = ACL_LOOKUP_PENDING;
-            fqdncache_nbgethostbyaddr(checklist->src_addr,
-                -1,
-                aclLookupSrcFQDNDone,
-                checklist);
-            return;
-        } else if (checklist->state[ACL_DST_DOMAIN] == ACL_LOOKUP_NEED) {
-            if ((ia = ipcacheCheckNumeric(checklist->request->host)) != NULL) {
-                checklist->state[ACL_DST_DOMAIN] = ACL_LOOKUP_PENDING;
-                fqdncache_nbgethostbyaddr(ia->in_addrs[0],
-                    -1,
-                    aclLookupDstFQDNDone,
-                    checklist);
+       if (checklist->state[ACL_DST_IP] == ACL_LOOKUP_NEED) {
+           checklist->state[ACL_DST_IP] = ACL_LOOKUP_PENDING;
+           ipcache_nbgethostbyname(checklist->request->host,
+               -1,
+               aclLookupDstIPDone,
+               checklist);
+           return;
+       } else if (checklist->state[ACL_SRC_DOMAIN] == ACL_LOOKUP_NEED) {
+           checklist->state[ACL_SRC_DOMAIN] = ACL_LOOKUP_PENDING;
+           fqdncache_nbgethostbyaddr(checklist->src_addr,
+               -1,
+               aclLookupSrcFQDNDone,
+               checklist);
+           return;
+       } else if (checklist->state[ACL_DST_DOMAIN] == ACL_LOOKUP_NEED) {
+           if ((ia = ipcacheCheckNumeric(checklist->request->host)) != NULL) {
+               checklist->state[ACL_DST_DOMAIN] = ACL_LOOKUP_PENDING;
+               fqdncache_nbgethostbyaddr(ia->in_addrs[0],
+                   -1,
+                   aclLookupDstFQDNDone,
+                   checklist);
            } else {
-                checklist->state[ACL_DST_DOMAIN] = ACL_LOOKUP_DONE;
+               checklist->state[ACL_DST_DOMAIN] = ACL_LOOKUP_DONE;
            }
-            return;
-        }
+           return;
+       }
        if (match) {
            debug(28, 3, "aclCheck: match found, returning %d\n", allow);
-           aclCheckCallback(checklist, !allow);
+           aclCheckCallback(checklist, allow);
            return;
        }
-       checklist->access_list  = A->next;
+       checklist->access_list = A->next;
     }
     aclCheckCallback(checklist, !allow);
 }
@@ -1204,55 +1204,56 @@ aclCheck(aclCheck_t * checklist)
 static void
 aclCheckCallback(aclCheck_t * checklist, int answer)
 {
-       checklist->callback(answer, checklist->callback_data);
-       requestUnlink(checklist->request);
-       xfree(checklist);
+    debug(28, 3, "aclCheckCallback: answer=%d\n", answer);
+    checklist->callback(answer, checklist->callback_data);
+    requestUnlink(checklist->request);
+    xfree(checklist);
 }
 
 static void
 aclLookupDstIPDone(int fd, const ipcache_addrs * ia, void *data)
 {
-       aclCheck_t * checklist = data;
-       checklist->state[ACL_DST_IP] = ACL_LOOKUP_DONE;
-       aclCheck(checklist);
+    aclCheck_t *checklist = data;
+    checklist->state[ACL_DST_IP] = ACL_LOOKUP_DONE;
+    aclCheck(checklist);
 }
 
 static void
 aclLookupSrcFQDNDone(int fd, const char *fqdn, void *data)
 {
-       aclCheck_t * checklist = data;
-       checklist->state[ACL_SRC_DOMAIN] = ACL_LOOKUP_DONE;
-       aclCheck(checklist);
+    aclCheck_t *checklist = data;
+    checklist->state[ACL_SRC_DOMAIN] = ACL_LOOKUP_DONE;
+    aclCheck(checklist);
 }
 
 static void
 aclLookupDstFQDNDone(int fd, const char *fqdn, void *data)
 {
-    aclCheck_t * checklist = data;
+    aclCheck_t *checklist = data;
     checklist->state[ACL_SRC_DOMAIN] = ACL_LOOKUP_DONE;
     aclCheck(checklist);
 }
 
 void
 aclNBCheck(const struct _acl_access *A,
-       request_t *request,
-       struct in_addr src_addr,
-       char *user_agent,
-       char *ident,
-       PF callback,
-       void *callback_data)
+    request_t * request,
+    struct in_addr src_addr,
+    char *user_agent,
+    char *ident,
+    PF callback,
+    void *callback_data)
 {
-       aclCheck_t *checklist = xcalloc(1, sizeof(aclCheck_t));;
-       checklist->access_list = A;
-       checklist->request = requestLink(request);
-       checklist->src_addr = src_addr;
-       if (user_agent)
-           xstrncpy(checklist->browser, user_agent, BROWSERNAMELEN);
-       if (ident)
-           xstrncpy(checklist->ident, ident, ICP_IDENT_SZ);
-       checklist->callback = callback;
-       checklist->callback_data = callback_data;
-       aclCheck(checklist);
+    aclCheck_t *checklist = xcalloc(1, sizeof(aclCheck_t));;
+    checklist->access_list = A;
+    checklist->request = requestLink(request);
+    checklist->src_addr = src_addr;
+    if (user_agent)
+       xstrncpy(checklist->browser, user_agent, BROWSERNAMELEN);
+    if (ident)
+       xstrncpy(checklist->ident, ident, ICP_IDENT_SZ);
+    checklist->callback = callback;
+    checklist->callback_data = callback_data;
+    aclCheck(checklist);
 }
 
 
index 618113603d90e6d15181a97065232f76db29efb8..5ceb5346ebf42fa5f568a6288f5c30dd6c984f90 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * $Id: errorpage.cc,v 1.53 1997/01/15 23:01:13 wessels Exp $
+ * $Id: errorpage.cc,v 1.54 1997/02/28 21:33:36 wessels Exp $
  *
  * DEBUG: section 4     Error Generation
  * AUTHOR: Duane Wessels
@@ -240,7 +240,7 @@ Generated by %s/%s@%s\n\
 \n"
 
 char *
-squid_error_request(const char *request, int type, const char *address, int code)
+squid_error_request(const char *request, int type, int code)
 {
     int error_index;
 
index d69bc6cb1e52036c566ed0f98cdcfc9bf8819efc..5f39e96f9ee8974fa0969d1bf2a737b091dec14e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: http.cc,v 1.151 1997/02/27 02:57:09 wessels Exp $
+ * $Id: http.cc,v 1.152 1997/02/28 21:33:37 wessels Exp $
  *
  * DEBUG: section 11    Hypertext Transfer Protocol (HTTP)
  * AUTHOR: Harvest Derived
@@ -959,7 +959,6 @@ proxyhttpStartComplete(void *data, int status)
        sock,
        httpConnect,
        httpState);
-    xfree(url);
     return;
 }
 
index af415ec66113023a2fc1b1059f995b2f05459926..39e0191b0958b32dc8c3a355868578c65dca64fd 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: neighbors.cc,v 1.127 1997/02/27 06:29:15 wessels Exp $
+ * $Id: neighbors.cc,v 1.128 1997/02/28 21:33:39 wessels Exp $
  *
  * DEBUG: section 15    Neighbor Routines
  * AUTHOR: Harvest Derived
@@ -112,7 +112,7 @@ static void neighborRemove _PARAMS((peer *));
 static peer *whichPeer _PARAMS((const struct sockaddr_in * from));
 static void neighborAlive _PARAMS((peer *, const MemObject *, const icp_common_t *));
 static void neighborCountIgnored _PARAMS((peer * e, icp_opcode op_unused));
-static neighbor_t parseNeighborType _PARAMS((const char *s));
+static peer_t parseNeighborType _PARAMS((const char *s));
 static void peerRefreshDNS _PARAMS((void *));
 static void peerDNSConfigure _PARAMS((int fd, const ipcache_addrs * ia, void *data));
 
@@ -184,16 +184,20 @@ whichPeer(const struct sockaddr_in *from)
 }
 
 void
-hierarchyNote(request_t * request, hier_code code, int timeout, const char *cache_host)
+hierarchyNote(request_t * request,
+       hier_code code,
+       icp_ping_data *icpdata,
+       const char *cache_host)
 {
     if (request) {
        request->hierarchy.code = code;
-       request->hierarchy.timeout = timeout;
+       request->hierarchy.icp = *icpdata;
        request->hierarchy.host = xstrdup(cache_host);
+       request->hierarchy.icp.stop = current_time;
     }
 }
 
-static neighbor_t
+static peer_t
 neighborType(const peer * e, const request_t * request)
 {
     const struct _domain_type *d = NULL;
@@ -433,15 +437,19 @@ neighbors_open(int fd)
 }
 
 int
-neighborsUdpPing(request_t * request, StoreEntry * entry, int *exprep)
+neighborsUdpPing(request_t * request,
+       StoreEntry * entry,
+       IRCB callback,
+       void *callback_data,
+       int *exprep)
 {
     char *host = request->host;
     char *url = entry->url;
+    MemObject *mem = entry->mem_obj;
     const ipcache_addrs *ia = NULL;
     struct sockaddr_in to_addr;
     peer *e = NULL;
     int i;
-    MemObject *mem = entry->mem_obj;
     int reqnum = 0;
     int flags;
     icp_common_t *query;
@@ -459,7 +467,9 @@ neighborsUdpPing(request_t * request, StoreEntry * entry, int *exprep)
     }
     if (entry->swap_status != NO_SWAP)
        fatal_dump("neighborsUdpPing: bad swap_status");
-
+    mem->start_ping = current_time;
+    mem->icp_reply_callback = callback;
+    mem->ircb_data = callback_data;
     for (i = 0, e = Peers.first_ping; i++ < Peers.n; e = e->next) {
        if (e == NULL)
            e = Peers.peers_head;
@@ -510,7 +520,7 @@ neighborsUdpPing(request_t * request, StoreEntry * entry, int *exprep)
            ICP_mcasts_sent++;
        } else if (neighborUp(e)) {
            /* its alive, expect a reply from it */
-           *exprep++;
+           (*exprep)++;
        } else {
            /* Neighbor is dead; ping it anyway, but don't expect a reply */
            /* log it once at the threshold */
@@ -596,9 +606,7 @@ neighborsUdpAck(int fd, const char *url, icp_common_t * header, const struct soc
 {
     peer *e = NULL;
     MemObject *mem = entry->mem_obj;
-    int w_rtt;
-    HttpStateData *httpState = NULL;
-    neighbor_t ntype = PEER_NONE;
+    peer_t ntype = PEER_NONE;
     char *opcode_d;
     icp_opcode opcode = (icp_opcode) header->opcode;
 
@@ -646,14 +654,14 @@ neighborsUdpAck(int fd, const char *url, icp_common_t * header, const struct soc
        } else if (ntype != PEER_PARENT) {
            (void) 0;           /* ignore MISS from non-parent */
        } else {
-           mem->icp_reply_callback(e, ntype, opcode, mem->cb_data);
+           mem->icp_reply_callback(e, ntype, opcode, mem->ircb_data);
        }
     } else if (opcode == ICP_OP_HIT || opcode == ICP_OP_HIT_OBJ) {
        if (e == NULL) {
            debug(15, 1, "Ignoring HIT from non-peer %s\n",
                inet_ntoa(from->sin_addr));
        } else {
-           mem->icp_reply_callback(e, ntype, ICP_OP_HIT, mem->cb_data);
+           mem->icp_reply_callback(e, ntype, ICP_OP_HIT, mem->ircb_data);
        }
     } else if (opcode == ICP_OP_DECHO) {
        if (e == NULL) {
@@ -663,14 +671,16 @@ neighborsUdpAck(int fd, const char *url, icp_common_t * header, const struct soc
            debug_trap("neighborsUdpAck: Found non-ICP cache as SIBLING\n");
            debug_trap("neighborsUdpAck: non-ICP neighbors must be a PARENT\n");
        } else {
-           mem->icp_reply_callback(e, ntype, opcode, mem->cb_data);
+           mem->icp_reply_callback(e, ntype, opcode, mem->ircb_data);
        }
     } else if (opcode == ICP_OP_SECHO) {
        if (e) {
            debug(15, 1, "Ignoring SECHO from neighbor %s\n", e->host);
            neighborCountIgnored(e, opcode);
+       } else if (!Config.sourcePing) {
+           debug(15, 1, "Unsolicited SECHO from %s\n", inet_ntoa(from->sin_addr));
        } else {
-           mem->icp_reply_callback(NULL, ntype, opcode, mem->cb_data);
+           mem->icp_reply_callback(NULL, ntype, opcode, mem->ircb_data);
        }
     } else if (opcode == ICP_OP_DENIED) {
        if (e == NULL) {
@@ -687,7 +697,7 @@ neighborsUdpAck(int fd, const char *url, icp_common_t * header, const struct soc
            }
        }
     } else if (opcode == ICP_OP_MISSNOFETCH) {
-       mem->icp_reply_callback(e, ntype, opcode, mem->cb_data);
+       mem->icp_reply_callback(e, ntype, opcode, mem->ircb_data);
     } else {
        debug(15, 0, "neighborsUdpAck: Unexpected ICP reply: %s\n", opcode_d);
     }
@@ -828,7 +838,7 @@ neighborFindByName(const char *name)
     return e;
 }
 
-static neighbor_t
+static peer_t
 parseNeighborType(const char *s)
 {
     if (!strcasecmp(s, "parent"))
index 689daf1e89943917d1e9ec649ee190a15c72e9ba..fe15323ce263de1d7d1e647598e3b639c53022db 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: peer_select.cc,v 1.5 1997/02/27 06:29:16 wessels Exp $
+ * $Id: peer_select.cc,v 1.6 1997/02/28 21:33:41 wessels Exp $
  *
  * DEBUG: section 44    Peer Selection Algorithm
  * AUTHOR: Duane Wessels
@@ -34,29 +34,11 @@ static struct {
     int timeouts;
 } PeerStats;
 
-typedef struct {
-    request_t *request;
-    StoreEntry *entry;
-    int always_direct;
-    int never_direct;
-    PSC callback;
-    PSC fail_callback;
-    void *callback_data;
-    struct {
-       struct timeval start;
-       int n_sent;
-       int n_recv;
-       int n_replies_expected;
-       int timeout;
-       peer *best_parent;
-    } ping;
-} psctrl_t;
 
-
-static void peerSelectFoo _PARAMS((psctrl_t *));
+static void peerSelectFoo _PARAMS((ps_state *));
 static void peerPingTimeout _PARAMS((void *data));
-void peerPingComplete _PARAMS((void *data));
-static void peerSelectCallbackFail _PARAMS((psctrl_t * ctrl));
+static void peerSelectCallbackFail _PARAMS((ps_state * psstate));
+static void peerHandleIcpReply _PARAMS((peer * p, peer_t type, icp_opcode op, void *data));
 
 int
 peerSelectIcpPing(request_t * request, int direct, StoreEntry * entry)
@@ -114,92 +96,99 @@ peerGetSomeParent(request_t * request, hier_code * code)
 
 void
 peerSelect(request_t * request,
-       StoreEntry *entry,
-       PSC callback,
-       PSC fail_callback,
-       void *callback_data)
+    StoreEntry * entry,
+    PSC callback,
+    PSC fail_callback,
+    void *callback_data)
 {
-    psctrl_t *ctrl = xcalloc(1, sizeof(psctrl_t));
-    ctrl->request = requestLink(request);
-    ctrl->entry = entry;
-    ctrl->callback = callback;
-    ctrl->fail_callback = fail_callback;
-    ctrl->callback_data = callback_data;
-    peerSelectFoo(ctrl);
+    ps_state *psstate = xcalloc(1, sizeof(ps_state));
+    psstate->request = requestLink(request);
+    psstate->entry = entry;
+    psstate->callback = callback;
+    psstate->fail_callback = fail_callback;
+    psstate->callback_data = callback_data;
+    psstate->icp.start = current_time;
+    peerSelectFoo(psstate);
 }
 
 static void
 peerCheckNeverDirectDone(int answer, void *data)
 {
-    psctrl_t *ctrl = data;
+    ps_state *psstate = data;
     debug(44, 3, "peerCheckNeverDirectDone: %d\n", answer);
-    ctrl->never_direct = answer ? 1 : -1;
-    peerSelectFoo(ctrl);
+    psstate->never_direct = answer ? 1 : -1;
+    peerSelectFoo(psstate);
 }
 
 static void
 peerCheckAlwaysDirectDone(int answer, void *data)
 {
-    psctrl_t *ctrl = data;
+    ps_state *psstate = data;
     debug(44, 3, "peerCheckAlwaysDirectDone: %d\n", answer);
-    ctrl->always_direct = answer ? 1 : -1;
-    peerSelectFoo(ctrl);
+    psstate->always_direct = answer ? 1 : -1;
+    peerSelectFoo(psstate);
 }
 
 static void
-peerSelectCallback(psctrl_t * ctrl, peer * p)
+peerSelectCallback(ps_state * psstate, peer * p)
 {
-    if (!ctrl->ping.timeout)
-       eventDelete(peerPingTimeout, ctrl);
-    ctrl->callback(p, ctrl->callback_data);
-    requestUnlink(ctrl->request);
-    xfree(ctrl);
+    StoreEntry *entry = psstate->entry;
+    if (entry) {
+       if (entry->ping_status == PING_WAITING)
+           eventDelete(peerPingTimeout, psstate);
+       entry->ping_status = PING_DONE;
+    }
+    psstate->callback(p, psstate->callback_data);
+    requestUnlink(psstate->request);
+    xfree(psstate);
 }
 
 static void
-peerSelectCallbackFail(psctrl_t * ctrl)
+peerSelectCallbackFail(ps_state * psstate)
 {
-    request_t *request = ctrl->request;
-    char *url = ctrl->entry ? ctrl->entry->url : urlCanonical(request, NULL);
+    request_t *request = psstate->request;
+    char *url = psstate->entry ? psstate->entry->url : urlCanonical(request, NULL);
     debug(44, 1, "Failed to select source for '%s'\n", url);
-    debug(44, 1, "  always_direct = %d\n", ctrl->always_direct);
-    debug(44, 1, "   never_direct = %d\n", ctrl->never_direct);
-    debug(44, 1, "        timeout = %d\n", ctrl->ping.timeout);
-    ctrl->fail_callback(NULL, ctrl->callback_data);
-    requestUnlink(ctrl->request);
-    xfree(ctrl);
+    debug(44, 1, "  always_direct = %d\n", psstate->always_direct);
+    debug(44, 1, "   never_direct = %d\n", psstate->never_direct);
+    debug(44, 1, "        timeout = %d\n", psstate->icp.timeout);
+    psstate->fail_callback(NULL, psstate->callback_data);
+    requestUnlink(psstate->request);
+    xfree(psstate);
 }
 
 static void
-peerSelectFoo(psctrl_t * ctrl)
+peerSelectFoo(ps_state * psstate)
 {
     peer *p;
     hier_code code;
-    StoreEntry *entry = ctrl->entry;
-    request_t *request = ctrl->request;
+    StoreEntry *entry = psstate->entry;
+    request_t *request = psstate->request;
     int direct;
-    debug(44, 3, "peerSelect: '%s'\n", entry->url);
-    if (ctrl->never_direct == 0) {
+    debug(44, 3, "peerSelect: '%s %s'\n",
+       RequestMethodStr[request->method],
+       request->host);
+    if (psstate->never_direct == 0) {
        aclNBCheck(Config.accessList.NeverDirect,
            request,
            request->client_addr,
            NULL,               /* user agent */
            NULL,               /* ident */
            peerCheckNeverDirectDone,
-           ctrl);
+           psstate);
        return;
-    } else if (ctrl->never_direct > 0) {
+    } else if (psstate->never_direct > 0) {
        direct = DIRECT_NO;
-    } else if (ctrl->always_direct == 0) {
+    } else if (psstate->always_direct == 0) {
        aclNBCheck(Config.accessList.AlwaysDirect,
            request,
            request->client_addr,
            NULL,               /* user agent */
            NULL,               /* ident */
            peerCheckAlwaysDirectDone,
-           ctrl);
+           psstate);
        return;
-    } else if (ctrl->always_direct > 0) {
+    } else if (psstate->always_direct > 0) {
        direct = DIRECT_YES;
     } else {
        direct = DIRECT_MAYBE;
@@ -207,69 +196,60 @@ peerSelectFoo(psctrl_t * ctrl)
     debug(44, 3, "peerSelect: direct = %d\n", direct);
     if (direct == DIRECT_YES) {
        debug(44, 3, "peerSelect: HIER_DIRECT\n");
-       hierarchyNote(request, HIER_DIRECT, ctrl->ping.timeout, request->host);
-       peerSelectCallback(ctrl, NULL);
+       hierarchyNote(request, HIER_DIRECT, &psstate->icp, request->host);
+       peerSelectCallback(psstate, NULL);
        return;
     }
     if (peerSelectIcpPing(request, direct, entry)) {
        if (entry->ping_status != PING_NONE)
-               fatal_dump("peerSelectFoo: bad ping_status");
+           fatal_dump("peerSelectFoo: bad ping_status");
        debug(44, 3, "peerSelect: Doing ICP pings\n");
-       ctrl->ping.n_sent = neighborsUdpPing(request,
-               entry,
-               &ctrl->ping.n_replies_expected);
-       if (ctrl->ping.n_sent > 0) {
+       psstate->icp.n_sent = neighborsUdpPing(request,
+           entry,
+           peerHandleIcpReply,
+           psstate,
+           &psstate->icp.n_replies_expected);
+       if (psstate->icp.n_sent > 0) {
            entry->ping_status = PING_WAITING;
            eventAdd("peerPingTimeout",
                peerPingTimeout,
-               ctrl,
+               psstate,
                Config.neighborTimeout);
-           ctrl->ping.start = current_time;
            return;
        }
        debug_trap("peerSelect: neighborsUdpPing returned 0");
     }
-    if ((p = ctrl->ping.best_parent)) {
+    if ((p = psstate->best_parent)) {
        code = HIER_BEST_PARENT_MISS;
        debug(44, 3, "peerSelect: %s/%s\n", hier_strings[code], p->host);
-       hierarchyNote(request, code, ctrl->ping.timeout, p->host);
-       peerSelectCallback(ctrl, p);
+       hierarchyNote(request, code, &psstate->icp, p->host);
+       peerSelectCallback(psstate, p);
     } else if (direct != DIRECT_NO) {
        code = HIER_DIRECT;
        debug(44, 3, "peerSelect: %s/%s\n", hier_strings[code], request->host);
-       hierarchyNote(request, code, ctrl->ping.timeout, request->host);
-       peerSelectCallback(ctrl, NULL);
+       hierarchyNote(request, code, &psstate->icp, request->host);
+       peerSelectCallback(psstate, NULL);
     } else if ((p = peerGetSomeParent(request, &code))) {
        debug(44, 3, "peerSelect: %s/%s\n", hier_strings[code], p->host);
-       hierarchyNote(request, code, ctrl->ping.timeout, p->host);
-       peerSelectCallback(ctrl, p);
+       hierarchyNote(request, code, &psstate->icp, p->host);
+       peerSelectCallback(psstate, p);
     } else {
        code = HIER_NO_DIRECT_FAIL;
-       hierarchyNote(request, code, ctrl->ping.timeout, NULL);
-       peerSelectCallbackFail(ctrl);
+       hierarchyNote(request, code, &psstate->icp, NULL);
+       peerSelectCallbackFail(psstate);
     }
 }
 
 void
 peerPingTimeout(void *data)
 {
-    psctrl_t *ctrl = data;
-    StoreEntry *entry = ctrl->entry;
+    ps_state *psstate = data;
+    StoreEntry *entry = psstate->entry;
     debug(44, 3, "peerPingTimeout: '%s'\n", entry->url);
     entry->ping_status = PING_TIMEOUT;
     PeerStats.timeouts++;
-    ctrl->ping.timeout = 1;
-    peerSelectFoo(ctrl);
-}
-
-void
-peerPingComplete(void *data)
-{
-    psctrl_t *ctrl = data;
-    StoreEntry *entry = ctrl->entry;
-    debug(44, 3, "peerPingComplete: '%s'\n", entry->url);
-    entry->ping_status = PING_DONE;
-    peerSelectFoo(ctrl);
+    psstate->icp.timeout = 1;
+    peerSelectFoo(psstate);
 }
 
 void
@@ -279,36 +259,37 @@ peerSelectInit(void)
 }
 
 
-void
-peerHandleIcpReply(peer * p, neighbor_t type, icp_opcode_t op, void *data)
+static void
+peerHandleIcpReply(peer * p, peer_t type, icp_opcode op, void *data)
 {
-    psctrl_t *ctrl = data;
+    ps_state *psstate = data;
     int w_rtt;
-    request_t *reqeust = ctrl->request;
-    ctrl->pings->n_recv++;
+    request_t *request = psstate->request;
+    psstate->icp.n_recv++;
     if (op == ICP_OP_MISS || op == ICP_OP_DECHO) {
        if (type == PEER_PARENT) {
-           w_rtt = tvSubMsec(ctrl->ping.start, current_time) / e->weight;
-           if (ctrl->ping.w_rtt == 0 || w_rtt < ctrl->ping.w_rtt) {
-               ctrl->ping.best_parent = e;
-               ctrl->ping.w_rtt = w_rtt;
+           w_rtt = tvSubMsec(psstate->icp.start, current_time) / p->weight;
+           if (psstate->icp.w_rtt == 0 || w_rtt < psstate->icp.w_rtt) {
+               psstate->best_parent = p;
+               psstate->icp.w_rtt = w_rtt;
            }
        }
     } else if (op == ICP_OP_HIT || op == ICP_OP_HIT_OBJ) {
        hierarchyNote(request,
            type == PEER_PARENT ? HIER_PARENT_HIT : HIER_SIBLING_HIT,
-           0,
+           &psstate->icp,
            p->host);
-       peerSelectCallback(ctrl, p);
+       peerSelectCallback(psstate, p);
        return;
     } else if (op == ICP_OP_SECHO) {
        hierarchyNote(request,
            HIER_SOURCE_FASTEST,
-           0,
-           request->host
-       peerSelectCallback(ctrl, p);
+           &psstate->icp,
+           request->host);
+       peerSelectCallback(psstate, p);
        return;
     }
-    if (ctrl->ping.n_recv < ping.n_replies_expected)
+    if (psstate->icp.n_recv < psstate->icp.n_replies_expected)
        return;
+    peerSelectFoo(psstate);
 }
index 7df79ea5eee5d58975ead6c17d411e58a383560d..5d98f5752a5445aee0270a2a80d746a0d8a964cf 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * $Id: squid.h,v 1.98 1997/02/27 02:57:16 wessels Exp $
+ * $Id: squid.h,v 1.99 1997/02/28 21:33:42 wessels Exp $
  *
  * AUTHOR: Duane Wessels
  *
@@ -272,6 +272,7 @@ typedef int (*QS) (const void *, const void *);
 #include "filemap.h"
 #include "hash.h"
 #include "proto.h"             /* must go before neighbors.h */
+#include "peer_select.h"       /* must go before neighbors.h */
 #include "neighbors.h"         /* must go before url.h */
 #include "url.h"
 #include "icp.h"
@@ -300,7 +301,6 @@ typedef int (*QS) (const void *, const void *);
 #include "client_db.h"
 #include "objcache.h"
 #include "refresh.h"
-#include "peer_select.h"
 
 #if !HAVE_TEMPNAM
 #include "tempnam.h"
index c81d01371c0cd6dd6448a4b35376d2053173df4b..db27a07ca1086854919e24faa50fa28914613631 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * $Id: ssl.cc,v 1.40 1997/02/26 19:46:22 wessels Exp $
+ * $Id: ssl.cc,v 1.41 1997/02/28 21:33:42 wessels Exp $
  *
  * DEBUG: section 26    Secure Sockets Layer Proxy
  * AUTHOR: Duane Wessels
@@ -65,7 +65,8 @@ static void sslClose _PARAMS((SslStateData * sslState));
 static void sslClientClosed _PARAMS((int fd, void *));
 static void sslConnectDone _PARAMS((int fd, int status, void *data));
 static void sslStateFree _PARAMS((int fd, void *data));
-static void sslSelectNeighbor _PARAMS((int fd, const ipcache_addrs *, void *));
+static void sslPeerSelectComplete _PARAMS((peer * p, void *data));
+static void sslPeerSelectFail _PARAMS((peer * p, void *data));
 
 static void
 sslClose(SslStateData * sslState)
@@ -417,10 +418,8 @@ sslStart(int fd, const char *url, request_t * request, char *mime_hdr, int *size
     SslStateData *sslState = NULL;
     int sock;
     char *buf = NULL;
-
     debug(26, 3, "sslStart: '%s %s'\n",
        RequestMethodStr[request->method], url);
-
     /* Create socket. */
     sock = comm_open(SOCK_STREAM,
        0,
@@ -461,20 +460,11 @@ sslStart(int fd, const char *url, request_t * request, char *mime_hdr, int *size
     comm_add_close_handler(sslState->client.fd,
        sslClientClosed,
        (void *) sslState);
-
-    if (Config.sslProxy) {
-       ipcache_nbgethostbyname(request->host,
-           sslState->server.fd,
-           sslSelectNeighbor,
-           sslState);
-    } else {
-       sslState->host = request->host;
-       sslState->port = request->port;
-       ipcache_nbgethostbyname(request->host,
-           sslState->server.fd,
-           sslConnect,
-           sslState);
-    }
+    peerSelect(request,
+       NULL,   
+       sslPeerSelectComplete,
+       sslPeerSelectFail,
+       sslState);
     return COMM_OK;
 }
 
@@ -499,27 +489,18 @@ sslProxyConnected(int fd, void *data)
 }
 
 static void
-sslSelectNeighbor(int fd, const ipcache_addrs * ia, void *data)
+sslPeerSelectComplete (peer * p, void *data)
 {
     SslStateData *sslState = data;
     request_t *request = sslState->request;
-    peer *e = NULL;
     peer *g = NULL;
-    hier_code code;
-    if (peerSelectDirect(request)) {
-       hierarchyNote(request, HIER_DIRECT, 0, request->host);
-    } else if ((e = peerGetSomeParent(request, &code))) {
-       hierarchyNote(request, code, 0, e->host);
-    } else {
-       hierarchyNote(request, HIER_DIRECT, 0, request->host);
-    }
-    sslState->proxying = e ? 1 : 0;
-    sslState->host = e ? e->host : request->host;
-    if (e == NULL) {
+    sslState->proxying = p ? 1 : 0;
+    sslState->host = p ? p->host : request->host;
+    if (p == NULL) {
        sslState->port = request->port;
-    } else if (e->http_port != 0) {
-       sslState->port = e->http_port;
-    } else if ((g = neighborFindByName(e->host))) {
+    } else if (p->http_port != 0) {
+       sslState->port = p->http_port;
+    } else if ((g = neighborFindByName(p->host))) {
        sslState->port = g->http_port;
     } else {
        sslState->port = CACHE_HTTP_PORT;
@@ -529,3 +510,11 @@ sslSelectNeighbor(int fd, const ipcache_addrs * ia, void *data)
        sslConnect,
        sslState);
 }
+
+static void
+sslPeerSelectFail (peer * p, void *data)
+{
+    SslStateData *sslState = data;
+    squid_error_request(sslState->url, ERR_CANNOT_FETCH, 400);
+    sslClose(sslState);
+}
index 8175d3fbf01b4e1d8511fe8c7d80a5d5cf94f396..2b6d392c3b602e9e3456608c910f0606d4ff2925 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * $Id: stat.cc,v 1.127 1997/02/26 19:46:22 wessels Exp $
+ * $Id: stat.cc,v 1.128 1997/02/28 21:33:43 wessels Exp $
  *
  * DEBUG: section 18    Cache Manager Statistics
  * AUTHOR: Harvest Derived
@@ -1078,7 +1078,10 @@ log_append(const cacheinfo * obj,
     const char *client = NULL;
     hier_code hier_code = HIER_NONE;
     const char *hier_host = dash_str;
-    int hier_timeout = 0;
+    int ns = 0;
+    int ne = 0;
+    int nr = 0;
+    int tt = 0;
 
     if (obj->logfile_status != LOG_ENABLE)
        return;
@@ -1101,21 +1104,24 @@ log_append(const cacheinfo * obj,
     if (hierData) {
        hier_code = hierData->code;
        hier_host = hierData->host ? hierData->host : dash_str;
-       hier_timeout = hierData->timeout;
+       if (hierData->icp.start.tv_sec && hierData->icp.stop.tv_sec)
+           tt = tvSubMsec(hierData->icp.start, hierData->icp.stop);
+       ns = hierData->icp.n_sent;
+       ne = hierData->icp.n_replies_expected;
+       nr = hierData->icp.n_recv;
     }
     if (Config.commonLogFormat)
-       sprintf(tmp, "%s %s - [%s] \"%s %s\" %s:%s%s %d\n",
+       sprintf(tmp, "%s %s - [%s] \"%s %s\" %s:%s %d\n",
            client,
            ident,
            mkhttpdlogtime(&squid_curtime),
            method,
            url,
            action,
-           hier_timeout ? "TIMEOUT_" : null_string,
            hier_strings[hier_code],
            size);
     else
-       sprintf(tmp, "%9d.%03d %6d %s %s/%03d %d %s %s %s %s%s/%s %s\n",
+       sprintf(tmp, "%9d.%03d %6d %s %s/%03d %d %s %s %s %s/%s %d/%d/%d/%d %s\n",
            (int) current_time.tv_sec,
            (int) current_time.tv_usec / 1000,
            msec,
@@ -1126,9 +1132,9 @@ log_append(const cacheinfo * obj,
            method,
            url,
            ident,
-           hier_timeout ? "TIMEOUT_" : null_string,
            hier_strings[hier_code],
            hier_host,
+           ns,ne,nr,tt,
            content_type);
 #if LOG_FULL_HEADERS
     if (Config.logMimeHdrs) {
index b931b100bab5e3dec3d322d8f848102528f5ea40..a293ca654163d6ea0137e2b1d679e9defaadb017 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * $Id: tunnel.cc,v 1.40 1997/02/26 19:46:22 wessels Exp $
+ * $Id: tunnel.cc,v 1.41 1997/02/28 21:33:42 wessels Exp $
  *
  * DEBUG: section 26    Secure Sockets Layer Proxy
  * AUTHOR: Duane Wessels
@@ -65,7 +65,8 @@ static void sslClose _PARAMS((SslStateData * sslState));
 static void sslClientClosed _PARAMS((int fd, void *));
 static void sslConnectDone _PARAMS((int fd, int status, void *data));
 static void sslStateFree _PARAMS((int fd, void *data));
-static void sslSelectNeighbor _PARAMS((int fd, const ipcache_addrs *, void *));
+static void sslPeerSelectComplete _PARAMS((peer * p, void *data));
+static void sslPeerSelectFail _PARAMS((peer * p, void *data));
 
 static void
 sslClose(SslStateData * sslState)
@@ -417,10 +418,8 @@ sslStart(int fd, const char *url, request_t * request, char *mime_hdr, int *size
     SslStateData *sslState = NULL;
     int sock;
     char *buf = NULL;
-
     debug(26, 3, "sslStart: '%s %s'\n",
        RequestMethodStr[request->method], url);
-
     /* Create socket. */
     sock = comm_open(SOCK_STREAM,
        0,
@@ -461,20 +460,11 @@ sslStart(int fd, const char *url, request_t * request, char *mime_hdr, int *size
     comm_add_close_handler(sslState->client.fd,
        sslClientClosed,
        (void *) sslState);
-
-    if (Config.sslProxy) {
-       ipcache_nbgethostbyname(request->host,
-           sslState->server.fd,
-           sslSelectNeighbor,
-           sslState);
-    } else {
-       sslState->host = request->host;
-       sslState->port = request->port;
-       ipcache_nbgethostbyname(request->host,
-           sslState->server.fd,
-           sslConnect,
-           sslState);
-    }
+    peerSelect(request,
+       NULL,   
+       sslPeerSelectComplete,
+       sslPeerSelectFail,
+       sslState);
     return COMM_OK;
 }
 
@@ -499,27 +489,18 @@ sslProxyConnected(int fd, void *data)
 }
 
 static void
-sslSelectNeighbor(int fd, const ipcache_addrs * ia, void *data)
+sslPeerSelectComplete (peer * p, void *data)
 {
     SslStateData *sslState = data;
     request_t *request = sslState->request;
-    peer *e = NULL;
     peer *g = NULL;
-    hier_code code;
-    if (peerSelectDirect(request)) {
-       hierarchyNote(request, HIER_DIRECT, 0, request->host);
-    } else if ((e = peerGetSomeParent(request, &code))) {
-       hierarchyNote(request, code, 0, e->host);
-    } else {
-       hierarchyNote(request, HIER_DIRECT, 0, request->host);
-    }
-    sslState->proxying = e ? 1 : 0;
-    sslState->host = e ? e->host : request->host;
-    if (e == NULL) {
+    sslState->proxying = p ? 1 : 0;
+    sslState->host = p ? p->host : request->host;
+    if (p == NULL) {
        sslState->port = request->port;
-    } else if (e->http_port != 0) {
-       sslState->port = e->http_port;
-    } else if ((g = neighborFindByName(e->host))) {
+    } else if (p->http_port != 0) {
+       sslState->port = p->http_port;
+    } else if ((g = neighborFindByName(p->host))) {
        sslState->port = g->http_port;
     } else {
        sslState->port = CACHE_HTTP_PORT;
@@ -529,3 +510,11 @@ sslSelectNeighbor(int fd, const ipcache_addrs * ia, void *data)
        sslConnect,
        sslState);
 }
+
+static void
+sslPeerSelectFail (peer * p, void *data)
+{
+    SslStateData *sslState = data;
+    squid_error_request(sslState->url, ERR_CANNOT_FETCH, 400);
+    sslClose(sslState);
+}