]>
Commit | Line | Data |
---|---|---|
ee0989f2 | 1 | /* |
77b1029d | 2 | * Copyright (C) 1996-2020 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" | |
8aec3e1b | 26 | #include "SquidTime.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 CT |
53 | /// not registered with Comm and not owned by any connection-closing code |
54 | #define COMM_ORPHANED 0x40 | |
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 | |
aed188fd AJ |
80 | /** Copy an existing connections IP and properties. |
81 | * This excludes the FD. The new copy will be a closed connection. | |
739b352a | 82 | */ |
5ae21d99 | 83 | ConnectionPointer copyDetails() const; |
aed188fd | 84 | |
1c2b4465 CT |
85 | /// close the still-open connection when its last reference is gone |
86 | void enterOrphanage() { flags |= COMM_ORPHANED; } | |
87 | /// resume relying on owner(s) to initiate an explicit connection closure | |
88 | void leaveOrphanage() { flags &= ~COMM_ORPHANED; } | |
89 | ||
aed188fd | 90 | /** Close any open socket. */ |
55cbb02b AJ |
91 | void close(); |
92 | ||
b54a7c5a CT |
93 | /** Synchronize with Comm: Somebody closed our connection. */ |
94 | void noteClosure(); | |
95 | ||
55cbb02b | 96 | /** determine whether this object describes an active connection or not. */ |
d6327017 | 97 | bool isOpen() const { return (fd >= 0); } |
55cbb02b | 98 | |
7fb5be3e AJ |
99 | /** Alter the stored IP address pair. |
100 | * WARNING: Does not ensure matching IPv4/IPv6 are supplied. | |
101 | */ | |
102 | void setAddrs(const Ip::Address &aLocal, const Ip::Address &aRemote) {local = aLocal; remote = aRemote;} | |
103 | ||
a3c6762c | 104 | /** retrieve the CachePeer pointer for use. |
5229395c AJ |
105 | * The caller is responsible for all CBDATA operations regarding the |
106 | * used of the pointer returned. | |
107 | */ | |
a3c6762c | 108 | CachePeer * getPeer() const; |
5229395c | 109 | |
a3c6762c FC |
110 | /** alter the stored CachePeer pointer. |
111 | * Perform appropriate CBDATA operations for locking the CachePeer pointer | |
5229395c | 112 | */ |
a3c6762c | 113 | void setPeer(CachePeer * p); |
5229395c | 114 | |
8aec3e1b CT |
115 | /** The time the connection started */ |
116 | time_t startTime() const {return startTime_;} | |
117 | ||
c5c06f02 CT |
118 | /** The connection lifetime */ |
119 | time_t lifeTime() const {return squid_curtime - startTime_;} | |
120 | ||
121 | /** The time left for this connection*/ | |
122 | time_t timeLeft(const time_t idleTimeout) const; | |
123 | ||
0ce8e93b EB |
124 | /// Connection establishment timeout for callers that have already decided |
125 | /// to connect(2), either for the first time or after checking | |
126 | /// EnoughTimeToReForward() during any re-forwarding attempts. | |
127 | /// \returns the time left for this connection to become connected | |
128 | /// \param fwdStart The start time of the peer selection/connection process. | |
129 | time_t connectTimeout(const time_t fwdStart) const; | |
130 | ||
8aec3e1b | 131 | void noteStart() {startTime_ = squid_curtime;} |
2bcab852 CT |
132 | |
133 | Security::NegotiationHistory *tlsNegotiations(); | |
134 | const Security::NegotiationHistory *hasTlsNegotiations() const {return tlsHistory;} | |
135 | ||
ccfbe8f4 AR |
136 | /* CodeContext API */ |
137 | virtual ScopedId codeContextGist() const override; | |
138 | virtual std::ostream &detailCodeContext(std::ostream &os) const override; | |
139 | ||
5229395c AJ |
140 | private: |
141 | /** These objects may not be exactly duplicated. Use copyDetails() instead. */ | |
142 | Connection(const Connection &c); | |
143 | ||
144 | /** These objects may not be exactly duplicated. Use copyDetails() instead. */ | |
145 | Connection & operator =(const Connection &c); | |
146 | ||
147 | public: | |
cfd66529 AJ |
148 | /** Address/Port for the Squid end of a TCP link. */ |
149 | Ip::Address local; | |
62e76326 | 150 | |
cfd66529 AJ |
151 | /** Address for the Remote end of a TCP link. */ |
152 | Ip::Address remote; | |
2d8c0b1a | 153 | |
cfd66529 | 154 | /** Hierarchy code for this connection link */ |
5229395c | 155 | hier_code peerType; |
cfd66529 | 156 | |
e83cc785 | 157 | /** Socket used by this connection. Negative if not open. */ |
cfd66529 AJ |
158 | int fd; |
159 | ||
739b352a | 160 | /** Quality of Service TOS values currently sent on this connection */ |
b5523edc AJ |
161 | tos_t tos; |
162 | ||
244da4ad AG |
163 | /** Netfilter MARK values currently sent on this connection |
164 | * In case of FTP, the MARK will be sent on data connections as well. | |
165 | */ | |
b5523edc | 166 | nfmark_t nfmark; |
cfd66529 | 167 | |
244da4ad AG |
168 | /** Netfilter CONNMARK value previously retrieved from this connection |
169 | * In case of FTP, the CONNMARK will NOT be applied to data connections, for one main reason: | |
170 | * the CONNMARK could be set by a third party like iptables and overwriting it in squid may | |
171 | * cause side effects and break CONNMARK-based policy. In other words, data connection is | |
172 | * related to control connection, but it's not the same. | |
173 | */ | |
174 | nfmark_t nfConnmark = 0; | |
175 | ||
cfd66529 AJ |
176 | /** COMM flags set on this connection */ |
177 | int flags; | |
739b352a | 178 | |
73c36fd9 AJ |
179 | char rfc931[USER_IDENT_SZ]; |
180 | ||
89aec9b6 AJ |
181 | #if USE_SQUID_EUI |
182 | Eui::Eui48 remoteEui48; | |
183 | Eui::Eui64 remoteEui64; | |
184 | #endif | |
185 | ||
a120b7a8 | 186 | InstanceId<Connection, uint64_t> id; |
ccfbe8f4 | 187 | |
739b352a AJ |
188 | private: |
189 | /** cache_peer data object (if any) */ | |
a3c6762c | 190 | CachePeer *peer_; |
8aec3e1b CT |
191 | |
192 | /** The time the connection object was created */ | |
193 | time_t startTime_; | |
2bcab852 CT |
194 | |
195 | /** TLS connection details*/ | |
196 | Security::NegotiationHistory *tlsHistory; | |
ee0989f2 | 197 | }; |
198 | ||
cfd66529 AJ |
199 | }; // namespace Comm |
200 | ||
6043e368 | 201 | std::ostream &operator << (std::ostream &os, const Comm::Connection &conn); |
5c336a3b AJ |
202 | |
203 | inline std::ostream & | |
204 | operator << (std::ostream &os, const Comm::ConnectionPointer &conn) | |
205 | { | |
206 | if (conn != NULL) | |
207 | os << *conn; | |
208 | return os; | |
209 | } | |
210 | ||
ee0989f2 | 211 | #endif |
f53969cc | 212 |