Skip to content
Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 85 additions & 0 deletions bazel/external/quiche.BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
licenses(["notice"]) # Apache 2

# QUICHE is Google's implementation of QUIC and related protocols. It is the
# same code used in Chromium and Google's servers, but packaged in a form that
# is intended to be easier to incorporate into third-party projects.
#
# QUICHE code falls into three groups:
# 1. Platform-independent code. Most QUICHE code is in this category.
# 2. APIs and type aliases to platform-dependent code/types, referenced by code
# in group 1. This group is called the "Platform API".
# 3. Definitions of types declared in group 2. This group is called the
# "Platform impl", and must be provided by the codebase that embeds QUICHE.
#
# Concretely, header files in group 2 (the Platform API) #include header and
# source files in group 3 (the Platform impl). Unfortunately, QUICHE does not
# yet provide a built-in way to customize this dependency, e.g. to override the
# directory or namespace in which Platform impl types are defined. Hence the
# gross hacks in this file.
#
# Transformations to QUICHE tarball performed here:
# - Move subtree under quiche/ base dir, for clarity in #include statements.
# - Rewrite include directives for platform/impl files.
#
# The mechanics of this will change as QUICHE evolves, supplies its own Bazel
# buildfiles, and provides a built-in way to override platform impl directory
# location. However, the end result (QUICHE files placed under
# quiche/{http2,quic,spdy}/, with the Envoy-specific implementation of the
# QUICHE platform APIs in //source/extensions/quic_listeners/quiche/platform/,
# should remain largely the same.

src_files = glob([
"**/*.h",
"**/*.c",
"**/*.cc",
"**/*.inc",
"**/*.proto",
])

# TODO(mpwarres): remove use of sed once QUICHE provides a cleaner way to
# override platform impl directory location.
genrule(
name = "quiche_files",
srcs = src_files,
outs = ["quiche/" + f for f in src_files],
cmd = "\n".join(
["sed -e '/^#include/ s!net/[^/]*/platform/impl/!extensions/quic_listeners/quiche/platform/!' $(location %s) > $(location :%s)" % (
f,
"quiche/" + f,
) for f in src_files],
),
visibility = ["//visibility:private"],
)

# Note: in dependencies below that reference Envoy build targets in the main
# repository (particularly for QUICHE platform libs), use '@' instead of
# '@envoy' as the repository identifier. Otherwise, Bazel generates duplicate
# object files for the same build target (one under
# bazel-out/.../bin/external/, and one under bazel-out/.../bin/), eventually
# resulting in link-time errors.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good find!

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See latest top-level comment for an explanation of what's up with TSAN/ASAN. Basically it's because they build Envoy as an external dependency of the filter example.


cc_library(
name = "http2_platform",
hdrs = [
"quiche/http2/platform/api/http2_arraysize.h",
"quiche/http2/platform/api/http2_bug_tracker.h",
"quiche/http2/platform/api/http2_containers.h",
"quiche/http2/platform/api/http2_estimate_memory_usage.h",
"quiche/http2/platform/api/http2_export.h",
"quiche/http2/platform/api/http2_flag_utils.h",
"quiche/http2/platform/api/http2_flags.h",
"quiche/http2/platform/api/http2_macros.h",
"quiche/http2/platform/api/http2_mock_log.h",
"quiche/http2/platform/api/http2_optional.h",
"quiche/http2/platform/api/http2_ptr_util.h",
"quiche/http2/platform/api/http2_reconstruct_object.h",
"quiche/http2/platform/api/http2_string.h",
"quiche/http2/platform/api/http2_string_piece.h",
"quiche/http2/platform/api/http2_string_utils.h",
"quiche/http2/platform/api/http2_test_helpers.h",
],
visibility = ["//visibility:public"],
deps = [
"@//source/extensions/quic_listeners/quiche/platform:http2_platform_impl_lib",
],
)
14 changes: 14 additions & 0 deletions bazel/repositories.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,7 @@ def envoy_dependencies(path = "@envoy_deps//", skip_targets = []):
_com_github_tencent_rapidjson()
_com_google_googletest()
_com_google_protobuf()
_com_googlesource_quiche()

# Used for bundling gcovr into a relocatable .par file.
_repository_impl("subpar")
Expand Down Expand Up @@ -539,6 +540,19 @@ def _com_google_protobuf():
actual = "@com_google_protobuf//util/python:python_headers",
)

