girl 0.67.0 → 0.71.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of girl might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9f8e5816785b5a946fbf35da638fc06a6e496704e3271153640ceb4301a27a84
4
- data.tar.gz: 12813e957b5cdb5cbf726b5078792651197c5e84cfeaa4251c491897e6017a56
3
+ metadata.gz: 82b6edf01d2b2157f11757d1a39b2f774507f114e0638aed6192ee19b29b03d5
4
+ data.tar.gz: 6253f10b1525763929b083e51a7693516e82ab34d2dfd374beae48e4305cf550
5
5
  SHA512:
6
- metadata.gz: 9d3721a009010761bbcc196a9e650e801cecdd287410cd118981e0ceaeb1225d720f592fedfb988a5341229e9eeef53c94ab949a9562b3ad659d53d40481b9ca
7
- data.tar.gz: 18b23dc9a36b43d6a9aeda602fea61398d236d1fc2baf680d312f048e2f5270479aeb88b2b7c6b445ab98e146c8444624434dfc3a91f3608708af85afb598e22
6
+ metadata.gz: c4d9edc69891b09e920bf27b6ad664f1243b41a182192fe26f1264ef83ebdd733c77e19d833d89f379cd63b98de62ec46a459b5be7a2238372ab0347298c3e6f
7
+ data.tar.gz: f3e6491a9267fb9eeef29457a6be5a74da026f1d7a37a89391eb8dec8b160e1a3d7d2eb5170acefd5aabcc792ac45e5c9bf0b8d49661654b158e5f3012d1d75a
@@ -19,17 +19,12 @@ girl.gemspec
19
19
  lib/girl.rb
20
20
  lib/girl/custom.rb
21
21
  lib/girl/head.rb
22
- lib/girl/hex.rb
23
22
  lib/girl/proxy_custom.rb
24
23
  lib/girl/proxy_worker.rb
25
24
  lib/girl/proxy.rb
26
25
  lib/girl/proxyd_custom.rb
27
26
  lib/girl/proxyd_worker.rb
28
27
  lib/girl/proxyd.rb
29
- lib/girl/resolv.rb
30
- lib/girl/resolvd.rb
31
- lib/girl/tun.rb
32
- lib/girl/tund.rb
33
28
  lib/girl/udp.rb
34
29
  lib/girl/udpd.rb
35
30
  lib/girl/version.rb
@@ -1,18 +1,17 @@
1
1
  module Girl
2
- PACK_SIZE = 1328 # 包大小 1400(console MTU) - 8(PPPoE header) - 40(IPv6 header) - 8(UDP header) - 8(pack id) - 8(src id) = 1328
3
- CHUNK_SIZE = PACK_SIZE * 1000 # 块大小
4
- WBUFFS_LIMIT = 1000 # 写前上限,超过上限结一个块
5
- WMEMS_LIMIT = 100_000 # 写后上限,达到上限暂停写
6
- RESUME_BELOW = 50_000 # 降到多少以下恢复写
7
- EXPIRE_NEW = 10 # 创建之后多久没有流量进来,过期
8
- EXPIRE_AFTER = 300 # 多久没有新流量,过期
9
- CHECK_EXPIRE_INTERVAL = 30 # 检查过期间隔
10
- HEARTBEAT_INTERVAL = 30 # 心跳间隔
11
- STATUS_INTERVAL = 0.5 # 发送状态间隔
12
- SEND_STATUS_UNTIL = 10 # 持续的告之对面状态,直到没有流量往来,持续多少秒
13
- BREAK_SEND_MISS = 10_000 # miss包个数上限,达到上限忽略要后面的段,可控碎片缓存
14
- CONFUSE_UNTIL = 5 # 混淆前几个包
15
- RESOLV_CACHE_EXPIRE = 300 # dns查询结果缓存多久过期
2
+ PACK_SIZE = 1328 # 包大小 1400(console MTU) - 8(PPPoE header) - 40(IPv6 header) - 8(UDP header) - 8(pack id) - 8(src id) = 1328
3
+ CHUNK_SIZE = PACK_SIZE * 1000 # 块大小
4
+ WBUFFS_LIMIT = 1000 # 写前上限,超过上限结一个块
5
+ WMEMS_LIMIT = 100_000 # 写后上限,达到上限暂停写
6
+ RESUME_BELOW = 50_000 # 降到多少以下恢复写
7
+ EXPIRE_NEW = 10 # 创建之后多久没有流量进来,过期
8
+ EXPIRE_AFTER = 300 # 多久没有新流量,过期
9
+ CHECK_EXPIRE_INTERVAL = 30 # 检查过期间隔
10
+ STATUS_INTERVAL = 0.5 # 发送状态间隔
11
+ SEND_STATUS_UNTIL = 10 # 持续的告之对面状态,直到没有流量往来,持续多少秒
12
+ BREAK_SEND_MISS = 10_000 # miss包个数上限,达到上限忽略要后面的段,可控碎片缓存
13
+ CONFUSE_UNTIL = 5 # 混淆前几个包
14
+ RESOLV_CACHE_EXPIRE = 300 # dns查询结果缓存多久过期
16
15
  TUND_PORT = 1
