Skip to content

Commit bd62615

Browse files
committed
Dual-stack support for KVS
1 parent 3eadab8 commit bd62615

File tree

10 files changed

+375
-21
lines changed

10 files changed

+375
-21
lines changed

.github/workflows/ci.yml

+18-1
Original file line numberDiff line numberDiff line change
@@ -471,11 +471,28 @@ jobs:
471471
cd build
472472
./tst/producer_test --gtest_filter="ProducerClientBasicTest.*"
473473
TEST_EXIT_CODE=$?
474-
474+
475475
# 128 (abnormal exit) + 11 (segmentation fault) = 139
476476
if [ $TEST_EXIT_CODE -ne 139 ]; then
477477
echo "Unexpected exit code: $TEST_EXIT_CODE"
478478
exit 1
479479
fi
480480
echo "Test exited as expected with code $TEST_EXIT_CODE."
481481
shell: bash
482+
483+
cmake-flags-test:
484+
runs-on: ubuntu-22.04
485+
container: public.ecr.aws/ubuntu/ubuntu:22.04_stable
486+
487+
steps:
488+
- name: Checkout code
489+
uses: actions/checkout@v4
490+
491+
- name: Install dependencies
492+
run: |
493+
apt-get update
494+
apt-get install -y git cmake build-essential pkg-config libssl-dev libcurl4-openssl-dev
495+
496+
- name: Run CMake Flag Combination Test
497+
run: |
498+
./tst/scripts/test_cmake_flags.sh >> $GITHUB_STEP_SUMMARY

CMakeLists.txt

