Skip to content

Commit

Permalink
ABI functions return WasmResult. (envoyproxy#133)
Browse files Browse the repository at this point in the history
* ABI functions return WasmResult.

Signed-off-by: John Plevyak <jplevyak@gmail.com>
  • Loading branch information
jplevyak authored Aug 20, 2019
2 parents 4d1a35b + 8b62708 commit be78f8a
Show file tree
Hide file tree
Showing 66 changed files with 15,430 additions and 14,954 deletions.
15 changes: 10 additions & 5 deletions api/wasm/cpp/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,16 @@ load(
envoy_package()

envoy_cc_library(
name = "intrinsics_hdr",
name = "api_lib",
hdrs = [
"proxy_wasm_enums.h",
"proxy_wasm_externs.h",
"proxy_wasm_impl.h",
"proxy_wasm_intrinsics.h",
"proxy_wasm_api.h",
],
)

envoy_cc_library(
name = "shared_lib",
hdrs = [
"proxy_wasm_result.h",
"proxy_wasm_metadata.h",
],
)
2 changes: 1 addition & 1 deletion api/wasm/cpp/Makefile.base
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ else
CPP_CONTEXT_LIB = ${CPP_API}/proxy_wasm_intrinsics.cc
endif

%.wasm %.wat: %.cc ${CPP_API}/proxy_wasm_intrinsics.h ${CPP_API}/proxy_wasm_enums.h ${CPP_API}/proxy_wasm_externs.h ${CPP_API}/proxy_wasm_impl.h ${CPP_API}/proxy_wasm_intrinsics.js ${CPP_CONTEXT_LIB}
%.wasm %.wat: %.cc ${CPP_API}/proxy_wasm_intrinsics.h ${CPP_API}/proxy_wasm_enums.h ${CPP_API}/proxy_wasm_externs.h ${CPP_API}/proxy_wasm_api.h ${CPP_API}/proxy_wasm_intrinsics.js ${CPP_CONTEXT_LIB}
em++ -s WASM=1 -s BINARYEN_TRAP_MODE='clamp' -s LEGALIZE_JS_FFI=0 -s EMIT_EMSCRIPTEN_METADATA=1 --std=c++17 -O3 -g3 -I${CPP_API} -I/usr/local/include --js-library ${CPP_API}/proxy_wasm_intrinsics.js $*.cc ${CPP_API}/proxy_wasm_intrinsics.pb.cc ${CPP_CONTEXT_LIB} ${CPP_API}/libprotobuf.bc -o $*.js
wavm-disas $*.wasm $*.wat
rm -f $*.js $*.wast
Expand Down
2 changes: 1 addition & 1 deletion api/wasm/cpp/Makefile.base_lite
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ else
CPP_CONTEXT_LIB = ${CPP_API}/proxy_wasm_intrinsics.cc
endif

%.wasm %.wat: %.cc ${CPP_API}/proxy_wasm_intrinsics.h ${CPP_API}/proxy_wasm_enums.h ${CPP_API}/proxy_wasm_externs.h ${CPP_API}/proxy_wasm_impl.h ${CPP_API}/proxy_wasm_intrinsics.js ${CPP_CONTEXT_LIB}
%.wasm %.wat: %.cc ${CPP_API}/proxy_wasm_intrinsics.h ${CPP_API}/proxy_wasm_enums.h ${CPP_API}/proxy_wasm_externs.h ${CPP_API}/proxy_wasm_api.h ${CPP_API}/proxy_wasm_intrinsics.js ${CPP_CONTEXT_LIB}
em++ -s WASM=1 -s BINARYEN_TRAP_MODE='clamp' -s LEGALIZE_JS_FFI=0 -s EMIT_EMSCRIPTEN_METADATA=1 --std=c++17 -O3 -g3 -DEMSCRIPTEN_PROTOBUF_LITE=1 -I${CPP_API} -I${CPP_API}/google/protobuf -I/usr/local/include --js-library ${CPP_API}/proxy_wasm_intrinsics.js $*.cc ${CPP_API}/proxy_wasm_intrinsics_lite.pb.cc ${CPP_API}/struct_lite.pb.cc ${CPP_CONTEXT_LIB} ${CPP_API}/libprotobuf-lite.bc -o $*.js
wavm-disas $*.wasm $*.wat
rm -f $*.js $*.wast
Expand Down
386 changes: 209 additions & 177 deletions api/wasm/cpp/proxy_wasm_impl.h → api/wasm/cpp/proxy_wasm_api.h

Large diffs are not rendered by default.

60 changes: 7 additions & 53 deletions api/wasm/cpp/proxy_wasm_enums.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,50 +5,17 @@

#pragma once

enum class LogLevel : EnumType { trace, debug, info, warn, error, critical };
enum class FilterHeadersStatus : EnumType { Continue = 0, StopIteration = 1 };
enum class FilterMetadataStatus : EnumType { Continue = 0 };
enum class FilterTrailersStatus : EnumType { Continue = 0, StopIteration = 1 };
enum class FilterDataStatus : EnumType {
enum class LogLevel : int32_t { trace, debug, info, warn, error, critical };
enum class FilterHeadersStatus : int32_t { Continue = 0, StopIteration = 1 };
enum class FilterMetadataStatus : int32_t { Continue = 0 };
enum class FilterTrailersStatus : int32_t { Continue = 0, StopIteration = 1 };
enum class FilterDataStatus : int32_t {
Continue = 0,
StopIterationAndBuffer = 1,
StopIterationAndWatermark = 2,
StopIterationNoBuffer = 3
};
enum class MetadataType : EnumType {
Request = 0,
Response = 1,
RequestRoute = 2, // Immutable
ResponseRoute = 3, // Immutable
Log = 4, // Immutable
Node = 5, // Immutable
Listener = 6, // Immutable
Cluster = 7, // Immutable
Expression = 8, // The key is a string expression. Only proxy_getMetadata().
};
/*
Expression and their types:
request.protocol : string
response.protocol : string
request.destination_port : int32
response.destination_port : int32
request.response_code : int32
response.response_code : int32
upstream.tls_version : string
downstream.tsl_version : string
plugin.direction : int32 (enum PluginDirection)
*/
enum class HeaderMapType : EnumType {
RequestHeaders = 0, // During the onLog callback these are immutable
RequestTrailers = 1, // During the onLog callback these are immutable
ResponseHeaders = 2, // During the onLog callback these are immutable
ResponseTrailers = 3, // During the onLog callback these are immutable
GrpcCreateInitialMetadata = 4,
GrpcReceiveInitialMetadata = 5, // Immutable
GrpcReceiveTrailingMetadata = 6, // Immutable
};
enum class GrpcStatus : EnumType {
enum class GrpcStatus : int32_t {
Ok = 0,
Canceled = 1,
Unknown = 2,
Expand All @@ -69,21 +36,8 @@ enum class GrpcStatus : EnumType {
MaximumValid = Unauthenticated,
InvalidCode = -1
};
enum class MetricType : EnumType {
enum class MetricType : int32_t {
Counter = 0,
Gauge = 1,
Histogram = 2,
};
enum class MetadataResult : EnumType {
Ok = 0,
StructNotFound = 1,
FieldNotFound = 2,
SerializationFailure = 3,
BadType = 4,
ParseFailure = 5,
};
enum class PluginDirection : EnumType {
Unspecified = 0,
Inbound = 1,
Outbound = 2,
};
82 changes: 42 additions & 40 deletions api/wasm/cpp/proxy_wasm_externs.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,67 +52,71 @@
//

// Logging
extern "C" void proxy_log(LogLevel level, const char* logMessage, size_t messageSize);
extern "C" WasmResult proxy_log(LogLevel level, const char* logMessage, size_t messageSize);

// Timer (must be called from a root context, e.g. onStart, onTick).
extern "C" void proxy_setTickPeriodMilliseconds(uint32_t millisecond);
extern "C" WasmResult proxy_setTickPeriodMilliseconds(uint32_t millisecond);

// Time
extern "C" uint64_t proxy_getCurrentTimeNanoseconds();
extern "C" WasmResult proxy_getCurrentTimeNanoseconds(uint64_t* nanoseconds);

// Metadata
extern "C" uint32_t proxy_getMetadata(MetadataType type, const char* key_ptr, size_t key_size,
extern "C" WasmResult proxy_getMetadata(MetadataType type, const char* key_ptr, size_t key_size,
const char** value_ptr_ptr, size_t* value_size_ptr);
extern "C" uint32_t proxy_setMetadata(MetadataType type, const char* key_ptr, size_t key_size,
extern "C" WasmResult proxy_setMetadata(MetadataType type, const char* key_ptr, size_t key_size,
const char* value_ptr, size_t value_size);
extern "C" uint32_t proxy_getMetadataPairs(MetadataType type, const char** value_ptr,
extern "C" WasmResult proxy_getMetadataPairs(MetadataType type, const char** value_ptr,
size_t* value_size);
extern "C" uint32_t proxy_getMetadataStruct(MetadataType type, const char* name_ptr, size_t name_size,
extern "C" WasmResult proxy_getMetadataStruct(MetadataType type, const char* name_ptr, size_t name_size,
const char** value_ptr_ptr, size_t* value_size_ptr);
extern "C" uint32_t proxy_setMetadataStruct(MetadataType type, const char* name_ptr, size_t name_size,
extern "C" WasmResult proxy_setMetadataStruct(MetadataType type, const char* name_ptr, size_t name_size,
const char* value_ptr, size_t value_size);

// Continue/Reply/Route
extern "C" void proxy_continueRequest();
extern "C" void proxy_continueResponse();
extern "C" void proxy_sendLocalResponse(uint32_t response_code,
extern "C" WasmResult proxy_continueRequest();
extern "C" WasmResult proxy_continueResponse();
extern "C" WasmResult proxy_sendLocalResponse(uint32_t response_code,
const char* response_code_details_ptr, size_t response_code_details_size,
const char* body_ptr, size_t body_size,
const char* additional_response_header_pairs_ptr, size_t additional_response_header_pairs_size,
uint32_t grpc_status);
extern "C" void proxy_clearRouteCache();
extern "C" WasmResult proxy_clearRouteCache();

// SharedData
extern "C" void proxy_getSharedData(const char* key_ptr, size_t key_size, const char** value_ptr,
size_t* value_size, uint32_t* cas);
// Returns: Ok, NotFound
extern "C" WasmResult proxy_getSharedData(const char* key_ptr, size_t key_size, const char** value_ptr,
size_t* value_size, uint32_t* cas);
// If cas != 0 and cas != the current cas for 'key' return false, otherwise set the value and
// return true.
extern "C" bool proxy_setSharedData(const char* key_ptr, size_t key_size, const char* value_ptr,
size_t value_size, uint32_t cas);
// Returns: Ok, CasMismatch
extern "C" WasmResult proxy_setSharedData(const char* key_ptr, size_t key_size, const char* value_ptr,
size_t value_size, uint32_t cas);

// SharedQueue
// Note: Registering the same queue_name will overwrite the old registration while preseving any pending data.
// Consequently it should typically be followed by a call to proxy_dequeueSharedQueue.
extern "C" uint32_t proxy_registerSharedQueue(const char* queue_name_ptr, size_t queue_name_size);
extern "C" uint32_t proxy_resolveSharedQueue(const char* vm_id, size_t vm_id_size, const char* queue_name_ptr, size_t queue_name_size);
// Returns true on end-of-stream (no more data available).
extern "C" bool proxy_dequeueSharedQueue(uint32_t token, const char** data_ptr, size_t* data_size);
// Returns: Ok
extern "C" WasmResult proxy_registerSharedQueue(const char* queue_name_ptr, size_t queue_name_size, uint32_t* token);
// Returns: Ok, NotFound
extern "C" WasmResult proxy_resolveSharedQueue(const char* vm_id, size_t vm_id_size, const char* queue_name_ptr, size_t queue_name_size, uint32_t* token);
// Returns Ok, Empty, NotFound (token not registered).
extern "C" WasmResult proxy_dequeueSharedQueue(uint32_t token, const char** data_ptr, size_t* data_size);
// Returns false if the queue was not found and the data was not enqueued.
extern "C" bool proxy_enqueueSharedQueue(uint32_t token, const char* data_ptr, size_t data_size);
extern "C" WasmResult proxy_enqueueSharedQueue(uint32_t token, const char* data_ptr, size_t data_size);

// Headers/Trailers/Metadata Maps
extern "C" void proxy_addHeaderMapValue(HeaderMapType type, const char* key_ptr, size_t key_size, const char* value_ptr, size_t value_size);
extern "C" void proxy_getHeaderMapValue(HeaderMapType type, const char* key_ptr, size_t key_size, const char** value_ptr, size_t* value_size);
extern "C" void proxy_getHeaderMapPairs(HeaderMapType type, const char** ptr, size_t* size);
extern "C" void proxy_setHeaderMapPairs(HeaderMapType type, const char* ptr, size_t size);
extern "C" void proxy_replaceHeaderMapValue(HeaderMapType type, const char* key_ptr, size_t key_size, const char* value_ptr, size_t value_size);
extern "C" void proxy_removeHeaderMapValue(HeaderMapType type, const char* key_ptr, size_t key_size);
extern "C" uint32_t proxy_getHeaderMapSize(HeaderMapType type);
extern "C" WasmResult proxy_addHeaderMapValue(HeaderMapType type, const char* key_ptr, size_t key_size, const char* value_ptr, size_t value_size);
extern "C" WasmResult proxy_getHeaderMapValue(HeaderMapType type, const char* key_ptr, size_t key_size, const char** value_ptr, size_t* value_size);
extern "C" WasmResult proxy_getHeaderMapPairs(HeaderMapType type, const char** ptr, size_t* size);
extern "C" WasmResult proxy_setHeaderMapPairs(HeaderMapType type, const char* ptr, size_t size);
extern "C" WasmResult proxy_replaceHeaderMapValue(HeaderMapType type, const char* key_ptr, size_t key_size, const char* value_ptr, size_t value_size);
extern "C" WasmResult proxy_removeHeaderMapValue(HeaderMapType type, const char* key_ptr, size_t key_size);
extern "C" WasmResult proxy_getHeaderMapSize(HeaderMapType type, size_t* size);

// Body
extern "C" void proxy_getRequestBodyBufferBytes(uint32_t start, uint32_t length, const char** ptr,
extern "C" WasmResult proxy_getRequestBodyBufferBytes(uint32_t start, uint32_t length, const char** ptr,
size_t* size);
extern "C" void proxy_getResponseBodyBufferBytes(uint32_t start, uint32_t length, const char** ptr,
extern "C" WasmResult proxy_getResponseBodyBufferBytes(uint32_t start, uint32_t length, const char** ptr,
size_t* size);

// HTTP
Expand All @@ -128,17 +132,15 @@ extern "C" uint32_t proxy_grpcCall(const char* service_ptr, size_t service_size,
const char* request_ptr, size_t request_size, uint32_t timeout_milliseconds);
extern "C" uint32_t proxy_grpcStream(const char* service_ptr, size_t service_size, const char* service_name_ptr,
size_t service_name_size, const char* method_name_ptr, size_t method_name_size);
extern "C" void proxy_grpcCancel(uint32_t token);
extern "C" void proxy_grpcClose(uint32_t token);
extern "C" void proxy_grpcSend(uint32_t token, const char* message_ptr, size_t message_size, uint32_t end_stream);
extern "C" WasmResult proxy_grpcCancel(uint32_t token);
extern "C" WasmResult proxy_grpcClose(uint32_t token);
extern "C" WasmResult proxy_grpcSend(uint32_t token, const char* message_ptr, size_t message_size, uint32_t end_stream);

// Metrics
// Returns a metric_id which can be used to report a metric. On error returns 0.
extern "C" uint32_t proxy_defineMetric(MetricType type, const char* name_ptr, size_t name_size);
extern "C" void proxy_incrementMetric(uint32_t metric_id, int64_t offset);
extern "C" void proxy_recordMetric(uint32_t metric_id, uint64_t value);
extern "C" uint64_t proxy_getMetric(uint32_t metric_id);
extern "C" WasmResult proxy_defineMetric(MetricType type, const char* name_ptr, size_t name_size, uint32_t* metric_id);
extern "C" WasmResult proxy_incrementMetric(uint32_t metric_id, int64_t offset);
extern "C" WasmResult proxy_recordMetric(uint32_t metric_id, uint64_t value);
extern "C" WasmResult proxy_getMetric(uint32_t metric_id, uint64_t* result);

// System
// Returns 0 on success.
extern "C" uint32_t proxy_setEffectiveContext(uint32_t effective_context_id);
extern "C" WasmResult proxy_setEffectiveContext(uint32_t effective_context_id);
6 changes: 4 additions & 2 deletions api/wasm/cpp/proxy_wasm_intrinsics.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,17 @@
#endif

#include <cstdint>
using EnumType = int32_t;
#include <string_view>
using StringView = std::string_view;

#include "proxy_wasm_enums.h"
#include "proxy_wasm_result.h"
#include "proxy_wasm_metadata.h"
#include "proxy_wasm_enums.h"
#include "proxy_wasm_externs.h"
#ifndef EMSCRIPTEN_PROTOBUF_LITE
#include "proxy_wasm_intrinsics.pb.h"
#else
#include "proxy_wasm_intrinsics_lite.pb.h"
#endif
#include "proxy_wasm_impl.h"
#include "proxy_wasm_api.h"
49 changes: 49 additions & 0 deletions api/wasm/cpp/proxy_wasm_metadata.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/*
* Intrinsic enumerations available to WASM modules.
*/
// NOLINT(namespace-envoy)

#pragma once

enum class MetadataType : int32_t {
Request = 0,
Response = 1,
RequestRoute = 2, // Immutable
ResponseRoute = 3, // Immutable
Log = 4, // Immutable
Node = 5, // Immutable
Listener = 6, // Immutable
Cluster = 7, // Immutable
Expression = 8, // The key is a string expression. Only proxy_getMetadata().
MAX = 8,
};
/*
Expression and their types:
request.protocol : string
response.protocol : string
request.destination_port : int32
response.destination_port : int32
request.response_code : int32
response.response_code : int32
upstream.tls_version : string
downstream.tls_version : string
plugin.direction : int32 (enum PluginDirection)
*/

enum class HeaderMapType : int32_t {
RequestHeaders = 0, // During the onLog callback these are immutable
RequestTrailers = 1, // During the onLog callback these are immutable
ResponseHeaders = 2, // During the onLog callback these are immutable
ResponseTrailers = 3, // During the onLog callback these are immutable
GrpcCreateInitialMetadata = 4,
GrpcReceiveInitialMetadata = 5, // Immutable
GrpcReceiveTrailingMetadata = 6, // Immutable
MAX = 6,
};

enum class PluginDirection : int32_t {
Unspecified = 0,
Inbound = 1,
Outbound = 2,
};
42 changes: 42 additions & 0 deletions api/wasm/cpp/proxy_wasm_result.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/*
* Intrinsic enumerations available to WASM modules.
*/
// NOLINT(namespace-envoy)

#pragma once

#include <string>

enum class WasmResult : uint32_t {
Ok = 0,
// The result could not be found, e.g. a provided key did not appear in a table.
NotFound = 1,
// An argument was bad, e.g. did not not conform to the required range.
BadArgument = 2,
// A protobuf could not be serialized.
SerializationFailure = 3,
// A protobuf could not be parsed.
ParseFailure = 4,
// A provided expression (e.g. "foo.bar") was illegal or unrecognized.
BadExpression = 5,
// A provided memory range was not legal.
InvalidMemoryAccess = 6,
// Data was requested from an empty container.
Empty = 7,
// The provided CAS did not match that of the stored data.
CasMismatch = 8,
};

inline std::string toString(WasmResult r) {
switch (r) {
case WasmResult::Ok: return "Ok";
case WasmResult::NotFound : return "NotFound";
case WasmResult::BadArgument : return "BadArgument";
case WasmResult::SerializationFailure : return "SerializationFailure";
case WasmResult::ParseFailure : return "ParseFailure";
case WasmResult::BadExpression : return "BadExpression";
case WasmResult::InvalidMemoryAccess : return "InvalidMemoryAccess";
case WasmResult::Empty : return "Empty";
case WasmResult::CasMismatch : return "CasMismatch";
}
}
2 changes: 1 addition & 1 deletion api/wasm/rust/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,6 @@ fn _free(ptr: *mut u8) {
pub mod host {
extern "C" {
#[link_name = "_proxy_log"]
pub fn proxy_log(level: u32, message_data: *const u8, message_size: usize);
pub fn proxy_log(level: u32, message_data: *const u8, message_size: usize) -> u32;
}
}
Binary file modified examples/wasm/envoy_filter_http_wasm_example.wasm
Binary file not shown.
Loading

0 comments on commit be78f8a

Please sign in to comment.