@@ -66,8 +66,8 @@ flag_2_desc(enum tcp_mux_flag flag)
6666 if (flag == flag_desc [i ].flag )
6767 return flag_desc [i ].desc ;
6868 }
69-
70- return "unknown_flag " ;
69+
70+ return "unkown_flag " ;
7171}
7272
7373static int
@@ -79,15 +79,6 @@ valid_tcp_mux_type(uint8_t type)
7979 return 0 ;
8080}
8181
82- static int
83- valid_tcp_mux_flag (uint16_t flag )
84- {
85- if (flag >= ZERO && flag <= RST )
86- return 1 ;
87-
88- return 0 ;
89- }
90-
9182static int
9283valid_tcp_mux_sid (uint32_t sid )
9384{
@@ -140,8 +131,7 @@ parse_tcp_mux_proto(uint8_t *data, int len, uint32_t *flag, uint32_t *type, uint
140131
141132 struct tcp_mux_header * hdr = (struct tcp_mux_header * )data ;
142133 if (hdr -> version == proto_version &&
143- valid_tcp_mux_type (hdr -> type ) &&
144- valid_tcp_mux_flag (htons (hdr -> flags ))) {
134+ valid_tcp_mux_type (hdr -> type )) {
145135 if (hdr -> type == DATA && !valid_tcp_mux_sid (htonl (hdr -> stream_id ))) {
146136 debug (LOG_INFO , "!!!!!type is DATA but cant find stream_id : type [%s] flag [%s] stream_id[%d]" ,
147137 type_2_desc (hdr -> type ), flag_2_desc (htons (hdr -> flags )), htonl (hdr -> stream_id ));
@@ -191,14 +181,14 @@ tcp_mux_send_win_update_ack(struct bufferevent *bout, uint32_t stream_id, uint32
191181}
192182
193183void
194- tcp_mux_send_win_update_rst (struct bufferevent * bout , uint32_t stream_id )
184+ tcp_mux_send_win_update_fin (struct bufferevent * bout , uint32_t stream_id )
195185{
196186 if (!tcp_mux_flag ()) return ;
197187
198188 struct tcp_mux_header tmux_hdr ;
199189 memset (& tmux_hdr , 0 , sizeof (tmux_hdr ));
200- tcp_mux_encode (WINDOW_UPDATE , RST , stream_id , 0 , & tmux_hdr );
201- debug (LOG_DEBUG , "tcp mux [%d] send wind update RST " , stream_id );
190+ tcp_mux_encode (WINDOW_UPDATE , FIN , stream_id , 0 , & tmux_hdr );
191+ debug (LOG_DEBUG , "tcp mux [%d] send wind update FIN " , stream_id );
202192 bufferevent_write (bout , (uint8_t * )& tmux_hdr , sizeof (tmux_hdr ));
203193}
204194
@@ -266,7 +256,15 @@ handle_tcp_mux_frps_msg(uint8_t *buf, int ilen, void (*fn)(uint8_t *, int, void
266256 data += l_dlen ;
267257 ilen -= l_dlen ;
268258 l_dlen = 0 ;
269- } else if ( ilen >= l_dlen ) {
259+ continue ;
260+ }
261+
262+ if (pc -> stream_state != ESTABLISHED ) {
263+ debug (LOG_INFO , "client [%d] state is [%d]" , pc -> stream_id , pc -> stream_state );
264+ break ;
265+ }
266+
267+ if ( ilen >= l_dlen ) {
270268 assert (pc -> local_proxy_bev );
271269 bufferevent_write (pc -> local_proxy_bev , data , l_dlen );
272270 data += l_dlen ;
@@ -306,12 +304,22 @@ handle_tcp_mux_frps_msg(uint8_t *buf, int ilen, void (*fn)(uint8_t *, int, void
306304 data += dlen ;
307305 ilen -= dlen ;
308306 l_dlen = 0 ;
309- } else if ( ilen >= dlen ){
307+ continue ;
308+ }
309+
310+ if (pc -> stream_state != ESTABLISHED ) {
311+ debug (LOG_INFO , "client [%d] state is [%d]" , pc -> stream_id , pc -> stream_state );
312+ break ;
313+ }
314+
315+ if (ilen >= dlen ){
316+ assert (pc -> local_proxy_bev );
310317 bufferevent_write (pc -> local_proxy_bev , data , dlen );
311318 data += dlen ;
312319 ilen -= dlen ;
313320 l_dlen = 0 ;
314321 } else {
322+ assert (pc -> local_proxy_bev );
315323 bufferevent_write (pc -> local_proxy_bev , data , ilen );
316324 l_dlen -= ilen ;
317325 ilen = 0 ;
@@ -329,14 +337,27 @@ handle_tcp_mux_frps_msg(uint8_t *buf, int ilen, void (*fn)(uint8_t *, int, void
329337 }
330338 case WINDOW_UPDATE :
331339 {
332- if (flag == RST ) {
333- del_proxy_client (pc );
334- } else if (pc && dlen > 0 ){
335- pc -> send_window += dlen ;
336- bufferevent_enable (pc -> local_proxy_bev , EV_READ |EV_WRITE );
337- } else {
338- debug (LOG_INFO , "window update no need process : flag %s dlen %d" , flag_2_desc (flag ), dlen );
340+ switch (flag ) {
341+ case RST :
342+ case FIN :
343+ del_proxy_client (pc );
344+ break ;
345+ case ZERO :
346+ case ACK :
347+ if (!pc )
348+ break ;
349+
350+ if (dlen > 0 ) {
351+ pc -> send_window += dlen ;
352+ bufferevent_enable (pc -> local_proxy_bev , EV_READ |EV_WRITE );
353+ }
354+ pc -> stream_state = ESTABLISHED ;
355+ break ;
356+ default :
357+ debug (LOG_INFO , "window update no need process : flag %2x %s dlen %d stream_id %d" ,
358+ flag , flag_2_desc (flag ), dlen , stream_id );
339359 }
360+
340361 break ;
341362 }
342363 default :
0 commit comments