17
16
  HEARTBEAT = 2
18
17
  A_NEW_SOURCE = 3
@@ -26,8 +25,6 @@ module Girl
26
25
  GOT_FIN2 = 11
27
26
  TUND_FIN = 12
28
27
  TUN_FIN = 13
29
- CTL_CLOSE = 1
30
- CTL_RESUME = 2
31
28
  HTTP_OK = "HTTP/1.1 200 OK\r\n\r\n"
32
29
  # https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml
33
30
  RESERVED_ROUTE = <<EOF
@@ -23,29 +23,37 @@ require 'socket'
23
23
  #
24
24
  # tun-tund:
25
25
  #
26
- # Q>: 0 ctlmsg -> C: 2 heartbeat -> C: random char
27
- # 3 a new src -> Q>: src_id -> encoded destination address
28
- # 4 paired -> Q>: src_id -> n: dst_port
29
- # 5 dst status -> n: dst_port -> Q>Q>: biggest_dst_pack_id continue_src_pack_id
30
- # 6 src status -> Q>: src_id -> Q>Q>: biggest_src_pack_id continue_dst_pack_id
31
- # 7 miss -> Q>: src_id/n: dst_port -> Q>Q>: pack_id_begin pack_id_end
32
- # 8 fin1 -> Q>: src_id/n: dst_port -> Q>Q>: biggest_src_pack_id continue_dst_pack_id / biggest_dst_pack_id continue_src_pack_id
26
+ # Q>: 0 ctlmsg -> C: 2 heartbeat -> C: random char
27
+ # 3 a new source -> Q>: src id -> encoded destination address
28
+ # 4 paired -> Q>: src id -> n: dst port
29
+ # 5 dest status -> n: dst port -> Q>: biggest relayed dst pack id -> Q>: continue src pack id
30
+ # 6 source status -> Q>: src id -> Q>: biggest relayed src pack id -> Q>: continue dst pack id
31
+ # 7 miss -> Q>/n: src id / dst port -> Q>: pack id begin -> Q>: pack id end
32
+ # 8 fin1 -> Q>/n: src id / dst port -> Q>: biggest src pack id / biggest dst pack id -> Q>: continue dst pack id / continue src pack id
33
33
  # 9 not use
34
- # 10 fin2 -> Q>: src_id/n: dst_port
34
+ # 10 fin2 -> Q>/n: src id / dst port
35
35
  # 11 not use
36
36
  # 12 tund fin
37
37
  # 13 tun fin
38
38
  #
39
- # Q>: 1+ pack_id -> Q>: src_id/n: dst_port -> traffic
39
+ # Q>: 1+ pack_id -> Q>/n: src id / dst port -> traffic
40
40
  #
41
41
  # close logic
42
42
  # ===========
43
43
  #
44
44
  # 1-1. after close src -> dst closed ? no -> send fin1
45
- # 1-2. recv fin2 -> del src ext
45
+ # 1-2. tun recv fin2 -> del src ext
46
46
  #
47
- # 2-1. recv traffic/fin1/dst status -> dst closed and all traffic received ? -> close src after write
48
- # 2-2. after close src -> dst closed ? yes -> del src ext -> send fin2
47
+ # 2-1. tun recv fin1 -> all traffic received ? -> close src after write
48
+ # 2-2. tun recv traffic -> dst closed and all traffic received ? -> close src after write
49
+ # 2-3. after close src -> dst closed ? yes -> del src ext -> send fin2
50
+ #
51
+ # 3-1. after close dst -> src closed ? no -> send fin1
52
+ # 3-2. tund recv fin2 -> del dst ext
53
+ #
54
+ # 4-1. tund recv fin1 -> all traffic received ? -> close dst after write
55
+ # 4-2. tund recv traffic -> src closed and all traffic received ? -> close dst after write
56
+ # 4-3. after close dst -> src closed ? yes -> del dst ext -> send fin2
49
57
  #