def _com_googlesource_quiche():
_repository_impl(
name = "com_googlesource_quiche",
build_file = "@envoy//bazel/external:quiche.BUILD",
)

# TODO: add bindings for quiche_quic_platform and quiche_spdy_platform once
# those build targets have been defined.
native.bind(
name = "quiche_http2_platform",
actual = "@com_googlesource_quiche//:http2_platform",
)

def _com_github_grpc_grpc():
_repository_impl("com_github_grpc_grpc")

Expand Down
5 changes: 5 additions & 0 deletions bazel/repository_locations.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -191,4 +191,9 @@ REPOSITORY_LOCATIONS = dict(
strip_prefix = "subpar-1.3.0",
urls = ["https://github.com/google/subpar/archive/1.3.0.tar.gz"],
),
com_googlesource_quiche = dict(
# Static snapshot of https://quiche.googlesource.com/quiche/+archive/c9b2cecd1d005893114a03c101532017ddfa12cb.tar.gz
sha256 = "c8faea835132103d574cc2769a58e244bee3de02669471330a174f2ffae6fcc3",
urls = ["https://storage.googleapis.com/quiche-envoy-integration/c9b2cecd1d005893114a03c101532017ddfa12cb.tar.gz"],
),
)
18 changes: 18 additions & 0 deletions source/extensions/quic_listeners/quiche/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
licenses(["notice"]) # Apache 2

load(
"//bazel:envoy_build_system.bzl",
"envoy_cc_library",
"envoy_package",
)

envoy_package()

# Placeholder library to verify/illustrate depending on a QUICHE build target.
# TODO(mpwarres): remove once real build rules added here.
envoy_cc_library(
name = "dummy_lib",
Comment thread
mpwarres marked this conversation as resolved.
srcs = ["dummy.cc"],
hdrs = ["dummy.h"],
external_deps = ["quiche_http2_platform"],
)
17 changes: 17 additions & 0 deletions source/extensions/quic_listeners/quiche/dummy.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#include "extensions/quic_listeners/quiche/dummy.h"

using http2::Http2String;

namespace Envoy {
namespace Extensions {
namespace QuicListeners {
namespace Quiche {

// Placeholder use of a QUICHE platform type.
// TODO(mpwarres): remove once real uses of QUICHE platform added.
Http2String moreCowbell(const Http2String& s) { return s + " cowbell"; }

} // namespace Quiche
} // namespace QuicListeners
} // namespace Extensions
} // namespace Envoy
17 changes: 17 additions & 0 deletions source/extensions/quic_listeners/quiche/dummy.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#pragma once

#include "quiche/http2/platform/api/http2_string.h"

namespace Envoy {
namespace Extensions {
namespace QuicListeners {
namespace Quiche {

// Placeholder use of a QUICHE platform type.
// TODO(mpwarres): remove once real uses of QUICHE platform added.
http2::Http2String moreCowbell(const http2::Http2String& s);

} // namespace Quiche
} // namespace QuicListeners
} // namespace Extensions
} // namespace Envoy
40 changes: 40 additions & 0 deletions source/extensions/quic_listeners/quiche/platform/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
licenses(["notice"]) # Apache 2

load(
"//bazel:envoy_build_system.bzl",
"envoy_cc_library",
"envoy_package",
)

envoy_package()

# TODO: add build targets for quic_platform_impl_lib and spdy_platform_impl_lib,
# as _impl.* files for those are added.

