Skip to content

Commit

Permalink
[quic|vpws]wrap quic in fd, support quic in vpws
Browse files Browse the repository at this point in the history
as well as:
add AbstractDelegateFD
IP now can hold hostname
and some other upgrading
  • Loading branch information
wkgcass committed Nov 11, 2023
1 parent 35f6c8c commit c17e377
Show file tree
Hide file tree
Showing 42 changed files with 1,713 additions and 589 deletions.
45 changes: 16 additions & 29 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ clean: clean-jar
rm -f ./base/src/main/c/libvfdposix.so
rm -f ./base/src/main/c/libvpxdp.so
rm -f ./base/src/main/c/vfdwindows.dll
rm -f ./base/src/main/c/libvpquic.dylib
rm -f ./base/src/main/c/libvpquic.so
rm -f ./base/src/main/c/libmsquic-java.dylib
rm -f ./base/src/main/c/libmsquic-java.so
cd ./base/src/main/c/xdp && make clean
rm -f ./vproxy
rm -f ./vproxy-*
Expand All @@ -46,7 +46,7 @@ clean-docker-plugin-rootfs:
.PHONY: init
init:
git submodule update --init --recursive
cd submodules/ && git clone https://github.com/wkgcass/msquic --branch=modified --depth=1 || exit 0
cd submodules/ && git clone https://github.com/wkgcass/msquic --branch=2.2.4-modified --depth=1 || exit 0
cd submodules/msquic && git submodule update --init --recursive --recommend-shallow

.PHONY: all
Expand All @@ -58,7 +58,7 @@ generate-module-info:

.PHONY: jar
jar: generate-module-info
/usr/bin/env bash ./gradlew jar
/usr/bin/env bash ./gradlew shadowJar
zip build/libs/vproxy.jar module-info.class

.PHONY: _add_linux_so_to_zip
Expand All @@ -68,15 +68,13 @@ _add_linux_so_to_zip:
cp ./base/src/main/c/libvpxdp.so ./io/vproxy/libvpxdp-$(LINUX_ARCH).so
cp ./base/src/main/c/xdp/libbpf/src/libbpf.so.0.6.0 ./io/vproxy/libbpf-$(LINUX_ARCH).so
cp ./libmsquic.so ./io/vproxy/libmsquic-$(LINUX_ARCH).so
cp ./submodules/msquic-java/core/src/main/c/libmsquic-java.so ./io/vproxy/libmsquic-java-$(LINUX_ARCH).so
cp ./base/src/main/c/libvpquic.so ./io/vproxy/libvpquic-$(LINUX_ARCH).so
cp ./base/src/main/c/libmsquic-java.so ./io/vproxy/libmsquic-java-$(LINUX_ARCH).so
zip build/libs/vproxy.jar \
./io/vproxy/libvfdposix-$(LINUX_ARCH).so \
./io/vproxy/libvpxdp-$(LINUX_ARCH).so \
./io/vproxy/libbpf-$(LINUX_ARCH).so \
./io/vproxy/libmsquic-$(LINUX_ARCH).so \
./io/vproxy/libmsquic-java-$(LINUX_ARCH).so \
./io/vproxy/libvpquic-$(LINUX_ARCH).so
./io/vproxy/libmsquic-java-$(LINUX_ARCH).so
rm -r ./io

.PHONY: jar-with-lib
Expand All @@ -87,13 +85,11 @@ jar-with-lib: clean jar vfdposix-linux vpxdp-linux quic-all vfdposix _add_linux_
mkdir -p ./io/vproxy/
cp ./base/src/main/c/libvfdposix.dylib ./io/vproxy/libvfdposix-$(ARCH).dylib
cp ./libmsquic.dylib ./io/vproxy/libmsquic-$(ARCH).dylib
cp ./submodules/msquic-java/core/src/main/c/libmsquic-java.dylib ./io/vproxy/libmsquic-java-$(ARCH).dylib
cp ./base/src/main/c/libvpquic.dylib ./io/vproxy/libvpquic-$(ARCH).dylib
cp ./base/src/main/c/libmsquic-java.dylib ./io/vproxy/libmsquic-java-$(ARCH).dylib
zip build/libs/vproxy.jar \
./io/vproxy/libvfdposix-$(ARCH).dylib \
./io/vproxy/libmsquic-$(ARCH).dylib \
./io/vproxy/libmsquic-java-$(ARCH).dylib \
./io/vproxy/libvpquic-$(ARCH).dylib
./io/vproxy/libmsquic-java-$(ARCH).dylib
rm -r ./io
endif

