@@ -23,6 +23,7 @@ import (
2323 "math"
2424 "net/netip"
2525 "slices"
26+ "strings"
2627 "sync"
2728 "sync/atomic"
2829 "time"
@@ -464,9 +465,25 @@ func (s *Server) onBye(log *slog.Logger, req *sip.Request, tx sip.ServerTransact
464465 c := s .activeCalls [tag ]
465466 s .cmu .RUnlock ()
466467 if c != nil {
467- c .log .Infow ("BYE from remote" )
468468 c .cc .AcceptBye (req , tx )
469- _ = c .Close ()
469+ var (
470+ reason ReasonHeader
471+ rawReason string
472+ )
473+ if h := req .GetHeader ("Reason" ); h != nil {
474+ rawReason = h .Value ()
475+ reason , err = ParseReasonHeader (rawReason )
476+ if err != nil {
477+ c .log .Warnw ("cannot parse reason header" , err , "reason-raw" , rawReason )
478+ }
479+ }
480+ c .log .Infow ("BYE from remote" ,
481+ "reason-type" , reason .Type ,
482+ "reason-cause" , reason .Cause ,
483+ "reason-text" , reason .Text ,
484+ "reason-raw" , rawReason ,
485+ )
486+ c .Bye (reason )
470487 return
471488 }
472489 ok := false
@@ -540,6 +557,7 @@ type inboundCall struct {
540557 attrsToHdr map [string ]string
541558 ctx context.Context
542559 cancel func ()
560+ closeReason atomic.Pointer [ReasonHeader ]
543561 call * rpc.SIPCall
544562 media * MediaPort
545563 dtmf chan dtmf.Event // buffered
@@ -1062,17 +1080,41 @@ func (c *inboundCall) closeWithNoACK() {
10621080}
10631081
10641082func (c * inboundCall ) closeWithCancelled () {
1065- c .state .DeferUpdate (func (info * livekit.SIPCallInfo ) {
1066- info .DisconnectReason = livekit .DisconnectReason_CLIENT_INITIATED
1067- })
1068- c .close (false , CallHangup , "cancelled" )
1083+ var reason ReasonHeader
1084+ if p := c .closeReason .Load (); p != nil {
1085+ reason = * p
1086+ }
1087+ c .closeWithReason (CallHangup , "cancelled" , reason )
10691088}
10701089
10711090func (c * inboundCall ) closeWithHangup () {
1091+ var reason ReasonHeader
1092+ if p := c .closeReason .Load (); p != nil {
1093+ reason = * p
1094+ }
1095+ c .closeWithReason (CallHangup , "hangup" , reason )
1096+ }
1097+
1098+ func (c * inboundCall ) closeWithReason (status CallStatus , reasonName string , reason ReasonHeader ) {
10721099 c .state .DeferUpdate (func (info * livekit.SIPCallInfo ) {
10731100 info .DisconnectReason = livekit .DisconnectReason_CLIENT_INITIATED
1101+ if info .Error == "" {
1102+ if ! reason .IsNormal () {
1103+ info .Error = reason .String ()
1104+ }
1105+ }
10741106 })
1075- c .close (false , CallHangup , "hangup" )
1107+ if reason .Type != "" {
1108+ if ! reason .IsNormal () {
1109+ reasonName = fmt .Sprintf ("bye-%s-%d" , strings .ToLower (reason .Type ), reason .Cause )
1110+ }
1111+ }
1112+ c .close (false , status , reasonName )
1113+ }
1114+
1115+ func (c * inboundCall ) Bye (reason ReasonHeader ) {
1116+ c .closeReason .Store (& reason )
1117+ _ = c .Close ()
10761118}
10771119
10781120func (c * inboundCall ) Close () error {
0 commit comments