+61
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,15 @@ option(BUILD_OPENSSL_PLATFORM "If buildng OpenSSL what is the target platform" O
2323
option(LOCAL_OPENSSL_BUILD "Whether or not to use local OpenSSL build" OFF)
2424
option(CONSTRAINED_DEVICE "Change pthread stack size" OFF)
2525

26+
# Endpoint selection - mutually exclusive
27+
option(AWS_KVS_USE_LEGACY_ENDPOINT_ONLY "Use only legacy IPv4-only endpoints (ignores env vars)" OFF)
28+
option(AWS_KVS_USE_DUAL_STACK_ENDPOINT_ONLY "Use only dual-stack endpoints (ignores env vars)" OFF)
29+
30+
# DNS IP resolution modes - mutually exclusive
31+
option(AWS_KVS_IPV4_ONLY "Use only IPv4 addresses from DNS (ignores env vars)" OFF)
32+
option(AWS_KVS_IPV6_ONLY "Use only IPv6 addresses from DNS (ignores env vars)" OFF)
33+
option(AWS_KVS_DUAL_STACK_ONLY "Use both IPv4 and IPv6 addresses from DNS (ignores env vars)" OFF)
34+
2635
# Developer Flags
2736
option(BUILD_TEST "Build the testing tree." OFF)
2837
option(CODE_COVERAGE "Enable coverage reporting" OFF)
@@ -64,6 +73,58 @@ if(NOT CMAKE_BUILD_TYPE)
6473
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build." FORCE)
6574
endif()
6675

76+
# Validate mutually exclusive endpoint options
77+
if(AWS_KVS_USE_LEGACY_ENDPOINT_ONLY AND AWS_KVS_USE_DUAL_STACK_ENDPOINT_ONLY)
78+
message(FATAL_ERROR "Cannot enable both AWS_KVS_USE_LEGACY_ENDPOINT_ONLY and AWS_KVS_USE_DUAL_STACK_ENDPOINT_ONLY at the same time.")
79+
endif()
80+
81+
# Validate mutually exclusive IP resolution options
82+
set(IPV4_ONLY_FLAG 0)
83+
set(IPV6_ONLY_FLAG 0)
84+
set(DUAL_STACK_ONLY_FLAG 0)
85+
86+
if(AWS_KVS_IPV4_ONLY)
87+
set(IPV4_ONLY_FLAG 1)
88+
endif()
89+
90+
if(AWS_KVS_IPV6_ONLY)
91+
set(IPV6_ONLY_FLAG 1)
92+
endif()
93+
94+
if(AWS_KVS_DUAL_STACK_ONLY)
95+
set(DUAL_STACK_ONLY_FLAG 1)
96+
endif()
97+
98+
# Sum the enabled flags
99+
math(EXPR IPV_OPTIONS_ENABLED_COUNT
100+
"${IPV4_ONLY_FLAG}+${IPV6_ONLY_FLAG}+${DUAL_STACK_ONLY_FLAG}")
101+
102+
# Check for conflicts
103+
if(IPV_OPTIONS_ENABLED_COUNT GREATER 1)
104+
message(FATAL_ERROR "Only one of AWS_KVS_IPV4_ONLY, AWS_KVS_IPV6_ONLY, or AWS_KVS_DUAL_STACK_ONLY can be enabled.")
105+
endif()
106+
107+
# Translate the CMake flags to the pre-processor macros
108+
if(AWS_KVS_IPV4_ONLY)
109+
add_definitions(-DAWS_KVS_IPV4_ONLY)
110+
endif()
111+
112+
if(AWS_KVS_IPV6_ONLY)
113+
add_definitions(-DAWS_KVS_IPV6_ONLY)
114+
endif()
115+
116+
if(AWS_KVS_DUAL_STACK_ONLY)
117+
add_definitions(-DAWS_KVS_DUAL_STACK_ONLY)
118+
endif()
119+
120+
if(AWS_KVS_USE_LEGACY_ENDPOINT_ONLY)
121+
add_definitions(-DAWS_KVS_USE_LEGACY_ENDPOINT_ONLY)
122+
endif()
123+
124+
if(AWS_KVS_USE_DUAL_STACK_ENDPOINT_ONLY)
125+
add_definitions(-DAWS_KVS_USE_DUAL_STACK_ENDPOINT_ONLY)
126+
endif()
127+
67128
if(BUILD_DEPENDENCIES)
68129
if (NOT OPEN_SRC_INSTALL_PREFIX)
69130
set(OPEN_SRC_INSTALL_PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/open-source)

README.md

+22
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ You can pass the following options to `cmake ..`.
5959
* `-DALIGNED_MEMORY_MODEL` Build for aligned memory model only devices. Default is OFF.
6060
* `-DLOCAL_OPENSSL_BUILD` Whether or not to use local OpenSSL build. Default is OFF.
6161
* `-DCONSTRAINED_DEVICE` -- Change thread stack size to 0.5Mb, needed for Alpine.
62+
* `-DAWS_KVS_USE_LEGACY_ENDPOINT_ONLY` -- Use only legacy IPV4-only endpoints (ignores env vars). Default is OFF.
63+
* `-DAWS_KVS_USE_DUAL_STACK_ENDPOINT_ONLY` -- Use only dual-stack endpoints (ignores env vars). Default is OFF.
64+
* `-DAWS_KVS_IPV4_ONLY` -- Use only IPv4 addresses from DNS (ignores env vars). Default is OFF.
65+
* `-DAWS_KVS_IPV6_ONLY` -- Use only IPv6 addresses from DNS (ignores env vars). Default is OFF.
66+
* `-DAWS_KVS_DUAL_STACK_ONLY` -- Use both IPv4 and IPv6 addresses from DNS (ignores env vars). Default is OFF.
6267

6368

6469
DMEMORY_SANITIZER, DTHREAD_SANITIZER etc. flags works only with clang compiler
@@ -197,6 +202,23 @@ For video and audio: `createOfflineAudioVideoStreamInfoProviderWithCodecs()`
197202

198203
The 2 APIs are available in [this](https://github.com/awslabs/amazon-kinesis-video-streams-producer-c/blob/412aab82c99a72f9dbde975f5fea81ffdc844ae5/src/include/com/amazonaws/kinesis/video/cproducer/Include.h) header file.
199204

205+
### KVS Endpoints and DNS resolution
206+
The default endpoints and DNS resolution chain is implemented by the SDK. It sequentially checks each place where you can set the configuration for these parameters, and then selects the first one you set. The predefined sequence is as follows:
207+
208+
#### Endpoint Configuration
209+
1. The `controlPlaneUrl` parameter for `createAbstractDefaultCallbacksProvider`.
210+
2. Endpoint configuration CMake parameters: (`-DAWS_KVS_USE_LEGACY_ENDPOINT_ONLY=TRUE`, `-DAWS_KVS_USE_DUAL_STACK_ENDPOINT_ONLY=TRUE`)
211+
3. Environment variables: (`export AWS_USE_DUALSTACK_ENDPOINT=TRUE`)
212+
- If `AWS_USE_DUALSTACK_ENDPOINT` is `TRUE` (case-insensitive), the dual-stack endpoint will be used.
213+
4. Otherwise, the legacy endpoint will be constructed.
214+
215+
With 2, 3, and 4, the endpoint will be constructed based on the region provided to `createAbstractDefaultCallbacksProvider`.
216+
217+
#### DNS filtering
218+
1. DNS resolution CMake parameters: (`-DAWS_KVS_IPV4_ONLY=TRUE`, `-DAWS_KVS_IPV6_ONLY=TRUE`, `-DAWS_KVS_DUAL_STACK_ONLY=TRUE`)
219+
2. Environment variables (`export AWS_KVS_USE_IPV4=TRUE`, `export AWS_KVS_USE_IPV6=TRUE`)
220+
3. Otherwise, no filtering will take place. Both IPv4 and IPv6 IP addresses, if returned by DNS, may be used.
221+
200222
## DEBUG
201223
* When building OpenSSL during `cmake ..`, if you encounter an architecture error such as `ld: symbol(s) not found for architecture i386`, building with a local OpenSSL build may help. First install OpenSSL 1.1 (for Mac: `brew install [email protected]`). Next set `export PKG_CONFIG_PATH="<YOUR-PATH>/[email protected]/lib/pkgconfig"` (your path can be printed to terminal using `which openssl` on Linux/Mac). Now set the following flag to ON when building: `cmake .. -DLOCAL_OPENSSL_BUILD=ON`. If there are still errors regarding locating the local OpenSSL library:
202224
* The following environment variables may need to be set to export:

src/include/com/amazonaws/kinesis/video/common/Include.h

+8
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,14 @@ extern "C" {
334334
#define AWS_GOV_CLOUD_REGION_PREFIX "us-gov-"
335335

336336
#define AWS_CN_REGION_PREFIX "cn-"
337+
338+
#define CONTROL_PLANE_URI_POSTFIX_DUAL_STACK ".api.aws"
339+
340+
#define CONTROL_PLANE_URI_POSTFIX_CN_DUAL_STACK ".api.amazonwebservices.com.cn"
341+
342+
#define CONTROL_PLANE_URI_POSTFIX_ISO_DUAL_STACK ".api.aws.ic.gov"
343+
344+
#define CONTROL_PLANE_URI_POSTFIX_ISO_B_DUAL_STACK ".api.aws.scloud"
337345

338346
/**
339347
* Default user agent name

src/source/CurlApiCallbacks.c

+55-20
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ STATUS createCurlApiCallbacks(PCallbacksProvider pCallbacksProvider, PCHAR regio
1414
ENTERS();
1515
STATUS retStatus = STATUS_SUCCESS, status;
1616
PCurlApiCallbacks pCurlApiCallbacks = NULL;
17+
BOOL useDualStackEndpoint;
1718

1819
CHK(pCallbacksProvider != NULL && ppCurlApiCallbacks != NULL, STATUS_NULL_ARG);
1920
CHK(certPath == NULL || STRNLEN(certPath, MAX_PATH_LEN + 1) <= MAX_PATH_LEN, STATUS_INVALID_CERT_PATH_LENGTH);
@@ -77,26 +78,20 @@ STATUS createCurlApiCallbacks(PCallbacksProvider pCallbacksProvider, PCHAR regio
7778
DLOGW("Failed to generate user agent string with error 0x%08x.", status);
7879
}
7980

80-
// Set the control plane URL
81-
if (controlPlaneUrl == NULL || controlPlaneUrl[0] == '\0') {
82-
if (0 == STRNCMP(pCurlApiCallbacks->region, AWS_ISO_B_REGION_PREFIX, STRLEN(AWS_ISO_B_REGION_PREFIX))) {
83-
SNPRINTF(pCurlApiCallbacks->controlPlaneUrl, MAX_URI_CHAR_LEN, "%s%s%s.%s%s", CONTROL_PLANE_URI_PREFIX, KINESIS_VIDEO_SERVICE_NAME,
84-
AWS_KVS_FIPS_ENDPOINT_POSTFIX, pCurlApiCallbacks->region, CONTROL_PLANE_URI_POSTFIX_ISO_B);
85-
// Region is in "aws-iso" partition
86-
} else if (0 == STRNCMP(pCurlApiCallbacks->region, AWS_ISO_REGION_PREFIX, STRLEN(AWS_ISO_REGION_PREFIX))) {
87-
SNPRINTF(pCurlApiCallbacks->controlPlaneUrl, MAX_URI_CHAR_LEN, "%s%s%s.%s%s", CONTROL_PLANE_URI_PREFIX, KINESIS_VIDEO_SERVICE_NAME,
88-
AWS_KVS_FIPS_ENDPOINT_POSTFIX, pCurlApiCallbacks->region, CONTROL_PLANE_URI_POSTFIX_ISO);
89-
} else if (0 == STRNCMP(pCurlApiCallbacks->region, AWS_GOV_CLOUD_REGION_PREFIX, STRLEN(AWS_GOV_CLOUD_REGION_PREFIX))) {
90-
SNPRINTF(pCurlApiCallbacks->controlPlaneUrl, MAX_URI_CHAR_LEN, "%s%s%s.%s%s", CONTROL_PLANE_URI_PREFIX, KINESIS_VIDEO_SERVICE_NAME,
91-
AWS_KVS_FIPS_ENDPOINT_POSTFIX, pCurlApiCallbacks->region, CONTROL_PLANE_URI_POSTFIX);
92-
} else if (0 == STRNCMP(pCurlApiCallbacks->region, AWS_CN_REGION_PREFIX, STRLEN(AWS_CN_REGION_PREFIX))) {
93-
SNPRINTF(pCurlApiCallbacks->controlPlaneUrl, MAX_URI_CHAR_LEN, "%s%s.%s%s", CONTROL_PLANE_URI_PREFIX, KINESIS_VIDEO_SERVICE_NAME,
94-
pCurlApiCallbacks->region, CONTROL_PLANE_URI_POSTFIX_CN);
95-
} else {
96-
// Create a fully qualified URI
97-
SNPRINTF(pCurlApiCallbacks->controlPlaneUrl, MAX_URI_CHAR_LEN, "%s%s.%s%s", CONTROL_PLANE_URI_PREFIX, KINESIS_VIDEO_SERVICE_NAME,
98-
pCurlApiCallbacks->region, CONTROL_PLANE_URI_POSTFIX);
99-
}
81+
// Construct Control Plane URL
82+
if (IS_NULL_OR_EMPTY_STRING(controlPlaneUrl)) {
83+
#if defined(AWS_KVS_USE_LEGACY_ENDPOINT_ONLY)
84+
useDualStackEndpoint = FALSE;
85+
DLOGI("Using legacy endpoint from AWS_KVS_USE_LEGACY_ENDPOINT_ONLY")
86+
#elif defined(AWS_KVS_USE_DUAL_STACK_ENDPOINT_ONLY)
87+
useDualStackEndpoint = TRUE;
88+
DLOGI("Using dual stack endpoint from AWS_KVS_USE_DUAL_STACK_ENDPOINT_ONLY")
89+
#else
90+
useDualStackEndpoint = (GETENV(CONTROL_PLANE_USE_DUAL_STACK_ENDPOINT_ENV_VAR) != NULL) && (0 == STRNCMPI(GETENV(CONTROL_PLANE_USE_DUAL_STACK_ENDPOINT_ENV_VAR), "true", 4));
91+
DLOGI("Using %s endpoint from environment", useDualStackEndpoint ? "dual stack" : "legacy");
92+
#endif
93+
94+
constructControlPlaneUrl(pCurlApiCallbacks->controlPlaneUrl, MAX_URI_CHAR_LEN, pCurlApiCallbacks->region, !useDualStackEndpoint);
10095
} else {
10196
STRNCPY(pCurlApiCallbacks->controlPlaneUrl, controlPlaneUrl, MAX_URI_CHAR_LEN);
10297
}
@@ -194,6 +189,46 @@ STATUS createCurlApiCallbacks(PCallbacksProvider pCallbacksProvider, PCHAR regio
194189
return retStatus;
195190
}
196191

192+
STATUS constructControlPlaneUrl(const char* buffer, SIZE_T bufferSize, const char* region, BOOL useLegacyEndpoint)
193+
{
194+
ENTERS();
195+
STATUS retStatus = STATUS_SUCCESS;
196+
const char* serviceNamePostfix = "";
197+
const char* postfix;
198+
199+
CHK(buffer != NULL && region != NULL, STATUS_NULL_ARG);
200+
CHK(bufferSize > 0, STATUS_INVALID_ARG_LEN);
201+
202+
if (0 == STRNCMP(region, AWS_ISO_B_REGION_PREFIX, STRLEN(AWS_ISO_B_REGION_PREFIX))) {
203+
// Top Secret Cloud regions: https://kinesisvideo-fips.us-isob-east-1.sc2s.sgov.gov
204+
serviceNamePostfix = AWS_KVS_FIPS_ENDPOINT_POSTFIX;
205+
postfix = useLegacyEndpoint ? CONTROL_PLANE_URI_POSTFIX_ISO_B : CONTROL_PLANE_URI_POSTFIX_ISO_B_DUAL_STACK;
206+
} else if (0 == STRNCMP(region, AWS_ISO_REGION_PREFIX, STRLEN(AWS_ISO_REGION_PREFIX))) {
207+
// Secret Cloud regions: https://kinesisvideo-fips.us-iso-east-1.c2s.ic.gov
208+
serviceNamePostfix = AWS_KVS_FIPS_ENDPOINT_POSTFIX;
209+
postfix = useLegacyEndpoint ? CONTROL_PLANE_URI_POSTFIX_ISO : CONTROL_PLANE_URI_POSTFIX_ISO_DUAL_STACK;
210+
} else if (0 == STRNCMP(region, AWS_GOV_CLOUD_REGION_PREFIX, STRLEN(AWS_GOV_CLOUD_REGION_PREFIX))) {
211+
// US Govcloud regions: https://kinesisvideo-fips.us-gov-east-1.amazonaws.com
212+
serviceNamePostfix = AWS_KVS_FIPS_ENDPOINT_POSTFIX;
213+
postfix = useLegacyEndpoint ? CONTROL_PLANE_URI_POSTFIX : CONTROL_PLANE_URI_POSTFIX_DUAL_STACK;
214+
} else if (0 == STRNCMP(region, AWS_CN_REGION_PREFIX, STRLEN(AWS_CN_REGION_PREFIX))) {
215+
// China regions: https://kinesisvideo.cn-north-1.amazonaws.com.cn"
216+
postfix = useLegacyEndpoint ? CONTROL_PLANE_URI_POSTFIX_CN : CONTROL_PLANE_URI_POSTFIX_CN_DUAL_STACK;
217+
} else {
218+
// Standard regions: https://kinesisvideo.us-west-2.amazonaws.com
219+
postfix = useLegacyEndpoint ? CONTROL_PLANE_URI_POSTFIX : CONTROL_PLANE_URI_POSTFIX_DUAL_STACK;
220+
}
221+
222+
// Create a fully qualified URI
223+
SNPRINTF((PCHAR) buffer, bufferSize, "%s%s%s.%s%s", CONTROL_PLANE_URI_PREFIX, KINESIS_VIDEO_SERVICE_NAME, serviceNamePostfix, region, postfix);
224+
225+
CleanUp:
226+
CHK_LOG_ERR(retStatus);
227+
228+
LEAVES();
229+
return retStatus;
230+
}
231+
197232
/**
198233
* Frees the CURL API callbacks object
199234
*

src/source/CurlApiCallbacks.h

+7
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ extern "C" {
2020
#define TAG_RESOURCE_API_POSTFIX "/tagStream"
2121
#define PUT_MEDIA_API_POSTFIX "/putMedia"
2222

23+
#define CONTROL_PLANE_USE_DUAL_STACK_ENDPOINT_ENV_VAR "AWS_USE_DUALSTACK_ENDPOINT"
24+
25+
#if defined(AWS_KVS_USE_LEGACY_ENDPOINT_ONLY) && defined(AWS_KVS_USE_DUAL_STACK_ENDPOINT_ONLY)
26+
#error "Only one of AWS_KVS_USE_LEGACY_ENDPOINT_ONLY or AWS_KVS_USE_DUAL_STACK_ENDPOINT_ONLY can be defined"
27+
#endif
28+
2329
// NOTE: THe longest string would be the tag resource where we get the maximal tag count and sizes plus some extra.
2430
#define MAX_TAGS_JSON_PARAMETER_STRING_LEN (MAX_JSON_PARAMETER_STRING_LEN + (MAX_TAG_COUNT * (MAX_TAG_NAME_LEN + MAX_TAG_VALUE_LEN)))
2531

@@ -177,6 +183,7 @@ typedef struct __CurlApiCallbacks* PCurlApiCallbacks;
177183
// Curl API Callbacks main functionality
178184
//////////////////////////////////////////////////////////////////////
179185
STATUS createCurlApiCallbacks(struct __CallbacksProvider*, PCHAR, API_CALL_CACHE_TYPE, UINT64, PCHAR, PCHAR, PCHAR, PCHAR, PCurlApiCallbacks*);
186+
STATUS constructControlPlaneUrl(const char*, SIZE_T, const char*, BOOL);
180187
STATUS freeCurlApiCallbacks(PCurlApiCallbacks*);
181188
STATUS curlApiCallbacksShutdownActiveRequests(PCurlApiCallbacks, STREAM_HANDLE, UINT64, BOOL, BOOL);
182189
STATUS curlApiCallbacksShutdownCachedEndpoints(PCurlApiCallbacks, STREAM_HANDLE, BOOL);

src/source/Response.c

+29
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,35 @@ STATUS initializeCurlSession(PRequestInfo pRequestInfo, PCallInfo pCallInfo, CUR
180180
curl_easy_setopt(pCurl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);
181181
}
182182

183+
#if defined(AWS_KVS_IPV4_ONLY)
184+
curl_easy_setopt(pCurl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
185+
DLOGD("Curl resolving IPV4 through AWS_KVS_IPV4_ONLY");
186+
#elif defined(AWS_KVS_IPV6_ONLY)
187+
curl_easy_setopt(pCurl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6);
188+
DLOGD("Curl resolving IPV6 through AWS_KVS_IPV6_ONLY");
189+
#elif defined(AWS_KVS_DUAL_STACK_ONLY)
190+
curl_easy_setopt(pCurl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_WHATEVER);
191+
DLOGD("Curl resolving dual stack through AWS_KVS_DUAL_STACK_ONLY");
192+
#else
193+
if (!IS_NULL_OR_EMPTY_STRING(GETENV(KVS_CURL_IPRESOLVE_V4_ENV_VAR))) {
194+
curl_easy_setopt(pCurl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
195+
DLOGD("Curl resolving IPV4 through environment variable");
196+
} else if (!IS_NULL_OR_EMPTY_STRING(GETENV(KVS_CURL_IPRESOLVE_V6_ENV_VAR))) {
197+
curl_easy_setopt(pCurl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6);
198+
DLOGD("Curl resolving IPV6 through environment variable");
199+
} else {
200+
curl_easy_setopt(pCurl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_WHATEVER);
201+
DLOGD("Curl resolving dual stack by default");
202+
}
203+
#endif
204+
205+
#ifndef NDEBUG
206+
// Only available in debug build
207+
if (!IS_NULL_OR_EMPTY_STRING(GETENV(KVS_CURL_DEBUG_ENV_VAR))) {
208+
curl_easy_setopt(pCurl, CURLOPT_VERBOSE, 1L);
209+
}
210+
#endif
211+
183212
// set request completion timeout in milliseconds
184213
if (pRequestInfo->completionTimeout != SERVICE_CALL_INFINITE_TIMEOUT) {
185214
curl_easy_setopt(pCurl, CURLOPT_TIMEOUT_MS, pRequestInfo->completionTimeout / HUNDREDS_OF_NANOS_IN_A_MILLISECOND);

src/source/Response.h

+11
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,17 @@ extern "C" {
2525
// Debug dump data file environment variable
2626
#define KVS_DEBUG_DUMP_DATA_FILE_DIR_ENV_VAR "KVS_DEBUG_DUMP_DATA_FILE_DIR"
2727

28+
// Curl settings
29+
#define KVS_CURL_IPRESOLVE_V4_ENV_VAR "AWS_KVS_USE_IPV4"
30+
#define KVS_CURL_IPRESOLVE_V6_ENV_VAR "AWS_KVS_USE_IPV6"
31+
#define KVS_CURL_DEBUG_ENV_VAR "KVS_CURL_DEBUG"
32+
33+
#if (defined(AWS_KVS_IPV4_ONLY) && defined(AWS_KVS_IPV6_ONLY)) || \
34+
(defined(AWS_KVS_IPV4_ONLY) && defined(AWS_KVS_DUAL_STACK_ONLY)) || \
35+
(defined(AWS_KVS_IPV6_ONLY) && defined(AWS_KVS_DUAL_STACK_ONLY))
36+
#error "Only one of AWS_KVS_IPV4_ONLY, AWS_KVS_IPV6_ONLY, or AWS_KVS_DUAL_STACK_ONLY can be defined"
37+
#endif
38+
2839
// this is used by postReadCallback to sleep before checking for more data
2940
#define MAX_GET_DATA_ITER 6
3041

0 commit comments

Comments
 (0)