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

static bool AlreadyTimedOut ( fde F)
static

Definition at line 1537 of file comm.cc.

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

Referenced by checkTimeouts().

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

Definition at line 973 of file comm.cc.

References debugs, and fd_table.

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().

void comm_exit ( void  )

Definition at line 1234 of file comm.cc.

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

Referenced by SquidShutdown().

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().

void comm_init_opened ( const Comm::ConnectionPointer conn,
const char *  note,
struct addrinfo AI 
)
static
unsigned short comm_local_port ( int  fd)
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().

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().

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

Definition at line 1017 of file comm.cc.

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

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 792 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().

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().

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().

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().

int comm_udp_recvfrom ( int  fd,
void *  buf,
size_t  len,
int  flags,
Ip::Address from 
)
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().

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

Definition at line 719 of file comm.cc.

References fde::closeHandler, debugs, F(), fd_table, NULL, and ScheduleCallHere.

Referenced by _comm_close(), and examine_select().

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 1630 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.

static void commHalfClosedReader ( const Comm::ConnectionPointer conn,
char *  ,
size_t  size,
Comm::Flag  flag,
int  ,
void *   
)
static
bool commHasHalfClosedMonitor ( int  fd)
static void commPlanHalfClosedCheck ( )
static
void commSetCloseOnExec ( int  fd)
int commSetConnTimeout ( const Comm::ConnectionPointer conn,
int  seconds,
AsyncCall::Pointer callback 
)
static void commSetNoLinger ( int  fd)
static

Definition at line 1032 of file comm.cc.

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

Referenced by comm_apply_flags().

static void commSetReuseAddr ( int  fd)
static

Definition at line 1047 of file comm.cc.

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

Referenced by comm_apply_flags(), and comm_open_uds().

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

Definition at line 1176 of file comm.cc.

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

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

static void commSetTcpRcvbuf ( int  fd,
int  size 
)
static

Definition at line 1057 of file comm.cc.

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

Referenced by comm_apply_flags(), and comm_open_uds().

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 1608 of file comm.cc.

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

Referenced by commMarkHalfClosed().

void commStartTlsClose ( const FdeCbParams params)

Definition at line 821 of file comm.cc.

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

Referenced by _comm_close().

void commStopHalfClosedMonitor ( int const  fd)

Definition at line 1662 of file comm.cc.

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

Referenced by _comm_close(), and comm_read_base().

int commUnsetNonBlocking ( int  fd)
static bool limitError ( int const  anErrno)
static

Definition at line 263 of file comm.cc.

Referenced by comm_open_uds(), and comm_openex().

void old_comm_reset_close ( int  fd)

Definition at line 807 of file comm.cc.

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

Referenced by commCloseAllSockets().

static bool writeTimedOut ( int  fd)
static

Definition at line 1552 of file comm.cc.

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

Referenced by checkTimeouts().

Variable Documentation

EVH commHalfClosedCheck
static

Definition at line 74 of file comm.cc.

Referenced by commPlanHalfClosedCheck().

IOCB commHalfClosedReader
static

Definition at line 60 of file comm.cc.

Referenced by commHalfClosedCheck().

DescriptorSet* TheHalfClosed = NULL
static

Definition at line 72 of file comm.cc.

Referenced by comm_exit().

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