AlinsRan commented on code in PR #2882:
URL: 
https://github.com/apache/apisix-ingress-controller/pull/2882#discussion_r4244313383


##########
docs/en/latest/concepts/gateway-api.md:
##########
@@ -87,7 +87,7 @@ The fields below are specified in the Gateway API 
specification but are either p
 | `spec.listeners[].port`               | Partially supported | Controls 
`server_port` route-var injection; off by default and enabled via 
[`listener_port_match_mode`](../reference/configuration-file.md) (`auto` / 
`explicit`). The controller cannot dynamically open data plane ports, so APISIX 
must already listen on the specified port. |
 | `spec.listeners[].tls.certificateRefs[].group` | Partially supported | Only 
`""` is supported; other group values cause validation failure. |
 | `spec.listeners[].tls.certificateRefs[].kind`        | Partially supported  
| Only `Secret` is supported.                                                   
                 |
-| `spec.listeners[].tls.mode`                          | Partially supported  
| `Terminate` is implemented; `Passthrough` is effectively unsupported for 
Gateway listeners.    |
+| `spec.listeners[].tls.mode`                          | Partially supported  
| `Terminate` and `Passthrough` are both implemented. A `Passthrough` listener 
needs APISIX to be listening on that port with 
[`tls_passthrough`](https://apisix.apache.org/docs/apisix/stream-proxy/); the 
controller cannot open data plane ports itself. A single port cannot mix the 
two modes: listeners that disagree on `tls.mode` for one port are reported 
`Accepted=False` with `ProtocolConflict`. |

Review Comment:
   Fixed in 284fa5da. The row now draws the line:
   
   ```markdown
   <!-- docs/en/latest/concepts/gateway-api.md -->
   A single port cannot mix the two modes. Within one Gateway, listeners that 
disagree on `tls.mode`
   for one port are reported `Accepted=False` with `ProtocolConflict` and carry 
no routes. Two Gateways
   that disagree about the same port are each valid on their own, so no 
conflict is reported there; the
   routes on that port fall back to `Terminate`, because a physical stream 
listen has a single mode.
   ```
   
   That matches what the translator does — `portsWithConflictingTLSMode` is 
built from one Gateway's listeners, and `tlsPassthroughOnPort` returns false 
the moment a matched listener on the port is not `Passthrough`, so the port is 
served as `Terminate`.



##########
test/conformance/conformance_test.go:
##########
@@ -62,6 +51,18 @@ var skippedTestsForKnownGaps = []string{
        // A single HTTPRoute attached to several Gateways is not served from 
each
        // parent independently.
        tests.HTTPRouteMultipleGateways.ShortName,
+
+       // The same limitation for TLSRoute, and not something the translator 
can
+       // fix. The test stands four Gateways up on port 443 with different 
listener
+       // hostnames; every Gateway resolves to the one data plane address and 
the one
+       // physical stream listen, so their SNI namespaces are shared. The 
Gateway
+       // whose listener carries no hostname keeps its route's "*.com" 
verbatim -
+       // correctly, and its own subtest depends on it - which then also 
answers
+       // "non.matching.com" on the address of the Gateway that should have 
rejected
+       // it. Which Gateway a connection was addressed to is not on the wire, 
so
+       // there is nothing left to discriminate on. Every other assertion in 
this
+       // test passes, including the hostname intersections themselves.
+       tests.TLSRouteHostnameIntersection.ShortName,

Review Comment:
   The description was wrong, not the skip list. Corrected: it now lists the 
three Passthrough tests that do run — `TLSRouteSimpleSameNamespace`, 
`TLSRouteInvalidBackendRefNonexistent`, `TLSRouteInvalidBackendRefUnknownKind` 
— and states the two that stay skipped with their reasons.
   
   `TLSRouteHostnameIntersection` stays skipped because it is an architectural 
limit rather than a translator gap, the same one `HTTPRouteMultipleGateways` is 
already skipped for. The reason is recorded where the skip is:
   
   ```go
   // test/conformance/conformance_test.go
   // The same limitation for TLSRoute, and not something the translator can
   // fix. The test stands four Gateways up on port 443 with different listener
   // hostnames; every Gateway resolves to the one data plane address and the 
one
   // physical stream listen, so their SNI namespaces are shared. The Gateway
   // whose listener carries no hostname keeps its route's "*.com" verbatim -
   // correctly, and its own subtest depends on it - which then also answers
   // "non.matching.com" on the address of the Gateway that should have rejected
   // it. Which Gateway a connection was addressed to is not on the wire, so
   // there is nothing left to discriminate on. Every other assertion in this
   // test passes, including the hostname intersections themselves.
   tests.TLSRouteHostnameIntersection.ShortName,
   ```
   
   This was checked by dumping the resulting stream routes, not inferred: the 
hostname intersections the test asserts on all come out right, and only the 
negative case on a shared address fails. Making it pass needs one address per 
Gateway, which is a deployment property.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to