# TCPAllocation

<a id="tcpallocation"></a>

# TCPAllocation

```cpp
#include <icy/turn/server/tcpallocation.h>

class TCPAllocation
```

[Defined in src/turn/include/icy/turn/server/tcpallocation.h:36](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/tcpallocation.h#L36)

> **Inherits:** [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation)

Server-side TCP TURN allocation with connection pair management per RFC 6062. Maintains a control connection for STUN signalling and an acceptor socket for incoming peer TCP connections. Each peer connection is tracked as a [TCPConnectionPair](https://auscaster.com/icey/docs/api-reference/icy-turn-TCPConnectionPair.md#tcpconnectionpair) and bridged to the client after a successful ConnectionBind.

## List of all members

| Name | Kind | Owner |
|------|------|-------|
| [`TCPAllocation`](#tcpallocation-1) | `function` | Declared here |
| [`~TCPAllocation`](#tcpallocation-2) | `function` | Declared here |
| [`handleRequest`](#handlerequest-2) | `function` | Declared here |
| [`handleConnectRequest`](#handleconnectrequest) | `function` | Declared here |
| [`handleConnectionBindRequest`](#handleconnectionbindrequest-1) | `function` | Declared here |
| [`sendPeerConnectResponse`](#sendpeerconnectresponse) | `function` | Declared here |
| [`sendToControl`](#sendtocontrol) | `function` | Declared here |
| [`control`](#control) | `function` | Declared here |
| [`relayedAddress`](#relayedaddress-2) | `function` | Declared here |
| [`pairs`](#pairs) | `function` | Declared here |
| [`onTimer`](#ontimer-5) | `function` | Declared here |
| [`onPeerAccept`](#onpeeraccept) | `function` | Declared here |
| [`onControlClosed`](#oncontrolclosed) | `function` | Declared here |
| [`_control`](#_control) | `variable` | Declared here |
| [`_acceptor`](#_acceptor) | `variable` | Declared here |
| [`_pairs`](#_pairs) | `variable` | Declared here |
| [`Server`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#server-10) | `friend` | Inherited from [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation) |
| [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation-1) | `function` | Inherited from [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation) |
| [`~ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation-2) | `function` | Inherited from [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation) |
| [`handleRequest`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#handlerequest-1) | `function` | Inherited from [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation) |
| [`handleRefreshRequest`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#handlerefreshrequest) | `function` | Inherited from [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation) |
| [`handleCreatePermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#handlecreatepermission) | `function` | Inherited from [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation) |
| [`onTimer`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#ontimer-4) | `function` | Inherited from [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation) |
| [`timeRemaining`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#timeremaining-1) | `function` | Inherited from [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation) |
| [`maxTimeRemaining`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#maxtimeremaining) | `function` | Inherited from [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation) |
| [`hasPermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#haspermission-4) | `function` | Inherited from [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation) |
| [`hasPermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#haspermission-5) | `function` | Inherited from [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation) |
| [`server`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#server-11) | `function` | Inherited from [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation) |
| [`print`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#print-14) | `function` | Inherited from [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation) |
| [`refreshDeleteRequested`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#refreshdeleterequested) | `function` | Inherited from [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation) |
| [`_maxLifetime`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#_maxlifetime) | `variable` | Inherited from [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation) |
| [`_server`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#_server-1) | `variable` | Inherited from [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation) |
| [`_permissionPolicy`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#_permissionpolicy) | `variable` | Inherited from [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation) |
| [`_refreshDeleteRequested`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#_refreshdeleterequested) | `variable` | Inherited from [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation) |
| [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation-3) | `function` | Inherited from [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation) |
| [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#operator-228) | `function` | Inherited from [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation) |
| [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation-4) | `function` | Inherited from [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation) |
| [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#operator-229) | `function` | Inherited from [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation) |
| [`operator<<`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#operator-224) | `friend` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation-1) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`~IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation-2) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation-3) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#operator-225) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation-4) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#operator-226) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`updateUsage`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#updateusage) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`setLifetime`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#setlifetime) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`setBandwidthLimit`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#setbandwidthlimit) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`expired`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#expired-1) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`deleted`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#deleted-1) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`bandwidthLimit`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#bandwidthlimit) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`bandwidthUsed`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#bandwidthused) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`bandwidthRemaining`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#bandwidthremaining) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`timeRemaining`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#timeremaining) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`tuple`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#tuple) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`username`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#username-3) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`lifetime`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#lifetime-1) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`permissions`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#permissions) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`relayedAddress`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#relayedaddress-1) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`addPermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#addpermission-4) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`addPermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#addpermission-5) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`addPermissions`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#addpermissions) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`removePermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#removepermission-2) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`removePermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#removepermission-3) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`removeAllPermissions`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#removeallpermissions) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`removeExpiredPermissions`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#removeexpiredpermissions) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`hasPermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#haspermission-2) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`hasPermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#haspermission-3) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`print`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#print-13) | `function` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`_tuple`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_tuple) | `variable` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`_username`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_username-2) | `variable` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`_permissions`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_permissions) | `variable` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`_lifetime`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_lifetime) | `variable` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`_bandwidthLimit`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_bandwidthlimit) | `variable` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`_bandwidthUsed`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_bandwidthused) | `variable` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`_createdAt`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_createdat) | `variable` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`_updatedAt`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_updatedat) | `variable` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |
| [`_deleted`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_deleted) | `variable` | Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation) |

## Inherited from [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation)

| Kind | Name | Description |
|------|------|-------------|
| `friend` | [`Server`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#server-10)  |  |
| `function` | [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation-1)  |  |
| `function` | [`~ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation-2) `virtual` |  |
| `function` | [`handleRequest`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#handlerequest-1) `virtual` | Dispatches incoming STUN requests to [handleCreatePermission()](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#handlecreatepermission) or [handleRefreshRequest()](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#handlerefreshrequest). Subclasses override to add transport-specific methods. |
| `function` | [`handleRefreshRequest`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#handlerefreshrequest) `virtual` | Processes a Refresh request; updates the lifetime or sets the delete flag if the requested lifetime is 0, then sends a success response. |
| `function` | [`handleCreatePermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#handlecreatepermission) `virtual` | Processes a CreatePermission request; installs or refreshes permissions for each XOR-PEER-ADDRESS attribute, then sends a success response. |
| `function` | [`onTimer`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#ontimer-4)  | Periodic maintenance callback called by [Server::onTimer()](https://auscaster.com/icey/docs/api-reference/icy-turn-Server.md#ontimer-3). Removes expired permissions. Returns false to signal that this allocation should be destroyed. |
| `function` | [`timeRemaining`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#timeremaining-1) `virtual` `const` `override` |  |
| `function` | [`maxTimeRemaining`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#maxtimeremaining) `const` |  |
| `function` | [`hasPermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#haspermission-4) `virtual` `override` | Checks permission, auto-granting local IPs if enabled in server options. |
| `function` | [`hasPermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#haspermission-5) `virtual` `override` | Checks whether a permission exists for `peerAddress`. The port is ignored; TURN permissions are IP-only. |
| `function` | [`server`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#server-11) `virtual` |  |
| `function` | [`print`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#print-14) `virtual` `const` `override` | Writes a detailed diagnostic dump of this allocation to `os`. |
| `function` | [`refreshDeleteRequested`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#refreshdeleterequested) `const` `inline` | Returns true if the refresh request set lifetime to 0, signaling the parent [Server](https://auscaster.com/icey/docs/api-reference/icy-turn-Server.md#server-7) to delete this allocation. |
| `variable` | [`_maxLifetime`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#_maxlifetime)  |  |
| `variable` | [`_server`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#_server-1)  |  |
| `variable` | [`_permissionPolicy`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#_permissionpolicy)  |  |
| `variable` | [`_refreshDeleteRequested`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#_refreshdeleterequested)  |  |
| `function` | [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation-3)  | NonCopyable and NonMovable. |
| `function` | [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#operator-228)  | Deleted assignment operator. |
| `function` | [`ServerAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#serverallocation-4)  | Deleted constructor. |
| `function` | [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#operator-229)  | Deleted assignment operator. |

## Inherited from [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation)

| Kind | Name | Description |
|------|------|-------------|
| `friend` | [`operator<<`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#operator-224) `inline` |  |
| `function` | [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation-1)  |  |
| `function` | [`~IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation-2) `virtual` |  |
| `function` | [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation-3)  | Deleted constructor. |
| `function` | [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#operator-225)  | Deleted assignment operator. |
| `function` | [`IAllocation`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#iallocation-4)  | Deleted constructor. |
| `function` | [`operator=`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#operator-226)  | Deleted assignment operator. |
| `function` | [`updateUsage`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#updateusage) `virtual` | Updates the last-activity timestamp and accumulates bandwidth usage. Call this whenever data is relayed through the allocation. |
| `function` | [`setLifetime`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#setlifetime) `virtual` | Sets the allocation lifetime in seconds and resets the activity timestamp, effectively extending the expiry from the current moment. |
| `function` | [`setBandwidthLimit`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#setbandwidthlimit) `virtual` | Sets the maximum number of bytes this allocation may relay in its lifetime. Pass 0 to disable bandwidth limiting. |
| `function` | [`expired`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#expired-1) `virtual` `const` |  |
| `function` | [`deleted`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#deleted-1) `virtual` `const` | Returns true if the allocation's deleted flag is set and or if the allocation has expired. |
| `function` | [`bandwidthLimit`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#bandwidthlimit) `virtual` `const` |  |
| `function` | [`bandwidthUsed`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#bandwidthused) `virtual` `const` |  |
| `function` | [`bandwidthRemaining`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#bandwidthremaining) `virtual` `const` |  |
| `function` | [`timeRemaining`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#timeremaining) `virtual` `const` |  |
| `function` | [`tuple`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#tuple) `virtual` |  |
| `function` | [`username`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#username-3) `virtual` `const` |  |
| `function` | [`lifetime`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#lifetime-1) `virtual` `const` |  |
| `function` | [`permissions`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#permissions) `virtual` `const` |  |
| `function` | [`relayedAddress`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#relayedaddress-1) `virtual` `const` |  |
| `function` | [`addPermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#addpermission-4) `virtual` | Adds a permission for `ip`, or refreshes the existing one. |
| `function` | [`addPermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#addpermission-5) `virtual` | Adds a permission for `address`, or refreshes the existing one. The port is ignored; TURN permissions are IP-only. |
| `function` | [`addPermissions`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#addpermissions) `virtual` | Adds (or refreshes) permissions for multiple IPs. |
| `function` | [`removePermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#removepermission-2) `virtual` | Removes the permission for `ip` if present. |
| `function` | [`removePermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#removepermission-3) `virtual` | Removes the permission for `address` if present. The port is ignored; TURN permissions are IP-only. |
| `function` | [`removeAllPermissions`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#removeallpermissions) `virtual` | Removes all permissions from the list. |
| `function` | [`removeExpiredPermissions`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#removeexpiredpermissions) `virtual` | Removes any permissions whose 5-minute lifetime has elapsed. |
| `function` | [`hasPermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#haspermission-2) `virtual` | Checks whether a permission exists for `peerIP`. Local addresses (192.168.x.x and 127.x.x.x) are always permitted. |
| `function` | [`hasPermission`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#haspermission-3) `virtual` | Checks whether a permission exists for `peerAddress`. The port is ignored; TURN permissions are IP-only. |
| `function` | [`print`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#print-13) `virtual` `const` `inline` |  |
| `variable` | [`_tuple`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_tuple)  |  |
| `variable` | [`_username`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_username-2)  |  |
| `variable` | [`_permissions`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_permissions)  |  |
| `variable` | [`_lifetime`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_lifetime)  |  |
| `variable` | [`_bandwidthLimit`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_bandwidthlimit)  |  |
| `variable` | [`_bandwidthUsed`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_bandwidthused)  |  |
| `variable` | [`_createdAt`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_createdat)  |  |
| `variable` | [`_updatedAt`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_updatedat)  |  |
| `variable` | [`_deleted`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#_deleted)  |  |

## Public Methods

| Return | Name | Description |
|--------|------|-------------|
|  | [`TCPAllocation`](#tcpallocation-1)  |  |
|  | [`~TCPAllocation`](#tcpallocation-2) `virtual` |  |
| `bool` | [`handleRequest`](#handlerequest-2) `virtual` | Extends the base handler with Connect and ConnectionBind methods. |
| `void` | [`handleConnectRequest`](#handleconnectrequest)  | Handles a Connect request; creates a [TCPConnectionPair](https://auscaster.com/icey/docs/api-reference/icy-turn-TCPConnectionPair.md#tcpconnectionpair) and initiates a TCP connection to the peer address carried in XOR-PEER-ADDRESS. |
| `void` | [`handleConnectionBindRequest`](#handleconnectionbindrequest-1)  | Handles a ConnectionBind request; associates the incoming TCP data socket with the pending [TCPConnectionPair](https://auscaster.com/icey/docs/api-reference/icy-turn-TCPConnectionPair.md#tcpconnectionpair) and activates the relay pipe. |
| `void` | [`sendPeerConnectResponse`](#sendpeerconnectresponse)  | Sends a Connect success or failure response to the control connection. |
| `ssize_t` | [`sendToControl`](#sendtocontrol)  | Sends a STUN message to the client over the control TCP connection. |
| [`net::TCPSocket`](https://auscaster.com/icey/docs/api-reference/icy-net-TCPSocket.md#tcpsocket) & | [`control`](#control)  |  |
| [`net::Address`](https://auscaster.com/icey/docs/api-reference/icy-net-Address.md#address) | [`relayedAddress`](#relayedaddress-2) `virtual` `const` |  |
| [`TCPConnectionPairMap`](https://auscaster.com/icey/docs/api-reference/icy-turn.md#tcpconnectionpairmap) & | [`pairs`](#pairs)  |  |
| `bool` | [`onTimer`](#ontimer-5)  | Periodic timer callback; removes expired or pending-delete connection pairs, then calls the base class timer. |
| `void` | [`onPeerAccept`](#onpeeraccept)  | Accepts incoming peer sockets on the relay acceptor socket. Checks permissions and sends a ConnectionAttempt indication to the control. |
| `bool` | [`onControlClosed`](#oncontrolclosed)  | Called when the control connection closes; marks the allocation for deletion. |

---

<a id="tcpallocation-1"></a>

### TCPAllocation

```cpp
TCPAllocation(Server & server, const net::Socket::Ptr & control, const FiveTuple & tuple, const std::string & username, const uint32_t & lifetime)
```

[Defined in src/turn/include/icy/turn/server/tcpallocation.h:44](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/tcpallocation.h#L44)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `server` | [`Server`](https://auscaster.com/icey/docs/api-reference/icy-turn-Server.md#server-7) & | Owning TURN server. |
| `control` | const [`net::Socket::Ptr`](https://auscaster.com/icey/docs/api-reference/icy-net-Socket.md#ptr-9) & | The accepted TCP socket used for STUN control messages. |
| `tuple` | const [`FiveTuple`](https://auscaster.com/icey/docs/api-reference/icy-turn-FiveTuple.md#fivetuple) & | 5-tuple identifying this allocation. |
| `username` | `const std::string &` | Authenticated username from the Allocate request. |
| `lifetime` | `const uint32_t &` | Initial lifetime in seconds. |

---

<a id="tcpallocation-2"></a>

### ~TCPAllocation

`virtual`

```cpp
virtual ~TCPAllocation()
```

[Defined in src/turn/include/icy/turn/server/tcpallocation.h:47](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/tcpallocation.h#L47)

---

<a id="handlerequest-2"></a>

### handleRequest

`virtual`

```cpp
virtual bool handleRequest(Request & request)
```

[Defined in src/turn/include/icy/turn/server/tcpallocation.h:52](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/tcpallocation.h#L52)

Extends the base handler with Connect and ConnectionBind methods. 
#### Returns
true if handled.

#### Reimplements

- [`ServerAllocation::handleRequest`](https://auscaster.com/icey/docs/api-reference/icy-turn-ServerAllocation.md#handlerequest-1)

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `request` | [`Request`](https://auscaster.com/icey/docs/api-reference/icy-turn-Request.md#request-14) & | Incoming STUN request. |

---

<a id="handleconnectrequest"></a>

### handleConnectRequest

```cpp
void handleConnectRequest(Request & request)
```

[Defined in src/turn/include/icy/turn/server/tcpallocation.h:57](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/tcpallocation.h#L57)

Handles a Connect request; creates a [TCPConnectionPair](https://auscaster.com/icey/docs/api-reference/icy-turn-TCPConnectionPair.md#tcpconnectionpair) and initiates a TCP connection to the peer address carried in XOR-PEER-ADDRESS.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `request` | [`Request`](https://auscaster.com/icey/docs/api-reference/icy-turn-Request.md#request-14) & | Incoming Connect request. |

---

<a id="handleconnectionbindrequest-1"></a>

### handleConnectionBindRequest

```cpp
void handleConnectionBindRequest(Request & request)
```

[Defined in src/turn/include/icy/turn/server/tcpallocation.h:62](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/tcpallocation.h#L62)

Handles a ConnectionBind request; associates the incoming TCP data socket with the pending [TCPConnectionPair](https://auscaster.com/icey/docs/api-reference/icy-turn-TCPConnectionPair.md#tcpconnectionpair) and activates the relay pipe.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `request` | [`Request`](https://auscaster.com/icey/docs/api-reference/icy-turn-Request.md#request-14) & | Incoming ConnectionBind request. |

---

<a id="sendpeerconnectresponse"></a>

### sendPeerConnectResponse

```cpp
void sendPeerConnectResponse(TCPConnectionPair * pair, bool success)
```

[Defined in src/turn/include/icy/turn/server/tcpallocation.h:67](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/tcpallocation.h#L67)

Sends a Connect success or failure response to the control connection.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `pair` | [`TCPConnectionPair`](https://auscaster.com/icey/docs/api-reference/icy-turn-TCPConnectionPair.md#tcpconnectionpair) * | The connection pair whose peer connection attempt completed. |
| `success` | `bool` | true if the peer TCP connection succeeded. |

---

<a id="sendtocontrol"></a>

### sendToControl

```cpp
ssize_t sendToControl(stun::Message & message)
```

[Defined in src/turn/include/icy/turn/server/tcpallocation.h:72](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/tcpallocation.h#L72)

Sends a STUN message to the client over the control TCP connection. 
#### Returns
Number of bytes sent, or a negative value on error.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `message` | [`stun::Message`](https://auscaster.com/icey/docs/api-reference/icy-stun-Message.md#message-6) & | Message to send. |

---

<a id="control"></a>

### control

```cpp
net::TCPSocket & control()
```

[Defined in src/turn/include/icy/turn/server/tcpallocation.h:75](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/tcpallocation.h#L75)

#### Returns
Reference to the TCP control socket.

---

<a id="relayedaddress-2"></a>

### relayedAddress

`virtual` `const`

```cpp
virtual net::Address relayedAddress() const
```

[Defined in src/turn/include/icy/turn/server/tcpallocation.h:78](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/tcpallocation.h#L78)

#### Returns
The listen address of the peer acceptor socket (used as the relayed address).

#### Reimplements

- [`IAllocation::relayedAddress`](https://auscaster.com/icey/docs/api-reference/icy-turn-IAllocation.md#relayedaddress-1)

---

<a id="pairs"></a>

### pairs

```cpp
TCPConnectionPairMap & pairs()
```

[Defined in src/turn/include/icy/turn/server/tcpallocation.h:81](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/tcpallocation.h#L81)

#### Returns
Reference to the map of active TCPConnectionPairs keyed by connection ID.

---

<a id="ontimer-5"></a>

### onTimer

```cpp
bool onTimer()
```

[Defined in src/turn/include/icy/turn/server/tcpallocation.h:86](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/tcpallocation.h#L86)

Periodic timer callback; removes expired or pending-delete connection pairs, then calls the base class timer. 
#### Returns
false if the allocation should be destroyed.

---

<a id="onpeeraccept"></a>

### onPeerAccept

```cpp
void onPeerAccept(const net::TCPSocket::Ptr & sock)
```

[Defined in src/turn/include/icy/turn/server/tcpallocation.h:91](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/tcpallocation.h#L91)

Accepts incoming peer sockets on the relay acceptor socket. Checks permissions and sends a ConnectionAttempt indication to the control.

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `sock` | const [`net::TCPSocket::Ptr`](https://auscaster.com/icey/docs/api-reference/icy-net-TCPSocket.md#ptr-14) & | Newly accepted peer socket. |

---

<a id="oncontrolclosed"></a>

### onControlClosed

```cpp
bool onControlClosed(net::Socket & socket)
```

[Defined in src/turn/include/icy/turn/server/tcpallocation.h:96](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/tcpallocation.h#L96)

Called when the control connection closes; marks the allocation for deletion. 
#### Returns
false (event propagation convention).

#### Parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `socket` | [`net::Socket`](https://auscaster.com/icey/docs/api-reference/icy-net-Socket.md#socket-1) & | The closed control socket. |

## Protected Attributes

| Return | Name | Description |
|--------|------|-------------|
| [`net::SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter) | [`_control`](#_control)  |  |
| [`net::SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter) | [`_acceptor`](#_acceptor)  |  |
| [`TCPConnectionPairMap`](https://auscaster.com/icey/docs/api-reference/icy-turn.md#tcpconnectionpairmap) | [`_pairs`](#_pairs)  |  |

---

<a id="_control"></a>

### _control

```cpp
net::SocketEmitter _control
```

Type: [`net::SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter)

[Defined in src/turn/include/icy/turn/server/tcpallocation.h:99](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/tcpallocation.h#L99)

---

<a id="_acceptor"></a>

### _acceptor

```cpp
net::SocketEmitter _acceptor
```

Type: [`net::SocketEmitter`](https://auscaster.com/icey/docs/api-reference/icy-net-SocketEmitter.md#socketemitter)

[Defined in src/turn/include/icy/turn/server/tcpallocation.h:100](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/tcpallocation.h#L100)

---

<a id="_pairs"></a>

### _pairs

```cpp
TCPConnectionPairMap _pairs
```

Type: [`TCPConnectionPairMap`](https://auscaster.com/icey/docs/api-reference/icy-turn.md#tcpconnectionpairmap)

[Defined in src/turn/include/icy/turn/server/tcpallocation.h:101](https://github.com/auscaster/icey/blob/main/src/turn/include/icy/turn/server/tcpallocation.h#L101)