50
58
  module Girl
51
59
  class Proxy
@@ -121,21 +129,19 @@ module Girl
121
129
  end
122
130
 
123
131
  src_chunk_dir = File.join( proxy_tmp_dir, 'src.chunk' )
124
- dst_chunk_dir = File.join( proxy_tmp_dir, 'dst.chunk' )
125
- tun_chunk_dir = File.join( proxy_tmp_dir, 'tun.chunk' )
126
-
127
- unless Dir.exist?( proxy_tmp_dir )
128
- Dir.mkdir( proxy_tmp_dir )
129
- end
130
132
 
131
133
  unless Dir.exist?( src_chunk_dir )
132
134
  Dir.mkdir( src_chunk_dir )
133
135
  end
134
136
 
137
+ dst_chunk_dir = File.join( proxy_tmp_dir, 'dst.chunk' )
138
+
135
139
  unless Dir.exist?( dst_chunk_dir )
136
140
  Dir.mkdir( dst_chunk_dir )
137
141
  end
138
142
 
143
+ tun_chunk_dir = File.join( proxy_tmp_dir, 'tun.chunk' )
144
+
139
145
  unless Dir.exist?( tun_chunk_dir )
140
146
  Dir.mkdir( tun_chunk_dir )
141
147
  end
@@ -168,8 +168,7 @@ module Girl
168
168
 
169
169
  @tun_info[ :src_exts ].each do | src_id, src_ext |
170
170
  if src_ext[ :dst_port ] && ( now - src_ext[ :last_continue_at ] < SEND_STATUS_UNTIL )
171
- # puts "debug2 ctl send status biggest #{ src_ext[ :biggest_pack_id ] } continue dst #{ src_ext[ :continue_dst_pack_id ] }"
172
- data = [ 0, SOURCE_STATUS, src_id, src_ext[ :biggest_pack_id ], src_ext[ :continue_dst_pack_id ] ].pack( 'Q>CQ>Q>Q>' )
171
+ data = [ 0, SOURCE_STATUS, src_id, src_ext[ :relay_pack_id ], src_ext[ :continue_dst_pack_id ] ].pack( 'Q>CQ>Q>Q>' )
173
172
  add_tun_ctlmsg( data )
174
173
  need_trigger = true
175
174
  end
@@ -180,11 +179,6 @@ module Girl
180
179
  puts "p#{ Process.pid } #{ Time.new } resume tun"
181
180
  @tun_info[ :paused ] = false
182
181
  add_write( @tun )
183
-
184
- @tun_info[ :src_exts ].each do | _, src_ext |
185
- add_write( src_ext[ :src ] )
186
- end
187
-
188
182
  need_trigger = true
189
183
  end
190
184
 
@@ -322,8 +316,8 @@ module Girl
322
316
  port: port, # 端口
323
317
  ctlmsg_rbuffs: [], # 还没配上tund,暂存的ctlmsg
324
318
  ctlmsgs: [], # [ to_addr, data ]
325
- wbuffs: [], # 写前缓存 [ src_id, data ]
326
- caches: [], # 块读出缓存 [ src_id, data ]
319
+ wbuffs: [], # 写前缓存 [ src_id, pack_id, data ]
320
+ caches: [], # 块读出缓存 [ src_id, pack_id, data ]
327
321
  chunks: [], # 块队列 filename
328
322
  spring: 0, # 块后缀,结块时,如果块队列不为空,则自增,为空,则置为0
329
323
  tund_addr: nil, # tund地址
@@ -388,17 +382,13 @@ module Girl
388
382
  src_info[ :dst ] = dst
389
383
 
390
384
  if src_info[ :proxy_proto ] == :http
391
- datas = src_info[ :rbuffs ]
392
-
393
- if datas.empty?
394
- # CONNECT
385
+ if src_info[ :is_connect ]
395
386
  # puts "debug1 add src wbuff http ok"
396
387
  add_src_wbuff( src, HTTP_OK )
397
388
  else
398
- # not CONNECT
399
389
  # puts "debug1 add src rbuffs to dst wbuff"
