Skip to content

Commit 802cf4b

Browse files
committed
[quic|vpws]wrap quic in fd, support quic in vpws
as well as: add AbstractDelegateFD IP now can hold hostname and some other upgrading
1 parent 35f6c8c commit 802cf4b

44 files changed

Lines changed: 1772 additions & 593 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Makefile

Lines changed: 16 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ clean: clean-jar
2121
rm -f ./base/src/main/c/libvfdposix.so
2222
rm -f ./base/src/main/c/libvpxdp.so
2323
rm -f ./base/src/main/c/vfdwindows.dll
24-
rm -f ./base/src/main/c/libvpquic.dylib
25-
rm -f ./base/src/main/c/libvpquic.so
24+
rm -f ./base/src/main/c/libmsquic-java.dylib
25+
rm -f ./base/src/main/c/libmsquic-java.so
2626
cd ./base/src/main/c/xdp && make clean
2727
rm -f ./vproxy
2828
rm -f ./vproxy-*
@@ -46,7 +46,7 @@ clean-docker-plugin-rootfs:
4646
.PHONY: init
4747
init:
4848
git submodule update --init --recursive
49-
cd submodules/ && git clone https://github.com/wkgcass/msquic --branch=modified --depth=1 || exit 0
49+
cd submodules/ && git clone https://github.com/wkgcass/msquic --branch=2.2.4-modified --depth=1 || exit 0
5050
cd submodules/msquic && git submodule update --init --recursive --recommend-shallow
5151

5252
.PHONY: all
@@ -58,7 +58,7 @@ generate-module-info:
5858

5959
.PHONY: jar
6060
jar: generate-module-info
61-
/usr/bin/env bash ./gradlew jar
61+
/usr/bin/env bash ./gradlew shadowJar
6262
zip build/libs/vproxy.jar module-info.class
6363

6464
.PHONY: _add_linux_so_to_zip
@@ -68,15 +68,13 @@ _add_linux_so_to_zip:
6868
cp ./base/src/main/c/libvpxdp.so ./io/vproxy/libvpxdp-$(LINUX_ARCH).so
6969
cp ./base/src/main/c/xdp/libbpf/src/libbpf.so.0.6.0 ./io/vproxy/libbpf-$(LINUX_ARCH).so
7070
cp ./libmsquic.so ./io/vproxy/libmsquic-$(LINUX_ARCH).so
71-
cp ./submodules/msquic-java/core/src/main/c/libmsquic-java.so ./io/vproxy/libmsquic-java-$(LINUX_ARCH).so
72-
cp ./base/src/main/c/libvpquic.so ./io/vproxy/libvpquic-$(LINUX_ARCH).so
71+
cp ./base/src/main/c/libmsquic-java.so ./io/vproxy/libmsquic-java-$(LINUX_ARCH).so
7372
zip build/libs/vproxy.jar \
7473
./io/vproxy/libvfdposix-$(LINUX_ARCH).so \
7574
./io/vproxy/libvpxdp-$(LINUX_ARCH).so \
7675
./io/vproxy/libbpf-$(LINUX_ARCH).so \
7776
./io/vproxy/libmsquic-$(LINUX_ARCH).so \
78-
./io/vproxy/libmsquic-java-$(LINUX_ARCH).so \
79-
./io/vproxy/libvpquic-$(LINUX_ARCH).so
77+
./io/vproxy/libmsquic-java-$(LINUX_ARCH).so
8078
rm -r ./io
8179

