]>
Commit | Line | Data |
---|---|---|
ee0989f2 | 1 | /* |
bf95c10a | 2 | * Copyright (C) 1996-2022 The Squid Software Foundation and contributors |
ee0989f2 | 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. | |
ee0989f2 | 7 | */ |
8 | ||
bbc27441 AJ |
9 | /* DEBUG: section 05 Socket Functions */ |
10 | ||
ee0989f2 | 11 | #ifndef _SQUIDCONNECTIONDETAIL_H_ |
12 | #define _SQUIDCONNECTIONDETAIL_H_ | |
13 | ||
ccfbe8f4 AR |
14 | #include "base/CodeContext.h" |
15 | #include "base/InstanceId.h" | |
49ae8b95 | 16 | #include "comm/forward.h" |
582c2af2 | 17 | #include "defines.h" |
89aec9b6 AJ |
18 | #if USE_SQUID_EUI |
19 | #include "eui/Eui48.h" | |
20 | #include "eui/Eui64.h" | |
21 | #endif | |
d35851f1 FC |
22 | #include "hier_code.h" |
23 | #include "ip/Address.h" | |
24 | #include "ip/forward.h" | |
25 | #include "mem/forward.h" | |
98cacedb | 26 | #include "time/gadgets.h" |
cc192b50 | 27 | |
5c336a3b | 28 | #include <iosfwd> |
5c336a3b | 29 | #include <ostream> |
5c336a3b | 30 | |
a3c6762c | 31 | class CachePeer; |
cfd66529 | 32 | |
2bcab852 CT |
33 | namespace Security |
34 | { | |
35 | class NegotiationHistory; | |
36 | }; | |
37 | ||
dc49061a A |
38 | namespace Comm |
39 | { | |
cfd66529 | 40 | |
27d1f0a0 AJ |
41 | /* TODO: make these a struct of boolean flags members in the connection instead of a bitmap. |
42 | * we can't do that until all non-comm code uses Commm::Connection objects to create FD | |
43 | * currently there is code still using comm_open() and comm_openex() synchronously!! | |
44 | */ | |
cfd66529 | 45 | #define COMM_UNSET 0x00 |
40d34a62 | 46 | #define COMM_NONBLOCKING 0x01 // default flag. |
cfd66529 | 47 | #define COMM_NOCLOEXEC 0x02 |
40d34a62 AJ |
48 | #define COMM_REUSEADDR 0x04 // shared FD may be both accept()ing and read()ing |
49 | #define COMM_DOBIND 0x08 // requires a bind() | |
50 | #define COMM_TRANSPARENT 0x10 // arrived via TPROXY | |
51 | #define COMM_INTERCEPTION 0x20 // arrived via NAT | |
7d17a6a6 | 52 | #define COMM_REUSEPORT 0x40 //< needs SO_REUSEPORT |
1c2b4465 | 53 | /// not registered with Comm and not owned by any connection-closing code |
50546301 | 54 | #define COMM_ORPHANED 0x80 |
62e76326 | 55 | |
739b352a AJ |
56 | /** |
57 | * Store data about the physical and logical attributes of a connection. | |
58 | * | |
2f8abb64 | 59 | * Some link state can be inferred from the data, however this is not an |
739b352a AJ |
60 | * object for state data. But a semantic equivalent for FD with easily |
61 | * accessible cached properties not requiring repeated complex lookups. | |
62 | * | |
50847dca | 63 | * Connection properties may be changed until the connection is opened. |
e83cc785 AJ |
64 | * Properties should be considered read-only outside of the Comm layer |
65 | * code once the connection is open. | |
739b352a | 66 | * |
1c8f25bb AJ |
67 | * These objects should not be passed around directly, |
68 | * but a Comm::ConnectionPointer should be passed instead. | |
739b352a | 69 | */ |
ccfbe8f4 | 70 | class Connection: public CodeContext |
cfd66529 | 71 | { |
fd7b48b9 AJ |
72 | MEMPROXY_CLASS(Comm::Connection); |
73 | ||
741c2986 | 74 | public: |
cfd66529 | 75 | Connection(); |
739b352a | 76 | |
aed188fd | 77 | /** Clear the connection properties and close any open socket. */ |
ccfbe8f4 | 78 | virtual ~Connection(); |
cfd66529 | 79 | |
2b6b1bcb AR |
80 | /// To prevent accidental copying of Connection objects that we started to |
81 | /// open or that are open, use cloneProfile() instead. | |
82 | Connection(const Connection &&) = delete; | |
9b7992d9 | 83 | |
2b6b1bcb AR |
84 | /// Create a new closed Connection with the same configuration as this one. |
85 | ConnectionPointer cloneProfile() const; | |
aed188fd | 86 | |
1c2b4465 CT |
87 | /// close the still-open connection when its last reference is gone |
88 | void enterOrphanage() { flags |= COMM_ORPHANED; } | |
89 | /// resume relying on owner(s) to initiate an explicit connection closure | |
90 | void leaveOrphanage() { flags &= ~COMM_ORPHANED; } | |
91 | ||
aed188fd | 92 | /** Close any open socket. */ |
55cbb02b AJ |
93 | void close(); |
94 | ||
b54a7c5a CT |
95 | /** Synchronize with Comm: Somebody closed our connection. */ |
96 | void noteClosure(); | |
97 | ||
55cbb02b | 98 | /** determine whether this object describes an active connection or not. */ |
d6327017 | 99 | bool isOpen() const { return (fd >= 0); } |
55cbb02b | 100 | |
7fb5be3e AJ |
101 | /** Alter the stored IP address pair. |
102 | * WARNING: Does not ensure matching IPv4/IPv6 are supplied. | |
103 | */ | |
104 | void setAddrs(const Ip::Address &aLocal, const Ip::Address &aRemote) {local = aLocal; remote = aRemote;} | |
105 | ||
a3c6762c | 106 | /** retrieve the CachePeer pointer for use. |
5229395c AJ |
107 | * The caller is responsible for all CBDATA operations regarding the |
108 | * used of the pointer returned. | |
109 | */ | |
a3c6762c | 110 | CachePeer * getPeer() const; |
5229395c | 111 | |
a3c6762c FC |
112 | /** alter the stored CachePeer pointer. |
113 | * Perform appropriate CBDATA operations for locking the CachePeer pointer | |
5229395c | 114 | */ |
a3c6762c | 115 | void setPeer(CachePeer * p); |
5229395c | 116 | |
8aec3e1b CT |
117 | /** The time the connection started */ |
118 | time_t startTime() const {return startTime_;} | |
119 | ||
c5c06f02 CT |
120 | /** The connection lifetime */ |
121 | time_t lifeTime() const {return squid_curtime - startTime_;} | |
122 | ||
123 | /** The time left for this connection*/ | |
124 | time_t timeLeft(const time_t idleTimeout) const; | |
125 | ||
0ce8e93b EB |
126 | /// Connection establishment timeout for callers that have already decided |
127 | /// to connect(2), either for the first time or after checking | |
128 | /// EnoughTimeToReForward() during any re-forwarding attempts. | |
129 | /// \returns the time left for this connection to become connected | |
130 | /// \param fwdStart The start time of the peer selection/connection process. | |
131 | time_t connectTimeout(const time_t fwdStart) const; | |
132 | ||
8aec3e1b | 133 | void noteStart() {startTime_ = squid_curtime;} |
2bcab852 CT |
134 | |
135 | Security::NegotiationHistory *tlsNegotiations(); | |
136 | const Security::NegotiationHistory *hasTlsNegotiations() const {return tlsHistory;} | |
137 | ||
ccfbe8f4 AR |
138 | /* CodeContext API */ |
139 | virtual ScopedId codeContextGist() const override; | |
140 | virtual std::ostream &detailCodeContext(std::ostream &os) const override; | |
141 | ||
5229395c | 142 | public: |
cfd66529 AJ |
143 | /** Address/Port for the Squid end of a TCP link. */ |
144 | Ip::Address local; | |
62e76326 | 145 | |
cfd66529 AJ |
146 | /** Address for the Remote end of a TCP link. */ |
147 | Ip::Address remote; | |
2d8c0b1a | 148 | |
cfd66529 | 149 | /** Hierarchy code for this connection link */ |
5229395c | 150 | hier_code peerType; |
cfd66529 | 151 | |
e83cc785 | 152 | /** Socket used by this connection. Negative if not open. */ |
cfd66529 AJ |
153 | int fd; |
154 | ||
739b352a | 155 | /** Quality of Service TOS values currently sent on this connection */ |
b5523edc AJ |
156 | tos_t tos; |
157 | ||
244da4ad AG |
158 | /** Netfilter MARK values currently sent on this connection |
159 | * In case of FTP, the MARK will be sent on data connections as well. | |
160 | */ | |
b5523edc | 161 | nfmark_t nfmark; |
cfd66529 | 162 | |
244da4ad AG |
163 | /** Netfilter CONNMARK value previously retrieved from this connection |
164 | * In case of FTP, the CONNMARK will NOT be applied to data connections, for one main reason: | |
165 | * the CONNMARK could be set by a third party like iptables and overwriting it in squid may | |
166 | * cause side effects and break CONNMARK-based policy. In other words, data connection is | |
167 | * related to control connection, but it's not the same. | |
168 | */ | |
169 | nfmark_t nfConnmark = 0; | |
170 | ||
cfd66529 AJ |
171 | /** COMM flags set on this connection */ |
172 | int flags; | |
739b352a | 173 | |
73c36fd9 AJ |
174 | char rfc931[USER_IDENT_SZ]; |
175 | ||
89aec9b6 AJ |
176 | #if USE_SQUID_EUI |
177 | Eui::Eui48 remoteEui48; | |
178 | Eui::Eui64 remoteEui64; | |
179 | #endif | |
180 | ||
a120b7a8 | 181 | InstanceId<Connection, uint64_t> id; |
ccfbe8f4 | 182 | |
739b352a AJ |
183 | private: |
184 | /** cache_peer data object (if any) */ | |
a3c6762c | 185 | CachePeer *peer_; |
8aec3e1b CT |
186 | |
187 | /** The time the connection object was created */ | |
188 | time_t startTime_; | |
2bcab852 CT |
189 | |
190 | /** TLS connection details*/ | |
191 | Security::NegotiationHistory *tlsHistory; | |
ee0989f2 | 192 | }; |
193 | ||
cfd66529 AJ |
194 | }; // namespace Comm |
195 | ||
6043e368 | 196 | std::ostream &operator << (std::ostream &os, const Comm::Connection &conn); |
5c336a3b AJ |
197 | |
198 | inline std::ostream & | |
199 | operator << (std::ostream &os, const Comm::ConnectionPointer &conn) | |
200 | { | |
aee3523a | 201 | if (conn != nullptr) |
5c336a3b AJ |
202 | os << *conn; |
203 | return os; | |
204 | } | |
205 | ||
ee0989f2 | 206 | #endif |
f53969cc | 207 |