docs(network): document the connection-filter seam and the UInt128 IP wart
Writes up IConnectionFilter for content authors: the accept-path contract (allocation-free, non-blocking, side effects owned by the filter), registration order and short-circuiting, the unregister-on-throw policy, and why this must not be routed through EventSink.InvokeSocketConnect. Also records the IPAddress <-> UInt128 normalization quirk. Addresses are normalized to IPv6 form, so a v4 address round-tripped through UInt128 can come back as InterNetworkV6 with IsIPv4MappedToIPv6 set. That is what the seemingly redundant clause in ToUInt128 is defending, not a stray condition. Noted as a follow-up rather than churned mid-feature: the normalization would read better as an explicit "to canonical v6 bits" step that never needs the family check. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
710973a28b
commit
2be79d054a
2 changed files with 65 additions and 1 deletions
|
|
@ -28,7 +28,12 @@ namespace Server;
|
|||
/// </summary>
|
||||
public static class IPAddressUtility
|
||||
{
|
||||
// Converts an IPAddress to a UInt128 in IPv6 format
|
||||
// Converts an IPAddress to a UInt128 in IPv6 format.
|
||||
// The IsIPv4MappedToIPv6 clause below looks redundant (the BCL only ever sets it on InterNetworkV6),
|
||||
// but it guards the v4 -> UInt128 -> IPAddress round-trip, which can return a mapped v6 address for
|
||||
// what is really a v4 one.
|
||||
//TODO Rework as an explicit "to canonical v6 bits" step that needs no family check
|
||||
// (see dev-docs/networking-packets.md, "IP Address Normalization")
|
||||
public static UInt128 ToUInt128(this IPAddress ip)
|
||||
{
|
||||
if (ip.AddressFamily == AddressFamily.InterNetwork && !ip.IsIPv4MappedToIPv6)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue