Skip to content

Commit

Permalink
fix: remove doAssert
Browse files Browse the repository at this point in the history
  • Loading branch information
lchenut committed Sep 10, 2024
1 parent 1d66aac commit f231a9d
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 44 deletions.
6 changes: 3 additions & 3 deletions webrtc/sctp/sctp_connection.nim
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ proc recvCallback*(sock: ptr socket, data: pointer, flags: cint) {.cdecl.} =
cast[ptr cint](addr flags),
)
if n < 0:
trace "usrsctp_recvv", error = sctpStrerror(n)
trace "usrsctp_recvv", error = sctpStrerror()
# TODO: should close
return
elif n > 0:
Expand Down Expand Up @@ -179,7 +179,7 @@ proc connect*(self: SctpConn, sctpPort: uint16) {.async: (raises: [CancelledErro
)
if connErr != 0 and errno != SctpEINPROGRESS:
raise
newException(WebRtcError, "SCTP - Connection failed: " & $(sctpStrerror(errno)) & $errno)
newException(WebRtcError, "SCTP - Connection failed: " & sctpStrerror())

proc read*(self: SctpConn): Future[SctpMessage] {.async: (raises: [CancelledError, WebRtcError]).} =
# Used by DataChannel, returns SctpMessage in order to get the stream
Expand Down Expand Up @@ -229,7 +229,7 @@ proc write*(
0,
)
if sendvErr < 0:
raise newException(WebRtcError, "SCTP - " & $(sctpStrerror(sendvErr)))
raise newException(WebRtcError, "SCTP - " & sctpStrerror())

proc write*(
self: SctpConn, s: string
Expand Down
94 changes: 56 additions & 38 deletions webrtc/sctp/sctp_transport.nim
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ logScope:
# use it. There's a lot of callbacks calling each other in a synchronous way.

# TODO:
# - Replace doAssert by a proper exception management
# - Find a clean way to manage SCTP ports

proc printf(
Expand All @@ -53,7 +52,7 @@ proc handleAccept(sock: ptr socket, data: pointer, flags: cint) {.cdecl.} =
conn = cast[SctpConn](sconn.sconn_addr)

if sctpSocket.isNil():
warn "usrsctp_accept fails", error = sctpStrerror(errno)
warn "usrsctp_accept fails", error = sctpStrerror()
conn.state = SctpState.SctpClosed
else:
trace "Scpt connection accepted", remoteAddress = conn.remoteAddress()
Expand All @@ -74,40 +73,69 @@ proc handleConnect(sock: ptr socket, data: pointer, flags: cint) {.cdecl.} =
elif bitand(events, SCTP_EVENT_WRITE) != 0:
conn.state = SctpState.SctpConnected
if usrsctp_set_upcall(conn.sctpSocket, recvCallback, data) != 0:
warn "usrsctp_set_upcall fails while connecting", error = sctpStrerror(errno)
warn "usrsctp_set_upcall fails while connecting", error = sctpStrerror()
trace "Sctp connection connected", remoteAddress = conn.remoteAddress()
conn.connectEvent.fire()
else:
warn "Should never happen", currentState = conn.state

proc stopServer*(self: Sctp) =
## Sctp Transport stop acting like a server
##
if not self.isServer:
trace "Try to close a client"
return
self.isServer = false
self.sockServer.usrsctp_close()

proc listen*(self: Sctp, sctpPort: uint16 = 5000) =
if self.isServer:
trace "Try to start the server twice"
return
self.isServer = true
trace "Listening", sctpPort
doAssert 0 == usrsctp_sysctl_set_sctp_blackhole(2)
doAssert 0 == usrsctp_sysctl_set_sctp_no_csum_on_loopback(0)
doAssert 0 == usrsctp_sysctl_set_sctp_delayed_sack_time_default(0)
proc serverSetup(self: Sctp, sctpPort: uint16): bool =
if usrsctp_sysctl_set_sctp_blackhole(2) != 0:
warn "usrsctp_sysctl_set_sctp_blackhole fails", error = sctpStrerror()
return false

if usrsctp_sysctl_set_sctp_no_csum_on_loopback(0) != 0:
warn "usrsctp_sysctl_set_sctp_no_csum_on_loopback fails", error = sctpStrerror()
return false

if usrsctp_sysctl_set_sctp_delayed_sack_time_default(0) != 0:
warn "usrsctp_sysctl_set_sctp_delayed_sack_time_default fails", error = sctpStrerror()
return false

let sock = usrsctp_socket(AF_CONN, SOCK_STREAM.toInt(), IPPROTO_SCTP, nil, nil, 0, nil)
var on: int = 1
doAssert 0 == usrsctp_set_non_blocking(sock, 1)
if usrsctp_set_non_blocking(sock, 1) != 0:
warn "usrsctp_set_non_blocking fails", error = sctpStrerror()
return false

var sin: Sockaddr_in
sin.sin_family = type(sin.sin_family)(SctpAF_INET)
sin.sin_port = htons(sctpPort)
sin.sin_addr.s_addr = htonl(INADDR_ANY)
doAssert 0 ==
usrsctp_bind(sock, cast[ptr SockAddr](addr sin), SockLen(sizeof(Sockaddr_in)))
doAssert 0 >= usrsctp_listen(sock, 1)
doAssert 0 == sock.usrsctp_set_upcall(handleAccept, cast[pointer](self))
if usrsctp_bind(sock, cast[ptr SockAddr](addr sin), SockLen(sizeof(Sockaddr_in))) != 0:
warn "usrsctp_bind fails", error = sctpStrerror()
return false

if usrsctp_listen(sock, 1) < 0:
warn "usrsctp_listen fails", error = sctpStrerror()
return false

if sock.usrsctp_set_upcall(handleAccept, cast[pointer](self)) != 0:
warn "usrsctp_set_upcall fails", error = sctpStrerror()
return false

self.sockServer = sock
return true

proc listen*(self: Sctp, sctpPort: uint16 = 5000) =
## listen marks the Sctp Transport as a transport that will be used to accept
## incoming connection requests using accept.
##
if self.isServer:
trace "Try to start the server twice"
return
self.isServer = true
trace "Sctp listening", sctpPort
if not self.serverSetup(sctpPort):
raise newException(WebRtcError, "SCTP - Fails to listen")

proc new*(T: type Sctp, dtls: Dtls): T =
var self = T()
Expand All @@ -130,32 +158,22 @@ proc close*(self: Sctp) {.async: (raises: [CancelledError]).} =
proc socketSetup(
conn: SctpConn, callback: proc(a1: ptr socket, a2: pointer, a3: cint) {.cdecl.}
): bool =
var
errorCode = conn.sctpSocket.usrsctp_set_non_blocking(1)
nodelay: uint32 = 1
recvinfo: uint32 = 1

if errorCode != 0:
warn "usrsctp_set_non_blocking fails", error = sctpStrerror(errorCode)
if conn.sctpSocket.usrsctp_set_non_blocking(1) != 0:
warn "usrsctp_set_non_blocking fails", error = sctpStrerror()
return false

errorCode = conn.sctpSocket.usrsctp_set_upcall(callback, cast[pointer](conn))
if errorCode != 0:
warn "usrsctp_set_upcall fails", error = sctpStrerror(errorCode)
if conn.sctpSocket.usrsctp_set_upcall(callback, cast[pointer](conn)) != 0:
warn "usrsctp_set_upcall fails", error = sctpStrerror()
return false

errorCode = conn.sctpSocket.usrsctp_setsockopt(
IPPROTO_SCTP, SCTP_NODELAY, addr nodelay, sizeof(nodelay).SockLen
)
if errorCode != 0:
warn "usrsctp_setsockopt nodelay fails", error = sctpStrerror(errorCode)
var nodelay: uint32 = 1
if conn.sctpSocket.usrsctp_setsockopt(IPPROTO_SCTP, SCTP_NODELAY, addr nodelay, sizeof(nodelay).SockLen) != 0:
warn "usrsctp_setsockopt nodelay fails", error = sctpStrerror()
return false

errorCode = conn.sctpSocket.usrsctp_setsockopt(
IPPROTO_SCTP, SCTP_RECVRCVINFO, addr recvinfo, sizeof(recvinfo).SockLen
)
if errorCode != 0:
warn "usrsctp_setsockopt recvinfo fails", error = sctpStrerror(errorCode)
var recvinfo: uint32 = 1
if conn.sctpSocket.usrsctp_setsockopt(IPPROTO_SCTP, SCTP_RECVRCVINFO, addr recvinfo, sizeof(recvinfo).SockLen) != 0:
warn "usrsctp_setsockopt recvinfo fails", error = sctpStrerror()
return false
return true

Expand Down
8 changes: 5 additions & 3 deletions webrtc/sctp/sctp_utils.nim
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ proc getSctpPacket*(buffer: seq[byte]): SctpPacketStructure =
# padding; could use `size.inc(-size %% 4)` instead but it lacks clarity
size.inc(1)

proc sctpStrerror*(
error: int
): cstring {.importc: "strerror", cdecl, header: "<string.h>".}
proc sctpStrerror*(): string =
proc strerror(
error: int
): cstring {.importc: "strerror", cdecl, header: "<string.h>".}
return $(sctpStrerror(errno))

0 comments on commit f231a9d

Please sign in to comment.