Expand Down Expand Up @@ -135,12 +131,6 @@ xdp-sample-kern:

.PHONY: msquic-java
msquic-java:
cd ./submodules/msquic-java/core/src/main/c && \
MSQUIC_LD=../../../../../msquic/build/bin/Release \
MSQUIC_INC=../../../../../msquic/src/inc \
/usr/bin/env bash ./make-quic.sh
.PHONY: vpquic
vpquic:
cd ./base/src/main/c && \
MSQUIC_LD=../../../../submodules/msquic/build/bin/Release \
MSQUIC_INC=../../../../submodules/msquic/src/inc \
Expand All @@ -152,12 +142,11 @@ msquic:
.PHONY: vfdposix-linux
.PHONY: vpxdp-linux
.PHONY: msquic-java-linux
.PHONY: vpquic-linux
.PHONY: msquic-linux
ifeq ($(OS),Linux)
vfdposix-linux: vfdposix
vpxdp-linux: vpxdp
vpquic-linux: vpquic
msquic-java-linux: msquic-java
msquic-linux: msquic
else
vfdposix-linux:
Expand All @@ -166,24 +155,22 @@ vpxdp-linux:
docker run --rm -v $(shell pwd):/vproxy vproxyio/compile:latest make vpxdp
msquic-java-linux:
docker run --rm -v $(shell pwd):/vproxy -v "$(shell pwd)/submodules/msquic/src/inc:/msquic/src/inc" -v "$(shell pwd)/submodules/msquic/build/bin/Release:/msquic/build/bin/Release" -e MSQUIC_INC=/msquic/src/inc -e MSQUIC_LD=/msquic/build/bin/Release vproxyio/compile:latest make msquic-java
vpquic-linux:
docker run --rm -v $(shell pwd):/vproxy -v "$(shell pwd)/submodules/msquic/src/inc:/msquic/src/inc" -v "$(shell pwd)/submodules/msquic/build/bin/Release:/msquic/build/bin/Release" -e MSQUIC_INC=/msquic/src/inc -e MSQUIC_LD=/msquic/build/bin/Release vproxyio/compile:latest make vpquic
msquic-linux:
docker run --rm -v $(shell pwd)/submodules/msquic:/msquic vproxyio/msquic-compile:latest make
docker run --rm -v $(shell pwd):/vproxy vproxyio/compile:latest /bin/bash -c 'cd submodules/msquic && make'
endif

.PHONY: quic
quic: vfdposix msquic msquic-java vpquic
quic: vfdposix msquic msquic-java
.PHONY: quic-linux
quic-linux: vfdposix-linux msquic-linux msquic-java-linux vpquic-linux
quic-linux: vfdposix-linux msquic-linux msquic-java-linux
.PHONY: quic-all
quic-all:
rm -rf ./submodules/msquic/build
make quic
cp ./submodules/msquic/build/bin/Release/libmsquic.2.3.0.dylib ./libmsquic.dylib
rm -rf ./submodules/msquic/build
make quic-linux
cp ./submodules/msquic/build/bin/Release/libmsquic.so.2.3.0 ./libmsquic.so
cp ./submodules/msquic/build/bin/Release/libmsquic.so.2.2.4 ./libmsquic.so
rm -rf ./submodules/msquic/build
make quic
cp ./submodules/msquic/build/bin/Release/libmsquic.2.2.4.dylib ./libmsquic.dylib

.PHONY: vfdwindows
vfdwindows:
Expand Down
9 changes: 8 additions & 1 deletion base/src/main/c/make-quic.sh
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ fi

os=`uname`

target="vpquic"
target="msquic-java"
include_platform_dir=""
cflags=""

