(addr *net.UDPAddr, b []byte, l1 *net.UDPConn)
| 161 | } |
| 162 | |
| 163 | func (s *Relay) UDPHandle(addr *net.UDPAddr, b []byte, l1 *net.UDPConn) error { |
| 164 | if s.IsDNS { |
| 165 | m := &dns.Msg{} |
| 166 | if err := m.Unpack(b); err != nil { |
| 167 | return err |
| 168 | } |
| 169 | if len(m.Question) == 0 { |
| 170 | return errors.New("no question") |
| 171 | } |
| 172 | done, err := DNSGate(addr, m, l1) |
| 173 | if err != nil { |
| 174 | return err |
| 175 | } |
| 176 | if done { |
| 177 | return nil |
| 178 | } |
| 179 | } |
| 180 | c, err := s.Pcf.Handle(addr, s.Dstb, b, func(b []byte) (int, error) { |
| 181 | return l1.WriteToUDP(b, addr) |
| 182 | }, s.UDPTimeout) |
| 183 | if err != nil { |
| 184 | return err |
| 185 | } |
| 186 | if c == nil { |
| 187 | return nil |
| 188 | } |
| 189 | defer c.Close() |
| 190 | rc, err := NATDial("udp", addr.String(), s.To, s.To) |
| 191 | if err != nil { |
| 192 | return err |
| 193 | } |
| 194 | defer rc.Close() |
| 195 | go func() { |
| 196 | var bf [65507]byte |
| 197 | for { |
| 198 | if s.UDPTimeout != 0 { |
| 199 | if err := rc.SetDeadline(time.Now().Add(time.Duration(s.UDPTimeout) * time.Second)); err != nil { |
| 200 | return |
| 201 | } |
| 202 | } |
| 203 | i, err := rc.Read(bf[:]) |
| 204 | if err != nil { |
| 205 | return |
| 206 | } |
| 207 | if _, err := c.Write(bf[0:i]); err != nil { |
| 208 | return |
| 209 | } |
| 210 | } |
| 211 | }() |
| 212 | var bf [65507]byte |
| 213 | for { |
| 214 | if s.UDPTimeout != 0 { |
| 215 | if err := c.SetDeadline(time.Now().Add(time.Duration(s.UDPTimeout) * time.Second)); err != nil { |
| 216 | return nil |
| 217 | } |
| 218 | } |
| 219 | i, err := c.Read(bf[:]) |
| 220 | if err != nil { |
no test coverage detected