400
390
 
401
- datas.each do | data |
391
+ src_info[ :rbuffs ].each do | _, data |
402
392
  add_dst_wbuff( dst, data )
403
393
  end
404
394
  end
@@ -420,11 +410,11 @@ module Girl
420
410
  dst_port: nil, # 远端dst端口
421
411
  wmems: {}, # 写后 pack_id => data
422
412
  send_ats: {}, # 上一次发出时间 pack_id => send_at
423
- biggest_pack_id: 0, # 发到几
413
+ relay_pack_id: 0, # 转发到几
424
414
  continue_dst_pack_id: 0, # 收到几
425
415
  pieces: {}, # 跳号包 dst_pack_id => data
426
- is_dst_closed: false, # 对面是否已关闭
427
- biggest_dst_pack_id: 0, # 对面发到几
416
+ is_dst_closed: false, # dst是否已关闭
417
+ biggest_dst_pack_id: 0, # dst最大包号码
428
418
  completed_pack_id: 0, # 完成到几(对面收到几)
429
419
  last_continue_at: Time.new # 创建,或者上一次收到连续流量,或者发出新包的时间
430
420
  }
@@ -496,17 +486,17 @@ module Girl
496
486
  ##
497
487
  # add tun wbuff
498
488
  #
499
- def add_tun_wbuff( src_id, data )
500
- @tun_info[ :wbuffs ] << [ src_id, data ]
489
+ def add_tun_wbuff( src_id, pack_id, data )
490
+ @tun_info[ :wbuffs ] << [ src_id, pack_id, data ]
501
491
 
502
492
  if @tun_info[ :wbuffs ].size >= WBUFFS_LIMIT
503
493
  spring = @tun_info[ :chunks ].size > 0 ? ( @tun_info[ :spring ] + 1 ) : 0
504
494
  filename = "#{ Process.pid }-#{ @tun_info[ :port ] }.#{ spring }"
505
495
  chunk_path = File.join( @tun_chunk_dir, filename )
506
- wbuffs = @tun_info[ :wbuffs ].map{ | _src_id, _data | [ [ _src_id, _data.bytesize ].pack( 'Q>n' ), _data ].join }
496
+ datas = @tun_info[ :wbuffs ].map{ | _src_id, _pack_id, _data | [ [ _src_id, _pack_id, _data.bytesize ].pack( 'Q>Q>n' ), _data ].join }
507
497
 
508
498
  begin
509
- IO.binwrite( chunk_path, wbuffs.join )
499
+ IO.binwrite( chunk_path, datas.join )
510
500
  rescue Errno::ENOSPC => e
511
501
  puts "p#{ Process.pid } #{ Time.new } #{ e.class }, close tun"
512
502
  set_is_closing( @tun )
@@ -592,7 +582,7 @@ module Girl
592
582
  # add write
593
583
  #
594
584
  def add_write( sock )
595
- unless @writes.include?( sock )
585
+ if sock && !sock.closed? && !@writes.include?( sock )
596
586
  @writes << sock
597
587
  end
598
588
  end
@@ -645,13 +635,13 @@ module Girl
645
635
  return if src_ext.nil? || src_ext[ :dst_port ].nil?
646
636
 
647
637
  if src_ext[ :is_dst_closed ]
648
- # puts "debug1 2-2. after close src -> dst closed ? yes -> del src ext -> send fin2"
638
+ # puts "debug1 2-3. after close src -> dst closed ? yes -> del src ext -> send fin2"
649
639
  del_src_ext( src_id )
650
640
  data = [ 0, FIN2, src_id ].pack( 'Q>CQ>' )
651
641
  add_tun_ctlmsg( data )
652
642
  else
653
643
  # puts "debug1 1-1. after close src -> dst closed ? no -> send fin1"
654
- data = [ 0, FIN1, src_id, src_ext[ :biggest_pack_id ], src_ext[ :continue_dst_pack_id ] ].pack( 'Q>CQ>Q>Q>' )
644
+ data = [ 0, FIN1, src_id, src_info[ :biggest_pack_id ], src_ext[ :continue_dst_pack_id ] ].pack( 'Q>CQ>Q>Q>' )
655
645
  add_tun_ctlmsg( data )
656
646
  end
657
647
  elsif src_info[ :proxy_type ] == :direct
@@ -768,15 +758,7 @@ module Girl
768
758
 