Expand Down Expand Up @@ -52,11 +52,18 @@ gcc -std=gnu11 -O2 \
-I ./dep/ae \
-I "$MSQUIC_INC" \
-I "../c-generated" \
-I "../../../../submodules/msquic-java/core/src/main/c-generated" \
-L "$MSQUIC_LD" \
-DQUIC_ENABLE_CUSTOM_EVENT_LOOP=1 \
$cflags \
-shared -Werror -lc -lpthread $NO_AS_NEEDED "-lmsquic" $AS_NEEDED -fPIC \
io_vproxy_msquic_MsQuic.c \
../c-generated/io_vproxy_msquic_CxPlatExecutionState.extra.c \
../c-generated/io_vproxy_msquic_CxPlatProcessEventLocals.extra.c \
../c-generated/pni.c \
../../../../submodules/msquic-java/core/src/main/c/io_vproxy_msquic_MsQuic.c \
../../../../submodules/msquic-java/core/src/main/c/inline.c \
../../../../submodules/msquic-java/core/src/main/c-generated/io_vproxy_msquic_MsQuicModUpcall.c \
../../../../submodules/msquic-java/core/src/main/c-generated/io_vproxy_msquic_MsQuicUpcall.c \
../../../../submodules/msquic-java/core/src/main/c-generated/io_vproxy_msquic_QuicAddr.extra.c \
-o "$target"
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import io.vproxy.base.util.LogType;
import io.vproxy.base.util.Logger;
import io.vproxy.base.util.RingBuffer;
import io.vproxy.vfd.FDProvider;
import io.vproxy.vfd.IPPort;
import io.vproxy.vfd.SocketFD;
import io.vproxy.vfd.UDSPath;
Expand Down Expand Up @@ -45,14 +44,14 @@ public static ConnectableConnection create(IPPort remote,
if (remote instanceof UDSPath) {
return createUDS(remote, opts, inBuffer, outBuffer);
}
SocketFD channel = FDProvider.get().openSocketFD();
SocketFD channel = opts.getFds().openSocketFD();
return create(channel, remote, opts, inBuffer, outBuffer);
}