8280
.PHONY: jar-with-lib
@@ -87,13 +85,11 @@ jar-with-lib: clean jar vfdposix-linux vpxdp-linux quic-all vfdposix _add_linux_
8785
mkdir -p ./io/vproxy/
8886
cp ./base/src/main/c/libvfdposix.dylib ./io/vproxy/libvfdposix-$(ARCH).dylib
8987
cp ./libmsquic.dylib ./io/vproxy/libmsquic-$(ARCH).dylib
90-
cp ./submodules/msquic-java/core/src/main/c/libmsquic-java.dylib ./io/vproxy/libmsquic-java-$(ARCH).dylib
91-
cp ./base/src/main/c/libvpquic.dylib ./io/vproxy/libvpquic-$(ARCH).dylib
88+
cp ./base/src/main/c/libmsquic-java.dylib ./io/vproxy/libmsquic-java-$(ARCH).dylib
9289
zip build/libs/vproxy.jar \
9390
./io/vproxy/libvfdposix-$(ARCH).dylib \
9491
./io/vproxy/libmsquic-$(ARCH).dylib \
95-
./io/vproxy/libmsquic-java-$(ARCH).dylib \
96-
./io/vproxy/libvpquic-$(ARCH).dylib
92+
./io/vproxy/libmsquic-java-$(ARCH).dylib
9793
rm -r ./io
9894
endif
9995

@@ -135,12 +131,6 @@ xdp-sample-kern:
135131

136132
.PHONY: msquic-java
137133
msquic-java:
138-
cd ./submodules/msquic-java/core/src/main/c && \
139-
MSQUIC_LD=../../../../../msquic/build/bin/Release \
140-
MSQUIC_INC=../../../../../msquic/src/inc \
141-
/usr/bin/env bash ./make-quic.sh
142-
.PHONY: vpquic
143-
vpquic:
144134
cd ./base/src/main/c && \
145135
MSQUIC_LD=../../../../submodules/msquic/build/bin/Release \
146136
MSQUIC_INC=../../../../submodules/msquic/src/inc \
@@ -152,12 +142,11 @@ msquic:
152142
.PHONY: vfdposix-linux
153143
.PHONY: vpxdp-linux
154144
.PHONY: msquic-java-linux
155-
.PHONY: vpquic-linux
156145
.PHONY: msquic-linux
157146
ifeq ($(OS),Linux)
158147
vfdposix-linux: vfdposix
159148
vpxdp-linux: vpxdp
160-
vpquic-linux: vpquic
149+
msquic-java-linux: msquic-java
161150
msquic-linux: msquic
162151
else
163152
vfdposix-linux:
@@ -166,24 +155,22 @@ vpxdp-linux:
166155
docker run --rm -v $(shell pwd):/vproxy vproxyio/compile:latest make vpxdp
167156
msquic-java-linux:
168157
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
169-
vpquic-linux:
170-
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
171158
msquic-linux:
172-
docker run --rm -v $(shell pwd)/submodules/msquic:/msquic vproxyio/msquic-compile:latest make
159+
docker run --rm -v $(shell pwd):/vproxy vproxyio/compile:latest /bin/bash -c 'cd submodules/msquic && make'
173160
endif
174161

175162
.PHONY: quic
176-
quic: vfdposix msquic msquic-java vpquic
163+
quic: vfdposix msquic msquic-java
177164
.PHONY: quic-linux
178-
quic-linux: vfdposix-linux msquic-linux msquic-java-linux vpquic-linux
165+
quic-linux: vfdposix-linux msquic-linux msquic-java-linux
179166
.PHONY: quic-all
180167
quic-all:
181-
rm -rf ./submodules/msquic/build
182-
make quic
183-
cp ./submodules/msquic/build/bin/Release/libmsquic.2.3.0.dylib ./libmsquic.dylib
184168
rm -rf ./submodules/msquic/build
185169
make quic-linux
186-
cp ./submodules/msquic/build/bin/Release/libmsquic.so.2.3.0 ./libmsquic.so
170+
cp ./submodules/msquic/build/bin/Release/libmsquic.so.2.2.4 ./libmsquic.so
171+
rm -rf ./submodules/msquic/build
172+
make quic
173+
cp ./submodules/msquic/build/bin/Release/libmsquic.2.2.4.dylib ./libmsquic.dylib
187174