769
759
  if data.empty?
770
760
  if src_info[ :is_closing ]
771
- if @tun.closed?
772
- close_src( src )
773
- elsif @tun_info[ :paused ]
774
- @writes.delete( src )
775
- elsif !@writes.include?( @tun )
776
- # 转发光了,正式关闭
777
- # puts "debug2 close src after tun empty"
778
- close_src( src )
779
- end
761
+ close_src( src )
780
762
  else
781
763
  @writes.delete( src )
782
764
  end
@@ -907,7 +889,7 @@ module Girl
907
889
 
908
890
  # 取写前
909
891
  if @tun_info[ :caches ].any?
910
- src_id, data = @tun_info[ :caches ].first
892
+ src_id, pack_id, data = @tun_info[ :caches ].first
911
893
  from = :caches
912
894
  elsif @tun_info[ :chunks ].any?
913
895
  path = File.join( @tun_chunk_dir, @tun_info[ :chunks ].shift )
@@ -924,16 +906,16 @@ module Girl
924
906
  caches = []
925
907
 
926
908
  until data.empty?
927
- _src_id, pack_size = data[ 0, 10 ].unpack( 'Q>n' )
928
- caches << [ _src_id, data[ 10, pack_size ] ]
929
- data = data[ ( 10 + pack_size )..-1 ]
909
+ _src_id, _pack_id, pack_size = data[ 0, 18 ].unpack( 'Q>Q>n' )
910
+ caches << [ _src_id, _pack_id, data[ 18, pack_size ] ]
911
+ data = data[ ( 18 + pack_size )..-1 ]
930
912
  end
931
913
 
932
914
  @tun_info[ :caches ] = caches
933
- src_id, data = caches.first
915
+ src_id, pack_id, data = caches.first
934
916
  from = :caches
935
917
  elsif @tun_info[ :wbuffs ].any?
936
- src_id, data = @tun_info[ :wbuffs ].first
918
+ src_id, pack_id, data = @tun_info[ :wbuffs ].first
937
919
  from = :wbuffs
938
920
  else
939
921
  @writes.delete( tun )
@@ -943,8 +925,6 @@ module Girl
943
925
  src_ext = @tun_info[ :src_exts ][ src_id ]
944
926
 
945
927
  if src_ext
946
- pack_id = src_ext[ :biggest_pack_id ] + 1
947
-
948
928
  if pack_id <= CONFUSE_UNTIL
949
929
  data = @custom.encode( data )
950
930
  # puts "debug1 encoded pack #{ pack_id }"
@@ -959,7 +939,7 @@ module Girl
959
939
  end
960
940
 
961
941
  # puts "debug2 written pack #{ pack_id }"
962
- src_ext[ :biggest_pack_id ] = pack_id
942
+ src_ext[ :relay_pack_id ] = pack_id
963
943
  src_ext[ :wmems ][ pack_id ] = data
964
944
  src_ext[ :send_ats ][ pack_id ] = now
965
945
  src_ext[ :last_continue_at ] = now
@@ -995,7 +975,9 @@ module Girl
995
975
  dst: nil, # :direct的场合,对应的dst
996
976
  destination_domain: nil, # 目的地域名
997
977
  destination_port: nil, # 目的地端口
998
- rbuffs: [], # 非CONNECT,dst或者远端dst未准备好,暂存流量
978
+ biggest_pack_id: 0, # 最大包号码
979
+ is_connect: true, # 代理协议是http的场合,是否是CONNECT
980
+ rbuffs: [], # 非CONNECT,dst或者远端dst未准备好,暂存流量 [ pack_id, data ]
999
981
  wbuff: '', # 写前
1000
982
  cache: '', # 块读出缓存
1001
983
  chunks: [], # 块队列,写前达到块大小时结一个块 filename
@@ -1092,7 +1074,10 @@ module Girl
1092
1074
  end
1093
1075
  end
1094
1076
 
1095
- src_info[ :rbuffs ] << data
1077
+ src_info[ :is_connect ] = false
1078
+ pack_id = src_info[ :biggest_pack_id ] + 1
1079
+ src_info[ :biggest_pack_id ] = pack_id
1080
+ src_info[ :rbuffs ] << [ pack_id, data ]
1096
1081
  end
1097
1082
 
1098
1083
  domain, port = domain_and_port.split( ':' )
