comm.cc File Reference
#include "squid.h"
#include "ClientInfo.h"
#include "comm/AcceptLimiter.h"
#include "comm/comm_internal.h"
#include "comm/Connection.h"
#include "comm/IoCallback.h"
#include "comm/Loops.h"
#include "comm/Read.h"
#include "comm/TcpAcceptor.h"
#include "comm/Write.h"
#include "CommRead.h"
#include "compat/cmsg.h"
#include "DescriptorSet.h"
#include "event.h"
#include "fd.h"
#include "fde.h"
#include "globals.h"
#include "icmp/net_db.h"
#include "ip/Intercept.h"
#include "ip/QosConfig.h"
#include "ip/tools.h"
#include "pconn.h"
#include "profiler/Profiler.h"
#include "sbuf/SBuf.h"
#include "SquidConfig.h"
#include "StatCounters.h"
#include "StoreIOBuffer.h"
#include "tools.h"
#include "ssl/support.h"
#include <cerrno>
#include <cmath>
Include dependency graph for comm.cc:

Go to the source code of this file.

Functions

static void comm_init_opened (const Comm::ConnectionPointer &conn, const char *note, struct addrinfo *AI)
 update FD tables after a local or remote (IPC) comm_openex(); More...
 
static int comm_apply_flags (int new_socket, Ip::Address &addr, int flags, struct addrinfo *AI)
 
static void commHandleWriteHelper (void *data)
 
static void commPlanHalfClosedCheck ()
 
static Comm::Flag commBind (int s, struct addrinfo &)
 
static void commSetReuseAddr (int)
 
static void commSetNoLinger (int)
 
static void commSetTcpRcvbuf (int, int)
 
bool isOpen (const int fd)
 
static void comm_empty_os_read_buffers (int fd)
 
int comm_udp_recvfrom (int fd, void *buf, size_t len, int flags, Ip::Address &from)
 
int comm_udp_recv (int fd, void *buf, size_t len, int flags)
 
ssize_t comm_udp_send (int s, const void *buf, size_t len, int flags)
 
bool comm_has_incomplete_write (int fd)
 
unsigned short comm_local_port (int fd)
 
int comm_open (int sock_type, int proto, Ip::Address &addr, int flags, const char *note)
 
void comm_open_listener (int sock_type, int proto, Comm::ConnectionPointer &conn, const char *note)
 
int comm_open_listener (int sock_type, int proto, Ip::Address &addr, int flags, const char *note)
 
static bool limitError (int const anErrno)
 
void comm_set_v6only (int fd, int tos)
 
void comm_set_transparent (int fd)
 
int comm_openex (int sock_type, int proto, Ip::Address &addr, int flags, const char *note)
 
void comm_import_opened (const Comm::ConnectionPointer &conn, const char *note, struct addrinfo *AI)
 update Comm state after getting a comm_open() FD from another process More...
 
void commUnsetFdTimeout (int fd)
 clear a timeout handler by FD number More...
 
int commSetConnTimeout (const Comm::ConnectionPointer &conn, int timeout, AsyncCall::Pointer &callback)
 
int commUnsetConnTimeout (const Comm::ConnectionPointer &conn)
 
int comm_connect_addr (int sock, const Ip::Address &address)
 
void commCallCloseHandlers (int fd)
 
void comm_reset_close (const Comm::ConnectionPointer &conn)
 
void old_comm_reset_close (int fd)
 
void commStartTlsClose (const FdeCbParams &params)
 
void comm_close_complete (const FdeCbParams &params)
 
void _comm_close (int fd, char const *file, int line)
 
int comm_udp_sendto (int fd, const Ip::Address &to_addr, const void *buf, int len)
 
AsyncCall::Pointer comm_add_close_handler (int fd, CLCB *handler, void *data)
 
void comm_add_close_handler (int fd, AsyncCall::Pointer &call)
 
void comm_remove_close_handler (int fd, CLCB *handler, void *data)
 
void comm_remove_close_handler (int fd, AsyncCall::Pointer &call)
 
int commSetNonBlocking (int fd)
 
int commUnsetNonBlocking (int fd)
 
void commSetCloseOnExec (int fd)
 
