Skip to content

Commit 80ce4a2

Browse files
committed
Experiment: seed ignore buffer and send 1st fake packet instantly
1 parent c0619e3 commit 80ce4a2

3 files changed

Lines changed: 54 additions & 25 deletions

File tree

proxy/proxy.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ type VisionWriter struct {
215215
addons *Addons
216216
trafficState *TrafficState
217217
ctx context.Context
218-
writeOnceUserUUID []byte
218+
writeOnceUserUUID *[]byte
219219
scheduler *Scheduler
220220
}
221221

@@ -227,8 +227,8 @@ func NewVisionWriter(writer buf.Writer, addon *Addons, state *TrafficState, cont
227227
addons: addon,
228228
trafficState: state,
229229
ctx: context,
230-
writeOnceUserUUID: w,
231-
scheduler: NewScheduler(writer, addon, state, context),
230+
writeOnceUserUUID: &w,
231+
scheduler: NewScheduler(writer, addon, state, &w, context),
232232
}
233233
}
234234

@@ -239,7 +239,7 @@ func (w *VisionWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
239239
}
240240
if w.trafficState.IsPadding && ShouldStartSeed(w.addons, w.trafficState){
241241
if len(mb) == 1 && mb[0] == nil {
242-
mb[0] = XtlsPadding(nil, CommandPaddingContinue, &w.writeOnceUserUUID, true, w.addons, w.ctx) // we do a long padding to hide vless header
242+
mb[0] = XtlsPadding(nil, CommandPaddingContinue, w.writeOnceUserUUID, true, w.addons, w.ctx) // we do a long padding to hide vless header
243243
} else {
244244
mb = ReshapeMultiBuffer(w.ctx, mb)
245245
longPadding := w.trafficState.IsTLS
@@ -258,12 +258,12 @@ func (w *VisionWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
258258
w.trafficState.IsPadding = false
259259
}
260260
}
261-
mb[i] = XtlsPadding(b, command, &w.writeOnceUserUUID, true, w.addons, w.ctx)
261+
mb[i] = XtlsPadding(b, command, w.writeOnceUserUUID, true, w.addons, w.ctx)
262262
longPadding = false
263263
continue
264264
} else if !w.trafficState.IsTLS12orAbove && ShouldStopSeed(w.addons, w.trafficState) {
265265
w.trafficState.IsPadding = false
266-
mb[i] = XtlsPadding(b, CommandPaddingEnd, &w.writeOnceUserUUID, longPadding, w.addons, w.ctx)
266+
mb[i] = XtlsPadding(b, CommandPaddingEnd, w.writeOnceUserUUID, longPadding, w.addons, w.ctx)
267267
break
268268
}
269269
var command byte = CommandPaddingContinue
@@ -273,7 +273,7 @@ func (w *VisionWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
273273
command = CommandPaddingDirect
274274
}
275275
}
276-
mb[i] = XtlsPadding(b, command, &w.writeOnceUserUUID, longPadding, w.addons, w.ctx)
276+
mb[i] = XtlsPadding(b, command, w.writeOnceUserUUID, longPadding, w.addons, w.ctx)
277277
}
278278
}
279279
}

proxy/scheduler.go

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,25 +12,29 @@ import (
1212
)
1313

1414
type Scheduler struct {
15-
Buffer chan buf.MultiBuffer
16-
Trigger chan int
17-
Error chan error
18-
bufferReadLock *sync.Mutex
19-
writer buf.Writer
20-
addons *Addons
21-
trafficState *TrafficState
22-
ctx context.Context
15+
Buffer chan buf.MultiBuffer
16+
Trigger chan int
17+
Error chan error
18+
closed chan int
19+
bufferReadLock *sync.Mutex
20+
writer buf.Writer
21+
addons *Addons
22+
trafficState *TrafficState
23+
writeOnceUserUUID *[]byte
24+
ctx context.Context
2325
}
2426