@@ -1105,7 +1090,9 @@ module Girl
1105
1090
  resolve_domain( src, domain )
1106
1091
  when :checking
1107
1092
  # puts "debug1 add src rbuff while checking #{ data.inspect }"
1108
- src_info[ :rbuffs ] << data
1093
+ pack_id = src_info[ :biggest_pack_id ] + 1
1094
+ src_info[ :biggest_pack_id ] = pack_id
1095
+ src_info[ :rbuffs ] << [ pack_id, data ]
1109
1096
  when :negotiation
1110
1097
  # +----+-----+-------+------+----------+----------+
1111
1098
  # |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
@@ -1152,6 +1139,9 @@ module Girl
1152
1139
  return
1153
1140
  end
1154
1141
 
1142
+ pack_id = src_info[ :biggest_pack_id ] + 1
1143
+ src_info[ :biggest_pack_id ] = pack_id
1144
+
1155
1145
  if src_ext[ :dst_port ]
1156
1146
  if @tun.closed?
1157
1147
  # puts "debug1 tun closed, close src"
@@ -1159,14 +1149,14 @@ module Girl
1159
1149
  return
1160
1150
  end
1161
1151
 
1162
- if src_info[ :rbuffs ].any?
1152
+ unless src_info[ :is_connect ]
1163
1153
  data, _ = sub_http_request( data )
1164
1154
  end
1165
1155
 
1166
- add_tun_wbuff( src_id, data )
1156
+ add_tun_wbuff( src_id, pack_id, data )
1167
1157
  else
1168
1158
  # puts "debug1 remote dst not ready, save data to src rbuff"
1169
- src_info[ :rbuffs ] << data
1159
+ src_info[ :rbuffs ] << [ pack_id, data ]
1170
1160
  end
1171
1161
  when :direct
1172
1162
  dst = src_info[ :dst ]
@@ -1178,14 +1168,14 @@ module Girl
1178
1168
  return
1179
1169
  end
1180
1170
 
1181
- if src_info[ :rbuffs ].any?
1171
+ unless src_info[ :is_connect ]
1182
1172
  data, _ = sub_http_request( data )
1183
1173
  end
1184
1174
 
1185
1175
  add_dst_wbuff( dst, data )
1186
1176
  else
1187
1177
  # puts "debug1 dst not ready, save data to src rbuff"
1188
- src_info[ :rbuffs ] << data
1178
+ src_info[ :rbuffs ] << [ nil, data ]
1189
1179
  end
1190
1180
  end
1191
1181
  end
@@ -1271,18 +1261,14 @@ module Girl
1271
1261
  src_info = @src_infos[ src ]
1272
1262
 
1273
1263
  if src_info[ :proxy_proto ] == :http
1274
- datas = src_info[ :rbuffs ]
1275
-
1276
- if datas.empty?
1277
- # CONNECT
1264
+ if src_info[ :is_connect ]
1278
1265
  # puts "debug1 add src wbuff http ok"
1279
1266
  add_src_wbuff( src, HTTP_OK )
1280
1267
  else
1281
- # not CONNECT
1282
1268
  # puts "debug1 add src rbuffs to tun wbuffs"
1283
1269
 
1284
- datas.each do | _data |
1285
- add_tun_wbuff( src_id, _data )
1270
+ src_info[ :rbuffs ].each do | pack_id, _data |
1271
+ add_tun_wbuff( src_id, pack_id, _data )
1286
1272
  end
1287
1273
  end
1288
1274
  elsif src_info[ :proxy_proto ] == :socks5
@@ -1291,7 +1277,7 @@ module Girl
1291
1277
  when DEST_STATUS
1292
1278
  return if from_addr != @tun_info[ :tund_addr ]
1293
1279
 
1294
- dst_port, biggest_dst_pack_id, continue_src_pack_id = data[ 9, 18 ].unpack( 'nQ>Q>' )
1280
+ dst_port, relay_dst_pack_id, continue_src_pack_id = data[ 9, 18 ].unpack( 'nQ>Q>' )
1295
1281
 
1296
1282
  src_id = @tun_info[ :src_ids ][ dst_port ]
1297
1283
  return unless src_id
@@ -1301,22 +1287,10 @@ module Girl
1301
1287
 
1302
1288
  # puts "debug2 got dest status"
1303
1289
 
