@@ -89,6 +89,7 @@ func newListenerConfiguratorFactory(
8989 protectedPorts ProtectedPorts ,
9090) * listenerConfiguratorFactory {
9191 sharedPortConflictResolver := createPortConflictResolver ()
92+ sharedOverlappingTLSConfigResolver := createOverlappingTLSConfigResolver ()
9293
9394 return & listenerConfiguratorFactory {
9495 unsupportedProtocol : & listenerConfigurator {
@@ -123,6 +124,7 @@ func newListenerConfiguratorFactory(
123124 },
124125 conflictResolvers : []listenerConflictResolver {
125126 sharedPortConflictResolver ,
127+ sharedOverlappingTLSConfigResolver ,
126128 },
127129 externalReferenceResolvers : []listenerExternalReferenceResolver {
128130 createExternalReferencesForTLSSecretsResolver (gw .Namespace , secretResolver , refGrantResolver ),
@@ -137,6 +139,7 @@ func newListenerConfiguratorFactory(
137139 },
138140 conflictResolvers : []listenerConflictResolver {
139141 sharedPortConflictResolver ,
142+ sharedOverlappingTLSConfigResolver ,
140143 },
141144 externalReferenceResolvers : []listenerExternalReferenceResolver {},
142145 },
@@ -591,3 +594,38 @@ func haveOverlap(hostname1, hostname2 *v1.Hostname) bool {
591594 }
592595 return matchesWildcard (h1 , h2 )
593596}
597+
598+ func createOverlappingTLSConfigResolver () listenerConflictResolver {
599+ listenersByPort := make (map [v1.PortNumber ][]* Listener )
600+
601+ return func (l * Listener ) {
602+ port := l .Source .Port
603+
604+ // Only check TLS-enabled listeners (HTTPS/TLS)
605+ if l .Source .Protocol != v1 .HTTPSProtocolType && l .Source .Protocol != v1 .TLSProtocolType {
606+ return
607+ }
608+
609+ // Check for overlaps with existing listeners on this port
610+ for _ , existingListener := range listenersByPort [port ] {
611+ // Only check against other TLS-enabled listeners
612+ if existingListener .Source .Protocol != v1 .HTTPSProtocolType &&
613+ existingListener .Source .Protocol != v1 .TLSProtocolType {
614+ continue
615+ }
616+
617+ // Check for hostname overlap
618+ if haveOverlap (l .Source .Hostname , existingListener .Source .Hostname ) {
619+ // Set condition on both listeners
620+ cond := conditions .NewListenerOverlappingTLSConfig (
621+ v1 .ListenerReasonOverlappingHostnames ,
622+ conditions .ListenerMessageOverlappingHostnames ,
623+ )
624+ l .Conditions = append (l .Conditions , cond )
625+ existingListener .Conditions = append (existingListener .Conditions , cond )
626+ }
627+ }
628+
629+ listenersByPort [port ] = append (listenersByPort [port ], l )
630+ }
631+ }
0 commit comments