]>
Commit | Line | Data |
---|---|---|
e6ccf245 | 1 | /* |
b8ae064d | 2 | * Copyright (C) 1996-2023 The Squid Software Foundation and contributors |
e6ccf245 | 3 | * |
bbc27441 AJ |
4 | * Squid software is distributed under GPLv2+ license and includes |
5 | * contributions from numerous individuals and organizations. | |
6 | * Please see the COPYING and CONTRIBUTORS files for details. | |
e6ccf245 | 7 | */ |
8 | ||
9 | #ifndef SQUID_ICP_H | |
10 | #define SQUID_ICP_H | |
11 | ||
63be0a78 | 12 | /** |
13 | \defgroup ServerProtocolICPAPI ICP | |
14 | \ingroup ServerProtocol | |
15 | */ | |
16 | ||
819be284 | 17 | #include "base/RefCount.h" |
e0d28505 | 18 | #include "comm/forward.h" |
582c2af2 | 19 | #include "icp_opcode.h" |
e0d28505 | 20 | #include "ip/Address.h" |
02c8dde5 | 21 | #include "LogTags.h" |
e1ba42a4 | 22 | #include "store_key_md5.h" |
9c947ba7 | 23 | #include "StoreClient.h" |
e6ccf245 | 24 | |
819be284 | 25 | class AccessLogEntry; |
582c2af2 FC |
26 | class HttpRequest; |
27 | ||
819be284 EB |
28 | typedef RefCount<AccessLogEntry> AccessLogEntryPointer; |
29 | ||
077fe581 | 30 | /** |
cb835136 AR |
31 | * Wire-level ICP header. |
32 | * DO NOT add or move fields. | |
e6ccf245 | 33 | * DO NOT add virtual methods. |
34 | */ | |
cb835136 AR |
35 | class icp_common_t { |
36 | public: | |
63be0a78 | 37 | /** opcode */ |
38 | unsigned char opcode; | |
39 | /** version number */ | |
40 | unsigned char version; | |
41 | /** total length (bytes) */ | |
42 | unsigned short length; | |
43 | /** req number (req'd for UDP) */ | |
09aabd84 FC |
44 | uint32_t reqnum; |
45 | uint32_t flags; | |
46 | uint32_t pad; | |
63be0a78 | 47 | /** sender host id */ |
09aabd84 | 48 | uint32_t shostid; |
63be0a78 | 49 | |
cb835136 AR |
50 | icp_common_t(); |
51 | icp_common_t(char *buf, unsigned int len); | |
62e76326 | 52 | |
b7ac5457 | 53 | void handleReply(char *buf, Ip::Address &from); |
e6ccf245 | 54 | icp_opcode getOpCode() const; |
09bbee4c | 55 | |
cb835136 AR |
56 | /// \returns newly allocated buffer with an ICP message, including header |
57 | static icp_common_t *CreateMessage(icp_opcode opcode, int flags, const char *url, int reqnum, int pad); | |
58 | }; | |
e6ccf245 | 59 | |
9837567d | 60 | // TODO: mempool this |
819be284 | 61 | class ICPState: public StoreClient |
62e76326 | 62 | { |
63 | ||
64 | public: | |
63be0a78 | 65 | ICPState(icp_common_t &aHeader, HttpRequest *aRequest); |
337b9aa4 | 66 | ~ICPState() override; |
819be284 | 67 | |
7976fed3 EB |
68 | /// whether the cache contains the requested entry |
69 | bool isHit() const; | |
70 | ||
e6ccf245 | 71 | icp_common_t header; |
190154cf | 72 | HttpRequest *request; |
e6ccf245 | 73 | int fd; |
62e76326 | 74 | |
b7ac5457 | 75 | Ip::Address from; |
e6ccf245 | 76 | char *url; |
7976fed3 | 77 | mutable AccessLogEntryPointer al; |
819be284 EB |
78 | |
79 | protected: | |
80 | /* StoreClient API */ | |
337b9aa4 AR |
81 | LogTags *loggingTags() const override; |
82 | void fillChecklist(ACLFilledChecklist &) const override; | |
62e76326 | 83 | |
d2a6dcba | 84 | /// either confirms and starts processing a cache hit or returns false |
7976fed3 | 85 | bool confirmAndPrepHit(const StoreEntry &) const; |
d4cb310b | 86 | }; |
87 | ||
e0d28505 AJ |
88 | extern Comm::ConnectionPointer icpIncomingConn; |
89 | extern Comm::ConnectionPointer icpOutgoingConn; | |
90 | extern Ip::Address theIcpPublicHostID; | |
91 | ||
63be0a78 | 92 | /// \ingroup ServerProtocolICPAPI |
8a648e8d | 93 | HttpRequest* icpGetRequest(char *url, int reqnum, int fd, Ip::Address &from); |
62e76326 | 94 | |
63be0a78 | 95 | /// \ingroup ServerProtocolICPAPI |
8a648e8d | 96 | bool icpAccessAllowed(Ip::Address &from, HttpRequest * icp_request); |
62e76326 | 97 | |
63be0a78 | 98 | /// \ingroup ServerProtocolICPAPI |
819be284 | 99 | void icpCreateAndSend(icp_opcode, int flags, char const *url, int reqnum, int pad, int fd, const Ip::Address &from, AccessLogEntryPointer); |
63be0a78 | 100 | |
101 | /// \ingroup ServerProtocolICPAPI | |
8a648e8d | 102 | icp_opcode icpGetCommonOpcode(); |
e6ccf245 | 103 | |
63be0a78 | 104 | /// \ingroup ServerProtocolICPAPI |
b7ac5457 | 105 | void icpDenyAccess(Ip::Address &from, char *url, int reqnum, int fd); |
63be0a78 | 106 | |
107 | /// \ingroup ServerProtocolICPAPI | |
8a648e8d | 108 | PF icpHandleUdp; |
63be0a78 | 109 | |
63be0a78 | 110 | /// \ingroup ServerProtocolICPAPI |
8a648e8d | 111 | void icpHandleIcpV3(int, Ip::Address &, char *, int); |
63be0a78 | 112 | |
63be0a78 | 113 | /// \ingroup ServerProtocolICPAPI |
8a648e8d | 114 | void icpOpenPorts(void); |
63be0a78 | 115 | |
116 | /// \ingroup ServerProtocolICPAPI | |
8a648e8d | 117 | void icpConnectionShutdown(void); |
63be0a78 | 118 | |
119 | /// \ingroup ServerProtocolICPAPI | |
8a648e8d | 120 | void icpClosePorts(void); |
63be0a78 | 121 | |
122 | /// \ingroup ServerProtocolICPAPI | |
8a648e8d | 123 | int icpSetCacheKey(const cache_key * key); |
e6ccf245 | 124 | |
63be0a78 | 125 | /// \ingroup ServerProtocolICPAPI |
8a648e8d | 126 | const cache_key *icpGetCacheKey(const char *url, int reqnum); |
e6ccf245 | 127 | |
e6ccf245 | 128 | #endif /* SQUID_ICP_H */ |
f53969cc | 129 |