188175
.PHONY: vfdwindows
189176
vfdwindows:

base/src/main/c/make-quic.sh

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ fi
1818

1919
os=`uname`
2020

21-
target="vpquic"
21+
target="msquic-java"
2222
include_platform_dir=""
2323
cflags=""
2424

@@ -52,11 +52,18 @@ gcc -std=gnu11 -O2 \
5252
-I ./dep/ae \
5353
-I "$MSQUIC_INC" \
5454
-I "../c-generated" \
55+
-I "../../../../submodules/msquic-java/core/src/main/c-generated" \
5556
-L "$MSQUIC_LD" \
5657
-DQUIC_ENABLE_CUSTOM_EVENT_LOOP=1 \
5758
$cflags \
5859
-shared -Werror -lc -lpthread $NO_AS_NEEDED "-lmsquic" $AS_NEEDED -fPIC \
5960
io_vproxy_msquic_MsQuic.c \
6061
../c-generated/io_vproxy_msquic_CxPlatExecutionState.extra.c \
6162
../c-generated/io_vproxy_msquic_CxPlatProcessEventLocals.extra.c \
63+
../c-generated/pni.c \
64+
../../../../submodules/msquic-java/core/src/main/c/io_vproxy_msquic_MsQuic.c \
65+
../../../../submodules/msquic-java/core/src/main/c/inline.c \
66+
../../../../submodules/msquic-java/core/src/main/c-generated/io_vproxy_msquic_MsQuicModUpcall.c \
67+
../../../../submodules/msquic-java/core/src/main/c-generated/io_vproxy_msquic_MsQuicUpcall.c \
68+
../../../../submodules/msquic-java/core/src/main/c-generated/io_vproxy_msquic_QuicAddr.extra.c \
6269
-o "$target"

base/src/main/java/io/vproxy/base/connection/ConnectableConnection.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import io.vproxy.base.util.LogType;
77
import io.vproxy.base.util.Logger;
88
import io.vproxy.base.util.RingBuffer;
9-
import io.vproxy.vfd.FDProvider;
109
import io.vproxy.vfd.IPPort;
1110
import io.vproxy.vfd.SocketFD;
1211
import io.vproxy.vfd.UDSPath;
@@ -45,14 +44,14 @@ public static ConnectableConnection create(IPPort remote,
4544
if (remote instanceof UDSPath) {
4645
return createUDS(remote, opts, inBuffer, outBuffer);
4746
}
48-
SocketFD channel = FDProvider.get().openSocketFD();
47+
SocketFD channel = opts.getFds().openSocketFD();
4948
return create(channel, remote, opts, inBuffer, outBuffer);
5049
}
5150