void commSetTcpKeepalive (int fd, int idle, int interval, int timeout)
 
void comm_init (void)
 
void comm_exit (void)
 
int ignoreErrno (int ierrno)
 
void commCloseAllSockets (void)
 
static bool AlreadyTimedOut (fde *F)
 
static bool writeTimedOut (int fd)
 
void checkTimeouts (void)
 
void commStartHalfClosedMonitor (int fd)
 Start waiting for a possibly half-closed connection to close. More...
 
static void commHalfClosedCheck (void *)
 
bool commHasHalfClosedMonitor (int fd)
 checks whether we are waiting for possibly half-closed connection to close More...
 
void commStopHalfClosedMonitor (int const fd)
 stop waiting for possibly half-closed connection to close More...
 
static void commHalfClosedReader (const Comm::ConnectionPointer &conn, char *, size_t size, Comm::Flag flag, int, void *)
 I/O handler for the possibly half-closed connection monitoring code. More...
 
int comm_open_uds (int sock_type, int proto, struct sockaddr_un *addr, int flags)
 Create a unix-domain socket (UDS) that only supports FD_MSGHDR I/O. More...
 

Variables

static IOCB commHalfClosedReader
 
static DescriptorSetTheHalfClosed = NULL
 
static bool WillCheckHalfClosed = false
 the set of half-closed FDs More...
 
static EVH commHalfClosedCheck
 true if check is scheduled More...
 

Function Documentation

◆ _comm_close()

◆ AlreadyTimedOut()

static bool AlreadyTimedOut ( fde F)
static

Definition at line 1544 of file comm.cc.

References fde::flags, fde::_fde_flags::open, squid_curtime, and fde::timeout.

Referenced by checkTimeouts().

◆ checkTimeouts()

◆ comm_add_close_handler() [1/2]

◆ comm_add_close_handler() [2/2]

void comm_add_close_handler ( int  fd,
AsyncCall::Pointer call 
)

Definition at line 980 of file comm.cc.

References debugs, and fd_table.

◆ comm_apply_flags()

◆ comm_close_complete()

◆ comm_connect_addr()

◆ comm_empty_os_read_buffers()

static void comm_empty_os_read_buffers ( int  fd)
static

Empty the read buffers

This is a magical routine that empties the read buffers. Under some platforms (Linux) if a buffer has data in it before you call close(), the socket will hang and take quite a while to timeout.

Definition at line 100 of file comm.cc.

References buf, FD_MSGHDR, FD_READ_METHOD(), and fd_table.

Referenced by _comm_close().

◆ comm_exit()

void comm_exit ( void  )

Definition at line 1241 of file comm.cc.

References Comm::CallbackTableDestruct(), fd_table, NULL, safe_free, and TheHalfClosed.

Referenced by SquidShutdown().

◆ comm_has_incomplete_write()

bool comm_has_incomplete_write ( int  fd)

Definition at line 147 of file comm.cc.

References assert, COMMIO_FD_WRITECB, isOpen(), and NULL.

Referenced by PconnPool::push().

◆ comm_import_opened()

◆ comm_init()

◆ comm_init_opened()

void comm_init_opened ( const Comm::ConnectionPointer conn,
const char *  note,
struct addrinfo AI 
)
static

◆ comm_local_port()

unsigned short comm_local_port ( int  fd)

◆ comm_open()

int comm_open ( int  sock_type,
int  proto,
Ip::Address addr,
int  flags,
const char *  note 
)

Create a socket. Default is blocking, stream (TCP) socket. IO_TYPE is OR of flags specified in comm.h. Defaults TOS

Definition at line 222 of file comm.cc.

References comm_openex().

Referenced by accessLogInit(), comm_open_uds(), comm_openex(), ipc_thread_1(), ipcCreate(), and logfile_mod_udp_open().

◆ comm_open_listener() [1/2]

◆ comm_open_listener() [2/2]

int comm_open_listener ( int  sock_type,
int  proto,
Ip::Address addr,
int  flags,
const char *  note 
)

Open a port specially bound for listening or sending through a specific port. This is a wrapper providing IPv4/IPv6 failover around comm_openex(). Please use for all listening sockets and bind() outbound sockets.

