(addr *net.UDPAddr, b []byte, l1 *net.UDPConn)
| 156 | } |
| 157 | |
| 158 | func (s *RelayOverBrook) UDPHandle(addr *net.UDPAddr, b []byte, l1 *net.UDPConn) error { |
| 159 | if s.IsDNS { |
| 160 | m := &dns.Msg{} |
| 161 | if err := m.Unpack(b); err != nil { |
| 162 | return err |
| 163 | } |
| 164 | if len(m.Question) == 0 { |
| 165 | return errors.New("no question") |
| 166 | } |
| 167 | done, err := DNSGate(addr, m, l1) |
| 168 | if err != nil { |
| 169 | return err |
| 170 | } |
| 171 | if done { |
| 172 | return nil |
| 173 | } |
| 174 | } |
| 175 | conn, err := s.pcf.Handle(addr, s.dstb, b, func(b []byte) (int, error) { |
| 176 | return l1.WriteToUDP(b, addr) |
| 177 | }, s.UDPTimeout) |
| 178 | if err != nil { |
| 179 | return err |
| 180 | } |
| 181 | if conn == nil { |
| 182 | return nil |
| 183 | } |
| 184 | defer conn.Close() |
| 185 | sc, rc, err := s.blk.CreateExchanger("udp", addr.String(), s.dstb, s.TCPTimeout, s.UDPTimeout) |
| 186 | if err != nil { |
| 187 | return err |
| 188 | } |
| 189 | defer rc.Close() |
| 190 | defer sc.Clean() |
| 191 | if err := sc.Exchange(conn); err != nil { |
| 192 | return nil |
| 193 | } |
| 194 | return nil |
| 195 | } |
| 196 | |
| 197 | func (s *RelayOverBrook) Shutdown() error { |
| 198 | return s.RunnerGroup.Done() |
no test coverage detected