@@ -486,6 +486,8 @@ func MatchTrunk(trunks []*livekit.SIPInboundTrunkInfo, call *rpc.SIPCall, opts .
486486// MatchTrunkDetailed is like MatchTrunkIter but returns detailed match information
487487func MatchTrunkDetailed (it iters.Iter [* livekit.SIPInboundTrunkInfo ], call * rpc.SIPCall , opts ... MatchTrunkOpt ) (* TrunkMatchResult , error ) {
488488 defer it .Close ()
489+ log := logger .GetLogger ()
490+
489491 var opt matchTrunkOpts
490492 for _ , fnc := range opts {
491493 fnc (& opt )
@@ -503,39 +505,96 @@ func MatchTrunkDetailed(it iters.Iter[*livekit.SIPInboundTrunkInfo], call *rpc.S
503505 sawAnyTrunk bool
504506 )
505507 calledNorm := NormalizeNumber (call .To .User )
508+ log .Debugw ("MatchTrunkDetailed: starting trunk matching" ,
509+ "calledNumber" , call .To .User ,
510+ "calledNumberNormalized" , calledNorm ,
511+ "callingNumber" , call .From .User ,
512+ "sourceIp" , call .SourceIp ,
513+ "fromHost" , call .From .Host )
514+
515+ trunkIndex := 0
506516 for {
507517 tr , err := it .Next ()
508518 if err == io .EOF {
509519 break
510520 } else if err != nil {
511521 return nil , err
512522 }
523+ trunkIndex ++
513524 if ! sawAnyTrunk {
514525 sawAnyTrunk = true
515526 result .MatchType = TrunkMatchNone // We have trunks but haven't matched any yet
516527 }
517528 tr = opt .Replace (tr )
529+
530+ log .Debugw ("MatchTrunkDetailed: evaluating trunk" ,
531+ "trunkIndex" , trunkIndex ,
532+ "trunkID" , tr .SipTrunkId ,
533+ "trunkName" , tr .Name ,
534+ "trunkNumbers" , tr .Numbers ,
535+ "trunkNumbersCount" , len (tr .Numbers ),
536+ "allowedNumbers" , tr .AllowedNumbers ,
537+ "allowedAddresses" , tr .AllowedAddresses )
538+
518539 // Do not consider it if number doesn't match.
519- if ! matchNumbers (call .From .User , tr .AllowedNumbers ) {
540+ fromMatches := matchNumbers (call .From .User , tr .AllowedNumbers )
541+ if ! fromMatches {
542+ log .Debugw ("MatchTrunkDetailed: trunk filtered - calling number not allowed" ,
543+ "trunkID" , tr .SipTrunkId ,
544+ "callingNumber" , call .From .User ,
545+ "allowedNumbers" , tr .AllowedNumbers )
520546 if ! opt .Filtered (tr , TrunkFilteredCallingNumberDisallowed ) {
521547 continue
522548 }
523549 }
524- if ! matchAddrMasks (call .SourceIp , call .From .Host , tr .AllowedAddresses ) {
550+
551+ addrMatches := matchAddrMasks (call .SourceIp , call .From .Host , tr .AllowedAddresses )
552+ if ! addrMatches {
553+ log .Debugw ("MatchTrunkDetailed: trunk filtered - source address not allowed" ,
554+ "trunkID" , tr .SipTrunkId ,
555+ "sourceIp" , call .SourceIp ,
556+ "fromHost" , call .From .Host ,
557+ "allowedAddresses" , tr .AllowedAddresses )
525558 if ! opt .Filtered (tr , TrunkFilteredSourceAddressDisallowed ) {
526559 continue
527560 }
528561 }
562+
529563 if len (tr .Numbers ) == 0 {
530564 // Default/wildcard trunk.
565+ log .Debugw ("MatchTrunkDetailed: trunk is default/wildcard (no specific numbers)" ,
566+ "trunkID" , tr .SipTrunkId )
531567 defaultTrunkPrev = defaultTrunk
532568 defaultTrunk = tr
533569 result .DefaultTrunkCount ++
534570 } else {
535571 for _ , num := range tr .Numbers {
536- if num == call .To .User || NormalizeNumber (num ) == calledNorm {
572+ numNorm := NormalizeNumber (num )
573+ directMatch := num == call .To .User
574+ normalizedMatch := numNorm == calledNorm
575+ matches := directMatch || normalizedMatch
576+
577+ log .Debugw ("MatchTrunkDetailed: checking trunk number" ,
578+ "trunkID" , tr .SipTrunkId ,
579+ "trunkNumber" , num ,
580+ "trunkNumberNormalized" , numNorm ,
581+ "calledNumber" , call .To .User ,
582+ "calledNumberNormalized" , calledNorm ,
583+ "directMatch" , directMatch ,
584+ "normalizedMatch" , normalizedMatch ,
585+ "matches" , matches )
586+
587+ if matches {
537588 // Trunk specific to the number.
589+ log .Debugw ("MatchTrunkDetailed: trunk number matched!" ,
590+ "trunkID" , tr .SipTrunkId ,
591+ "trunkNumber" , num ,
592+ "calledNumber" , call .To .User )
538593 if selectedTrunk != nil {
594+ log .Debugw ("MatchTrunkDetailed: multiple trunks matched, conflict detected" ,
595+ "previousTrunkID" , selectedTrunk .SipTrunkId ,
596+ "newTrunkID" , tr .SipTrunkId ,
597+ "calledNumber" , call .To .User )
539598 opt .Conflict (selectedTrunk , tr , TrunkConflictCalledNumber )
540599 if opt .AllowConflicts {
541600 // This path is unreachable, since we pick the first trunk. Kept for completeness.
@@ -548,10 +607,16 @@ func MatchTrunkDetailed(it iters.Iter[*livekit.SIPInboundTrunkInfo], call *rpc.S
548607 // Pick the first match as soon as it's found. We don't care about conflicts.
549608 result .Trunk = selectedTrunk
550609 result .MatchType = TrunkMatchSpecific
610+ log .Debugw ("MatchTrunkDetailed: returning matched trunk (allow conflicts)" ,
611+ "trunkID" , selectedTrunk .SipTrunkId )
551612 return result , nil
552613 }
553614 // Keep searching! We want to know if there are any conflicting Trunk definitions.
554615 } else {
616+ log .Debugw ("MatchTrunkDetailed: trunk number did not match" ,
617+ "trunkID" , tr .SipTrunkId ,
618+ "trunkNumber" , num ,
619+ "calledNumber" , call .To .User )
555620 opt .Filtered (tr , TrunkFilteredCalledNumberDisallowed )
556621 }
557622 }
@@ -561,9 +626,16 @@ func MatchTrunkDetailed(it iters.Iter[*livekit.SIPInboundTrunkInfo], call *rpc.S
561626 if selectedTrunk != nil {
562627 result .Trunk = selectedTrunk
563628 result .MatchType = TrunkMatchSpecific
629+ log .Debugw ("MatchTrunkDetailed: returning specific matched trunk" ,
630+ "trunkID" , selectedTrunk .SipTrunkId ,
631+ "calledNumber" , call .To .User ,
632+ "matchType" , result .MatchType )
564633 return result , nil
565634 }
566635 if result .DefaultTrunkCount > 1 {
636+ log .Debugw ("MatchTrunkDetailed: multiple default trunks found, conflict detected" ,
637+ "defaultTrunkCount" , result .DefaultTrunkCount ,
638+ "calledNumber" , call .To .User )
567639 opt .Conflict (defaultTrunk , defaultTrunkPrev , TrunkConflictDefault )
568640 if ! opt .AllowConflicts {
569641 return nil , twirp .NewErrorf (twirp .FailedPrecondition , "Multiple default SIP Trunks matched for %q" , call .To .User )
@@ -572,7 +644,18 @@ func MatchTrunkDetailed(it iters.Iter[*livekit.SIPInboundTrunkInfo], call *rpc.S
572644 if defaultTrunk != nil {
573645 result .Trunk = defaultTrunk
574646 result .MatchType = TrunkMatchDefault
647+ log .Debugw ("MatchTrunkDetailed: returning default trunk" ,
648+ "trunkID" , defaultTrunk .SipTrunkId ,
649+ "calledNumber" , call .To .User ,
650+ "matchType" , result .MatchType )
651+ return result , nil
575652 }
653+
654+ log .Debugw ("MatchTrunkDetailed: no trunk matched" ,
655+ "calledNumber" , call .To .User ,
656+ "trunksEvaluated" , trunkIndex ,
657+ "matchType" , result .MatchType ,
658+ "defaultTrunkCount" , result .DefaultTrunkCount )
576659 return result , nil
577660}
578661
0 commit comments