github.com/inazumav/sing-box@v0.0.0-20230926072359-ab51429a14f1/transport/hysteria2/server_packet.go (about) 1 package hysteria2 2 3 import ( 4 "github.com/sagernet/sing/common" 5 E "github.com/sagernet/sing/common/exceptions" 6 M "github.com/sagernet/sing/common/metadata" 7 ) 8 9 func (s *serverSession) loopMessages() { 10 for { 11 message, err := s.quicConn.ReceiveMessage(s.ctx) 12 if err != nil { 13 s.closeWithError(E.Cause(err, "receive message")) 14 return 15 } 16 hErr := s.handleMessage(message) 17 if hErr != nil { 18 s.closeWithError(E.Cause(hErr, "handle message")) 19 return 20 } 21 } 22 } 23 24 func (s *serverSession) handleMessage(data []byte) error { 25 message := udpMessagePool.Get().(*udpMessage) 26 err := decodeUDPMessage(message, data) 27 if err != nil { 28 message.release() 29 return E.Cause(err, "decode UDP message") 30 } 31 s.handleUDPMessage(message) 32 return nil 33 } 34 35 func (s *serverSession) handleUDPMessage(message *udpMessage) { 36 s.udpAccess.RLock() 37 udpConn, loaded := s.udpConnMap[message.sessionID] 38 s.udpAccess.RUnlock() 39 if !loaded || common.Done(udpConn.ctx) { 40 udpConn = newUDPPacketConn(s.ctx, s.quicConn, func() { 41 s.udpAccess.Lock() 42 delete(s.udpConnMap, message.sessionID) 43 s.udpAccess.Unlock() 44 }) 45 udpConn.sessionID = message.sessionID 46 s.udpAccess.Lock() 47 s.udpConnMap[message.sessionID] = udpConn 48 s.udpAccess.Unlock() 49 go s.handler.NewPacketConnection(udpConn.ctx, udpConn, M.Metadata{ 50 Source: s.source, 51 Destination: M.ParseSocksaddr(message.destination), 52 }) 53 } 54 udpConn.inputPacket(message) 55 }