It will open a socket bound for:

  • IPv4 if IPv6 is disabled or address is IPv4-native.
  • IPv6 if address is IPv6-native
  • IPv6 dual-stack mode if able to open [::]

When an open performs failover it update the given address to feedback the new IPv4-only status of the socket. Further displays of the IP (in debugs or cachemgr) will occur in Native IPv4 format. A reconfigure is needed to reset the stored IP in most cases and attempt a port re-open.

Definition at line 245 of file comm.cc.

References COMM_DOBIND, and comm_openex().

◆ comm_open_uds()

◆ comm_openex()

◆ comm_remove_close_handler() [1/2]

◆ comm_remove_close_handler() [2/2]

void comm_remove_close_handler ( int  fd,
AsyncCall::Pointer call 
)

Definition at line 1024 of file comm.cc.

References assert, debugs, fd_table, isOpen(), NULL, and p.

◆ comm_reset_close()

void comm_reset_close ( const Comm::ConnectionPointer conn)

enable linger with time of 0 so that when the socket is closed, TCP generates a RESET

Definition at line 793 of file comm.cc.

References Comm::Connection::close(), DBG_CRITICAL, debugs, Comm::Connection::fd, and xstrerr().

Referenced by ConnStateData::abortChunkedRequestBody(), clientProcessRequestFinished(), Adaptation::Icap::ServiceRep::putConnection(), and ConnStateData::setAuth().

◆ comm_set_transparent()

void comm_set_transparent ( int  fd)

Set the socket option required for TPROXY spoofing for:

  • Linux TPROXY v4 support,
  • OpenBSD divert-to support,
  • FreeBSD IPFW TPROXY v4 support.

Definition at line 288 of file comm.cc.

References DBG_CRITICAL, DBG_IMPORTANT, debugs, enter_suid(), fd_table, leave_suid(), MYNAME, and xstrerr().

Referenced by comm_apply_flags().

◆ comm_set_v6only()

void comm_set_v6only ( int  fd,
int  tos 
)

Definition at line 269 of file comm.cc.

References DBG_CRITICAL, DBG_IMPORTANT, debugs, MYNAME, and xstrerr().

Referenced by comm_openex().

◆ comm_udp_recv()

int comm_udp_recv ( int  fd,
void *  buf,
size_t  len,
int  flags 
)

Definition at line 134 of file comm.cc.

References comm_udp_recvfrom().

Referenced by ipcCreate(), and IcmpSquid::Recv().

◆ comm_udp_recvfrom()

int comm_udp_recvfrom ( int  fd,
void *  buf,
size_t  len,
int  flags,
Ip::Address from 
)

◆ comm_udp_send()

ssize_t comm_udp_send ( int  s,
const void *  buf,
size_t  len,
int  flags 
)

Definition at line 141 of file comm.cc.

Referenced by ipcCreate(), IcmpSquid::SendEcho(), wccpAssignBuckets(), and wccpHereIam().

◆ comm_udp_sendto()

◆ commBind()

static Comm::Flag commBind ( int  s,
struct addrinfo inaddr 
)
static

◆ commCallCloseHandlers()

◆ commCloseAllSockets()

◆ commHalfClosedCheck()

static void commHalfClosedCheck ( void *  )
static

iterates over all descriptors that may need half-closed tests and calls comm_read for those that do; re-schedules the check if needed

Definition at line 1645 of file comm.cc.

References DescriptorSet::begin(), commCbCall(), commHalfClosedReader, commPlanHalfClosedCheck(), debugs, DescriptorSet::end(), Comm::Connection::fd, fd_table, HERE(), i, NULL, Comm::Read(), and WillCheckHalfClosed.

◆ commHalfClosedReader()

static void commHalfClosedReader ( const Comm::ConnectionPointer conn,
char *  ,
size_t  size,
Comm::Flag  flag,
int  ,
void *   
)
static

◆ commHandleWriteHelper()

◆ commHasHalfClosedMonitor()

bool commHasHalfClosedMonitor ( int  fd)

◆ commPlanHalfClosedCheck()

static void commPlanHalfClosedCheck ( )
static

◆ commSetCloseOnExec()

◆ commSetConnTimeout()

