mirror of
https://github.com/vacp2p/nim-quic.git
synced 2026-01-09 22:08:09 -05:00
chore: add parseDatagramDestination (#122)
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import ./ngtcp2/native/parsedatagram
|
||||
|
||||
export parseDatagram
|
||||
export parseDatagramInfo
|
||||
export parseDatagramDestination
|
||||
export shouldAccept
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user