25-
func NewScheduler(w buf.Writer, addon *Addons, state *TrafficState, context context.Context) *Scheduler {
27+
func NewScheduler(w buf.Writer, addon *Addons, state *TrafficState, userUUID *[]byte, context context.Context) *Scheduler {
2628
var s = Scheduler{
2729
Buffer: make(chan buf.MultiBuffer, 100),
2830
Trigger: make(chan int),
2931
Error: make(chan error, 100),
32+
closed: make(chan int),
3033
bufferReadLock: new(sync.Mutex),
3134
writer: w,
3235
addons: addon,
3336
trafficState: state,
37+
writeOnceUserUUID: userUUID,
3438
ctx: context,
3539
}
3640
go s.mainLoop()
@@ -42,6 +46,9 @@ func NewScheduler(w buf.Writer, addon *Addons, state *TrafficState, context cont
4246

4347
func(s *Scheduler) mainLoop() {
4448
for trigger := range s.Trigger {
49+
if len(s.closed) > 0 {
50+
return
51+
}
4552
go func() { // each trigger has independent delay, trigger does not block
4653
var d = 0 * time.Millisecond
4754
if s.addons.Delay != nil {
@@ -58,12 +65,31 @@ func(s *Scheduler) mainLoop() {
5865
if sending > 0 {
5966
errors.LogDebug(s.ctx, "Scheduler Trigger for ", sending, " buffer(s) with ", d, " ", trigger)
6067
for i := 0; i<sending; i++ {
61-
s.Error <- s.writer.WriteMultiBuffer(<-s.Buffer)
68+
err := s.writer.WriteMultiBuffer(<-s.Buffer)
69+
if err != nil {
70+
s.Error <- err
71+
s.closed <- 1
72+
return
73+
}
6274
}
63-
} else if trigger > 0 {
75+
} else if trigger > 0 && s.trafficState.IsPadding && ShouldStartSeed(s.addons, s.trafficState) && !ShouldStopSeed(s.addons, s.trafficState) {
6476
errors.LogDebug(s.ctx, "Scheduler Trigger for fake buffer with ", d, " ", trigger)
77+
s.trafficState.NumberOfPacketSent += 1
6578
mb := make(buf.MultiBuffer, 1)
66-
s.Error <- s.writer.WriteMultiBuffer(mb)
79+
mb[0] = XtlsPadding(nil, CommandPaddingContinue, s.writeOnceUserUUID, true, s.addons, s.ctx)
80+
s.trafficState.ByteSent += int64(mb.Len())
81+
if s.trafficState.StartTime.IsZero() {
82+
s.trafficState.StartTime = time.Now()
83+
}
84+
err := s.writer.WriteMultiBuffer(mb)
85+
if err != nil {
86+
s.Error <- err
87+
s.closed <- 1
88+
return
89+
}
90+
if buffered, ok := s.writer.(*buf.BufferedWriter); ok {
91+
buffered.SetBuffered(false)
92+
}
6793
}
6894
s.bufferReadLock.Unlock()
6995
}()
@@ -72,7 +98,10 @@ func(s *Scheduler) mainLoop() {
7298

7399
func(s *Scheduler) exampleIndependentScheduler() {
74100
for {
75-
time.Sleep(500 * time.Millisecond)
101+
if len(s.closed) > 0 {
102+
return
103+
}
76104
s.Trigger <- 1 // send fake buffer if no pending
105+
time.Sleep(500 * time.Millisecond)
77106
}
78107
}

proxy/vless/encoding/addons.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -189,11 +189,11 @@ func PopulateSeed(seed string, addons *proxy.Addons) {
189189
LongMin: 900,
190190
LongMax: 1400,
191191
}
192-
addons.Delay = &proxy.DelayConfig{
193-
IsRandom: true,
194-
MinMillis: 100,
195-
MaxMillis: 500,
196-
}
192+
// addons.Delay = &proxy.DelayConfig{
193+
// IsRandom: true,
194+
// MinMillis: 100,
195+
// MaxMillis: 500,
196+
// }
197197
addons.Scheduler = &proxy.SchedulerConfig{
198198
TimeoutMillis: 600,
199199
}

0 commit comments

Comments
 (0)