chore: add parseDatagramDestination (#122)

This commit is contained in:
vladopajic
2025-09-24 14:00:32 +02:00
committed by GitHub
parent 5cbccd2b2c
commit 717d5ce3e8
6 changed files with 26 additions and 16 deletions

View File

@@ -47,7 +47,7 @@ proc getOrCreateConnection*(
rng: ref HmacDrbgContext,
): Opt[Connection] =
var connection: Connection
let destination = parseDatagram(msg).destination
let destination = parseDatagramDestination(msg)
if not listener.hasConnection(destination):
if not shouldAccept(msg):
return Opt.none(Connection)

View File

@@ -7,7 +7,9 @@ import ./native/parsedatagram
import ./native/picotls
import ./native/certificateverifier
export parseDatagram
export parseDatagramInfo
export parseDatagramDestination
export shouldAccept
export Ngtcp2Connection
export newNgtcp2Client
export newNgtcp2Server

View File

@@ -9,7 +9,7 @@ proc toConnectionId(p: ptr byte, length: uint): ConnectionId =
copyMem(bytes.toPtr, p, length)
ConnectionId(bytes)
proc parseDatagram*(datagram: openArray[byte]): PacketInfo =
proc parseDatagramInfo*(datagram: openArray[byte]): PacketInfo =
var version: ngtcp2_version_cid
checkResult ngtcp2_pkt_decode_version_cid(
addr version, unsafeAddr datagram[0], datagram.len.uint, DefaultConnectionIdLength
@@ -20,6 +20,13 @@ proc parseDatagram*(datagram: openArray[byte]): PacketInfo =
version: version.version.uint32,
)
proc parseDatagramDestination*(datagram: openArray[byte]): ConnectionId =
var version: ngtcp2_version_cid
checkResult ngtcp2_pkt_decode_version_cid(
addr version, unsafeAddr datagram[0], datagram.len.uint, DefaultConnectionIdLength
)
return toConnectionId(version.dcid, version.dcidlen)
proc shouldAccept*(datagram: openArray[byte]): bool =
var hd: ngtcp2_pkt_hd
let ret = ngtcp2_accept(hd.unsafeAddr, datagram[0].unsafeAddr, datagram.len.uint)

View File

@@ -105,15 +105,13 @@ proc newNgtcp2Server*(
nConn.tlsContext = tlsContext
nConn
proc extractIds(datagram: openArray[byte]): tuple[source, dest: ngtcp2_cid] =
let info = parseDatagram(datagram)
(source: info.source.toCid, dest: info.destination.toCid)
proc newNgtcp2Server*(
tlsContext: PicoTLSContext,
local, remote: TransportAddress,
datagram: openArray[byte],
rng: ref HmacDrbgContext,
): Ngtcp2Connection =
let (source, destination) = extractIds(datagram)
newNgtcp2Server(tlsContext, local, remote, source, destination, rng)
let info = parseDatagramInfo(datagram)
newNgtcp2Server(
tlsContext, local, remote, info.source.toCid, info.destination.toCid, rng
)

View File

@@ -1,3 +1,5 @@
import ./ngtcp2/native/parsedatagram
export parseDatagram
export parseDatagramInfo
export parseDatagramDestination
export shouldAccept

View File

@@ -1,31 +1,32 @@
import std/unittest
import ngtcp2
import bearssl/rand
import quic/helpers/rand
import quic/transport/[packets, parsedatagram, version]
suite "parse ngtcp2 packet info":
var packet: Packet
var datagram: array[4096, byte]
var rng: ref HmacDrbgContext
setup:
let rng = newRng()
packet = initialPacket(CurrentQuicVersion)
rng = newRng()
packet.source = randomConnectionId(rng)
packet.destination = randomConnectionId(rng)
datagram = typeof(datagram).default
datagram.write(packet)
test "extracts destination id":
let info = parseDatagram(datagram)
let info = parseDatagramInfo(datagram)
check info.destination == packet.destination
let destination = parseDatagramDestination(datagram)
check info.destination == destination
test "extracts source id":
let info = parseDatagram(datagram)
let info = parseDatagramInfo(datagram)
check info.source == packet.source
test "extracts version":
let info = parseDatagram(datagram)
let info = parseDatagramInfo(datagram)
check info.version == packet.initial.version