1304
- # 更新对面发到几
1305
- if biggest_dst_pack_id > src_ext[ :biggest_dst_pack_id ]
1306
- # puts "debug2 update biggest dst pack #{ biggest_dst_pack_id }"
1307
- src_ext[ :biggest_dst_pack_id ] = biggest_dst_pack_id
1308
-
1309
- # 接到对面状态,若对面已关闭,且最后一个包已经进写前,关闭src
1310
- if src_ext[ :is_dst_closed ] && ( biggest_dst_pack_id == src_ext[ :continue_dst_pack_id ] )
1311
- # puts "debug1 2-1. recv traffic/fin1/dst status -> dst closed and all traffic received ? -> close src after write"
1312
- set_is_closing( src_ext[ :src ] )
1313
- end
1314
- end
1315
-
1316
1290
  release_wmems( src_ext, continue_src_pack_id )
1317
1291
 
1318
1292
  # 发miss
1319
- if !src_ext[ :src ].closed? && ( src_ext[ :continue_dst_pack_id ] < src_ext[ :biggest_dst_pack_id ] )
1293
+ if !src_ext[ :src ].closed? && ( src_ext[ :continue_dst_pack_id ] < relay_dst_pack_id )
1320
1294
  ranges = []
1321
1295
  curr_pack_id = src_ext[ :continue_dst_pack_id ] + 1
1322
1296
 
@@ -1328,12 +1302,12 @@ module Girl
1328
1302
  curr_pack_id = pack_id + 1
1329
1303
  end
1330
1304
 
1331
- if curr_pack_id <= src_ext[ :biggest_dst_pack_id ]
1332
- ranges << [ curr_pack_id, src_ext[ :biggest_dst_pack_id ] ]
1305
+ if curr_pack_id <= relay_dst_pack_id
1306
+ ranges << [ curr_pack_id, relay_dst_pack_id ]
1333
1307
  end
1334
1308
 
1335
1309
  pack_count = 0
1336
- # puts "debug1 continue/biggest #{ src_ext[ :continue_dst_pack_id ] }/#{ src_ext[ :biggest_dst_pack_id ] } send MISS #{ ranges.size }"
1310
+ # puts "debug1 continue/relay #{ src_ext[ :continue_dst_pack_id ] }/#{ relay_dst_pack_id } send MISS #{ ranges.size }"
1337
1311
 
1338
1312
  ranges.each do | pack_id_begin, pack_id_end |
1339
1313
  if pack_count >= BREAK_SEND_MISS
@@ -1380,9 +1354,8 @@ module Girl
1380
1354
  src_ext[ :biggest_dst_pack_id ] = biggest_dst_pack_id
1381
1355
  release_wmems( src_ext, continue_src_pack_id )
1382
1356
 
1383
- # 接到对面已关闭,若最后一个包已经进写前,关闭src
1384
1357
  if ( biggest_dst_pack_id == src_ext[ :continue_dst_pack_id ] )
1385
- # puts "debug1 2-1. recv fin1 -> set dst closed -> all traffic received ? -> close src after write"
1358
+ # puts "debug1 2-1. tun recv fin1 -> all traffic received ? -> close src after write"
1386
1359
  set_is_closing( src_ext[ :src ] )
1387
1360
  end
1388
1361
  when FIN2
@@ -1393,7 +1366,7 @@ module Girl
1393
1366
  src_id = @tun_info[ :src_ids ][ dst_port ]
1394
1367
  return unless src_id
1395
1368
 
1396
- # puts "debug1 1-2. recv fin2 -> del src ext"
1369
+ # puts "debug1 1-2. tun recv fin2 -> del src ext"
1397
1370
  del_src_ext( src_id )
1398
1371
  when TUND_FIN
1399
1372
  return if from_addr != @tun_info[ :tund_addr ]
@@ -1439,7 +1412,7 @@ module Girl
1439
1412
 
1440
1413
  # 接到流量,若对面已关闭,且流量正好收全,关闭src
1441
1414
  if src_ext[ :is_dst_closed ] && ( pack_id == src_ext[ :biggest_dst_pack_id ] )
1442
- # puts "debug1 2-1. recv traffic/fin1/dst status -> dst closed and all traffic received ? -> close src after write"
1415
+ # puts "debug1 2-2. tun recv traffic -> dst closed and all traffic received ? -> close src after write"
1443
1416
  set_is_closing( src_ext[ :src ] )
1444
1417
  end
1445
1418
  else