@@ -441,10 +441,10 @@ private void FillBoundStreamSettings(Outbounds4Ray outbound)
441441 kcpSettings . congestion = _config . KcpItem . Congestion ;
442442 kcpSettings . readBufferSize = _config . KcpItem . ReadBufferSize ;
443443 kcpSettings . writeBufferSize = _config . KcpItem . WriteBufferSize ;
444- streamSettings . finalmask ?? = new ( ) ;
444+ var kcpFinalmask = new Finalmask4Ray ( ) ;
445445 if ( Global . KcpHeaderMaskMap . TryGetValue ( _node . HeaderType , out var header ) )
446446 {
447- streamSettings . finalmask . udp =
447+ kcpFinalmask . udp =
448448 [
449449 new Mask4Ray
450450 {
@@ -453,23 +453,24 @@ private void FillBoundStreamSettings(Outbounds4Ray outbound)
453453 }
454454 ] ;
455455 }
456- streamSettings . finalmask . udp ??= [ ] ;
456+ kcpFinalmask . udp ??= [ ] ;
457457 if ( path . IsNullOrEmpty ( ) )
458458 {
459- streamSettings . finalmask . udp . Add ( new Mask4Ray
459+ kcpFinalmask . udp . Add ( new Mask4Ray
460460 {
461461 type = "mkcp-original"
462462 } ) ;
463463 }
464464 else
465465 {
466- streamSettings . finalmask . udp . Add ( new Mask4Ray
466+ kcpFinalmask . udp . Add ( new Mask4Ray
467467 {
468468 type = "mkcp-aes128gcm" ,
469469 settings = new MaskSettings4Ray { password = path }
470470 } ) ;
471471 }
472472 streamSettings . kcpSettings = kcpSettings ;
473+ streamSettings . finalmask = kcpFinalmask ;
473474 break ;
474475 //ws
475476 case nameof ( ETransport . ws ) :
@@ -598,36 +599,46 @@ private void FillBoundStreamSettings(Outbounds4Ray outbound)
598599 : ( _config . HysteriaItem . HopInterval >= 5
599600 ? _config . HysteriaItem . HopInterval
600601 : Global . Hysteria2DefaultHopInt ) . ToString ( ) ;
601- HysteriaUdpHop4Ray ? udpHop = null ;
602+ var hy2Finalmask = new Finalmask4Ray ( ) ;
603+ var quicParams = new QuicParams4Ray ( ) ;
602604 if ( ! ports . IsNullOrEmpty ( ) &&
603605 ( ports . Contains ( ':' ) || ports . Contains ( '-' ) || ports . Contains ( ',' ) ) )
604606 {
605- udpHop = new HysteriaUdpHop4Ray
607+ var udpHop = new UdpHop4Ray
606608 {
607- port = ports . Replace ( ':' , '-' ) ,
609+ ports = ports . Replace ( ':' , '-' ) ,
608610 interval = hopInterval ,
609611 } ;
612+ quicParams . udpHop = udpHop ;
613+ }
614+ if ( upMbps > 0 || downMbps > 0 )
615+ {
616+ quicParams . congestion = "brutal" ;
617+ quicParams . brutalUp = upMbps > 0 ? $ "{ upMbps } mbps" : null ;
618+ quicParams . brutalDown = downMbps > 0 ? $ "{ downMbps } mbps" : null ;
619+ }
620+ else
621+ {
622+ quicParams . congestion = "bbr" ;
623+ }
624+ hy2Finalmask . quicParams = quicParams ;
625+ if ( ! protocolExtra . SalamanderPass . IsNullOrEmpty ( ) )
626+ {
627+ hy2Finalmask . udp =
628+ [
629+ new Mask4Ray
630+ {
631+ type = "salamander" ,
632+ settings = new MaskSettings4Ray { password = protocolExtra . SalamanderPass . TrimEx ( ) , }
633+ }
634+ ] ;
610635 }
611636 streamSettings . hysteriaSettings = new ( )
612637 {
613638 version = 2 ,
614639 auth = _node . Password ,
615- up = upMbps > 0 ? $ "{ upMbps } mbps" : null ,
616- down = downMbps > 0 ? $ "{ downMbps } mbps" : null ,
617- udphop = udpHop ,
618640 } ;
619- if ( ! protocolExtra . SalamanderPass . IsNullOrEmpty ( ) )
620- {
621- streamSettings . finalmask ??= new ( ) ;
622- streamSettings . finalmask . udp =
623- [
624- new Mask4Ray
625- {
626- type = "salamander" ,
627- settings = new MaskSettings4Ray { password = protocolExtra . SalamanderPass . TrimEx ( ) , }
628- }
629- ] ;
630- }
641+ streamSettings . finalmask = hy2Finalmask ;
631642 break ;
632643
633644 default :
@@ -665,7 +676,7 @@ private void FillBoundStreamSettings(Outbounds4Ray outbound)
665676
666677 if ( ! _node . Finalmask . IsNullOrEmpty ( ) )
667678 {
668- streamSettings . finalmask = JsonUtils . Deserialize < Finalmask4Ray > ( _node . Finalmask ) ;
679+ streamSettings . finalmask = JsonUtils . ParseJson ( _node . Finalmask ) ;
669680 }
670681 }
671682 catch ( Exception ex )
0 commit comments