From c3a42b7a7c506cf0d6539189a05cf25ab338daf8 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Tue, 16 Nov 2021 22:03:30 +0900 Subject: [PATCH 1/4] cmake: Disable libbpf build by default --- CMakeLists.txt | 7 ++++++- CMakeOptions.txt | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ae0700cb..a4587d81 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -67,7 +67,12 @@ if(LIBNGTCP2_CRYPTO_OPENSSL_FOUND) set(HAVE_LIBNGTCP2_CRYPTO_OPENSSL 1) endif() find_package(Libnghttp3 0.0.0) -find_package(Libbpf 0.4.0) +if(WITH_LIBBPF) + find_package(Libbpf 0.4.0) + if(NOT LIBBPF_FOUND) + message(FATAL_ERROR "libbpf was requested (WITH_LIBBPF=1) but not found.") + endif() +endif() if(OPENSSL_FOUND AND LIBEV_FOUND AND ZLIB_FOUND) set(ENABLE_APP_DEFAULT ON) else() diff --git a/CMakeOptions.txt b/CMakeOptions.txt index 754428a2..6a1a89ef 100644 --- a/CMakeOptions.txt +++ b/CMakeOptions.txt @@ -27,5 +27,6 @@ option(WITH_SPDYLAY "Use spdylay" ${WITH_SPDYLAY_DEFAULT}) option(WITH_MRUBY "Use mruby") option(WITH_NEVERBLEED "Use neverbleed") +option(WITH_LIBBPF "Use libbpf") # vim: ft=cmake: From 6feab0a09c3cfcbb7a33e338b81f3019d2f4b1bf Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Tue, 16 Nov 2021 22:09:48 +0900 Subject: [PATCH 2/4] Fix cmake CI build --- .github/workflows/build.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 33d8cb18..dc53f626 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -88,8 +88,10 @@ jobs: PREFIX=$PWD/build make -C src install EXTRA_AUTOTOOLS_OPTS="--with-libbpf" + EXTRA_CMAKE_OPTS="-DWITH_LIBBPF=1" echo 'EXTRA_AUTOTOOLS_OPTS='"$EXTRA_AUTOTOOLS_OPTS" >> $GITHUB_ENV + echo 'EXTRA_CMAKE_OPTS='"$EXTRA_CMAKE_OPTS" >> $GITHUB_ENV - name: Build quictls/openssl v1.1.1 if: matrix.http3 == 'http3' && matrix.openssl == 'openssl1' run: | @@ -133,11 +135,12 @@ jobs: PKG_CONFIG_PATH="$PWD/openssl/build/lib/pkgconfig:$PWD/nghttp3/build/lib/pkgconfig:$PWD/ngtcp2/build/lib/pkgconfig:$PWD/libbpf/build/lib64/pkgconfig:$PKG_CONFIG_PATH" LDFLAGS="$LDFLAGS -Wl,-rpath,$PWD/openssl/build/lib -Wl,-rpath,$PWD/libbpf/build/lib64" EXTRA_AUTOTOOLS_OPTS="--enable-http3 $EXTRA_AUTOTOOLS_OPTS" + EXTRA_CMAKE_OPTS="-DENABLE_HTTP3=1 $EXTRA_CMAKE_OPTS" echo 'PKG_CONFIG_PATH='"$PKG_CONFIG_PATH" >> $GITHUB_ENV echo 'LDFLAGS='"$LDFLAGS" >> $GITHUB_ENV echo 'EXTRA_AUTOTOOLS_OPTS='"$EXTRA_AUTOTOOLS_OPTS" >> $GITHUB_ENV - echo 'EXTRA_CMAKE_OPTS=-DENABLE_HTTP3=ON' >> $GITHUB_ENV + echo 'EXTRA_CMAKE_OPTS='"$EXTRA_CMAKE_OPTS" >> $GITHUB_ENV - name: Setup git submodules run: | git submodule update --init From 950f0f8d14363ef14a559a6f297a7e530f3da088 Mon Sep 17 00:00:00 2001 From: robaho Date: Sat, 20 Nov 2021 14:54:52 -0600 Subject: [PATCH 3/4] nghttpd does not support client requested frame size Fixes #1647 --- lib/nghttp2_frame.h | 2 +- lib/nghttp2_session.c | 15 +++++++++++++++ src/HttpServer.h | 2 +- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/nghttp2_frame.h b/lib/nghttp2_frame.h index 4b9222ac..15298352 100644 --- a/lib/nghttp2_frame.h +++ b/lib/nghttp2_frame.h @@ -53,7 +53,7 @@ (NGHTTP2_FRAME_HDLEN + 1 + NGHTTP2_MAX_PAYLOADLEN) /* The default length of DATA frame payload. */ -#define NGHTTP2_DATA_PAYLOADLEN NGHTTP2_MAX_FRAME_SIZE_MIN +#define NGHTTP2_DATA_PAYLOADLEN 256*1024 /* Maximum headers block size to send, calculated using nghttp2_hd_deflate_bound(). This is the default value, and can be diff --git a/lib/nghttp2_session.c b/lib/nghttp2_session.c index 36f1179f..4bf53b08 100644 --- a/lib/nghttp2_session.c +++ b/lib/nghttp2_session.c @@ -7165,6 +7165,21 @@ int nghttp2_session_pack_data(nghttp2_session *session, nghttp2_bufs *bufs, datamax = (size_t)payloadlen; } + if ((size_t)datamax > nghttp2_buf_avail(buf)) { + /* Resize the current buffer(s). The reason why we do +1 for + buffer size is for possible padding field. */ + rv = nghttp2_bufs_realloc(&session->aob.framebufs, + (size_t)(NGHTTP2_FRAME_HDLEN + 1 + datamax)); + + if (rv != 0) { + DEBUGF("send: realloc buffer failed rv=%d", rv); + } else { + assert(&session->aob.framebufs == bufs); + + buf = &bufs->cur->buf; + } + } + /* Current max DATA length is less then buffer chunk size */ assert(nghttp2_buf_avail(buf) >= datamax); diff --git a/src/HttpServer.h b/src/HttpServer.h index 0de90e42..ef2af396 100644 --- a/src/HttpServer.h +++ b/src/HttpServer.h @@ -203,7 +203,7 @@ public: struct ev_loop *get_loop() const; - using WriteBuf = Buffer<64_k>; + using WriteBuf = Buffer<512_k>; WriteBuf *get_wb(); From ec5bc1283662a9b31b674d796bf1440a3d79a92b Mon Sep 17 00:00:00 2001 From: robaho Date: Sat, 20 Nov 2021 15:16:22 -0600 Subject: [PATCH 4/4] add comment about WriteBuf size --- src/HttpServer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/HttpServer.h b/src/HttpServer.h index ef2af396..6280fce4 100644 --- a/src/HttpServer.h +++ b/src/HttpServer.h @@ -203,7 +203,7 @@ public: struct ev_loop *get_loop() const; - using WriteBuf = Buffer<512_k>; + using WriteBuf = Buffer<512_k>; // This needs to be >= largest frame sent, or frame is not sent WriteBuf *get_wb();