Start SCTP

This commit is contained in:
Ludovic Chenut 2022-11-02 11:19:52 +01:00
parent 7ba2452e94
commit a9b8e2faa1
No known key found for this signature in database
GPG Key ID: D9A59B1907F1D50C
2 changed files with 66 additions and 2 deletions

View File

@ -1,6 +1,6 @@
import sequtils, bitops
import bitops
import chronos, posix
import usrsctp
import ../webrtc/usrsctp
import stew/ranges/ptr_arith
const IPPROTO_SCTP = 132

64
webrtc/sctp.nim Normal file
View File

@ -0,0 +1,64 @@
# Nim-WebRTC
# Copyright (c) 2022 Status Research & Development GmbH
# Licensed under either of
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE))
# * MIT license ([LICENSE-MIT](LICENSE-MIT))
# at your option.
# This file may not be copied, modified, or distributed except according to
# those terms.
import tables, bitops, sequtils
import chronos
import usrsctp
type
SctpConnection* = ref object
udp: DatagramTransport
address: TransportAddress
SctpListener* = ref object
udp: DatagramTransport
connections: Table[TransportAddress, SctpConnection]
Sctp* = ref object
udps: seq[DatagramTransport]
proc new(T: typedesc[SctpConnection],
udp: DatagramTransport,
address: TransportAddress): T =
T(udp: udp, address: address)
proc read(self: SctpConnection): Future[seq[byte]] = discard
proc write(self: SctpConnection, buf: seq[byte]) {.async.} = discard
proc close(self: SctpConnection) {.async.} = discard
proc getOrCreateConnection(self: SctpListener,
udp: DatagramTransport,
address: TransportAddress): SctpConnection =
if self.connections.hasKey(address):
return self.connections[address]
let connection = SctpConnection.new(udp, address)
self.connections[address] = connection
return connection
proc new(T: typedesc[SctpListener], address: TransportAddress): T =
let listener = T()
proc onReceive(udp: DatagramTransport, address: TransportAddress) {.async.} =
let connection = listener.getOrCreateConnection(udp, address)
connection.receive(udp.getMessage())
let udp = newDatagramTransport(onReceive, local = address)
listener.udp = udp
listener
proc new(T: typedesc[Sctp]): T =
T()
proc listen(self: Sctp, address: TransportAddress): SctpListener =
# what should happen when adding multiple time the same address
proc onReceive(udp: DatagramTransport, address: TransportAddress) {.async.} =
discard
let udp = newDatagramTransport(onReceive, local = address)
self.udps.add(udp)
proc connect(self: Sctp): Future[SctpConnection] = discard
proc dial(self: Sctp, address: TransportAddress): Future[SctpConnection] = discard