Repository: knative-sandbox/net-kourier
Pull request #694 (2021-11-05 16:47:16)

Adds k8s recommended labels
# Changes

Adds Kubernetes recommended labels to networking as discussed in https://github.com/knative/networking/issues/552

Note that changes to the labels in `vendor/knative.dev/networking` should be handled by the automation once https://github.com/knative/networking/pull/555 merges. 

/kind enhancement

/assign @dprotaso 

knative-prow-robot: [APPROVALNOTIFIER] This PR is **NOT APPROVED**

This pull-request has been approved by: *<a href="https://github.com/knative-sandbox/net-kourier/pull/694#" title="Author self-approved">psschwei</a>*
To complete the [pull request process](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process), please assign **markusthoemmes** after the PR has been reviewed.
You can assign the PR to them by writing `/assign @markusthoemmes` in a comment when ready.

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=knative-sandbox%2Fnet-kourier).

<details open>
Needs approval from an approver in each of these files:

- **[OWNERS](https://github.com/knative-sandbox/net-kourier/blob/main/OWNERS)**

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":["markusthoemmes"]} -->
codecov[bot]: # [Codecov](https://codecov.io/gh/knative-sandbox/net-kourier/pull/694?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox) Report
> Merging [#694](https://codecov.io/gh/knative-sandbox/net-kourier/pull/694?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox) (7a5ab8a) into [main](https://codecov.io/gh/knative-sandbox/net-kourier/commit/e48ce2b10f8ff7208f4b46caace7edddb5bc7517?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox) (e48ce2b) will **not change** coverage.
> The diff coverage is `n/a`.

[![Impacted file tree graph](https://codecov.io/gh/knative-sandbox/net-kourier/pull/694/graphs/tree.svg?width=650&height=150&src=pr&token=KmlRo23zX4&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox)](https://codecov.io/gh/knative-sandbox/net-kourier/pull/694?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox)

```diff
@@           Coverage Diff           @@
##             main     #694   +/-   ##
=======================================
  Coverage   70.53%   70.53%           
=======================================
  Files          18       18           
  Lines         655      655           
=======================================
  Hits          462      462           
  Misses        168      168           
  Partials       25       25           
```



------

[Continue to review full report at Codecov](https://codecov.io/gh/knative-sandbox/net-kourier/pull/694?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/knative-sandbox/net-kourier/pull/694?src=pr&el=footer&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox). Last update [e48ce2b...7a5ab8a](https://codecov.io/gh/knative-sandbox/net-kourier/pull/694?src=pr&el=lastupdated&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=knative-sandbox).


Patch:
diff --git a/config/100-namespace.yaml b/config/100-namespace.yaml
index fe120ef4..3f818c92 100644
--- a/config/100-namespace.yaml
+++ b/config/100-namespace.yaml
@@ -18,4 +18,7 @@ metadata:
   name: kourier-system
   labels:
     networking.knative.dev/ingress-provider: kourier
+    app.kubernetes.io/name: knative-serving
+    app.kubernetes.io/component: net-kourier
+    app.kubernetes.io/version: devel
     serving.knative.dev/release: devel
diff --git a/config/200-bootstrap.yaml b/config/200-bootstrap.yaml
index a64af1f8..d1558878 100644
--- a/config/200-bootstrap.yaml
+++ b/config/200-bootstrap.yaml
@@ -19,6 +19,9 @@ metadata:
   namespace: kourier-system
   labels:
     networking.knative.dev/ingress-provider: kourier
+    app.kubernetes.io/component: net-kourier
+    app.kubernetes.io/version: devel
+    app.kubernetes.io/name: knative-serving
     serving.knative.dev/release: devel
 data:
   envoy-bootstrap.yaml: |
diff --git a/config/200-config.yaml b/config/200-config.yaml
index 729c6ebf..4d5be5d1 100644
--- a/config/200-config.yaml
+++ b/config/200-config.yaml
@@ -19,6 +19,9 @@ metadata:
   namespace: knative-serving
   labels:
     networking.knative.dev/ingress-provider: kourier
+    app.kubernetes.io/component: net-kourier
+    app.kubernetes.io/version: devel
+    app.kubernetes.io/name: knative-serving
     serving.knative.dev/release: devel
 data:
   _example: |
diff --git a/config/200-serviceaccount.yaml b/config/200-serviceaccount.yaml
index 3a44fbc6..1769df15 100644
--- a/config/200-serviceaccount.yaml
+++ b/config/200-serviceaccount.yaml
@@ -19,6 +19,9 @@ metadata:
   namespace: knative-serving
   labels:
     networking.knative.dev/ingress-provider: kourier
+    app.kubernetes.io/component: net-kourier
+    app.kubernetes.io/version: devel
+    app.kubernetes.io/name: knative-serving
     serving.knative.dev/release: devel
 ---
 apiVersion: rbac.authorization.k8s.io/v1
@@ -28,6 +31,9 @@ metadata:
   namespace: knative-serving
   labels:
     networking.knative.dev/ingress-provider: kourier
+    app.kubernetes.io/component: net-kourier
+    app.kubernetes.io/version: devel
+    app.kubernetes.io/name: knative-serving
     serving.knative.dev/release: devel
 rules:
   - apiGroups: [""]
@@ -55,6 +61,9 @@ metadata:
   name: net-kourier
   labels:
     networking.knative.dev/ingress-provider: kourier
+    app.kubernetes.io/component: net-kourier
+    app.kubernetes.io/version: devel
+    app.kubernetes.io/name: knative-serving
     serving.knative.dev/release: devel
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff --git a/config/300-controller.yaml b/config/300-controller.yaml
index 98e676de..a068a02d 100644
--- a/config/300-controller.yaml
+++ b/config/300-controller.yaml
@@ -19,6 +19,9 @@ metadata:
   namespace: knative-serving
   labels:
     networking.knative.dev/ingress-provider: kourier
+    app.kubernetes.io/component: net-kourier
+    app.kubernetes.io/version: devel
+    app.kubernetes.io/name: knative-serving
     serving.knative.dev/release: devel
 spec:
   replicas: 1
@@ -70,6 +73,9 @@ metadata:
   namespace: knative-serving
   labels:
     networking.knative.dev/ingress-provider: kourier
+    app.kubernetes.io/component: net-kourier
+    app.kubernetes.io/version: devel
+    app.kubernetes.io/name: knative-serving
     serving.knative.dev/release: devel
 spec:
   ports:
diff --git a/config/300-gateway.yaml b/config/300-gateway.yaml
index e955050d..2881cdf7 100644
--- a/config/300-gateway.yaml
+++ b/config/300-gateway.yaml
@@ -19,6 +19,9 @@ metadata:
   namespace: kourier-system
   labels:
     networking.knative.dev/ingress-provider: kourier
+    app.kubernetes.io/component: net-kourier
+    app.kubernetes.io/version: devel
+    app.kubernetes.io/name: knative-serving
     serving.knative.dev/release: devel
 spec:
   strategy:
@@ -94,6 +97,9 @@ metadata:
   namespace: kourier-system
   labels:
     networking.knative.dev/ingress-provider: kourier
+    app.kubernetes.io/component: net-kourier
+    app.kubernetes.io/version: devel
+    app.kubernetes.io/name: knative-serving
     serving.knative.dev/release: devel
 spec:
   ports:
@@ -116,6 +122,9 @@ metadata:
   namespace: kourier-system
   labels:
     networking.knative.dev/ingress-provider: kourier
+    app.kubernetes.io/component: net-kourier
+    app.kubernetes.io/version: devel
+    app.kubernetes.io/name: knative-serving
     serving.knative.dev/release: devel
 spec:
   ports:
diff --git a/go.mod b/go.mod
index ed028809..b5957ed4 100644
--- a/go.mod
+++ b/go.mod
@@ -17,7 +17,7 @@ require (
 	k8s.io/apimachinery v0.21.4
 	k8s.io/client-go v0.21.4
 	k8s.io/code-generator v0.21.4
-	knative.dev/hack v0.0.0-20211104075903-0f69979bbb7d
-	knative.dev/networking v0.0.0-20211104064801-6871f98f7b4d
-	knative.dev/pkg v0.0.0-20211104101302-51b9e7f161b4
+	knative.dev/hack v0.0.0-20211108170701-96aac1c30be3
+	knative.dev/networking v0.0.0-20211109014842-5d4dc7ffa17b
+	knative.dev/pkg v0.0.0-20211108064904-3cc697a3cb09
 )
diff --git a/go.sum b/go.sum
index b1f93f42..1a054538 100644
--- a/go.sum
+++ b/go.sum
@@ -1120,15 +1120,15 @@ k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 h1:vEx13qjvaZ4yfObSSXW7Br
 k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE=
 k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw=
 k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
-knative.dev/hack v0.0.0-20211101195839-11d193bf617b/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI=
 knative.dev/hack v0.0.0-20211102174540-b284d49386cc/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI=
-knative.dev/hack v0.0.0-20211104075903-0f69979bbb7d h1:osgDQ4YarclNcFctyQULF/coJhzvAMOTjyBgPHLclso=
-knative.dev/hack v0.0.0-20211104075903-0f69979bbb7d/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI=
-knative.dev/networking v0.0.0-20211104064801-6871f98f7b4d h1:tUUVM7awGZgLrd0ysguiVlzGCMpPk4Zp3Ec2qQcKgx0=
-knative.dev/networking v0.0.0-20211104064801-6871f98f7b4d/go.mod h1:gP1Wha/MhUkANNu5ac2nINkH+fh/TtIU54105JxmA9I=
-knative.dev/pkg v0.0.0-20211103135647-464034912f7e/go.mod h1:a+9AWOb0zOaBVU6xoPgTvEA7vfMnLjPnK4SX3ciSHKE=
-knative.dev/pkg v0.0.0-20211104101302-51b9e7f161b4 h1:X1CGp8wqBcIWfuz5uIH1yo011/SFPMPPP7Qe8KyRiyI=
+knative.dev/hack v0.0.0-20211105231158-29f86c2653b5/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI=
+knative.dev/hack v0.0.0-20211108170701-96aac1c30be3 h1:oSvRgnKoU308k7aXbPV3iL5Zh5kBGM2Ptar4hyeda+A=
+knative.dev/hack v0.0.0-20211108170701-96aac1c30be3/go.mod h1:PHt8x8yX5Z9pPquBEfIj0X66f8iWkWfR0S/sarACJrI=
+knative.dev/networking v0.0.0-20211109014842-5d4dc7ffa17b h1:CizrD5o9757Nu6dQeYjJWZnRdzgZwKEebl6PVktVuwA=
+knative.dev/networking v0.0.0-20211109014842-5d4dc7ffa17b/go.mod h1:6la3jzmZXWsmvoxaNJhLXMYMxjTQIsizx19Sq4ud6Cc=
 knative.dev/pkg v0.0.0-20211104101302-51b9e7f161b4/go.mod h1:EKhRrRSAHrnJwQPfgUyrmHgLCam9xcRh79t+G3MJu4k=
+knative.dev/pkg v0.0.0-20211108064904-3cc697a3cb09 h1:EuziitWfjhtDEI7vyNV79AtqFia5rACAFOy2rbinVo4=
+knative.dev/pkg v0.0.0-20211108064904-3cc697a3cb09/go.mod h1:YiSfFDMdYHZTuO5XS8UzxSeOEmocy+Kb2YOGik9C8lw=
 pgregory.net/rapid v0.3.3/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU=
 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
 rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
diff --git a/hack/release.sh b/hack/release.sh
index 3c5adffa..93bb5658 100755
--- a/hack/release.sh
+++ b/hack/release.sh
@@ -35,8 +35,8 @@ readonly RELEASES
 function build_release() {
   # Update release labels if this is a tagged release
   if [[ -n "${TAG}" ]]; then
-    echo "Tagged release, updating release labels to serving.knative.dev/release: \"${TAG}\""
-    LABEL_YAML_CMD=(sed -e "s|serving.knative.dev/release: devel|serving.knative.dev/release: \"${TAG}\"|")
+    echo "Tagged release, updating release labels to serving.knative.dev/release: \"${TAG}\" and app.kubernetes.io/version: \"${TAG}\""
+    LABEL_YAML_CMD=(sed -e "s|serving.knative.dev/release: devel|serving.knative.dev/release: \"${TAG}\"|" -e "s|app.kubernetes.io/version: devel|app.kubernetes.io/version: \"${TAG:1}\"|")
   else
     echo "Untagged release, will NOT update release labels"
     LABEL_YAML_CMD=(cat)
diff --git a/pkg/config/ext_authz.go b/pkg/config/ext_authz.go
index f5cfdabf..cef3f8ba 100644
--- a/pkg/config/ext_authz.go
+++ b/pkg/config/ext_authz.go
@@ -28,6 +28,7 @@ import (
 	endpoint "github.com/envoyproxy/go-control-plane/envoy/config/endpoint/v3"
 	extAuthService "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/ext_authz/v3"
 	hcm "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/network/http_connection_manager/v3"
+	httpOptions "github.com/envoyproxy/go-control-plane/envoy/extensions/upstreams/http/v3"
 	"github.com/envoyproxy/go-control-plane/pkg/wellknown"
 	"github.com/kelseyhightower/envconfig"
 	"google.golang.org/protobuf/types/known/anypb"
@@ -93,14 +94,23 @@ func init() {
 }
 
 func extAuthzCluster(host string, port uint32) *v3Cluster.Cluster {
+	opts, _ := anypb.New(&httpOptions.HttpProtocolOptions{
+		UpstreamProtocolOptions: &httpOptions.HttpProtocolOptions_ExplicitHttpConfig_{
+			ExplicitHttpConfig: &httpOptions.HttpProtocolOptions_ExplicitHttpConfig{
+				ProtocolConfig: &httpOptions.HttpProtocolOptions_ExplicitHttpConfig_Http2ProtocolOptions{},
+			},
+		},
+	})
+
 	return &v3Cluster.Cluster{
 		Name: extAuthzClusterName,
 		ClusterDiscoveryType: &v3Cluster.Cluster_Type{
 			Type: v3Cluster.Cluster_STRICT_DNS,
 		},
-		//nolint: staticcheck // TODO: Http2ProtocolOptions is deprecated.
-		Http2ProtocolOptions: &core.Http2ProtocolOptions{},
-		ConnectTimeout:       durationpb.New(5 * time.Second),
+		TypedExtensionProtocolOptions: map[string]*anypb.Any{
+			"envoy.extensions.upstreams.http.v3.HttpProtocolOptions": opts,
+		},
+		ConnectTimeout: durationpb.New(5 * time.Second),
 		LoadAssignment: &endpoint.ClusterLoadAssignment{
 			ClusterName: extAuthzClusterName,
 			Endpoints: []*endpoint.LocalityLbEndpoints{{
diff --git a/pkg/envoy/api/cluster.go b/pkg/envoy/api/cluster.go
index 2b099baa..3b6068ae 100644
--- a/pkg/envoy/api/cluster.go
+++ b/pkg/envoy/api/cluster.go
@@ -20,8 +20,9 @@ import (
 	"time"
 
 	envoyCluster "github.com/envoyproxy/go-control-plane/envoy/config/cluster/v3"
-	core "github.com/envoyproxy/go-control-plane/envoy/config/core/v3"
 	endpoint "github.com/envoyproxy/go-control-plane/envoy/config/endpoint/v3"
+	httpOptions "github.com/envoyproxy/go-control-plane/envoy/extensions/upstreams/http/v3"
+	"google.golang.org/protobuf/types/known/anypb"
 	"google.golang.org/protobuf/types/known/durationpb"
 )
 
@@ -48,8 +49,17 @@ func NewCluster(
 	}
 
 	if isHTTP2 {
-		//nolint: staticcheck // TODO: Http2ProtocolOptions is deprecated.
-		cluster.Http2ProtocolOptions = &core.Http2ProtocolOptions{}
+		opts, _ := anypb.New(&httpOptions.HttpProtocolOptions{
+			UpstreamProtocolOptions: &httpOptions.HttpProtocolOptions_ExplicitHttpConfig_{
+				ExplicitHttpConfig: &httpOptions.HttpProtocolOptions_ExplicitHttpConfig{
+					ProtocolConfig: &httpOptions.HttpProtocolOptions_ExplicitHttpConfig_Http2ProtocolOptions{},
+				},
+			},
+		})
+
+		cluster.TypedExtensionProtocolOptions = map[string]*anypb.Any{
+			"envoy.extensions.upstreams.http.v3.HttpProtocolOptions": opts,
+		}
 	}
 
 	return cluster
diff --git a/vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/upstreams/http/v3/http_protocol_options.pb.go b/vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/upstreams/http/v3/http_protocol_options.pb.go
new file mode 100644
index 00000000..7cc16181
--- /dev/null
+++ b/vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/upstreams/http/v3/http_protocol_options.pb.go
@@ -0,0 +1,730 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.25.0
+// 	protoc        v3.18.0
+// source: envoy/extensions/upstreams/http/v3/http_protocol_options.proto
+
+package envoy_extensions_upstreams_http_v3
+
+import (
+	_ "github.com/cncf/xds/go/udpa/annotations"
+	v3 "github.com/envoyproxy/go-control-plane/envoy/config/core/v3"
+	_ "github.com/envoyproxy/protoc-gen-validate/validate"
+	proto "github.com/golang/protobuf/proto"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
+
+// HttpProtocolOptions specifies Http upstream protocol options. This object
+// is used in
+// :ref:`typed_extension_protocol_options<envoy_v3_api_field_config.cluster.v3.Cluster.typed_extension_protocol_options>`,
+// keyed by the name `envoy.extensions.upstreams.http.v3.HttpProtocolOptions`.
+//
+// This controls what protocol(s) should be used for upstream and how said protocol(s) are configured.
+//
+// This replaces the prior pattern of explicit protocol configuration directly
+// in the cluster. So a configuration like this, explicitly configuring the use of HTTP/2 upstream:
+//
+// .. code::
+//
+//   clusters:
+//     - name: some_service
+//       connect_timeout: 5s
+//       upstream_http_protocol_options:
+//         auto_sni: true
+//       common_http_protocol_options:
+//         idle_timeout: 1s
+//       http2_protocol_options:
+//         max_concurrent_streams: 100
+//        .... [further cluster config]
+//
+// Would now look like this:
+//
+// .. code::
+//
+//   clusters:
+//     - name: some_service
+//       connect_timeout: 5s
+//       typed_extension_protocol_options:
+//         envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
+//           "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
+//           upstream_http_protocol_options:
+//             auto_sni: true
+//           common_http_protocol_options:
+//             idle_timeout: 1s
+//           explicit_http_config:
+//             http2_protocol_options:
+//               max_concurrent_streams: 100
+//        .... [further cluster config]
+// [#next-free-field: 6]
+type HttpProtocolOptions struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// This contains options common across HTTP/1 and HTTP/2
+	CommonHttpProtocolOptions *v3.HttpProtocolOptions `protobuf:"bytes,1,opt,name=common_http_protocol_options,json=commonHttpProtocolOptions,proto3" json:"common_http_protocol_options,omitempty"`
+	// This contains common protocol options which are only applied upstream.
+	UpstreamHttpProtocolOptions *v3.UpstreamHttpProtocolOptions `protobuf:"bytes,2,opt,name=upstream_http_protocol_options,json=upstreamHttpProtocolOptions,proto3" json:"upstream_http_protocol_options,omitempty"`
+	// This controls the actual protocol to be used upstream.
+	//
+	// Types that are assignable to UpstreamProtocolOptions:
+	//	*HttpProtocolOptions_ExplicitHttpConfig_
+	//	*HttpProtocolOptions_UseDownstreamProtocolConfig
+	//	*HttpProtocolOptions_AutoConfig
+	UpstreamProtocolOptions isHttpProtocolOptions_UpstreamProtocolOptions `protobuf_oneof:"upstream_protocol_options"`
+}
+
+func (x *HttpProtocolOptions) Reset() {
+	*x = HttpProtocolOptions{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *HttpProtocolOptions) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*HttpProtocolOptions) ProtoMessage() {}
+
+func (x *HttpProtocolOptions) ProtoReflect() protoreflect.Message {
+	mi := &file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use HttpProtocolOptions.ProtoReflect.Descriptor instead.
+func (*HttpProtocolOptions) Descriptor() ([]byte, []int) {
+	return file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *HttpProtocolOptions) GetCommonHttpProtocolOptions() *v3.HttpProtocolOptions {
+	if x != nil {
+		return x.CommonHttpProtocolOptions
+	}
+	return nil
+}
+
+func (x *HttpProtocolOptions) GetUpstreamHttpProtocolOptions() *v3.UpstreamHttpProtocolOptions {
+	if x != nil {
+		return x.UpstreamHttpProtocolOptions
+	}
+	return nil
+}
+
+func (m *HttpProtocolOptions) GetUpstreamProtocolOptions() isHttpProtocolOptions_UpstreamProtocolOptions {
+	if m != nil {
+		return m.UpstreamProtocolOptions
+	}
+	return nil
+}
+
+func (x *HttpProtocolOptions) GetExplicitHttpConfig() *HttpProtocolOptions_ExplicitHttpConfig {
+	if x, ok := x.GetUpstreamProtocolOptions().(*HttpProtocolOptions_ExplicitHttpConfig_); ok {
+		return x.ExplicitHttpConfig
+	}
+	return nil
+}
+
+func (x *HttpProtocolOptions) GetUseDownstreamProtocolConfig() *HttpProtocolOptions_UseDownstreamHttpConfig {
+	if x, ok := x.GetUpstreamProtocolOptions().(*HttpProtocolOptions_UseDownstreamProtocolConfig); ok {
+		return x.UseDownstreamProtocolConfig
+	}
+	return nil
+}
+
+func (x *HttpProtocolOptions) GetAutoConfig() *HttpProtocolOptions_AutoHttpConfig {
+	if x, ok := x.GetUpstreamProtocolOptions().(*HttpProtocolOptions_AutoConfig); ok {
+		return x.AutoConfig
+	}
+	return nil
+}
+
+type isHttpProtocolOptions_UpstreamProtocolOptions interface {
+	isHttpProtocolOptions_UpstreamProtocolOptions()
+}
+
+type HttpProtocolOptions_ExplicitHttpConfig_ struct {
+	// To explicitly configure either HTTP/1 or HTTP/2 (but not both!) use *explicit_http_config*.
+	// If the *explicit_http_config* is empty, HTTP/1.1 is used.
+	ExplicitHttpConfig *HttpProtocolOptions_ExplicitHttpConfig `protobuf:"bytes,3,opt,name=explicit_http_config,json=explicitHttpConfig,proto3,oneof"`
+}
+
+type HttpProtocolOptions_UseDownstreamProtocolConfig struct {
+	// This allows switching on protocol based on what protocol the downstream
+	// connection used.
+	UseDownstreamProtocolConfig *HttpProtocolOptions_UseDownstreamHttpConfig `protobuf:"bytes,4,opt,name=use_downstream_protocol_config,json=useDownstreamProtocolConfig,proto3,oneof"`
+}
+
+type HttpProtocolOptions_AutoConfig struct {
+	// This allows switching on protocol based on ALPN
+	AutoConfig *HttpProtocolOptions_AutoHttpConfig `protobuf:"bytes,5,opt,name=auto_config,json=autoConfig,proto3,oneof"`
+}
+
+func (*HttpProtocolOptions_ExplicitHttpConfig_) isHttpProtocolOptions_UpstreamProtocolOptions() {}
+
+func (*HttpProtocolOptions_UseDownstreamProtocolConfig) isHttpProtocolOptions_UpstreamProtocolOptions() {
+}
+
+func (*HttpProtocolOptions_AutoConfig) isHttpProtocolOptions_UpstreamProtocolOptions() {}
+
+// If this is used, the cluster will only operate on one of the possible upstream protocols.
+// Note that HTTP/2 or above should generally be used for upstream gRPC clusters.
+type HttpProtocolOptions_ExplicitHttpConfig struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	// Types that are assignable to ProtocolConfig:
+	//	*HttpProtocolOptions_ExplicitHttpConfig_HttpProtocolOptions
+	//	*HttpProtocolOptions_ExplicitHttpConfig_Http2ProtocolOptions
+	//	*HttpProtocolOptions_ExplicitHttpConfig_Http3ProtocolOptions
+	ProtocolConfig isHttpProtocolOptions_ExplicitHttpConfig_ProtocolConfig `protobuf_oneof:"protocol_config"`
+}
+
+func (x *HttpProtocolOptions_ExplicitHttpConfig) Reset() {
+	*x = HttpProtocolOptions_ExplicitHttpConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *HttpProtocolOptions_ExplicitHttpConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*HttpProtocolOptions_ExplicitHttpConfig) ProtoMessage() {}
+
+func (x *HttpProtocolOptions_ExplicitHttpConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use HttpProtocolOptions_ExplicitHttpConfig.ProtoReflect.Descriptor instead.
+func (*HttpProtocolOptions_ExplicitHttpConfig) Descriptor() ([]byte, []int) {
+	return file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_rawDescGZIP(), []int{0, 0}
+}
+
+func (m *HttpProtocolOptions_ExplicitHttpConfig) GetProtocolConfig() isHttpProtocolOptions_ExplicitHttpConfig_ProtocolConfig {
+	if m != nil {
+		return m.ProtocolConfig
+	}
+	return nil
+}
+
+func (x *HttpProtocolOptions_ExplicitHttpConfig) GetHttpProtocolOptions() *v3.Http1ProtocolOptions {
+	if x, ok := x.GetProtocolConfig().(*HttpProtocolOptions_ExplicitHttpConfig_HttpProtocolOptions); ok {
+		return x.HttpProtocolOptions
+	}
+	return nil
+}
+
+func (x *HttpProtocolOptions_ExplicitHttpConfig) GetHttp2ProtocolOptions() *v3.Http2ProtocolOptions {
+	if x, ok := x.GetProtocolConfig().(*HttpProtocolOptions_ExplicitHttpConfig_Http2ProtocolOptions); ok {
+		return x.Http2ProtocolOptions
+	}
+	return nil
+}
+
+func (x *HttpProtocolOptions_ExplicitHttpConfig) GetHttp3ProtocolOptions() *v3.Http3ProtocolOptions {
+	if x, ok := x.GetProtocolConfig().(*HttpProtocolOptions_ExplicitHttpConfig_Http3ProtocolOptions); ok {
+		return x.Http3ProtocolOptions
+	}
+	return nil
+}
+
+type isHttpProtocolOptions_ExplicitHttpConfig_ProtocolConfig interface {
+	isHttpProtocolOptions_ExplicitHttpConfig_ProtocolConfig()
+}
+
+type HttpProtocolOptions_ExplicitHttpConfig_HttpProtocolOptions struct {
+	HttpProtocolOptions *v3.Http1ProtocolOptions `protobuf:"bytes,1,opt,name=http_protocol_options,json=httpProtocolOptions,proto3,oneof"`
+}
+
+type HttpProtocolOptions_ExplicitHttpConfig_Http2ProtocolOptions struct {
+	Http2ProtocolOptions *v3.Http2ProtocolOptions `protobuf:"bytes,2,opt,name=http2_protocol_options,json=http2ProtocolOptions,proto3,oneof"`
+}
+
+type HttpProtocolOptions_ExplicitHttpConfig_Http3ProtocolOptions struct {
+	// .. warning::
+	//   QUIC support is currently alpha and should be used with caution. Please
+	//   see :ref:`here <arch_overview_http3>` for details.
+	Http3ProtocolOptions *v3.Http3ProtocolOptions `protobuf:"bytes,3,opt,name=http3_protocol_options,json=http3ProtocolOptions,proto3,oneof"`
+}
+
+func (*HttpProtocolOptions_ExplicitHttpConfig_HttpProtocolOptions) isHttpProtocolOptions_ExplicitHttpConfig_ProtocolConfig() {
+}
+
+func (*HttpProtocolOptions_ExplicitHttpConfig_Http2ProtocolOptions) isHttpProtocolOptions_ExplicitHttpConfig_ProtocolConfig() {
+}
+
+func (*HttpProtocolOptions_ExplicitHttpConfig_Http3ProtocolOptions) isHttpProtocolOptions_ExplicitHttpConfig_ProtocolConfig() {
+}
+
+// If this is used, the cluster can use either of the configured protocols, and
+// will use whichever protocol was used by the downstream connection.
+//
+// If HTTP/3 is configured for downstream and not configured for upstream,
+// HTTP/3 requests will fail over to HTTP/2.
+type HttpProtocolOptions_UseDownstreamHttpConfig struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	HttpProtocolOptions  *v3.Http1ProtocolOptions `protobuf:"bytes,1,opt,name=http_protocol_options,json=httpProtocolOptions,proto3" json:"http_protocol_options,omitempty"`
+	Http2ProtocolOptions *v3.Http2ProtocolOptions `protobuf:"bytes,2,opt,name=http2_protocol_options,json=http2ProtocolOptions,proto3" json:"http2_protocol_options,omitempty"`
+	// .. warning::
+	//   QUIC support is currently alpha and should be used with caution. Please
+	//   see :ref:`here <arch_overview_http3>` for details.
+	Http3ProtocolOptions *v3.Http3ProtocolOptions `protobuf:"bytes,3,opt,name=http3_protocol_options,json=http3ProtocolOptions,proto3" json:"http3_protocol_options,omitempty"`
+}
+
+func (x *HttpProtocolOptions_UseDownstreamHttpConfig) Reset() {
+	*x = HttpProtocolOptions_UseDownstreamHttpConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *HttpProtocolOptions_UseDownstreamHttpConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*HttpProtocolOptions_UseDownstreamHttpConfig) ProtoMessage() {}
+
+func (x *HttpProtocolOptions_UseDownstreamHttpConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use HttpProtocolOptions_UseDownstreamHttpConfig.ProtoReflect.Descriptor instead.
+func (*HttpProtocolOptions_UseDownstreamHttpConfig) Descriptor() ([]byte, []int) {
+	return file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_rawDescGZIP(), []int{0, 1}
+}
+
+func (x *HttpProtocolOptions_UseDownstreamHttpConfig) GetHttpProtocolOptions() *v3.Http1ProtocolOptions {
+	if x != nil {
+		return x.HttpProtocolOptions
+	}
+	return nil
+}
+
+func (x *HttpProtocolOptions_UseDownstreamHttpConfig) GetHttp2ProtocolOptions() *v3.Http2ProtocolOptions {
+	if x != nil {
+		return x.Http2ProtocolOptions
+	}
+	return nil
+}
+
+func (x *HttpProtocolOptions_UseDownstreamHttpConfig) GetHttp3ProtocolOptions() *v3.Http3ProtocolOptions {
+	if x != nil {
+		return x.Http3ProtocolOptions
+	}
+	return nil
+}
+
+// If this is used, the cluster can use either HTTP/1 or HTTP/2, and will use whichever
+// protocol is negotiated by ALPN with the upstream.
+// Clusters configured with *AutoHttpConfig* will use the highest available
+// protocol; HTTP/2 if supported, otherwise HTTP/1.
+// If the upstream does not support ALPN, *AutoHttpConfig* will fail over to HTTP/1.
+// This can only be used with transport sockets which support ALPN. Using a
+// transport socket which does not support ALPN will result in configuration
+// failure. The transport layer may be configured with custom ALPN, but the default ALPN
+// for the cluster (or if custom ALPN fails) will be "h2,http/1.1".
+type HttpProtocolOptions_AutoHttpConfig struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	HttpProtocolOptions  *v3.Http1ProtocolOptions `protobuf:"bytes,1,opt,name=http_protocol_options,json=httpProtocolOptions,proto3" json:"http_protocol_options,omitempty"`
+	Http2ProtocolOptions *v3.Http2ProtocolOptions `protobuf:"bytes,2,opt,name=http2_protocol_options,json=http2ProtocolOptions,proto3" json:"http2_protocol_options,omitempty"`
+	// Unlike HTTP/1 and HTTP/2, HTTP/3 will not be configured unless it is
+	// present, and (soon) only if there is an indication of server side
+	// support.
+	// See :ref:`here <arch_overview_http3_upstream>` for more information on
+	// when HTTP/3 will be used, and when Envoy will fail over to TCP.
+	//
+	// .. warning::
+	//   QUIC support is currently alpha and should be used with caution. Please
+	//   see :ref:`here <arch_overview_http3>` for details.
+	//   AutoHttpConfig config is undergoing especially rapid change and as it
+	//   is alpha is not guaranteed to be API-stable.
+	Http3ProtocolOptions *v3.Http3ProtocolOptions `protobuf:"bytes,3,opt,name=http3_protocol_options,json=http3ProtocolOptions,proto3" json:"http3_protocol_options,omitempty"`
+	// The presence of alternate protocols cache options causes the use of the
+	// alternate protocols cache, which is responsible for parsing and caching
+	// HTTP Alt-Svc headers. This enables the use of HTTP/3 for origins that
+	// advertise supporting it.
+	//
+	// .. note::
+	//   This is required when HTTP/3 is enabled.
+	AlternateProtocolsCacheOptions *v3.AlternateProtocolsCacheOptions `protobuf:"bytes,4,opt,name=alternate_protocols_cache_options,json=alternateProtocolsCacheOptions,proto3" json:"alternate_protocols_cache_options,omitempty"`
+}
+
+func (x *HttpProtocolOptions_AutoHttpConfig) Reset() {
+	*x = HttpProtocolOptions_AutoHttpConfig{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *HttpProtocolOptions_AutoHttpConfig) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*HttpProtocolOptions_AutoHttpConfig) ProtoMessage() {}
+
+func (x *HttpProtocolOptions_AutoHttpConfig) ProtoReflect() protoreflect.Message {
+	mi := &file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use HttpProtocolOptions_AutoHttpConfig.ProtoReflect.Descriptor instead.
+func (*HttpProtocolOptions_AutoHttpConfig) Descriptor() ([]byte, []int) {
+	return file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_rawDescGZIP(), []int{0, 2}
+}
+
+func (x *HttpProtocolOptions_AutoHttpConfig) GetHttpProtocolOptions() *v3.Http1ProtocolOptions {
+	if x != nil {
+		return x.HttpProtocolOptions
+	}
+	return nil
+}
+
+func (x *HttpProtocolOptions_AutoHttpConfig) GetHttp2ProtocolOptions() *v3.Http2ProtocolOptions {
+	if x != nil {
+		return x.Http2ProtocolOptions
+	}
+	return nil
+}
+
+func (x *HttpProtocolOptions_AutoHttpConfig) GetHttp3ProtocolOptions() *v3.Http3ProtocolOptions {
+	if x != nil {
+		return x.Http3ProtocolOptions
+	}
+	return nil
+}
+
+func (x *HttpProtocolOptions_AutoHttpConfig) GetAlternateProtocolsCacheOptions() *v3.AlternateProtocolsCacheOptions {
+	if x != nil {
+		return x.AlternateProtocolsCacheOptions
+	}
+	return nil
+}
+
+var File_envoy_extensions_upstreams_http_v3_http_protocol_options_proto protoreflect.FileDescriptor
+
+var file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_rawDesc = []byte{
+	0x0a, 0x3e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
+	0x6e, 0x73, 0x2f, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x2f, 0x68, 0x74, 0x74,
+	0x70, 0x2f, 0x76, 0x33, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x12, 0x22, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
+	0x6e, 0x73, 0x2e, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x2e, 0x68, 0x74, 0x74,
+	0x70, 0x2e, 0x76, 0x33, 0x1a, 0x23, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2f, 0x63, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x75, 0x64, 0x70, 0x61, 0x2f,
+	0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x73, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61,
+	0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x22, 0xf0, 0x0d, 0x0a, 0x13, 0x48, 0x74, 0x74, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x6a, 0x0a, 0x1c, 0x63, 0x6f, 0x6d,
+	0x6d, 0x6f, 0x6e, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x29, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63,
+	0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x19, 0x63, 0x6f, 0x6d, 0x6d,
+	0x6f, 0x6e, 0x48, 0x74, 0x74, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70,
+	0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x76, 0x0a, 0x1e, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61,
+	0x6d, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f,
+	0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e,
+	0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72,
+	0x65, 0x2e, 0x76, 0x33, 0x2e, 0x55, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x74, 0x74,
+	0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+	0x52, 0x1b, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x74, 0x74, 0x70, 0x50, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x7e, 0x0a,
+	0x14, 0x65, 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x63,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4a, 0x2e, 0x65, 0x6e,
+	0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x75,
+	0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x76, 0x33,
+	0x2e, 0x48, 0x74, 0x74, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74,
+	0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x48, 0x74, 0x74,
+	0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x12, 0x65, 0x78, 0x70, 0x6c, 0x69,
+	0x63, 0x69, 0x74, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x96, 0x01,
+	0x0a, 0x1e, 0x75, 0x73, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d,
+	0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x4f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65,
+	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65,
+	0x61, 0x6d, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70,
+	0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e,
+	0x55, 0x73, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x74, 0x74,
+	0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x1b, 0x75, 0x73, 0x65, 0x44, 0x6f,
+	0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x69, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x63,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x65, 0x6e,
+	0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x75,
+	0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x76, 0x33,
+	0x2e, 0x48, 0x74, 0x74, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74,
+	0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x43, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x1a, 0xd6, 0x02, 0x0a, 0x12, 0x45, 0x78, 0x70, 0x6c, 0x69, 0x63, 0x69, 0x74, 0x48, 0x74,
+	0x74, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x60, 0x0a, 0x15, 0x68, 0x74, 0x74, 0x70,
+	0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+	0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e,
+	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48,
+	0x74, 0x74, 0x70, 0x31, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69,
+	0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x13, 0x68, 0x74, 0x74, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x62, 0x0a, 0x16, 0x68, 0x74,
+	0x74, 0x70, 0x32, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x6f, 0x70, 0x74,
+	0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76,
+	0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76,
+	0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x32, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x14, 0x68, 0x74, 0x74, 0x70, 0x32, 0x50,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x62,
+	0x0a, 0x16, 0x68, 0x74, 0x74, 0x70, 0x33, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c,
+	0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a,
+	0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f,
+	0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x33, 0x50, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x48, 0x00, 0x52, 0x14, 0x68, 0x74,
+	0x74, 0x70, 0x33, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f,
+	0x6e, 0x73, 0x42, 0x16, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x63,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x03, 0xf8, 0x42, 0x01, 0x1a, 0xbd, 0x02, 0x0a, 0x17, 0x55,
+	0x73, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x48, 0x74, 0x74, 0x70,
+	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5e, 0x0a, 0x15, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f,
+	0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74,
+	0x70, 0x31, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+	0x73, 0x52, 0x13, 0x68, 0x74, 0x74, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x60, 0x0a, 0x16, 0x68, 0x74, 0x74, 0x70, 0x32, 0x5f,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74,
+	0x74, 0x70, 0x32, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f,
+	0x6e, 0x73, 0x52, 0x14, 0x68, 0x74, 0x74, 0x70, 0x32, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x60, 0x0a, 0x16, 0x68, 0x74, 0x74, 0x70,
+	0x33, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f,
+	0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79,
+	0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e,
+	0x48, 0x74, 0x74, 0x70, 0x33, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74,
+	0x69, 0x6f, 0x6e, 0x73, 0x52, 0x14, 0x68, 0x74, 0x74, 0x70, 0x33, 0x50, 0x72, 0x6f, 0x74, 0x6f,
+	0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0xb5, 0x03, 0x0a, 0x0e, 0x41,
+	0x75, 0x74, 0x6f, 0x48, 0x74, 0x74, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5e, 0x0a,
+	0x15, 0x68, 0x74, 0x74, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x6f,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x65,
+	0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x31, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x13, 0x68, 0x74, 0x74, 0x70, 0x50, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x60, 0x0a,
+	0x16, 0x68, 0x74, 0x74, 0x70, 0x32, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f,
+	0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e,
+	0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72,
+	0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x32, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63,
+	0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x14, 0x68, 0x74, 0x74, 0x70, 0x32,
+	0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12,
+	0x60, 0x0a, 0x16, 0x68, 0x74, 0x74, 0x70, 0x33, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f,
+	0x6c, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x2a, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63,
+	0x6f, 0x72, 0x65, 0x2e, 0x76, 0x33, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x33, 0x50, 0x72, 0x6f, 0x74,
+	0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x14, 0x68, 0x74, 0x74,
+	0x70, 0x33, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
+	0x73, 0x12, 0x7f, 0x0a, 0x21, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x5f, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x6f,
+	0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x65,
+	0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x63, 0x6f, 0x72, 0x65,
+	0x2e, 0x76, 0x33, 0x2e, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f,
+	0x6e, 0x73, 0x52, 0x1e, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f,
+	0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f,
+	0x6e, 0x73, 0x42, 0x20, 0x0a, 0x19, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12,
+	0x03, 0xf8, 0x42, 0x01, 0x42, 0x56, 0x0a, 0x30, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79,
+	0x70, 0x72, 0x6f, 0x78, 0x79, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65,
+	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x75, 0x70, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73,
+	0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x76, 0x33, 0x42, 0x18, 0x48, 0x74, 0x74, 0x70, 0x50, 0x72,
+	0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x72, 0x6f,
+	0x74, 0x6f, 0x50, 0x01, 0xba, 0x80, 0xc8, 0xd1, 0x06, 0x02, 0x10, 0x02, 0x62, 0x06, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_rawDescOnce sync.Once
+	file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_rawDescData = file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_rawDesc
+)
+
+func file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_rawDescGZIP() []byte {
+	file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_rawDescOnce.Do(func() {
+		file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_rawDescData = protoimpl.X.CompressGZIP(file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_rawDescData)
+	})
+	return file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_rawDescData
+}
+
+var file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
+var file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_goTypes = []interface{}{
+	(*HttpProtocolOptions)(nil),                         // 0: envoy.extensions.upstreams.http.v3.HttpProtocolOptions
+	(*HttpProtocolOptions_ExplicitHttpConfig)(nil),      // 1: envoy.extensions.upstreams.http.v3.HttpProtocolOptions.ExplicitHttpConfig
+	(*HttpProtocolOptions_UseDownstreamHttpConfig)(nil), // 2: envoy.extensions.upstreams.http.v3.HttpProtocolOptions.UseDownstreamHttpConfig
+	(*HttpProtocolOptions_AutoHttpConfig)(nil),          // 3: envoy.extensions.upstreams.http.v3.HttpProtocolOptions.AutoHttpConfig
+	(*v3.HttpProtocolOptions)(nil),                      // 4: envoy.config.core.v3.HttpProtocolOptions
+	(*v3.UpstreamHttpProtocolOptions)(nil),              // 5: envoy.config.core.v3.UpstreamHttpProtocolOptions
+	(*v3.Http1ProtocolOptions)(nil),                     // 6: envoy.config.core.v3.Http1ProtocolOptions
+	(*v3.Http2ProtocolOptions)(nil),                     // 7: envoy.config.core.v3.Http2ProtocolOptions
+	(*v3.Http3ProtocolOptions)(nil),                     // 8: envoy.config.core.v3.Http3ProtocolOptions
+	(*v3.AlternateProtocolsCacheOptions)(nil),           // 9: envoy.config.core.v3.AlternateProtocolsCacheOptions
+}
+var file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_depIdxs = []int32{
+	4,  // 0: envoy.extensions.upstreams.http.v3.HttpProtocolOptions.common_http_protocol_options:type_name -> envoy.config.core.v3.HttpProtocolOptions
+	5,  // 1: envoy.extensions.upstreams.http.v3.HttpProtocolOptions.upstream_http_protocol_options:type_name -> envoy.config.core.v3.UpstreamHttpProtocolOptions
+	1,  // 2: envoy.extensions.upstreams.http.v3.HttpProtocolOptions.explicit_http_config:type_name -> envoy.extensions.upstreams.http.v3.HttpProtocolOptions.ExplicitHttpConfig
+	2,  // 3: envoy.extensions.upstreams.http.v3.HttpProtocolOptions.use_downstream_protocol_config:type_name -> envoy.extensions.upstreams.http.v3.HttpProtocolOptions.UseDownstreamHttpConfig
+	3,  // 4: envoy.extensions.upstreams.http.v3.HttpProtocolOptions.auto_config:type_name -> envoy.extensions.upstreams.http.v3.HttpProtocolOptions.AutoHttpConfig
+	6,  // 5: envoy.extensions.upstreams.http.v3.HttpProtocolOptions.ExplicitHttpConfig.http_protocol_options:type_name -> envoy.config.core.v3.Http1ProtocolOptions
+	7,  // 6: envoy.extensions.upstreams.http.v3.HttpProtocolOptions.ExplicitHttpConfig.http2_protocol_options:type_name -> envoy.config.core.v3.Http2ProtocolOptions
+	8,  // 7: envoy.extensions.upstreams.http.v3.HttpProtocolOptions.ExplicitHttpConfig.http3_protocol_options:type_name -> envoy.config.core.v3.Http3ProtocolOptions
+	6,  // 8: envoy.extensions.upstreams.http.v3.HttpProtocolOptions.UseDownstreamHttpConfig.http_protocol_options:type_name -> envoy.config.core.v3.Http1ProtocolOptions
+	7,  // 9: envoy.extensions.upstreams.http.v3.HttpProtocolOptions.UseDownstreamHttpConfig.http2_protocol_options:type_name -> envoy.config.core.v3.Http2ProtocolOptions
+	8,  // 10: envoy.extensions.upstreams.http.v3.HttpProtocolOptions.UseDownstreamHttpConfig.http3_protocol_options:type_name -> envoy.config.core.v3.Http3ProtocolOptions
+	6,  // 11: envoy.extensions.upstreams.http.v3.HttpProtocolOptions.AutoHttpConfig.http_protocol_options:type_name -> envoy.config.core.v3.Http1ProtocolOptions
+	7,  // 12: envoy.extensions.upstreams.http.v3.HttpProtocolOptions.AutoHttpConfig.http2_protocol_options:type_name -> envoy.config.core.v3.Http2ProtocolOptions
+	8,  // 13: envoy.extensions.upstreams.http.v3.HttpProtocolOptions.AutoHttpConfig.http3_protocol_options:type_name -> envoy.config.core.v3.Http3ProtocolOptions
+	9,  // 14: envoy.extensions.upstreams.http.v3.HttpProtocolOptions.AutoHttpConfig.alternate_protocols_cache_options:type_name -> envoy.config.core.v3.AlternateProtocolsCacheOptions
+	15, // [15:15] is the sub-list for method output_type
+	15, // [15:15] is the sub-list for method input_type
+	15, // [15:15] is the sub-list for extension type_name
+	15, // [15:15] is the sub-list for extension extendee
+	0,  // [0:15] is the sub-list for field type_name
+}
+
+func init() { file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_init() }
+func file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_init() {
+	if File_envoy_extensions_upstreams_http_v3_http_protocol_options_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*HttpProtocolOptions); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*HttpProtocolOptions_ExplicitHttpConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*HttpProtocolOptions_UseDownstreamHttpConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*HttpProtocolOptions_AutoHttpConfig); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_msgTypes[0].OneofWrappers = []interface{}{
+		(*HttpProtocolOptions_ExplicitHttpConfig_)(nil),
+		(*HttpProtocolOptions_UseDownstreamProtocolConfig)(nil),
+		(*HttpProtocolOptions_AutoConfig)(nil),
+	}
+	file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_msgTypes[1].OneofWrappers = []interface{}{
+		(*HttpProtocolOptions_ExplicitHttpConfig_HttpProtocolOptions)(nil),
+		(*HttpProtocolOptions_ExplicitHttpConfig_Http2ProtocolOptions)(nil),
+		(*HttpProtocolOptions_ExplicitHttpConfig_Http3ProtocolOptions)(nil),
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   4,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_goTypes,
+		DependencyIndexes: file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_depIdxs,
+		MessageInfos:      file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_msgTypes,
+	}.Build()
+	File_envoy_extensions_upstreams_http_v3_http_protocol_options_proto = out.File
+	file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_rawDesc = nil
+	file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_goTypes = nil
+	file_envoy_extensions_upstreams_http_v3_http_protocol_options_proto_depIdxs = nil
+}
diff --git a/vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/upstreams/http/v3/http_protocol_options.pb.validate.go b/vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/upstreams/http/v3/http_protocol_options.pb.validate.go
new file mode 100644
index 00000000..0e49c886
--- /dev/null
+++ b/vendor/github.com/envoyproxy/go-control-plane/envoy/extensions/upstreams/http/v3/http_protocol_options.pb.validate.go
@@ -0,0 +1,487 @@
+// Code generated by protoc-gen-validate. DO NOT EDIT.
+// source: envoy/extensions/upstreams/http/v3/http_protocol_options.proto
+
+package envoy_extensions_upstreams_http_v3
+
+import (
+	"bytes"
+	"errors"
+	"fmt"
+	"net"
+	"net/mail"
+	"net/url"
+	"regexp"
+	"strings"
+	"time"
+	"unicode/utf8"
+
+	"google.golang.org/protobuf/types/known/anypb"
+)
+
+// ensure the imports are used
+var (
+	_ = bytes.MinRead
+	_ = errors.New("")
+	_ = fmt.Print
+	_ = utf8.UTFMax
+	_ = (*regexp.Regexp)(nil)
+	_ = (*strings.Reader)(nil)
+	_ = net.IPv4len
+	_ = time.Duration(0)
+	_ = (*url.URL)(nil)
+	_ = (*mail.Address)(nil)
+	_ = anypb.Any{}
+)
+
+// Validate checks the field values on HttpProtocolOptions with the rules
+// defined in the proto definition for this message. If any rules are
+// violated, an error is returned.
+func (m *HttpProtocolOptions) Validate() error {
+	if m == nil {
+		return nil
+	}
+
+	if v, ok := interface{}(m.GetCommonHttpProtocolOptions()).(interface{ Validate() error }); ok {
+		if err := v.Validate(); err != nil {
+			return HttpProtocolOptionsValidationError{
+				field:  "CommonHttpProtocolOptions",
+				reason: "embedded message failed validation",
+				cause:  err,
+			}
+		}
+	}
+
+	if v, ok := interface{}(m.GetUpstreamHttpProtocolOptions()).(interface{ Validate() error }); ok {
+		if err := v.Validate(); err != nil {
+			return HttpProtocolOptionsValidationError{
+				field:  "UpstreamHttpProtocolOptions",
+				reason: "embedded message failed validation",
+				cause:  err,
+			}
+		}
+	}
+
+	switch m.UpstreamProtocolOptions.(type) {
+
+	case *HttpProtocolOptions_ExplicitHttpConfig_:
+
+		if v, ok := interface{}(m.GetExplicitHttpConfig()).(interface{ Validate() error }); ok {
+			if err := v.Validate(); err != nil {
+				return HttpProtocolOptionsValidationError{
+					field:  "ExplicitHttpConfig",
+					reason: "embedded message failed validation",
+					cause:  err,
+				}
+			}
+		}
+
+	case *HttpProtocolOptions_UseDownstreamProtocolConfig:
+
+		if v, ok := interface{}(m.GetUseDownstreamProtocolConfig()).(interface{ Validate() error }); ok {
+			if err := v.Validate(); err != nil {
+				return HttpProtocolOptionsValidationError{
+					field:  "UseDownstreamProtocolConfig",
+					reason: "embedded message failed validation",
+					cause:  err,
+				}
+			}
+		}
+
+	case *HttpProtocolOptions_AutoConfig:
+
+		if v, ok := interface{}(m.GetAutoConfig()).(interface{ Validate() error }); ok {
+			if err := v.Validate(); err != nil {
+				return HttpProtocolOptionsValidationError{
+					field:  "AutoConfig",
+					reason: "embedded message failed validation",
+					cause:  err,
+				}
+			}
+		}
+
+	default:
+		return HttpProtocolOptionsValidationError{
+			field:  "UpstreamProtocolOptions",
+			reason: "value is required",
+		}
+
+	}
+
+	return nil
+}
+
+// HttpProtocolOptionsValidationError is the validation error returned by
+// HttpProtocolOptions.Validate if the designated constraints aren't met.
+type HttpProtocolOptionsValidationError struct {
+	field  string
+	reason string
+	cause  error
+	key    bool
+}
+
+// Field function returns field value.
+func (e HttpProtocolOptionsValidationError) Field() string { return e.field }
+
+// Reason function returns reason value.
+func (e HttpProtocolOptionsValidationError) Reason() string { return e.reason }
+
+// Cause function returns cause value.
+func (e HttpProtocolOptionsValidationError) Cause() error { return e.cause }
+
+// Key function returns key value.
+func (e HttpProtocolOptionsValidationError) Key() bool { return e.key }
+
+// ErrorName returns error name.
+func (e HttpProtocolOptionsValidationError) ErrorName() string {
+	return "HttpProtocolOptionsValidationError"
+}
+
+// Error satisfies the builtin error interface
+func (e HttpProtocolOptionsValidationError) Error() string {
+	cause := ""
+	if e.cause != nil {
+		cause = fmt.Sprintf(" | caused by: %v", e.cause)
+	}
+
+	key := ""
+	if e.key {
+		key = "key for "
+	}
+
+	return fmt.Sprintf(
+		"invalid %sHttpProtocolOptions.%s: %s%s",
+		key,
+		e.field,
+		e.reason,
+		cause)
+}
+
+var _ error = HttpProtocolOptionsValidationError{}
+
+var _ interface {
+	Field() string
+	Reason() string
+	Key() bool
+	Cause() error
+	ErrorName() string
+} = HttpProtocolOptionsValidationError{}
+
+// Validate checks the field values on HttpProtocolOptions_ExplicitHttpConfig
+// with the rules defined in the proto definition for this message. If any
+// rules are violated, an error is returned.
+func (m *HttpProtocolOptions_ExplicitHttpConfig) Validate() error {
+	if m == nil {
+		return nil
+	}
+
+	switch m.ProtocolConfig.(type) {
+
+	case *HttpProtocolOptions_ExplicitHttpConfig_HttpProtocolOptions:
+
+		if v, ok := interface{}(m.GetHttpProtocolOptions()).(interface{ Validate() error }); ok {
+			if err := v.Validate(); err != nil {
+				return HttpProtocolOptions_ExplicitHttpConfigValidationError{
+					field:  "HttpProtocolOptions",
+					reason: "embedded message failed validation",
+					cause:  err,
+				}
+			}
+		}
+
+	case *HttpProtocolOptions_ExplicitHttpConfig_Http2ProtocolOptions:
+
+		if v, ok := interface{}(m.GetHttp2ProtocolOptions()).(interface{ Validate() error }); ok {
+			if err := v.Validate(); err != nil {
+				return HttpProtocolOptions_ExplicitHttpConfigValidationError{
+					field:  "Http2ProtocolOptions",
+					reason: "embedded message failed validation",
+					cause:  err,
+				}
+			}
+		}
+
+	case *HttpProtocolOptions_ExplicitHttpConfig_Http3ProtocolOptions:
+
+		if v, ok := interface{}(m.GetHttp3ProtocolOptions()).(interface{ Validate() error }); ok {
+			if err := v.Validate(); err != nil {
+				return HttpProtocolOptions_ExplicitHttpConfigValidationError{
+					field:  "Http3ProtocolOptions",
+					reason: "embedded message failed validation",
+					cause:  err,
+				}
+			}
+		}
+
+	default:
+		return HttpProtocolOptions_ExplicitHttpConfigValidationError{
+			field:  "ProtocolConfig",
+			reason: "value is required",
+		}
+
+	}
+
+	return nil
+}
+
+// HttpProtocolOptions_ExplicitHttpConfigValidationError is the validation
+// error returned by HttpProtocolOptions_ExplicitHttpConfig.Validate if the
+// designated constraints aren't met.
+type HttpProtocolOptions_ExplicitHttpConfigValidationError struct {
+	field  string
+	reason string
+	cause  error
+	key    bool
+}
+
+// Field function returns field value.
+func (e HttpProtocolOptions_ExplicitHttpConfigValidationError) Field() string { return e.field }
+
+// Reason function returns reason value.
+func (e HttpProtocolOptions_ExplicitHttpConfigValidationError) Reason() string { return e.reason }
+
+// Cause function returns cause value.
+func (e HttpProtocolOptions_ExplicitHttpConfigValidationError) Cause() error { return e.cause }
+
+// Key function returns key value.
+func (e HttpProtocolOptions_ExplicitHttpConfigValidationError) Key() bool { return e.key }
+
+// ErrorName returns error name.
+func (e HttpProtocolOptions_ExplicitHttpConfigValidationError) ErrorName() string {
+	return "HttpProtocolOptions_ExplicitHttpConfigValidationError"
+}
+
+// Error satisfies the builtin error interface
+func (e HttpProtocolOptions_ExplicitHttpConfigValidationError) Error() string {
+	cause := ""
+	if e.cause != nil {
+		cause = fmt.Sprintf(" | caused by: %v", e.cause)
+	}
+
+	key := ""
+	if e.key {
+		key = "key for "
+	}
+
+	return fmt.Sprintf(
+		"invalid %sHttpProtocolOptions_ExplicitHttpConfig.%s: %s%s",
+		key,
+		e.field,
+		e.reason,
+		cause)
+}
+
+var _ error = HttpProtocolOptions_ExplicitHttpConfigValidationError{}
+
+var _ interface {
+	Field() string
+	Reason() string
+	Key() bool
+	Cause() error
+	ErrorName() string
+} = HttpProtocolOptions_ExplicitHttpConfigValidationError{}
+
+// Validate checks the field values on
+// HttpProtocolOptions_UseDownstreamHttpConfig with the rules defined in the
+// proto definition for this message. If any rules are violated, an error is returned.
+func (m *HttpProtocolOptions_UseDownstreamHttpConfig) Validate() error {
+	if m == nil {
+		return nil
+	}
+
+	if v, ok := interface{}(m.GetHttpProtocolOptions()).(interface{ Validate() error }); ok {
+		if err := v.Validate(); err != nil {
+			return HttpProtocolOptions_UseDownstreamHttpConfigValidationError{
+				field:  "HttpProtocolOptions",
+				reason: "embedded message failed validation",
+				cause:  err,
+			}
+		}
+	}
+
+	if v, ok := interface{}(m.GetHttp2ProtocolOptions()).(interface{ Validate() error }); ok {
+		if err := v.Validate(); err != nil {
+			return HttpProtocolOptions_UseDownstreamHttpConfigValidationError{
+				field:  "Http2ProtocolOptions",
+				reason: "embedded message failed validation",
+				cause:  err,
+			}
+		}
+	}
+
+	if v, ok := interface{}(m.GetHttp3ProtocolOptions()).(interface{ Validate() error }); ok {
+		if err := v.Validate(); err != nil {
+			return HttpProtocolOptions_UseDownstreamHttpConfigValidationError{
+				field:  "Http3ProtocolOptions",
+				reason: "embedded message failed validation",
+				cause:  err,
+			}
+		}
+	}
+
+	return nil
+}
+
+// HttpProtocolOptions_UseDownstreamHttpConfigValidationError is the validation
+// error returned by HttpProtocolOptions_UseDownstreamHttpConfig.Validate if
+// the designated constraints aren't met.
+type HttpProtocolOptions_UseDownstreamHttpConfigValidationError struct {
+	field  string
+	reason string
+	cause  error
+	key    bool
+}
+
+// Field function returns field value.
+func (e HttpProtocolOptions_UseDownstreamHttpConfigValidationError) Field() string { return e.field }
+
+// Reason function returns reason value.
+func (e HttpProtocolOptions_UseDownstreamHttpConfigValidationError) Reason() string { return e.reason }
+
+// Cause function returns cause value.
+func (e HttpProtocolOptions_UseDownstreamHttpConfigValidationError) Cause() error { return e.cause }
+
+// Key function returns key value.
+func (e HttpProtocolOptions_UseDownstreamHttpConfigValidationError) Key() bool { return e.key }
+
+// ErrorName returns error name.
+func (e HttpProtocolOptions_UseDownstreamHttpConfigValidationError) ErrorName() string {
+	return "HttpProtocolOptions_UseDownstreamHttpConfigValidationError"
+}
+
+// Error satisfies the builtin error interface
+func (e HttpProtocolOptions_UseDownstreamHttpConfigValidationError) Error() string {
+	cause := ""
+	if e.cause != nil {
+		cause = fmt.Sprintf(" | caused by: %v", e.cause)
+	}
+
+	key := ""
+	if e.key {
+		key = "key for "
+	}
+
+	return fmt.Sprintf(
+		"invalid %sHttpProtocolOptions_UseDownstreamHttpConfig.%s: %s%s",
+		key,
+		e.field,
+		e.reason,
+		cause)
+}
+
+var _ error = HttpProtocolOptions_UseDownstreamHttpConfigValidationError{}
+
+var _ interface {
+	Field() string
+	Reason() string
+	Key() bool
+	Cause() error
+	ErrorName() string
+} = HttpProtocolOptions_UseDownstreamHttpConfigValidationError{}
+
+// Validate checks the field values on HttpProtocolOptions_AutoHttpConfig with
+// the rules defined in the proto definition for this message. If any rules
+// are violated, an error is returned.
+func (m *HttpProtocolOptions_AutoHttpConfig) Validate() error {
+	if m == nil {
+		return nil
+	}
+
+	if v, ok := interface{}(m.GetHttpProtocolOptions()).(interface{ Validate() error }); ok {
+		if err := v.Validate(); err != nil {
+			return HttpProtocolOptions_AutoHttpConfigValidationError{
+				field:  "HttpProtocolOptions",
+				reason: "embedded message failed validation",
+				cause:  err,
+			}
+		}
+	}
+
+	if v, ok := interface{}(m.GetHttp2ProtocolOptions()).(interface{ Validate() error }); ok {
+		if err := v.Validate(); err != nil {
+			return HttpProtocolOptions_AutoHttpConfigValidationError{
+				field:  "Http2ProtocolOptions",
+				reason: "embedded message failed validation",
+				cause:  err,
+			}
+		}
+	}
+
+	if v, ok := interface{}(m.GetHttp3ProtocolOptions()).(interface{ Validate() error }); ok {
+		if err := v.Validate(); err != nil {
+			return HttpProtocolOptions_AutoHttpConfigValidationError{
+				field:  "Http3ProtocolOptions",
+				reason: "embedded message failed validation",
+				cause:  err,
+			}
+		}
+	}
+
+	if v, ok := interface{}(m.GetAlternateProtocolsCacheOptions()).(interface{ Validate() error }); ok {
+		if err := v.Validate(); err != nil {
+			return HttpProtocolOptions_AutoHttpConfigValidationError{
+				field:  "AlternateProtocolsCacheOptions",
+				reason: "embedded message failed validation",
+				cause:  err,
+			}
+		}
+	}
+
+	return nil
+}
+
+// HttpProtocolOptions_AutoHttpConfigValidationError is the validation error
+// returned by HttpProtocolOptions_AutoHttpConfig.Validate if the designated
+// constraints aren't met.
+type HttpProtocolOptions_AutoHttpConfigValidationError struct {
+	field  string
+	reason string
+	cause  error
+	key    bool
+}
+
+// Field function returns field value.
+func (e HttpProtocolOptions_AutoHttpConfigValidationError) Field() string { return e.field }
+
+// Reason function returns reason value.
+func (e HttpProtocolOptions_AutoHttpConfigValidationError) Reason() string { return e.reason }
+
+// Cause function returns cause value.
+func (e HttpProtocolOptions_AutoHttpConfigValidationError) Cause() error { return e.cause }
+
+// Key function returns key value.
+func (e HttpProtocolOptions_AutoHttpConfigValidationError) Key() bool { return e.key }
+
+// ErrorName returns error name.
+func (e HttpProtocolOptions_AutoHttpConfigValidationError) ErrorName() string {
+	return "HttpProtocolOptions_AutoHttpConfigValidationError"
+}
+
+// Error satisfies the builtin error interface
+func (e HttpProtocolOptions_AutoHttpConfigValidationError) Error() string {
+	cause := ""
+	if e.cause != nil {
+		cause = fmt.Sprintf(" | caused by: %v", e.cause)
+	}
+
+	key := ""
+	if e.key {
+		key = "key for "
+	}
+
+	return fmt.Sprintf(
+		"invalid %sHttpProtocolOptions_AutoHttpConfig.%s: %s%s",
+		key,
+		e.field,
+		e.reason,
+		cause)
+}
+
+var _ error = HttpProtocolOptions_AutoHttpConfigValidationError{}
+
+var _ interface {
+	Field() string
+	Reason() string
+	Key() bool
+	Cause() error
+	ErrorName() string
+} = HttpProtocolOptions_AutoHttpConfigValidationError{}
diff --git a/vendor/knative.dev/hack/library.sh b/vendor/knative.dev/hack/library.sh
index 0d52ad68..17ce662e 100644
--- a/vendor/knative.dev/hack/library.sh
+++ b/vendor/knative.dev/hack/library.sh
@@ -186,6 +186,32 @@ function wait_until_object_does_not_exist() {
   return 1
 }
 
+# Waits until the given object exists.
+# Parameters: $1 - the kind of the object.
+#             $2 - object's name.
+#             $3 - namespace (optional).
+function wait_until_object_exists() {
+  local KUBECTL_ARGS="get $1 $2"
+  local DESCRIPTION="$1 $2"
+
+  if [[ -n $3 ]]; then
+    KUBECTL_ARGS="get -n $3 $1 $2"
+    DESCRIPTION="$1 $3/$2"
+  fi
+  echo -n "Waiting until ${DESCRIPTION} exists"
+  for i in {1..150}; do  # timeout after 5 minutes
+    if kubectl ${KUBECTL_ARGS} > /dev/null 2>&1; then
+      echo -e "\n${DESCRIPTION} exists"
+      return 0
+    fi
+    echo -n "."
+    sleep 2
+  done
+  echo -e "\n\nERROR: timeout waiting for ${DESCRIPTION} to exist"
+  kubectl ${KUBECTL_ARGS}
+  return 1
+}
+
 # Waits until all pods are running in the given namespace.
 # This function handles some edge cases that `kubectl wait` does not support,
 # and it provides nice debug info on the state of the pod if it failed,
@@ -771,6 +797,7 @@ function current_branch() {
   # Get the branch name from Prow's env var, see https://github.com/kubernetes/test-infra/blob/master/prow/jobs.md.
   # Otherwise, try getting the current branch from git.
   (( IS_PROW )) && branch_name="${PULL_BASE_REF:-}"
+  [[ -z "${branch_name}" ]] && branch_name="${GITHUB_BASE_REF:-}"
   [[ -z "${branch_name}" ]] && branch_name="$(git rev-parse --abbrev-ref HEAD)"
   echo "${branch_name}"
 }
@@ -835,30 +862,56 @@ function shellcheck_new_files() {
   fi
 }
 
+# Note: if using Github checkout action please ensure you fetch all tags prior to calling
+# this function
+#
+# ie.
+# - uses: actions/checkout@v2
+#   with:
+#     fetch-depth: 0
+#
+# See: https://github.com/actions/checkout#fetch-all-history-for-all-tags-and-branches
 function latest_version() {
   local branch_name="$(current_branch)"
 
-  if [ "$branch_name" = "master" ] || [ "$branch_name" = "main" ]; then
-    # For main branch, simply use git tag without major version, this will work even
-    # if the release tag is not in the main
+  # Use the latest release for main
+  if [[ "$branch_name" == "main" ]] || [[ "$branch_name" == "master" ]]; then
     git tag -l "*$(git tag -l "*v[0-9]*" | cut -d '-' -f2 | sort -r --version-sort | head -n1)*"
+    return
+  fi
+
+  # Ideally we shouldn't need to treat release branches differently but
+  # there are scenarios where git describe will return newer tags than
+  # the ones on the current branch
+  #
+  # ie. create a PR pulling commits from 0.24 into a release-0.23 branch
+  if [[ "$branch_name" == "release-"* ]]; then
+    # Infer major, minor version from the branch name
+    local tag="${branch_name##release-}"
   else
-    ## Assumption here is we are on a release branch
-    local major_minor="${branch_name##release-}"
-    local major_version="$(major_version $major_minor)"
-    local minor_version="$(minor_version $major_minor)"
+    # Nearest tag with the `knative-` prefix
+    local tag=$(git describe --abbrev=0 --match "knative-v[0-9]*")
 
-    # Hardcode the jump back from 1.0
-    if [ "$major_version" = "1" ] && [ "$minor_version" == 0 ]; then
-      local tag='v0.26*'
-    else
-      # Adjust the minor down by one
-      local tag="*v$major_version.$(( minor_version - 1 ))*"
-    fi
+    # Fallback to older tag scheme vX.Y.Z
+    [[ -z "${tag}" ]] && tag=$(git describe --abbrev=0 --match "v[0-9]*")
+
+    # Drop the prefix
+    tag="${tag##knative-}"
+  fi
+
+  local major_version="$(major_version ${tag})"
+  local minor_version="$(minor_version ${tag})"
 
-    # Get the latest patch release for the major minor
-    git tag -l "${tag}*" | sort -r --version-sort | head -n1
+  # Hardcode the jump back from 1.0
+  if [ "$major_version" = "1" ] && [ "$minor_version" = "0" ]; then
+    local tag_filter='v0.26*'
+  else
+    # Adjust the minor down by one
+    local tag_filter="*v$major_version.$(( minor_version - 1 ))*"
   fi
+
+  # Get the latest patch release for the major minor
+  git tag -l "${tag_filter}" | sort -r --version-sort | head -n1
 }
 
 # Initializations that depend on previous functions.
diff --git a/vendor/knative.dev/networking/config/certificate.yaml b/vendor/knative.dev/networking/config/certificate.yaml
index 1e524817..d3a710ba 100644
--- a/vendor/knative.dev/networking/config/certificate.yaml
+++ b/vendor/knative.dev/networking/config/certificate.yaml
@@ -17,6 +17,8 @@ kind: CustomResourceDefinition
 metadata:
   name: certificates.networking.internal.knative.dev
   labels:
+    app.kubernetes.io/version: devel
+    app.kubernetes.io/part-of: knative-serving
     serving.knative.dev/release: devel
     knative.dev/crd-install: "true"
 spec:
diff --git a/vendor/knative.dev/networking/config/config-network.yaml b/vendor/knative.dev/networking/config/config-network.yaml
index e5baf6fc..30dff7d0 100644
--- a/vendor/knative.dev/networking/config/config-network.yaml
+++ b/vendor/knative.dev/networking/config/config-network.yaml
@@ -18,6 +18,8 @@ metadata:
   name: config-network
   namespace: knative-serving
   labels:
+    app.kubernetes.io/version: devel
+    app.kubernetes.io/part-of: knative-serving
     serving.knative.dev/release: devel
   annotations:
     knative.dev/example-checksum: "6e2033e0"
diff --git a/vendor/knative.dev/networking/config/domain-claim.yaml b/vendor/knative.dev/networking/config/domain-claim.yaml
index 03219cc7..cbda4155 100644
--- a/vendor/knative.dev/networking/config/domain-claim.yaml
+++ b/vendor/knative.dev/networking/config/domain-claim.yaml
@@ -17,6 +17,8 @@ kind: CustomResourceDefinition
 metadata:
   name: clusterdomainclaims.networking.internal.knative.dev
   labels:
+    app.kubernetes.io/version: devel
+    app.kubernetes.io/part-of: knative-serving
     serving.knative.dev/release: devel
     knative.dev/crd-install: "true"
 spec:
diff --git a/vendor/knative.dev/networking/config/domain.yaml b/vendor/knative.dev/networking/config/domain.yaml
index b8824aba..6b584c17 100644
--- a/vendor/knative.dev/networking/config/domain.yaml
+++ b/vendor/knative.dev/networking/config/domain.yaml
@@ -17,6 +17,8 @@ kind: CustomResourceDefinition
 metadata:
   name: domains.networking.internal.knative.dev
   labels:
+    app.kubernetes.io/version: devel
+    app.kubernetes.io/part-of: knative-serving
     serving.knative.dev/release: devel
     knative.dev/crd-install: "true"
 spec:
diff --git a/vendor/knative.dev/networking/config/ingress.yaml b/vendor/knative.dev/networking/config/ingress.yaml
index 97edc647..010abc7c 100644
--- a/vendor/knative.dev/networking/config/ingress.yaml
+++ b/vendor/knative.dev/networking/config/ingress.yaml
@@ -17,6 +17,8 @@ kind: CustomResourceDefinition
 metadata:
   name: ingresses.networking.internal.knative.dev
   labels:
+    app.kubernetes.io/version: devel
+    app.kubernetes.io/part-of: knative-serving
     serving.knative.dev/release: devel
     knative.dev/crd-install: "true"
 spec:
diff --git a/vendor/knative.dev/networking/config/realm.yaml b/vendor/knative.dev/networking/config/realm.yaml
index 9c4b3077..57b7883c 100644
--- a/vendor/knative.dev/networking/config/realm.yaml
+++ b/vendor/knative.dev/networking/config/realm.yaml
@@ -17,6 +17,8 @@ kind: CustomResourceDefinition
 metadata:
   name: realms.networking.internal.knative.dev
   labels:
+    app.kubernetes.io/version: devel
+    app.kubernetes.io/part-of: knative-serving
     serving.knative.dev/release: devel
     knative.dev/crd-install: "true"
 spec:
diff --git a/vendor/knative.dev/networking/config/serverlessservice.yaml b/vendor/knative.dev/networking/config/serverlessservice.yaml
index cfb327f0..1171db0f 100644
--- a/vendor/knative.dev/networking/config/serverlessservice.yaml
+++ b/vendor/knative.dev/networking/config/serverlessservice.yaml
@@ -17,6 +17,8 @@ kind: CustomResourceDefinition
 metadata:
   name: serverlessservices.networking.internal.knative.dev
   labels:
+    app.kubernetes.io/version: devel
+    app.kubernetes.io/part-of: knative-serving
     serving.knative.dev/release: devel
     knative.dev/crd-install: "true"
 spec:
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 78c221c9..a5a5cda8 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -48,6 +48,7 @@ github.com/envoyproxy/go-control-plane/envoy/extensions/access_loggers/file/v3
 github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/ext_authz/v3
 github.com/envoyproxy/go-control-plane/envoy/extensions/filters/network/http_connection_manager/v3
 github.com/envoyproxy/go-control-plane/envoy/extensions/transport_sockets/tls/v3
+github.com/envoyproxy/go-control-plane/envoy/extensions/upstreams/http/v3
 github.com/envoyproxy/go-control-plane/envoy/service/auth/v2
 github.com/envoyproxy/go-control-plane/envoy/service/auth/v3
 github.com/envoyproxy/go-control-plane/envoy/service/cluster/v3
@@ -829,10 +830,10 @@ k8s.io/utils/buffer
 k8s.io/utils/integer
 k8s.io/utils/pointer
 k8s.io/utils/trace
-# knative.dev/hack v0.0.0-20211104075903-0f69979bbb7d
+# knative.dev/hack v0.0.0-20211108170701-96aac1c30be3
 ## explicit
 knative.dev/hack
-# knative.dev/networking v0.0.0-20211104064801-6871f98f7b4d
+# knative.dev/networking v0.0.0-20211109014842-5d4dc7ffa17b
 ## explicit
 knative.dev/networking/config
 knative.dev/networking/pkg
@@ -865,7 +866,7 @@ knative.dev/networking/test/test_images/runtime/handlers
 knative.dev/networking/test/test_images/timeout
 knative.dev/networking/test/test_images/wsserver
 knative.dev/networking/test/types
-# knative.dev/pkg v0.0.0-20211104101302-51b9e7f161b4
+# knative.dev/pkg v0.0.0-20211108064904-3cc697a3cb09
 ## explicit
 knative.dev/pkg/apis
 knative.dev/pkg/apis/duck


Test patch:
diff --git a/.github/workflows/kind-e2e.yaml b/.github/workflows/kind-e2e.yaml
index d91d6250..a9fe7570 100644
--- a/.github/workflows/kind-e2e.yaml
+++ b/.github/workflows/kind-e2e.yaml
@@ -25,9 +25,9 @@ jobs:
         - v1.22.0
 
         gateway:
-        - docker.io/maistra/proxyv2-ubi8:2.0.2
+        - quay.io/maistra/proxyv2-ubi8:2.1.0
         - docker.io/envoyproxy/envoy:v1.17-latest
-        - docker.io/envoyproxy/envoy:v1.16-latest
+        - docker.io/envoyproxy/envoy:v1.18-latest
 
         # Map between K8s and KinD versions.
         # This is attempting to make it a bit clearer what's being tested.
diff --git a/pkg/envoy/api/cluster_test.go b/pkg/envoy/api/cluster_test.go
index 06439c91..626e9a3b 100644
--- a/pkg/envoy/api/cluster_test.go
+++ b/pkg/envoy/api/cluster_test.go
@@ -37,13 +37,11 @@ func TestNewCluster(t *testing.T) {
 	// With HTTP2
 	c := NewCluster(name, connectTimeout, endpoints, true, v3Cluster.Cluster_STATIC)
 	assert.Equal(t, c.GetConnectTimeout().Seconds, int64(connectTimeout.Seconds()))
-	//nolint: staticcheck // TODO: GetHttp2ProtocolOptions() is deprecated.
-	assert.Assert(t, c.GetHttp2ProtocolOptions() != nil)
+	assert.Assert(t, c.TypedExtensionProtocolOptions["envoy.extensions.upstreams.http.v3.HttpProtocolOptions"] != nil)
 	assert.Equal(t, c.GetName(), name)
 	assert.DeepEqual(t, c.LoadAssignment.Endpoints[0].LbEndpoints, endpoints, protocmp.Transform())
 
 	// Without HTTP2
 	c = NewCluster(name, connectTimeout, endpoints, false, v3Cluster.Cluster_STATIC)
-	//nolint: staticcheck // TODO: GetHttp2ProtocolOptions() is deprecated.
-	assert.Assert(t, c.GetHttp2ProtocolOptions() == nil)
+	assert.Assert(t, c.TypedExtensionProtocolOptions["envoy.extensions.upstreams.http.v3.HttpProtocolOptions"] == nil)
 }
diff --git a/test/e2e-upgrade-kind.sh b/test/e2e-upgrade-kind.sh
index c08cd9e5..510999b3 100755
--- a/test/e2e-upgrade-kind.sh
+++ b/test/e2e-upgrade-kind.sh
@@ -23,7 +23,7 @@ source $(dirname $0)/e2e-common.sh
 KOURIER_GATEWAY_NAMESPACE=kourier-system
 KOURIER_CONTROL_NAMESPACE=knative-serving
 TEST_NAMESPACE=serving-tests
-LATEST_RELEASE_VERSION="knative-v1.0.0"
+LATEST_RELEASE_VERSION=$(latest_version)
 
 $(dirname $0)/upload-test-images.sh