private static ConnectableConnection createUDS(IPPort remote,
ConnectionOpts opts,
RingBuffer inBuffer, RingBuffer outBuffer) throws IOException {
var fds = FDProvider.get().getProvided();
var fds = opts.getFds();
if (!(fds instanceof PosixFDs)) {
throw new IOException("unix domain socket is not supported by " + fds + ", use -Dvfd=posix");
}
Expand Down
14 changes: 14 additions & 0 deletions base/src/main/java/io/vproxy/base/connection/ConnectionOpts.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package io.vproxy.base.connection;

import io.vproxy.base.Config;
import io.vproxy.vfd.FDProvider;
import io.vproxy.vfd.FDs;

public class ConnectionOpts {
int timeout = Config.tcpTimeout;
private FDs fds;

public static ConnectionOpts getDefault() {
return DefaultConnectionOpts.defaultConnectionOpts;
Expand All @@ -16,6 +19,17 @@ public ConnectionOpts setTimeout(int timeout) {
this.timeout = timeout;
return this;
}

public ConnectionOpts setFDs(FDs fds) {
this.fds = fds;
return this;
}

public FDs getFds() {
if (fds == null)
return FDProvider.get().getProvided();
return fds;
}
}

final class DefaultConnectionOpts extends ConnectionOpts {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,7 @@ private NetEventLoopUtils() {
}

static void callExceptionEvent(ConnectionHandlerContext cctx, IOException err) {
assert Logger.lowLevelDebug(STR."call exception event for \{cctx.connection}: \{err}");
cctx.handler.exception(cctx, err);
if (!cctx.connection.isClosed()) {
cctx.connection.close(true);
Expand Down
6 changes: 4 additions & 2 deletions base/src/main/java/io/vproxy/base/dns/DNSClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -386,9 +386,11 @@ private void getAllByName0(String domain, boolean ipv4, Callback<List<IP>, Unkno
List<IP> addresses = new ArrayList<>();
for (DNSResource answer : packet.answers) {
if (answer.type == DNSType.A) {
addresses.add(((A) answer.rdata).address);
var addr = ((A) answer.rdata).address;
addresses.add(IP.from(domain, addr.getAddress()));
} else if (answer.type == DNSType.AAAA) {
addresses.add(((AAAA) answer.rdata).address);
var addr = ((AAAA) answer.rdata).address;
addresses.add(IP.from(domain, addr.getAddress()));
} else {
assert Logger.lowLevelDebug("ignore answer with type " + answer.type);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

import io.vproxy.base.selector.SelectorEventLoop;
import io.vproxy.base.util.Logger;
import io.vproxy.base.util.anno.Comment;
import io.vproxy.base.util.promise.Promise;
import io.vproxy.vfd.FD;
import io.vproxy.vfd.IPPort;
import io.vproxy.vfd.SocketFD;
Expand All @@ -13,10 +11,9 @@
import java.net.SocketOption;
import java.net.StandardSocketOptions;
import java.nio.ByteBuffer;
import java.util.function.Function;
import java.util.Objects;

public abstract class AbstractBaseVirtualSocketFD extends AbstractBaseFD implements SocketFD, VirtualFD {
private final VirtualFD _self;
public abstract class AbstractBaseVirtualSocketFD extends AbstractBaseFD implements SocketFD, VirtualFD, DelegatingSourceFD {
private SelectorEventLoop loop;
protected final boolean isAccepted;

Expand All @@ -30,16 +27,11 @@ public abstract class AbstractBaseVirtualSocketFD extends AbstractBaseFD impleme
private IPPort remote;
private IPPort local;

private boolean shutdownOutputIsCalled;
private boolean eof;
private IOException error;

public AbstractBaseVirtualSocketFD(boolean isAccepted, IPPort local, IPPort remote) {
this(null, isAccepted, local, remote);
}

@Comment("this constructor will make an util object")
public AbstractBaseVirtualSocketFD(VirtualFD _self, boolean isAccepted, IPPort local, IPPort remote) {
this._self = _self;
this.isAccepted = isAccepted;
this.connected = isAccepted;
this.local = local;
Expand Down Expand Up @@ -98,6 +90,11 @@ public boolean isConnected() {
public void shutdownOutput() throws IOException {
checkOpen();
checkConnected();
shutdownOutputIsCalled = true;
}

public boolean isShutdownOutput() {
return shutdownOutputIsCalled;
}

@Override
Expand Down Expand Up @@ -161,7 +158,7 @@ public int read(ByteBuffer dst) throws IOException {

protected abstract int doRead(ByteBuffer dst) throws IOException;

public void setEof() {
protected void setEof() {
this.eof = true;
setReadable();
}
Expand Down Expand Up @@ -227,7 +224,7 @@ public <T> void setOption(SocketOption<T> name, T value) {

@Override
public FD real() {
throw new UnsupportedOperationException();
return null;
}

@Override
Expand Down Expand Up @@ -262,17 +259,6 @@ private void superClose() {

protected abstract void doClose(boolean reset);

protected void asyncClose(Function<Boolean, Promise<Void>> promiseFunc) {
if (closed) {
return;
}
closed = true;
promiseFunc.apply(resetWhenClosing).then(v -> {
closeSelf();
return Promise.resolve(null);
});
}

@Override
public String toString() {
return formatToString();
Expand All @@ -284,8 +270,14 @@ public String toString() {
// events
// ======

private VirtualFD self() {
return _self == null ? this : _self;
private DelegatingTargetFD delegatingTargetFD;

@Override
public void setDelegatingTargetFD(DelegatingTargetFD fd) {
Objects.requireNonNull(fd);
if (delegatingTargetFD != null)
throw new IllegalStateException("delegatingTargetFD is already set");
delegatingTargetFD = fd;
}

private boolean readable = false;
Expand All @@ -295,15 +287,23 @@ protected void setReadable() {
if (loop == null) {
return;
}
loop.runOnLoop(() -> loop.selector.registerVirtualReadable(self()));
if (delegatingTargetFD != null) {
delegatingTargetFD.setReadable();
return;
}
loop.runOnLoop(() -> loop.selector.registerVirtualReadable(this));
}

protected void cancelReadable() {
readable = false;
if (loop == null) {
return;
}
loop.runOnLoop(() -> loop.selector.removeVirtualReadable(self()));
if (delegatingTargetFD != null) {
delegatingTargetFD.cancelReadable();
return;
}
loop.runOnLoop(() -> loop.selector.removeVirtualReadable(this));
}

private boolean writable = false;
Expand All @@ -313,15 +313,23 @@ protected void setWritable() {
if (loop == null) {
return;
}
loop.runOnLoop(() -> loop.selector.registerVirtualWritable(self()));
if (delegatingTargetFD != null) {
delegatingTargetFD.setWritable();
return;
}
loop.runOnLoop(() -> loop.selector.registerVirtualWritable(this));
}

protected void cancelWritable() {
writable = false;
if (loop == null) {
return;
}
loop.runOnLoop(() -> loop.selector.removeVirtualWritable(self()));
if (delegatingTargetFD != null) {
delegatingTargetFD.cancelWritable();
return;
}
loop.runOnLoop(() -> loop.selector.removeVirtualWritable(this));
}

@Override
Expand All @@ -338,14 +346,4 @@ public void onRegister() {
public void onRemove() {
// do nothing
}

protected void tryToRunOnLoop(Runnable r) {
if (loop == null) {
assert Logger.lowLevelDebug("no loop yet, direct run");
r.run();
} else {
assert Logger.lowLevelDebug("run on loop");
loop.runOnLoop(r);
}
}
}
Loading

0 comments on commit c17e377

Please sign in to comment.