760 Commits

Author SHA1 Message Date
sirzooro ceccc15191 Fix race and disconnection after candidate replace (#913)
This PR fixes two race conditions introduced by peer-reflexive candidate
replacement and addresses a connectivity regression where an agent could
transition from Connected to Disconnected/Failed shortly after
replacement.

## Problems

1. Data race in candidate pair access:

- `replaceRedundantPeerReflexiveCandidates` updated `pair.Remote` in
place.
- At the same time, hot-path reads (for example `CandidatePair.Write`)
could read `pair.Remote` without synchronization.

2. Data race in remote candidate cache map:

- `candidateBase.handleInboundPacket` (non-STUN path) read/wrote
`remoteCandidateCaches` from recv loop goroutines.
- Concurrent writes also happened from agent-loop code
(`replaceRemoteCandidateCacheValues`).

3. Connectivity regression after replacement:

- When replacing a selected pair's remote candidate (prflx -> signaled),
the new candidate could have zero `LastReceived`/`LastSent`.
- `validateSelectedPair` uses `selectedPair.Remote.LastReceived()`,
which could cause quick `Connected -> Disconnected -> Failed`
transitions.

## Root Cause

Replacement logic preserved pair priority but mutated shared objects in
place and did not preserve candidate activity timestamps across
candidate object replacement.

## Fixes

### 1) Replace candidate pair objects instead of mutating `pair.Remote`

- Added helper `replacePairRemote(pair, remote)` to clone pair state
into a new `CandidatePair`.
- Preserved pair fields and runtime stats:
  - `id`, role, state, nomination flags, binding counters.
  - RTT fields, packet/byte counters, request/response counters.
  - timestamp `atomic.Value` fields.
- Replaced references in:
  - `a.checklist[i]`
  - `a.pairsByID[pair.id]`
- If old pair was selected, published replacement via
`a.setSelectedPair(replacement)`.

### 2) Serialize remote cache access on agent loop

- Updated non-STUN path in `candidateBase.handleInboundPacket`:
- Cache validation, remote candidate lookup, `seen(false)`, and cache
insert now run inside `agent.loop.Run(...)`.
- This removes concurrent map read/write between recv loop and
agent-loop updates.

### 3) Preserve candidate activity on replacement

- Added `copyCandidateActivity(dst, src)` to transfer:
  - `LastReceived`
  - `LastSent`
- Applied before replacing references so selected-pair liveness checks
remain stable.
v4.2.5
2026-04-21 06:27:53 +02:00
Vinayak Mishra e6483a6066 Add fuzz test for UnmarshalCandidate 2026-04-16 21:16:47 +02:00
Jo Turk 883b73c4c4 Upgrade to turn/v5 2026-04-15 15:38:11 +02:00
sirzooro ffbe6d5f0b Fixed TCP bugs, added TURN transport type option (#908)
Fix relay transport semantics and decouple TURN control transport from
relay candidate network type

## Summary

This change fixes relay transport handling in two critical areas:

1. Some relay candidates were exposed with `tcp` network in the
candidate line, even though relayed endpoints are UDP.
2. Relay connectivity could fail when pion/ice was configured with
TCP-only network types, because TURN control transport selection and
relay candidate transport were incorrectly coupled.

The patch separates these concerns:

- Relay candidate transport is treated as UDP (current TURN allocation
behavior).
- TURN client-to-server transport is selected independently from URL
scheme/proto and a dedicated TURN transport protocol configuration.

## Bugs Fixed

### 1) Incorrect relay candidate network type in candidate lines

Before this change, relay candidates created through TURN over TCP/TLS
paths could carry TCP network in candidate metadata.

Now relay candidates are always emitted as UDP network candidates,
matching actual relayed endpoint behavior.

### 2) Relay connection failure in TCP-only configurations

Before this change, relay gathering used candidate network type
filtering to drive TURN control connection transport, which could block
valid TURN/TCP or TURNS flows depending on configured candidate network
types.

Now TURN control transport selection is independent and based on:

- Effective URL transport (explicit `transport` or implicit defaults:
TURN->UDP, TURNS->TCP)
- Allowed TURN transport protocols configuration

This enables relay connectivity in scenarios where TURN control
transport is TCP while relay endpoints remain UDP.

## Key Implementation Changes

- Introduced dedicated TURN control transport filtering path for relay
gathering.
- Kept relay candidate publication gated by UDP candidate support (relay
allocations currently produce UDP endpoints).
- Ensured relay candidate creation uses UDP network type regardless of
TURN control channel transport.
- Removed early remote candidate rejection based only on local network
type filters, so candidates are stored and compatibility is handled
later at pairing/sending stages.
- Added sanitization/deduplication for network-type based options and
TURN transport protocol options.

## API/Config Notes

- `WithNetworkTypes(...)` continues to control candidate network types
exposed/used for pairing.
- `WithTURNTransportProtocols(...)` controls TURN client<->server
transport independently.
- Config comments were updated to clarify these responsibilities and
defaults.

## Test Coverage Added/Updated

- Added comprehensive relay/srflx/host transport matrix coverage in
`transport_filtering_matrix_test.go`.
- Added explicit TURN/TURNS and implicit transport-default test cases.
- Added regression test verifying TURN-over-TCP still produces UDP relay
candidates.
- Updated remote-candidate behavior tests to reflect store-first
semantics.
- Added/updated option sanitization tests for network type and TURN
transport protocol handling.
v4.2.4
2026-04-14 05:43:24 +02:00
sirzooro 23e8708890 Updated received trickled candidates handling (#877)
Implements RFC 8838 §11.4 (“Receiving Trickled Candidates”) behavior so
that when a remote peer-reflexive (prflx) candidate is discovered first,
a later signaled equivalent candidate (host/srflx/relay) replaces it
in-place while preserving checklist/pair behavior.

## Key Changes

- **prflx replacement on trickle (RFC 8838 §11.4)**
- Replace redundant remote prflx candidates when a signaled candidate
with the same transport address arrives.
- Upgrade existing checklist pairs in-place (remote candidate swap),
while preserving the pair priority.
- Update local candidate remote-candidate caches so subsequent lookups
use the signaled candidate.
  - Avoid creating duplicate pairs when the replacement occurs.

- **prflx priority from inbound STUN (RFC 5245 §7.1.3.2.1)**
- When a prflx candidate is discovered via an inbound Binding Request,
set its priority from the STUN `PRIORITY` attribute.


~~- **Candidate pair priority correctness (RFC 5245)**~~
~~- Fix pair-priority computation to use the RFC 5245 formula with
$2^{32}$ (not $2^{32}-1$).~~
~~- Add an internal helper for the computation and make it overflow-safe
via saturation.~~
~~- Add a pair-level priority override so prflx→signaled replacement can
preserve the previously computed pair priority.~~
(Restored original code, this change was not needed)

- **Handler notifier deadlock/starvation fix**
- Split the notifier’s single `running` flag into independent running
state for connection-state, candidate, and selected-pair queues.
- Prevent callback starvation that could cause tests (and user code)
waiting on connection-state transitions to hang.

~~- **Test stability improvements (Active TCP)**~~
~~- Prefer non-link-local IPv6 addresses and skip IPv6 cases when only
link-local addresses exist.~~
~~- Use mDNS on non-Windows platforms but disable it on Windows to
reduce flakiness.~~
~~- Increase the per-subtest timeout to reduce intermittent CI/dev
timeouts.~~
(Moved to another PR)

#### Reference issue
Fixes #622
2026-04-12 21:04:12 +02:00
Star-ho 99fbdeaadb Fix controlled agent STUN busy loop
Once a candidate pair reaches Succeeded state with a selected pair,
controlledSelector.HandleBindingRequest no longer sends a triggered
check (PingCandidate). Previously, every inbound Binding Request
unconditionally called PingCandidate, creating a ping-pong loop
where each Response triggered a new Request at 1/RTT speed.

After connection is established, consent freshness is maintained
by checkKeepalive() on a timer, so triggered checks are not needed.

Added regression tests verifying:
- No triggered check for succeeded+selected pairs
- Triggered check still sent during ICE checking phase
v4.2.3
2026-04-11 00:28:37 +02:00
Alex Snyatkov ce7d392e37 Use *[]byte in bufferPool to reduce allocs
sync.Pool boxes values into any (interface{}).
Storing []byte directly causes the 24-byte slice
header to be heap-allocated on every Put().
Storing *[]byte avoids this since the pointer is
already on the heap.

Same pattern used in Go stdlib (fmt.pp,
encoding/json).
2026-04-07 04:50:09 +02:00
Pion 9acc9f60f0 Update CI configs to v0.12.2
Update lint scripts and CI configs.
2026-04-06 00:45:41 +02:00
renovate[bot] 82b3551012 Update module github.com/pion/stun/v3 to v3.1.2 (#904)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [github.com/pion/stun/v3](https://redirect.github.com/pion/stun) |
`v3.1.1` → `v3.1.2` |
![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fpion%2fstun%2fv3/v3.1.2?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fpion%2fstun%2fv3/v3.1.1/v3.1.2?slim=true)
|

---

### Release Notes

<details>
<summary>pion/stun (github.com/pion/stun/v3)</summary>

###
[`v3.1.2`](https://redirect.github.com/pion/stun/releases/tag/v3.1.2)

[Compare
Source](https://redirect.github.com/pion/stun/compare/v3.1.1...v3.1.2)

#### Changelog

-
[`f927db8`](https://redirect.github.com/pion/stun/commit/f927db87cf42b1a39cb233764eb3f9abbf9d414b)
Keep DTLS configs until API change
-
[`20e8a63`](https://redirect.github.com/pion/stun/commit/20e8a63ba63129edb660b6c90fdfb22e93562dca)
Apply modernize, link upgrades and checks
-
[`1a06979`](https://redirect.github.com/pion/stun/commit/1a06979434a655d93a53ea7bdcbf85035c15f852)
Update CI configs to v0.12.1
-
[`97b4669`](https://redirect.github.com/pion/stun/commit/97b4669b3803421b9b6aebafae6a5beb9fb76498)
Update module github.com/pion/dtls/v3 to v3.1.2
-
[`31c4046`](https://redirect.github.com/pion/stun/commit/31c4046316a11c2125dddd7e73cb50b4c6b50d3c)
Update module github.com/pion/dtls/v3 to v3.0.11 \[SECURITY]
([#&#8203;268](https://redirect.github.com/pion/stun/issues/268))
-
[`e615214`](https://redirect.github.com/pion/stun/commit/e615214b639f76a558da9b2210eee4e9e417c338)
Update CI configs to v0.12.0
-
[`9279313`](https://redirect.github.com/pion/stun/commit/9279313de626b55b7b30b90af26fcd49641fd6a4)
Update CI configs to v0.11.39
-
[`be995ed`](https://redirect.github.com/pion/stun/commit/be995ed92bfcceded27a8b830f07a962dd751e7b)
Use constant format string
-
[`76f3a9f`](https://redirect.github.com/pion/stun/commit/76f3a9ffabac570cca57c006ae6e178b12c02caf)
Update CI configs to v0.11.37

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/pion/ice).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4xMDIuNyIsInVwZGF0ZWRJblZlciI6IjQzLjEwMi43IiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIiwibGFiZWxzIjpbXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-02 01:13:09 +00:00
Jo Turk 8e16375115 Match libwebrtc's nomination attribute 2026-03-30 17:34:28 +02:00
Philipp Hancke 9ddcde837c Expose asynchronous API for connect (#862)
This adds a nonblocking API for ICE that will allow the PeerConnection's
`startTransports` to start ICE, *not* wait for ICE to connect and start
DTLS so the DTLS handshake can be piggybacked into the STUN messages
earlier.
2026-03-26 14:03:03 +01:00
sirzooro fdd86c407c Respect transport parameters and allowed net types (#901)
## Summary

This change makes transport/network-type handling consistent across
candidate gathering and remote candidate admission.

It fixes cases where the ICE agent could use STUN/TURN URLs with
mismatched transport or accept remote candidates on disabled network
types.

## What changed

### 1) Remote candidate filtering by configured network types

- Added a guard in `addRemoteCandidate` to ignore candidates whose
`NetworkType` is not enabled in `AgentConfig.NetworkTypes`.
- Added logging for ignored candidates.

### 2) URL transport interpretation and filtering

- Added helpers:
- `effectiveURLProtoType` (applies default transport when URI transport
is omitted)
  - `urlSupportsSrflxGathering`
  - `relayNetworkTypesForURL`
  - `configuredNetworkTypes`
- Applied this logic to srflx gathering (`gatherCandidatesSrflx`,
`gatherCandidatesSrflxUDPMux`) so only valid UDP URLs are used.

### 3) Relay gathering honors network types and filtered local binds

- Refactored relay gathering to select per-URL/per-network-type behavior
instead of hardcoded network assumptions.
- Kept support for interface/IP filtered local binding addresses in
relay/srflx paths.
- Replaced manual host:port formatting in srflx paths with
`net.JoinHostPort(..., strconv.Itoa(...))` for safer address
construction.

### 4) IPv6 TURN status (important)

- IPv6 TURN code paths were updated and covered by tests, but full IPv6
TURN support is not complete yet.
- For now, IPv6 TURN relay gathering is intentionally disabled in
runtime path.
- Related IPv6 relay test scenario is present but currently skipped
(`t.Skip("IPv6 TURN is not supported yet")`).

### Reference issue
Fixes #367
v4.2.2
2026-03-23 19:03:53 +01:00
sirzooro e29653e9ff Add remote candidate IP filtering to ICE Agent (#898)
## Summary

This PR adds support for filtering **remote** candidate IP addresses
before they are accepted by the agent.

A new `RemoteIPFilter` callback can now be configured via both
`AgentConfig` and `WithRemoteIPFilter(...)`. The filter is applied
consistently when:

- remote candidates are added through `AddRemoteCandidate` / internal
`addRemoteCandidate`
- peer-reflexive candidates are discovered from inbound STUN Binding
requests

If a remote candidate is rejected by policy (or its address cannot be
parsed), it is ignored and not added.

## Motivation

`IPFilter` controls local candidate gathering, but there was no
symmetric policy control for incoming remote candidates. This change
enables allowlist/blocklist style enforcement for remote candidate
addresses.

## What changed

- `agent_config.go`
  - Added `RemoteIPFilter func(net.IP) (keep bool)` to `AgentConfig`.

- `agent_options.go`
  - Added `WithRemoteIPFilter(filter func(net.IP) bool) AgentOption`.

- `agent.go`
  - Added `remoteIPFilter` field to `Agent`.
  - Wired `AgentConfig.RemoteIPFilter` into agent construction.
  - Added `shouldAcceptRemoteCandidate(cand Candidate) bool`.
- Applied filtering before adding remote candidates in
`addRemoteCandidate`.
- Applied filtering to newly created peer-reflexive candidates in
inbound request handling.
- Added warning logs when candidate address parsing fails or candidate
is filtered out.

- Tests
  - `agent_options_test.go`
    - Added `TestWithRemoteIPFilterOption`.
  - `agent_test.go`
    - Added coverage for filtering in direct remote candidate addition.
- Added coverage for filtering in `AddRemoteCandidate` asynchronous
path.
- Added inbound Binding request case verifying blocked prflx candidates
are discarded.
- Included `WithRemoteIPFilter` in non-updatable options test matrix.
2026-03-21 08:18:14 +01:00
Ali Sayyah 3cabadd645 Bail early in listenUDPInPortRange on interface-level errors (#896)
## Summary
- When a network interface disappears (e.g. Kubernetes pods with
`host_network: true`), `listenUDPInPortRange` would try every port in
the range before giving up, causing high CPU usage
- Added `isInterfaceLevelError()` to detect `EADDRNOTAVAIL` — the error
the kernel returns when binding to an IP that is no longer assigned to
any local interface
- The loop now bails immediately on `EADDRNOTAVAIL` instead of
exhausting the entire port range
- Cross-platform support: handles both POSIX `EADDRNOTAVAIL` and Windows
`WSAEADDRNOTAVAIL` (10049) via platform-specific files

Fixes #779

## Test plan
- [x] `TestListenUDPInPortRange_BailsOnEADDRNOTAVAIL` — mock test
verifying early bail on `EADDRNOTAVAIL` wrapped in real kernel error
chain (`OpError → SyscallError → Errno`)
- [x] `TestListenUDPInPortRange_ContinuesOnPortBusyError` — regression
guard: `EADDRINUSE` still tries all ports
- [x] `TestListenUDPInPortRange_RealEADDRNOTAVAIL` — integration test
using actual kernel `bind()` against TEST-NET-1 (`192.0.2.1`), skipped
on WASM
- [x] Existing `DefaultsPortMinTo1024` and `DefaultsPortMaxToFFFF` still
pass
- [x] Builds on all platforms: Linux, macOS, Windows, WASM
- [x] `golangci-lint` passes with no new issues

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 12:26:04 -07:00
sirzooro 8f6a882190 Honor interface/IP filters for srflx and relay STUN requests (#899)
## Summary

This PR fixes a bug where server-reflexive (srflx) STUN requests and
TURN relay UDP sockets could be sent from interfaces that were filtered
out by `InterfaceFilter` / `IPFilter`.

Previously:

- srflx gathering used wildcard local binds (`0.0.0.0` / `::`)
- relay TURN/UDP gathering used wildcard local bind (`0.0.0.0:0`)

That allowed kernel routing to choose source interfaces outside
configured filters, which could expose public IPs from non-allowed
adapters.

With this change, when interface/IP filters are configured:

- srflx gathering binds STUN sockets to filtered local interface
addresses only
- relay (TURN/UDP) gathering binds local sockets to filtered local
interface addresses only

## Root cause

- Wildcard local binds do not constrain source interface selection.
- `localInterfaces(...)` filtering was applied to host gathering but not
consistently to srflx and relay local bind paths.

## What changed

- `gather.go`
  - Refactored `gatherCandidatesSrflx` to support two modes:
    - **Filtered mode** (`interfaceFilter` or `ipFilter` set):
      - Resolve filtered local interfaces via `localInterfaces(...)`.
      - Bind srflx sockets per matching local address/family.
    - **Default mode** (no filters):
      - Preserve existing wildcard-bind behavior.
- Updated `gatherCandidatesRelay` (TURN/UDP path) with the same two-mode
behavior:
- **Filtered mode** binds relay UDP sockets per filtered local IPv4
address.
    - **Default mode** preserves legacy `0.0.0.0:0` bind behavior.

- `gather_test.go`
- Added `srflxListenCaptureNet` and
`TestGatherCandidatesSrflxRespectsInterfaceFilter`.
- Added `relayListenCaptureNet` and
`TestGatherCandidatesRelayRespectsInterfaceFilter`.
- Kept existing relay behavior checks via
`TestGatherCandidatesRelayCallsAddRelayCandidates`.

## Backward compatibility

- No behavior change for users who do not configure `InterfaceFilter` /
`IPFilter`.
- When filters are configured, srflx/relay local bind behavior now
consistently honors those filters.

## Reference issue
Fixes #727
2026-03-15 07:04:56 +01:00
Ali Sayyah 398ac7c807 Fix lint issues for golangci-lint v2.10.1 2026-03-14 03:06:58 +02:00
Pion a289f71039 Update CI configs to v0.12.1
Update lint scripts and CI configs.
2026-03-14 03:06:58 +02:00
Jo Turk bca1b4cd38 Use semver format for go version v4.2.1 2026-02-19 19:12:34 +02:00
Jo Turk 4881fc352d Upgrade pion/dtls to fix a CVE
https://github.com/pion/dtls/security/advisories/GHSA-9f3f-wv7r-qc8r
2026-02-19 19:07:05 +02:00
Jo Turk 9d68de2208 Check if only the NOMINATION attribute is set
Co-authored-by: Martin Liu <m@rtin.sh>
2026-02-19 19:00:02 +02:00
Jo Turk 292e24055f Avoid link-local IPv6 in active TCP tests 2026-02-19 17:56:04 +02:00
Jo Turk 74a026ba4c Align mdns and TCPMux for active TCP connectivity 2026-02-19 17:56:04 +02:00
Jo Turk da652e14c2 Bound mdns remote resolution time 2026-02-19 17:56:04 +02:00
Pion 256ca98e24 Update CI configs to v0.11.39
Update lint scripts and CI configs.
2026-02-18 23:05:21 +02:00
renovate[bot] c5b305b1c6 Update golang Docker tag to v1.26 (#886)
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| golang | stage | minor | `1.25-bookworm` → `1.26-bookworm` |

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/pion/ice).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45Ny4wIiwidXBkYXRlZEluVmVyIjoiNDIuOTcuMCIsInRhcmdldEJyYW5jaCI6Im1hc3RlciIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-02-11 04:39:42 +00:00
Philipp Hancke 7aa0886e1c Add DTLS-in-STUN (SPED) attributes (#861)
defined in https://github.com/pion/stun/pull/260
2026-01-29 14:09:36 +01:00
Anton Manakin 91a31517bd Fix relay candidate preference (#880)
#### Description
This fixes the handling of relay preferences. Previously,
`LocalPreference` for `CandidateRelay` was not being called, causing all
relay protocols to have the same priority. This change introduces
protocol-based preferences (UDP: 3, DTLS: 2, TCP: 1, TLS: 0).

#### Reference issue
Fixes #879
2026-01-28 18:46:13 +01:00
cnderrauber 3a1823b13b Unmarshal .invalid hostname (#883)
Libwebrtc could send `redacted-ip.invalid` hostname, don't return error
in the case.

#### Description

#### Reference issue
Fixes #...
2026-01-26 13:07:14 +08:00
Pion cdbf668b03 Update CI configs to v0.11.37
Update lint scripts and CI configs.
2026-01-22 10:59:01 +02:00
Jo Turk 4da5bc14ec Improve active_tcp test timeout v4.2.0 2026-01-08 23:01:02 +02:00
Jo Turk 7fd68a39d1 Upgrade to transport v4 2026-01-08 22:37:31 +02:00
renovate[bot] 9d57f1fbeb Update module github.com/pion/dtls/v3 to v3.0.10 (#871)
This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
| [github.com/pion/dtls/v3](https://redirect.github.com/pion/dtls) |
`v3.0.9` → `v3.0.10` |
![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fpion%2fdtls%2fv3/v3.0.10?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fpion%2fdtls%2fv3/v3.0.9/v3.0.10?slim=true)
|

---

### Release Notes

<details>
<summary>pion/dtls (github.com/pion/dtls/v3)</summary>

###
[`v3.0.10`](https://redirect.github.com/pion/dtls/releases/tag/v3.0.10)

[Compare
Source](https://redirect.github.com/pion/dtls/compare/v3.0.9...v3.0.10)

#### Changelog

-
[`713910a`](https://redirect.github.com/pion/dtls/commit/713910a964f7026715069716e245483f51e74eaf)
Upgrade to pion/transport/v4
-
[`e0d3160`](https://redirect.github.com/pion/dtls/commit/e0d31600d0a99bdde26c549fdbf0668f863f05bd)
Add the key share extension
([#&#8203;749](https://redirect.github.com/pion/dtls/issues/749))
-
[`7a57e26`](https://redirect.github.com/pion/dtls/commit/7a57e2689ed88d7e1a8357ce1aa9c87bdec38636)
Update CI configs to v0.11.36
-
[`08d8c3e`](https://redirect.github.com/pion/dtls/commit/08d8c3e0ba82aa8a550abec1f3abb6852cddc597)
Fix gosec slice bounds warnings
([#&#8203;764](https://redirect.github.com/pion/dtls/issues/764))
-
[`7b9612e`](https://redirect.github.com/pion/dtls/commit/7b9612e8c727eee1de08e5b895e12fae61301212)
Handshake fragments assembly refactoring
([#&#8203;762](https://redirect.github.com/pion/dtls/issues/762))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/pion/ice).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi43NC41IiwidXBkYXRlZEluVmVyIjoiNDIuNzQuNSIsInRhcmdldEJyYW5jaCI6Im1hc3RlciIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-01-08 19:53:51 +00:00
David von Wrangel aebfe98fae Add UpdateOptions for runtime agent configuration (#866) 2026-01-08 00:03:14 +02:00
renovate[bot] fcd859177e Update module github.com/pion/stun/v3 to v3.1.0
Generated by renovateBot
2026-01-06 09:27:37 +01:00
Kevin Wang f0c4479e20 Add API to write to specific candidate pair 2026-01-03 17:05:15 -05:00
Pion 89b9c27b5b Update CI configs to v0.11.36
Update lint scripts and CI configs.
2025-12-20 23:19:27 +02:00
Ali Sayyah 0c736dbf4e Fix gosec slice bounds warning
Replace range loop index access with direct value iteration
to address G602 gosec warning in gatherCandidatesRelay.
2025-12-20 23:12:56 +02:00
Joe Turki 2bd4cd80aa Update example to the new API 2025-12-20 22:14:14 +02:00
Joe Turki 37cc4c1855 Fix config api deprecation comments 2025-12-20 20:53:38 +02:00
philipch07 d594d8d173 Clean up parseAddr 2025-12-18 23:56:33 -05:00
Joe Turki d82936b71f Refactor and test handleInbound 2025-12-19 04:22:01 +02:00
philipch07 a221984ebb Clean up getting candidate stats 2025-12-18 21:21:05 -05:00
Joe Turki 205bf933d4 Propagate and implement deadlines 2025-12-18 05:14:11 +02:00
Alessandro Toppi c21e2f1d35 Use 1 microsecond tolerance for equality tests 2025-12-18 02:26:09 +02:00
Alessandro Toppi e5a0d2a0b3 Make linter happy 2025-12-18 02:26:09 +02:00
Alessandro Toppi 945cf9fe3b Use a reference time for storing nanos 2025-12-18 02:26:09 +02:00
Alessandro Toppi c9e85c7f1b Store lastSent and lastReceived as int64 2025-12-18 02:26:09 +02:00
Joe Turki 18ff63e944 Test relay gathering vnet 2025-12-13 21:26:04 +02:00
Joe Turki a42e726bb3 Deprecate AgentConfig v4.1.0 2025-12-12 18:58:42 +02:00
Joe Turki f808e10d45 Allow any port range 2025-12-12 18:55:37 +02:00