<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Verdana, Geneva, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof">
I will take a look, thank's for help <span id="🙂">🙂</span></div>
<div>
<div style="font-family: Verdana, Geneva, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div id="Signature">
<div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<span style="font-family: Verdana, Geneva, sans-serif;">Regards,</span></div>
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<div style="margin:0px;text-align:start;background-color:white"><span style="font-size: 11pt; color: rgb(0, 0, 0); font-family: Verdana, Geneva, sans-serif;">ThĂ©o BARRAGUÉ</span></div>
</div>
</div>
</div>
</div>
<div id="signature_bookmark"></div>
<div id="appendonsend"></div>
<div style="font-family:Verdana,Geneva,sans-serif; font-size:12pt; color:rgb(0,0,0)">
<br>
</div>
<hr tabindex="-1" style="display:inline-block; width:98%">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" color="#000000" style="font-size:11pt"><b>From:</b> Alex Rousskov <rousskov@measurement-factory.com><br>
<b>Sent:</b> Monday, September 26, 2022 3:25 PM<br>
<b>To:</b> ThĂ©o BARRAGUE <Theo.BARRAGUE.ext@boursorama.fr>; squid-users@lists.squid-cache.org <squid-users@lists.squid-cache.org><br>
<b>Cc:</b> Olivier HANESSE <Olivier.HANESSE@boursorama.fr><br>
<b>Subject:</b> Re: [squid-users] Use ICP RTT with HTTPS request</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt">
<div class="PlainText">On 9/26/22 05:51, ThĂ©o BARRAGUE wrote:<br>
<br>
>  entry is null so peerGetSomeNeighbor is never called<br>
<br>
I did not check all the details, but it looks like Squid ICMP code <br>
(ab)uses StoreEntry-linked metadata. Basic CONNECT tunnels lack <br>
StoreEntry because they are not reading/writing data from/to Store. The <br>
combination is essentially a Squid bug -- basic CONNECT tunnels cannot <br>
use ICMP features.<br>
<br>
Most likely, the correct long-term solution here is to remove StoreEntry <br>
use from ICMP code -- I bet that code does not have a genuine need for <br>
Store access and should store its essential metadata elsewhere. That <br>
proper solution will require non-trivial development. For a possibly <br>
simpler workaround, one could consider creating a temporary StoreEntry <br>
object for ICMP use (instead of disabling ICMP for entry-less use cases).<br>
<br>
<a href="https://wiki.squid-cache.org/SquidFaq/AboutSquid#How_to_add_a_new_Squid_feature.2C_enhance.2C_of_fix_something.3F" data-auth="NotApplicable">https://wiki.squid-cache.org/SquidFaq/AboutSquid#How_to_add_a_new_Squid_feature.2C_enhance.2C_of_fix_something.3F</a><br>
<br>
<br>
HTH,<br>
<br>
Alex.<br>
<br>
>     2022/09/26 09:07:52.381| 44,3| peer_select.cc(163) peerSelect: CONNECT<br>
>     2022/09/26 09:07:52.381| 44,3| peer_select.cc(472) peerSelectFoo:<br>
>     CONNECT api.gouv.fr<br>
>     2022/09/26 09:07:52.381| 44,3| peer_select.cc(485) peerSelectFoo:<br>
>     peerSelectFoo: direct = DIRECT_UNKNOWN (never_direct to be checked)<br>
>     2022/09/26 09:07:52.381| 28,3| Checklist.cc(70) preCheck:<br>
>     0x5653abfc4b68 checking slow rules<br>
>     2022/09/26 09:07:52.381| 28,3| Ip.cc(538) match: aclIpMatchIp:<br>
>     '10.25.41.21:34896' found<br>
>     2022/09/26 09:07:52.381| 28,3| Acl.cc(151) matches: checked: all = 1<br>
>     2022/09/26 09:07:52.381| 28,3| Acl.cc(151) matches: checked:<br>
>     never_direct#1 = 1<br>
>     2022/09/26 09:07:52.381| 28,3| Acl.cc(151) matches: checked:<br>
>     never_direct = 1<br>
>     2022/09/26 09:07:52.381| 28,3| Checklist.cc(63) markFinished:<br>
>     0x5653abfc4b68 answer ALLOWED for match<br>
>     2022/09/26 09:07:52.381| 28,3| Checklist.cc(163) checkCallback:<br>
>     ACLChecklist::checkCallback: 0x5653abfc4b68 answer=ALLOWED<br>
>     2022/09/26 09:07:52.381| 44,3| peer_select.cc(195)<br>
>     peerCheckNeverDirectDone: peerCheckNeverDirectDone: ALLOWED<br>
>     2022/09/26 09:07:52.381| 44,3| peer_select.cc(201)<br>
>     peerCheckNeverDirectDone: direct = DIRECT_NO (never_direct allow)<br>
>     2022/09/26 09:07:52.381| 44,3| peer_select.cc(472) peerSelectFoo:<br>
>     CONNECT api.gouv.fr<br>
>     2022/09/26 09:07:52.381| 44,3| peer_select.cc(712)<br>
>     peerGetSomeParent: CONNECT api.gouv.fr<br>
>     2022/09/26 09:07:52.381| 15,3| neighbors.cc(332)<br>
>     getRoundRobinParent: returning NULL<br>
>     2022/09/26 09:07:52.381| 15,3| neighbors.cc(382)<br>
>     getWeightedRoundRobinParent: getWeightedRoundRobinParent: returning NULL<br>
>     2022/09/26 09:07:52.381| 28,3| Checklist.cc(70) preCheck:<br>
>     0x7ffd6220f030 checking fast rules<br>
>     2022/09/26 09:07:52.381| 28,3| Ip.cc(538) match: aclIpMatchIp:<br>
>     '10.25.41.21:34896' found<br>
>     2022/09/26 09:07:52.381| 28,3| Acl.cc(151) matches: checked: all = 1<br>
>     2022/09/26 09:07:52.381| 28,3| Acl.cc(151) matches: checked:<br>
>     peer_access squid-2.inf-proxy03-d01.dc02#1 = 1<br>
>     2022/09/26 09:07:52.381| 28,3| Acl.cc(151) matches: checked:<br>
>     peer_access squid-2.inf-proxy03-d01.dc02 = 1<br>
>     2022/09/26 09:07:52.381| 28,3| Checklist.cc(63) markFinished:<br>
>     0x7ffd6220f030 answer ALLOWED for match<br>
>     2022/09/26 09:07:52.381| 15,3| neighbors.cc(294) getFirstUpParent:<br>
>     getFirstUpParent: returning 10.26.8.10<br>
>     2022/09/26 09:07:52.381| 44,3| peer_select.cc(978) peerAddFwdServer:<br>
>     adding FIRSTUP_PARENT/10.26.8.10<br>
>     2022/09/26 09:07:52.381| 28,3| Checklist.cc(70) preCheck:<br>
>     0x7ffd6220f0d0 checking fast rules<br>
>     2022/09/26 09:07:52.381| 28,3| Ip.cc(538) match: aclIpMatchIp:<br>
>     '10.25.41.21:34896' found<br>
>     2022/09/26 09:07:52.381| 28,3| Acl.cc(151) matches: checked: all = 1<br>
>     2022/09/26 09:07:52.382| 28,3| Acl.cc(151) matches: checked:<br>
>     peer_access squid-2.inf-proxy03-d01.dc02#1 = 1<br>
>     2022/09/26 09:07:52.382| 28,3| Acl.cc(151) matches: checked:<br>
>     peer_access squid-2.inf-proxy03-d01.dc02 = 1<br>
>     2022/09/26 09:07:52.382| 28,3| Checklist.cc(63) markFinished:<br>
>     0x7ffd6220f0d0 answer ALLOWED for match<br>
>     2022/09/26 09:07:52.382| 44,3| peer_select.cc(971) peerAddFwdServer:<br>
>     skipping ANY_OLD_PARENT/10.26.8.10; have FIRSTUP_PARENT/10.26.8.10<br>
>     2022/09/26 09:07:52.382| 28,3| Checklist.cc(70) preCheck:<br>
>     0x7ffd6220f0d0 checking fast rules<br>
>     2022/09/26 09:07:52.382| 28,3| Ip.cc(538) match: aclIpMatchIp:<br>
>     '10.25.41.21:34896' found<br>
>     2022/09/26 09:07:52.382| 28,3| Acl.cc(151) matches: checked: all = 1<br>
>     2022/09/26 09:07:52.382| 28,3| Acl.cc(151) matches: checked:<br>
>     peer_access squid-2.inf-proxy03-d01.dc01#1 = 1<br>
>     2022/09/26 09:07:52.382| 28,3| Acl.cc(151) matches: checked:<br>
>     peer_access squid-2.inf-proxy03-d01.dc01 = 1<br>
>     2022/09/26 09:07:52.382| 28,3| Checklist.cc(63) markFinished:<br>
>     0x7ffd6220f0d0 answer ALLOWED for match<br>
>     2022/09/26 09:07:52.382| 44,3| peer_select.cc(978) peerAddFwdServer:<br>
>     adding ANY_OLD_PARENT/127.0.0.1<br>
>     2022/09/26 09:07:52.382| 15,3| neighbors.cc(472) getDefaultParent:<br>
>     getDefaultParent: returning NULL<br>
>     2022/09/26 09:07:52.382| 44,2| peer_select.cc(295)<br>
>     peerSelectDnsPaths: Find IP destination for: api.gouv.fr:443' via<br>
>     10.26.8.10<br>
>     2022/09/26 09:07:52.382| 44,2| peer_select.cc(295)<br>
>     peerSelectDnsPaths: Find IP destination for: api.gouv.fr:443' via<br>
>     127.0.0.1<br>
>     2022/09/26 09:07:52.382| 44,2| peer_select.cc(316)<br>
>     peerSelectDnsPaths: Found sources for 'api.gouv.fr:443'<br>
>     2022/09/26 09:07:52.382| 44,2| peer_select.cc(317)<br>
>     peerSelectDnsPaths: always_direct = DENIED<br>
>     2022/09/26 09:07:52.382| 44,2| peer_select.cc(318)<br>
>     peerSelectDnsPaths: never_direct = ALLOWED<br>
>     2022/09/26 09:07:52.382| 44,2| peer_select.cc(328)<br>
>     peerSelectDnsPaths: cache_peer = local=0.0.0.0<br>
>     remote=10.26.8.10:3129 flags=1<br>
>     2022/09/26 09:07:52.382| 44,2| peer_select.cc(328)<br>
>     peerSelectDnsPaths: cache_peer = local=0.0.0.0 remote=127.0.0.1:3129<br>
>     flags=1<br>
>     2022/09/26 09:07:52.382| 44,2| peer_select.cc(331)<br>
>     peerSelectDnsPaths: timedout = 0<br>
>     2022/09/26 09:07:52.382| 26,3| tunnel.cc(1249)<br>
>     tunnelPeerSelectComplete: paths=2, p[0]={local=0.0.0.0<br>
>     remote=10.26.8.10:3129 flags=1}, serverDest[0]={local=0.0.0.0<br>
>     remote=10.26.8.10:3129 flags=1}<br>
>     2022/09/26 09:07:52.382| 17,3| FwdState.cc(1369)<br>
>     GetMarkingsToServer: from 0.0.0.0 netfilter mark 0<br>
>     2022/09/26 09:07:52.382| 26,3| AsyncCall.cc(25) AsyncCall: The<br>
>     AsyncCall tunnelConnectDone constructed, this=0x5653abf924a0 [call164]<br>
>     2022/09/26 09:07:52.382| 5,3| ConnOpener.cc(43) ConnOpener: will<br>
>     connect to local=0.0.0.0 remote=10.26.8.10:3129 flags=1 with 30 timeout<br>
>     2022/09/26 09:07:52.382| 50,3| comm.cc(350) comm_openex:<br>
>     comm_openex: Attempt open socket for: 0.0.0.0<br>
>     2022/09/26 09:07:52.382| 50,3| comm.cc(393) comm_openex:<br>
>     comm_openex: Opened socket local=0.0.0.0 remote=[::] FD 14 flags=1 :<br>
>     family=2, type=1, protocol=6<br>
>     2022/09/26 09:07:52.382| 51,3| fd.cc(198) fd_open: fd_open() FD 14<br>
>     api.gouv.fr:443<br>
>     2022/09/26 09:07:52.382| 5,3| ConnOpener.cc(291) createFd:<br>
>     local=0.0.0.0 remote=10.26.8.10:3129 flags=1 will timeout in 30<br>
>     2022/09/26 09:07:52.393| 26,3| AsyncCall.cc(92) ScheduleCall:<br>
>     ConnOpener.cc(139) will call<br>
>     tunnelConnectDone(local=10.25.8.10:58500 remote=10.26.8.10:3129 FD<br>
>     14 flags=1, data=0x5653abfa3598) [call164]<br>
>     2022/09/26 09:07:52.393| 26,3| AsyncCallQueue.cc(55) fireNext:<br>
>     entering tunnelConnectDone(local=10.25.8.10:58500<br>
>     remote=10.26.8.10:3129 FD 14 flags=1, data=0x5653abfa3598)<br>
>     2022/09/26 09:07:52.393| 26,3| AsyncCall.cc(37) make: make call<br>
>     tunnelConnectDone [call164]<br>
>     2022/09/26 09:07:52.393| 14,3| Address.cc(382) lookupHostIP: Given<br>
>     Non-IP 'api.gouv.fr': Name or service not known<br>
>     2022/09/26 09:07:52.393| 38,3| net_db.cc(355) netdbSendPing:<br>
>     netdbSendPing: pinging api.gouv.fr<br>
>     2022/09/26 09:07:52.393| 37,2| IcmpSquid.cc(59) SendEcho:  Socket<br>
>     Closed. Aborted send to 10.26.8.10, opcode 3, len 10<br>
>     2022/09/26 09:07:52.393| 26,3| tunnel.cc(1163)<br>
>     tunnelRelayConnectRequest: local=10.25.8.10:58500<br>
>     remote=10.26.8.10:3129 FD 14 flags=1, tunnelState=0x5653abfa3598<br>
>     2022/09/26 09:07:52.393| 22,3| refresh.cc(648) getMaxAge: getMaxAge:<br>
>     'api.gouv.fr:443'<br>
>     2022/09/26 09:07:52.393| 11,2| tunnel.cc(1177)<br>
>     tunnelRelayConnectRequest: Tunnel Server REQUEST:<br>
>     local=10.25.8.10:58500 remote=10.26.8.10:3129 FD 14 flags=1:<br>
>     ----------<br>
>     CONNECT api.gouv.fr:443 HTTP/1.1<br>
>     User-Agent: curl/7.52.1<br>
>     Host: api.gouv.fr:443<br>
>     X-Forwarded-For: unknown<br>
>     Cache-Control: max-age=259200<br>
>     Connection: close<br>
> <br>
> <br>
>     ----------<br>
>     2022/09/26 09:07:52.393| 5,3| comm.cc(559) commSetConnTimeout:<br>
>     local=10.25.8.10:58500 remote=10.26.8.10:3129 FD 14 flags=1 timeout 900<br>
>     2022/09/26 09:07:52.393| 5,3| comm.cc(559) commSetConnTimeout:<br>
>     local=10.25.8.10:58500 remote=10.26.8.10:3129 FD 14 flags=1 timeout 900<br>
>     2022/09/26 09:07:52.393| 26,3| AsyncCallQueue.cc(57) fireNext:<br>
>     leaving tunnelConnectDone(local=10.25.8.10:58500<br>
>     remote=10.26.8.10:3129 FD 14 flags=1, data=0x5653abfa3598)<br>
>     2022/09/26 09:07:52.393| 5,3| IoCallback.cc(116) finish: called for<br>
>     local=10.25.8.10:58500 remote=10.26.8.10:3129 FD 14 flags=1 (0, 0)<br>
>     2022/09/26 09:07:52.393| 26,3| tunnel.cc(929)<br>
>     tunnelConnectReqWriteDone: local=10.25.8.10:58500<br>
>     remote=10.26.8.10:3129 FD 14 flags=1, flag=0<br>
> <br>
> <br>
> It seems /peerGetSomeParent/ is called and this method never issue an ICP :<br>
> <br>
> <br>
>     staticvoid<br>
>     peerGetSomeParent(ps_state * ps)<br>
>     {<br>
>          CachePeer *p;<br>
>          HttpRequest *request = ps->request;<br>
>          hier_code code = HIER_NONE;<br>
>     debugs(44, 3, request->method << ' ' << request->url.host());<br>
>     if (ps->direct == DIRECT_YES)<br>
>     return;<br>
>     if ((p = peerSourceHashSelectParent(request))) {<br>
>              code = SOURCEHASH_PARENT;<br>
>     #if USE_AUTH<br>
>          } elseif ((p = peerUserHashSelectParent(request))) {<br>
>              code = USERHASH_PARENT;<br>
>     #endif<br>
>          } elseif ((p = carpSelectParent(request))) {<br>
>              code = CARP;<br>
>          } elseif ((p = getRoundRobinParent(request))) {<br>
>              code = ROUNDROBIN_PARENT;<br>
>          } elseif ((p = getWeightedRoundRobinParent(request))) {<br>
>              code = ROUNDROBIN_PARENT;<br>
>          } elseif ((p = getFirstUpParent(request))) {<br>
>              code = FIRSTUP_PARENT;<br>
>          } elseif ((p = getDefaultParent(request))) {<br>
>              code = DEFAULT_PARENT;<br>
>          }<br>
> <br>
>     if (code != HIER_NONE) {<br>
>     peerAddFwdServer(ps, p, code);<br>
>          }<br>
>     }<br>
> <br>
> <br>
> Instead of /peerGetSomeNeighbor/ :<br>
> <br>
> <br>
>     /**<br>
>       * peerGetSomeNeighbor<br>
>       *<br>
>       * Selects a neighbor (parent or sibling) based on one of the<br>
>       * following methods:<br>
>       *      Cache Digests<br>
>       *      CARP<br>
>       *      ICMP Netdb RTT estimates<br>
>       *      ICP/HTCP queries<br>
>       */<br>
>     staticvoid<br>
>     peerGetSomeNeighbor(ps_state * ps)<br>
>     {<br>
>          StoreEntry *entry = ps->entry;<br>
>          HttpRequest *request = ps->request;<br>
>          CachePeer *p;<br>
>          hier_code code = HIER_NONE;<br>
>     assert(entry->ping_status == PING_NONE);<br>
> <br>
>     if (ps->direct == DIRECT_YES) {<br>
>     entry->ping_status = PING_DONE;<br>
>     return;<br>
>          }<br>
> <br>
>     #if USE_CACHE_DIGESTS<br>
>     if ((p = neighborsDigestSelect(request))) {<br>
>     if (neighborType(p, request->url) == PEER_PARENT)<br>
>                  code = CD_PARENT_HIT;<br>
>     else<br>
>                  code = CD_SIBLING_HIT;<br>
>          } else<br>
>     #endif<br>
>     if ((p = netdbClosestParent(request))) {<br>
>                  code = CLOSEST_PARENT;<br>
>              } elseif (peerSelectIcpPing(request, ps->direct, entry)) {<br>
>     debugs(44, 3, "peerSelect: Doing ICP pings");<br>
>     ps->ping.start = current_time;<br>
>     ps->ping.n_sent = neighborsUdpPing(request,<br>
>                                                     entry,<br>
>                                                     peerHandlePingReply,<br>
>                                                     ps,<br>
>                                                   <br>
>       &ps->ping.n_replies_expected,<br>
>                                                     &ps->ping.timeout);<br>
> <br>
>     if (ps->ping.n_sent == 0)<br>
>     debugs(44, DBG_CRITICAL, "WARNING: neighborsUdpPing returned 0");<br>
>     debugs(44, 3, "peerSelect: " << ps->ping.n_replies_expected <<<br>
>     " ICP replies expected, RTT " << ps->ping.timeout <<<br>
>     " msec");<br>
> <br>
>     if (ps->ping.n_replies_expected > 0) {<br>
>     entry->ping_status = PING_WAITING;<br>
>     eventAdd("peerPingTimeout",<br>
>                               peerPingTimeout,<br>
>                               ps,<br>
>     0.001 * ps->ping.timeout,<br>
>     0);<br>
>     return;<br>
>                  }<br>
>              }<br>
> <br>
>     if (code != HIER_NONE) {<br>
>     assert(p);<br>
>     peerAddFwdServer(ps, p, code);<br>
>          }<br>
> <br>
>     entry->ping_status = PING_DONE;<br>
>     }<br>
> <br>
> <br>
> These functions are called from /peerSelectFoo/ :<br>
> <br>
> <br>
>     staticvoid<br>
>     peerSelectFoo(ps_state * ps)<br>
>     {<br>
>     if (!cbdataReferenceValid(ps->callback_data)) {<br>
>     debugs(44, 3, "Aborting peer selection. Parent Job went away.");<br>
>     delete ps;<br>
>     return;<br>
>          }<br>
>          StoreEntry *entry = ps->entry;<br>
>          HttpRequest *request = ps->request;<br>
>     debugs(44, 3, request->method << ' ' << request->url.host());<br>
>          /** If we don't know whether DIRECT is permitted ... */<br>
>     if (ps->direct == DIRECT_UNKNOWN) {<br>
>     if (ps->always_direct == ACCESS_DUNNO) {<br>
>     debugs(44, 3, "peerSelectFoo: direct = " << DirectStr[ps->direct] <<<br>
>     " (always_direct to be checked)");<br>
>                  /** check always_direct; */<br>
>                  ACLFilledChecklist *ch =<br>
>     newACLFilledChecklist(Config.accessList.AlwaysDirect, request, NULL);<br>
>     ch->al = ps->al;<br>
>     ps->acl_checklist = ch;<br>
>     ps->acl_checklist->nonBlockingCheck(peerCheckAlwaysDirectDone, ps);<br>
>     return;<br>
>              } elseif (ps->never_direct == ACCESS_DUNNO) {<br>
>     debugs(44, 3, "peerSelectFoo: direct = " << DirectStr[ps->direct] <<<br>
>     " (never_direct to be checked)");<br>
>                  /** check never_direct; */<br>
>                  ACLFilledChecklist *ch =<br>
>     newACLFilledChecklist(Config.accessList.NeverDirect, request, NULL);<br>
>     ch->al = ps->al;<br>
>     ps->acl_checklist = ch;<br>
>     ps->acl_checklist->nonBlockingCheck(peerCheckNeverDirectDone, ps);<br>
>     return;<br>
>              } elseif (request->flags.noDirect) {<br>
>                  /** if we are accelerating, direct is not an option. */<br>
>     ps->direct = DIRECT_NO;<br>
>     debugs(44, 3, "peerSelectFoo: direct = " << DirectStr[ps->direct] <<<br>
>     " (forced non-direct)");<br>
>              } elseif (request->flags.loopDetected) {<br>
>                  /** if we are in a forwarding-loop, direct is not an<br>
>     option. */<br>
>     ps->direct = DIRECT_YES;<br>
>     debugs(44, 3, "peerSelectFoo: direct = " << DirectStr[ps->direct] <<<br>
>     " (forwarding loop detected)");<br>
>              } elseif (peerCheckNetdbDirect(ps)) {<br>
>     ps->direct = DIRECT_YES;<br>
>     debugs(44, 3, "peerSelectFoo: direct = " << DirectStr[ps->direct] <<<br>
>     " (checkNetdbDirect)");<br>
>              } else {<br>
>     ps->direct = DIRECT_MAYBE;<br>
>     debugs(44, 3, "peerSelectFoo: direct = " << DirectStr[ps->direct] <<<br>
>     " (default)");<br>
>              }<br>
> <br>
>     debugs(44, 3, "peerSelectFoo: direct = " << DirectStr[ps->direct]);<br>
>          }<br>
> <br>
>     if (!entry || entry->ping_status == PING_NONE)<br>
>     peerSelectPinned(ps);<br>
>     if (entry == NULL) {<br>
>              (void) 0;<br>
>          } elseif (entry->ping_status == PING_NONE) {<br>
>     peerGetSomeNeighbor(ps);<br>
> <br>
>     if (entry->ping_status == PING_WAITING)<br>
>     return;<br>
>          } elseif (entry->ping_status == PING_WAITING) {<br>
>     peerGetSomeNeighborReplies(ps);<br>
>     entry->ping_status = PING_DONE;<br>
>          }<br>
> <br>
>     switch (ps->direct) {<br>
> <br>
>     case DIRECT_YES:<br>
>     peerGetSomeDirect(ps);<br>
>     break;<br>
> <br>
>     case DIRECT_NO:<br>
>     peerGetSomeParent(ps);<br>
>     peerGetAllParents(ps);<br>
>     break;<br>
> <br>
>     default:<br>
> <br>
>     if (Config.onoff.prefer_direct)<br>
>     peerGetSomeDirect(ps);<br>
> <br>
>     if (request->flags.hierarchical ||<br>
>     !Config.onoff.nonhierarchical_direct) {<br>
>     peerGetSomeParent(ps);<br>
>     peerGetAllParents(ps);<br>
>              }<br>
> <br>
>     if (!Config.onoff.prefer_direct)<br>
>     peerGetSomeDirect(ps);<br>
> <br>
>     break;<br>
>          }<br>
> <br>
>          // resolve the possible peers<br>
>     peerSelectDnsPaths(ps);<br>
>     }<br>
> <br>
> <br>
> /entry/ is /null/ so /peerGetSomeNeighbor/ is never called :<br>
> <br>
> if (entry == NULL) {<br>
>          (void) 0;<br>
>      } elseif (entry->ping_status == PING_NONE) {<br>
> peerGetSomeNeighbor(ps);<br>
> <br>
> if (entry->ping_status == PING_WAITING)<br>
> return;<br>
>      } elseif (entry->ping_status == PING_WAITING) {<br>
> peerGetSomeNeighborReplies(ps);<br>
> entry->ping_status = PING_DONE;<br>
>      }<br>
> <br>
> <br>
> Because of /tunnelStart/ method :<br>
> <br>
> <br>
>     void<br>
>     tunnelStart(ClientHttpRequest * http)<br>
>     {<br>
>     debugs(26, 3, HERE);<br>
>          /* Create state structure. */<br>
>          TunnelStateData *tunnelState = NULL;<br>
>          ErrorState *err = NULL;<br>
>          HttpRequest *request = http->request;<br>
>     char *url = http->uri;<br>
> <br>
>          /*<br>
>           * client_addr.isNoAddr()  indicates this is an "internal" request<br>
>           * from peer_digest.c, asn.c, netdb.c, etc and should always<br>
>           * be allowed.  yuck, I know.<br>
>           */<br>
> <br>
>     if (Config.accessList.miss && !request->client_addr.isNoAddr()) {<br>
>              /*<br>
>               * Check if this host is allowed to fetch MISSES from us<br>
>     (miss_access)<br>
>               * default is to allow.<br>
>               */<br>
>              ACLFilledChecklist ch(Config.accessList.miss, request, NULL);<br>
>     ch.al = http->al;<br>
>     ch.src_addr = request->client_addr;<br>
>     ch.my_addr = request->my_addr;<br>
>     ch.syncAle(request, http->log_uri);<br>
>     if (ch.fastCheck().denied()) {<br>
>     debugs(26, 4, HERE << "MISS access forbidden.");<br>
>                  err = newErrorState(ERR_FORWARDING_DENIED,<br>
>     Http::scForbidden, request);<br>
>     http->al->http.code = Http::scForbidden;<br>
>     errorSend(http->getConn()->clientConnection, err);<br>
>     return;<br>
>              }<br>
>          }<br>
>     debugs(26, 3, request->method << ' ' << url << ' ' <<<br>
>     request->http_ver);<br>
>          ++statCounter.server.all.requests;<br>
>          ++statCounter.server.other.requests;<br>
> <br>
>          tunnelState = newTunnelStateData(http);<br>
>     #if USE_DELAY_POOLS<br>
>          //server.setDelayId called from tunnelConnectDone after server<br>
>     side connection established<br>
>     #endif<br>
> <br>
>     peerSelect(&(tunnelState->serverDestinations), request, http->al,<br>
>     NULL,<br>
>                     tunnelPeerSelectComplete,<br>
>                     tunnelState);<br>
>     }<br>
> <br>
> <br>
> Any ideas ?<br>
> <br>
> Regards,<br>
> ThĂ©o BARRAGUÉ<br>
<br>
</div>
</span></font></div>
</body>
</html>