envoy_cc_library(
name = "http2_platform_impl_lib",
hdrs = [
"http2_arraysize_impl.h",
Comment thread
mpwarres marked this conversation as resolved.
"http2_bug_tracker_impl.h",
"http2_containers_impl.h",
"http2_estimate_memory_usage_impl.h",
"http2_export_impl.h",
"http2_flag_utils_impl.h",
"http2_flags_impl.h",
"http2_macros_impl.h",
"http2_mock_log_impl.h",
"http2_optional_impl.h",
"http2_ptr_util_impl.h",
"http2_reconstruct_object_impl.h",
"http2_string_impl.h",
"http2_string_piece_impl.h",
"http2_string_utils_impl.h",
"http2_test_helpers_impl.h",
],
external_deps = [
"abseil_base",
"abseil_optional",
],
visibility = ["//visibility:public"],
deps = ["//source/common/common:assert_lib"],
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#pragma once

#include "absl/base/macros.h"

// NOLINT(namespace-envoy)

#define HTTP2_ARRAYSIZE_IMPL(x) ABSL_ARRAYSIZE(x)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#pragma once

// NOLINT(namespace-envoy)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you add comments to all the platform impl files just after the NOLINE explaining these are part of the QUICHE platform implementation, these are not consumed directly in Envoy and should not be referenced directly by any Envoy code, etc. This would make the style differences below more palatable. Thanks :)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.


// TODO: implement

#define HTTP2_BUG_IMPL 0
#define HTTP2_BUG_IF_IMPL 0
#define FLAGS_http2_always_log_bugs_for_tests_IMPL 0
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#pragma once

#include <deque>

// NOLINT(namespace-envoy)

namespace http2 {

template <typename T> using Http2DequeImpl = std::deque<T>;

} // namespace http2
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#pragma once

#include <cstddef>

// NOLINT(namespace-envoy)

namespace http2 {

template <class T> size_t Http2EstimateMemoryUsageImpl(const T& /*object*/) { return 0; }

} // namespace http2
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#pragma once

// NOLINT(namespace-envoy)

#define HTTP2_EXPORT
#define HTTP2_EXPORT_PRIVATE
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#pragma once

// NOLINT(namespace-envoy)

#define HTTP2_RELOADABLE_FLAG_COUNT_IMPL(flag) \
do { \
} while (0)
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#pragma once

// NOLINT(namespace-envoy)

// TODO: implement

#define GetHttp2ReloadableFlagImpl(flag) 0
#define SetHttp2ReloadableFlagImpl(flag, value) 0
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#pragma once

#include "common/common/assert.h"

#include "absl/base/macros.h"

// NOLINT(namespace-envoy)

#define HTTP2_FALLTHROUGH_IMPL ABSL_FALLTHROUGH_INTENDED
#define HTTP2_UNREACHABLE_IMPL() NOT_REACHED_GCOVR_EXCL_LINE
#define HTTP2_DIE_IF_NULL_IMPL(ptr) ABSL_DIE_IF_NULL(ptr)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#pragma once

// NOLINT(namespace-envoy)

// TODO: implement

#define CREATE_HTTP2_MOCK_LOG_IMPL(log) 0
#define EXPECT_HTTP2_LOG_CALL_IMPL(log) 0
#define EXPECT_HTTP2_LOG_CALL_CONTAINS_IMPL(log, level, content) 0
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#pragma once

#include "absl/types/optional.h"

// NOLINT(namespace-envoy)

namespace http2 {

template <typename T> using Http2OptionalImpl = absl::optional<T>;

} // namespace http2
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#pragma once

#include <memory>
#include <utility>

// NOLINT(namespace-envoy)

namespace http2 {

template <typename T, typename... Args> std::unique_ptr<T> Http2MakeUniqueImpl(Args&&... args) {
return std::make_unique<T>(std::forward<Args>(args)...);
}

} // namespace http2
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#pragma once

#include <cstddef>

// NOLINT(namespace-envoy)

// TODO: implement

namespace http2 {
Comment thread
mpwarres marked this conversation as resolved.
namespace test {

class Http2Random;

void MarkMemoryUninitialized(void* /*ptr*/, size_t /*num_bytes*/) {}
void MarkMemoryUninitialized(void* /*ptr*/, size_t /*num_bytes*/, Http2Random* /*rng*/) {}

template <class T> void MarkObjectUninitialized(T* /*ptr*/) {}
template <class T> void MarkObjectUninitialized(T* /*ptr*/, Http2Random* /*rng*/) {}

template <class T, size_t N> void MarkArrayUninitialized(T (&/*array*/)[N]) {}
template <class T, size_t N> void MarkArrayUninitialized(T (&/*array*/)[N], Http2Random* /*rng*/) {}

template <class T, class... Args>
void Http2ReconstructObjectImpl(T* /*ptr*/, Http2Random* /*rng*/, Args&&... /*args*/) {}
template <class T> void Http2DefaultReconstructObjectImpl(T* /*ptr*/, Http2Random* /*rng*/) {}

} // namespace test
} // namespace http2
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#pragma once

#include <string>

// NOLINT(namespace-envoy)

namespace http2 {

using Http2StringImpl = std::string;

} // namespace http2
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#pragma once

#include "absl/strings/string_view.h"

// NOLINT(namespace-envoy)

namespace http2 {

using Http2StringPieceImpl = absl::string_view;

} // namespace http2
Loading