int commSetConnTimeout ( const Comm::ConnectionPointer conn,
int  seconds,
AsyncCall::Pointer callback 
)

◆ commSetNoLinger()

static void commSetNoLinger ( int  fd)
static

Definition at line 1039 of file comm.cc.

References DBG_CRITICAL, debugs, fd_table, MYNAME, and xstrerr().

Referenced by comm_apply_flags().

◆ commSetNonBlocking()

◆ commSetReuseAddr()

static void commSetReuseAddr ( int  fd)
static

Definition at line 1054 of file comm.cc.

References DBG_IMPORTANT, debugs, MYNAME, and xstrerr().

Referenced by comm_apply_flags(), and comm_open_uds().

◆ commSetTcpKeepalive()

void commSetTcpKeepalive ( int  fd,
int  idle,
int  interval,
int  timeout 
)

Definition at line 1183 of file comm.cc.

References DBG_IMPORTANT, debugs, MYNAME, and xstrerr().

Referenced by Ftp::Server::AcceptCtrlConnection(), httpAccept(), and httpsAccept().

◆ commSetTcpRcvbuf()

static void commSetTcpRcvbuf ( int  fd,
int  size 
)
static

Definition at line 1064 of file comm.cc.

References DBG_IMPORTANT, debugs, MYNAME, and xstrerr().

Referenced by comm_apply_flags(), and comm_open_uds().

◆ commStartHalfClosedMonitor()

void commStartHalfClosedMonitor ( int  fd)

The read channel has closed and the caller does not expect more data but needs to detect connection aborts. The current detection method uses 0-length reads: We read until the error occurs or the writer closes the connection. If there is a read error, we close the connection.

Definition at line 1623 of file comm.cc.

References DescriptorSet::add(), assert, commHasHalfClosedMonitor(), commPlanHalfClosedCheck(), debugs, HERE(), and isOpen().

Referenced by commMarkHalfClosed().

◆ commStartTlsClose()

void commStartTlsClose ( const FdeCbParams params)

Definition at line 822 of file comm.cc.

References CommCommonCbParams::fd, fd_table, and Security::SessionSendGoodbye().

Referenced by _comm_close().

◆ commStopHalfClosedMonitor()

void commStopHalfClosedMonitor ( int const  fd)

Definition at line 1677 of file comm.cc.

References debugs, DescriptorSet::del(), fd_table, HERE(), NULL, and Comm::ReadCancel().

Referenced by _comm_close(), and comm_read_base().

◆ commUnsetConnTimeout()

◆ commUnsetFdTimeout()

◆ commUnsetNonBlocking()

int commUnsetNonBlocking ( int  fd)

◆ ignoreErrno()

◆ isOpen()

◆ limitError()

static bool limitError ( int const  anErrno)
static

Definition at line 263 of file comm.cc.

Referenced by comm_open_uds(), and comm_openex().

◆ old_comm_reset_close()

void old_comm_reset_close ( int  fd)

Definition at line 808 of file comm.cc.

References comm_close, DBG_CRITICAL, debugs, and xstrerr().

Referenced by commCloseAllSockets().

◆ writeTimedOut()

static bool writeTimedOut ( int  fd)
static

Definition at line 1559 of file comm.cc.

References COMMIO_FD_WRITECB, Config, fd_table, squid_curtime, SquidConfig::Timeout, and SquidConfig::write.

Referenced by checkTimeouts().

Variable Documentation

◆ commHalfClosedCheck

EVH commHalfClosedCheck
static

Definition at line 74 of file comm.cc.

Referenced by commPlanHalfClosedCheck().

◆ commHalfClosedReader

IOCB commHalfClosedReader
static

Definition at line 60 of file comm.cc.

Referenced by commHalfClosedCheck().

◆ TheHalfClosed

DescriptorSet* TheHalfClosed = NULL
static

Definition at line 72 of file comm.cc.

Referenced by comm_exit().

◆ WillCheckHalfClosed

bool WillCheckHalfClosed = false
static

Definition at line 73 of file comm.cc.

Referenced by commHalfClosedCheck(), and commPlanHalfClosedCheck().

 

Introduction

Documentation

Support

Miscellaneous

Web Site Translations

Mirrors