2 * Copyright (C) 1996-2018 The Squid Software Foundation and contributors
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.
9 #ifndef SQUID_COMM_TCPACCEPTOR_H
10 #define SQUID_COMM_TCPACCEPTOR_H
12 #include "anyp/forward.h"
13 #include "base/AsyncJob.h"
14 #include "base/CbcPointer.h"
15 #include "base/Subscription.h"
16 #include "comm/Flag.h"
17 #include "comm/forward.h"
19 class CommCloseCbParams
;
27 * Listens on a Comm::Connection for new incoming connections and
28 * emits an active Comm::Connection descriptor for the new client.
30 * Handles all event limiting required to quash inbound connection
31 * floods within the global FD limits of available Squid_MaxFD and
32 * client_ip_max_connections.
34 * Fills the emitted connection with all connection details able to
35 * be looked up. Currently these are the local/remote IP:port details
36 * and the listening socket transparent-mode flag.
38 class TcpAcceptor
: public AsyncJob
40 CBDATA_CLASS(TcpAcceptor
);
43 typedef CbcPointer
<Comm::TcpAcceptor
> Pointer
;
47 virtual bool doneAll() const;
48 virtual void swanSong();
49 virtual const char *status() const;
51 TcpAcceptor(const TcpAcceptor
&); // not implemented.
54 TcpAcceptor(const Comm::ConnectionPointer
&conn
, const char *note
, const Subscription::Pointer
&aSub
);
55 TcpAcceptor(const AnyP::PortCfgPointer
&listenPort
, const char *note
, const Subscription::Pointer
&aSub
);
57 /** Subscribe a handler to receive calls back about new connections.
58 * Unsubscribes any existing subscribed handler.
60 void subscribe(const Subscription::Pointer
&aSub
);
62 /** Remove the currently waiting callback subscription.
63 * Already scheduled callbacks remain scheduled.
65 void unsubscribe(const char *reason
);
67 /** Try and accept another connection (synchronous).
68 * If one is pending already the subscribed callback handler will be scheduled
69 * to handle it before this method returns.
73 /// Call the subscribed callback handler with details about a new connection.
74 void notify(const Comm::Flag flag
, const Comm::ConnectionPointer
&details
) const;
76 /// errno code of the last accept() or listen() action if one occurred.
80 friend class AcceptLimiter
;
81 int32_t isLimited
; ///< whether this socket is delayed and on the AcceptLimiter queue.
84 Subscription::Pointer theCallSub
; ///< used to generate AsyncCalls handling our events.
86 /// conn being listened on for new connections
87 /// Reserved for read-only use.
88 ConnectionPointer conn
;
90 /// configuration details of the listening port (if provided)
91 AnyP::PortCfgPointer listenPort_
;
93 /// listen socket closure handler
94 AsyncCall::Pointer closer_
;
96 /// Method to test if there are enough file descriptors to open a new client connection
97 /// if not the accept() will be postponed
98 static bool okToAccept();
100 /// Method callback for whenever an FD is ready to accept a client connection.
101 static void doAccept(int fd
, void *data
);
104 Comm::Flag
oldAccept(Comm::ConnectionPointer
&details
);
106 void handleClosure(const CommCloseCbParams
&io
);
107 /// whether we are listening on one of the squid.conf *ports
108 bool intendedForUserConnections() const { return bool(listenPort_
); }
113 #endif /* SQUID_COMM_TCPACCEPTOR_H */