5251
private static ConnectableConnection createUDS(IPPort remote,
5352
ConnectionOpts opts,
5453
RingBuffer inBuffer, RingBuffer outBuffer) throws IOException {
55-
var fds = FDProvider.get().getProvided();
54+
var fds = opts.getFds();
5655
if (!(fds instanceof PosixFDs)) {
5756
throw new IOException("unix domain socket is not supported by " + fds + ", use -Dvfd=posix");
5857
}

base/src/main/java/io/vproxy/base/connection/ConnectionOpts.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package io.vproxy.base.connection;
22

33
import io.vproxy.base.Config;
4+
import io.vproxy.vfd.FDProvider;
5+
import io.vproxy.vfd.FDs;
46

57
public class ConnectionOpts {
68
int timeout = Config.tcpTimeout;
9+
private FDs fds;
710

811
public static ConnectionOpts getDefault() {
912
return DefaultConnectionOpts.defaultConnectionOpts;
@@ -16,6 +19,17 @@ public ConnectionOpts setTimeout(int timeout) {
1619
this.timeout = timeout;
1720
return this;
1821
}
22+
23+
public ConnectionOpts setFDs(FDs fds) {
24+
this.fds = fds;
25+
return this;
26+
}
27+
28+
public FDs getFds() {
29+
if (fds == null)
30+
return FDProvider.get().getProvided();
31+
return fds;
32+
}
1933
}
2034

2135
final class DefaultConnectionOpts extends ConnectionOpts {

base/src/main/java/io/vproxy/base/connection/NetEventLoop.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,7 @@ private NetEventLoopUtils() {
241241
}
242242

243243
static void callExceptionEvent(ConnectionHandlerContext cctx, IOException err) {
244+
assert Logger.lowLevelDebug(STR."call exception event for \{cctx.connection}: \{err}");
244245
cctx.handler.exception(cctx, err);
245246
if (!cctx.connection.isClosed()) {
246247
cctx.connection.close(true);

base/src/main/java/io/vproxy/base/dns/DNSClient.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -386,9 +386,11 @@ private void getAllByName0(String domain, boolean ipv4, Callback<List<IP>, Unkno
386386
List<IP> addresses = new ArrayList<>();
387387
for (DNSResource answer : packet.answers) {
388388
if (answer.type == DNSType.A) {
389-
addresses.add(((A) answer.rdata).address);
389+
var addr = ((A) answer.rdata).address;
390+
addresses.add(IP.from(domain, addr.getAddress()));
390391
} else if (answer.type == DNSType.AAAA) {
391-
addresses.add(((AAAA) answer.rdata).address);
392+
var addr = ((AAAA) answer.rdata).address;
393+
addresses.add(IP.from(domain, addr.getAddress()));
392394
} else {
393395
assert Logger.lowLevelDebug("ignore answer with type " + answer.type);
394396
}

base/src/main/java/io/vproxy/base/selector/wrap/AbstractBaseVirtualSocketFD.java

Lines changed: 38 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
import io.vproxy.base.selector.SelectorEventLoop;
44
import io.vproxy.base.util.Logger;
5-
import io.vproxy.base.util.anno.Comment;
6-
import io.vproxy.base.util.promise.Promise;
75
import io.vproxy.vfd.FD;
86
import io.vproxy.vfd.IPPort;
97
import io.vproxy.vfd.SocketFD;
@@ -13,10 +11,9 @@
1311
import java.net.SocketOption;
1412
import java.net.StandardSocketOptions;
1513
import java.nio.ByteBuffer;
16-
import java.util.function.Function;
14+
import java.util.Objects;
1715

18-
public abstract class AbstractBaseVirtualSocketFD extends AbstractBaseFD implements SocketFD, VirtualFD {
19-
private final VirtualFD _self;
16+
public abstract class AbstractBaseVirtualSocketFD extends AbstractBaseFD implements SocketFD, VirtualFD, DelegatingSourceFD {
2017
private SelectorEventLoop loop;
2118
protected final boolean isAccepted;
2219

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

30+
private boolean shutdownOutputIsCalled;
3331
private boolean eof;
3432
private IOException error;
3533

3634
public AbstractBaseVirtualSocketFD(boolean isAccepted, IPPort local, IPPort remote) {
37-
this(null, isAccepted, local, remote);
38-
}
39-
40-
@Comment("this constructor will make an util object")
41-
public AbstractBaseVirtualSocketFD(VirtualFD _self, boolean isAccepted, IPPort local, IPPort remote) {
42-
this._self = _self;
4335
this.isAccepted = isAccepted;
4436
this.connected = isAccepted;
4537
this.local = local;
@@ -98,6 +90,11 @@ public boolean isConnected() {
9890
public void shutdownOutput() throws IOException {
9991
checkOpen();
10092
checkConnected();
93+
shutdownOutputIsCalled = true;
94+
}
95+
96+
public boolean isShutdownOutput() {
97+
return shutdownOutputIsCalled;
10198
}
10299

103100
@Override
@@ -161,7 +158,7 @@ public int read(ByteBuffer dst) throws IOException {
161158

162159
protected abstract int doRead(ByteBuffer dst) throws IOException;
163160

164-
public void setEof() {
161+
protected void setEof() {
165162
this.eof = true;
166163
setReadable();
167164
}
@@ -227,7 +224,7 @@ public <T> void setOption(SocketOption<T> name, T value) {
227224

228225
@Override
229226
public FD real() {
230-
throw new UnsupportedOperationException();
227+
return null;
231228
}
232229

233230
@Override
@@ -262,17 +259,6 @@ private void superClose() {
262259

263260
protected abstract void doClose(boolean reset);
264261

265-
protected void asyncClose(Function<Boolean, Promise<Void>> promiseFunc) {
266-
if (closed) {
267-
return;
268-
}
269-
closed = true;
270-
promiseFunc.apply(resetWhenClosing).then(v -> {
271-
closeSelf();
272-
return Promise.resolve(null);
273-
});
274-
}
275-
276262
@Override
277263
public String toString() {
278264
return formatToString();
@@ -284,8 +270,14 @@ public String toString() {
284270
// events
285271
// ======
286272

287-
private VirtualFD self() {
288-
return _self == null ? this : _self;
273+
private DelegatingTargetFD delegatingTargetFD;
274+
275+
@Override
276+
public void setDelegatingTargetFD(DelegatingTargetFD fd) {
277+
Objects.requireNonNull(fd);
278+
if (delegatingTargetFD != null)
279+
throw new IllegalStateException("delegatingTargetFD is already set");
280+
delegatingTargetFD = fd;
289281
}
290282

291283
private boolean readable = false;
@@ -295,15 +287,23 @@ protected void setReadable() {
295287
if (loop == null) {
296288
return;
297289
}
298-
loop.runOnLoop(() -> loop.selector.registerVirtualReadable(self()));
290+
if (delegatingTargetFD != null) {
291+
delegatingTargetFD.setReadable();
292+
return;
293+
}
294+
loop.runOnLoop(() -> loop.selector.registerVirtualReadable(this));
299295
}
300296

301297
protected void cancelReadable() {
302298
readable = false;
303299
if (loop == null) {
304300
return;
305301
}
306-
loop.runOnLoop(() -> loop.selector.removeVirtualReadable(self()));
302+
if (delegatingTargetFD != null) {
303+
delegatingTargetFD.cancelReadable();
304+
return;
305+
}
306+
loop.runOnLoop(() -> loop.selector.removeVirtualReadable(this));
307307
}
308308

309309
private boolean writable = false;
@@ -313,15 +313,23 @@ protected void setWritable() {
313313
if (loop == null) {
314314
return;
315315
}
316-
loop.runOnLoop(() -> loop.selector.registerVirtualWritable(self()));
316+
if (delegatingTargetFD != null) {
317+
delegatingTargetFD.setWritable();
318+
return;
319+
}
320+
loop.runOnLoop(() -> loop.selector.registerVirtualWritable(this));
317321
}
318322

319323
protected void cancelWritable() {
320324
writable = false;
321325
if (loop == null) {
322326
return;
323327
}
324-
loop.runOnLoop(() -> loop.selector.removeVirtualWritable(self()));
328+
if (delegatingTargetFD != null) {
329+
delegatingTargetFD.cancelWritable();
330+
return;
331+
}
332+
loop.runOnLoop(() -> loop.selector.removeVirtualWritable(this));
325333
}
326334

327335
@Override
@@ -338,14 +346,4 @@ public void onRegister() {
338346
public void onRemove() {
339347
// do nothing
340348
}
341-
342-
protected void tryToRunOnLoop(Runnable r) {
343-
if (loop == null) {
344-
assert Logger.lowLevelDebug("no loop yet, direct run");
345-
r.run();
346-
} else {
347-
assert Logger.lowLevelDebug("run on loop");
348-
loop.runOnLoop(r);
349-
}
350-
}
351349
}

0 commit comments

Comments
 (0)