packetsToChannel reads in all packets from the packet source and sends them to the given channel. This routine terminates when a non-temporary error is returned by NextPacket().
()
| 813 | // to the given channel. This routine terminates when a non-temporary error |
| 814 | // is returned by NextPacket(). |
| 815 | func (p *PacketSource) packetsToChannel() { |
| 816 | defer close(p.c) |
| 817 | for { |
| 818 | packet, err := p.NextPacket() |
| 819 | if err == nil { |
| 820 | p.c <- packet |
| 821 | continue |
| 822 | } |
| 823 | |
| 824 | // Immediately retry for temporary network errors |
| 825 | if nerr, ok := err.(net.Error); ok && nerr.Temporary() { |
| 826 | continue |
| 827 | } |
| 828 | |
| 829 | // Immediately retry for EAGAIN |
| 830 | if err == syscall.EAGAIN { |
| 831 | continue |
| 832 | } |
| 833 | |
| 834 | // Immediately break for known unrecoverable errors |
| 835 | if err == io.EOF || err == io.ErrUnexpectedEOF || |
| 836 | err == io.ErrNoProgress || err == io.ErrClosedPipe || err == io.ErrShortBuffer || |
| 837 | err == syscall.EBADF || |
| 838 | strings.Contains(err.Error(), "use of closed file") { |
| 839 | break |
| 840 | } |
| 841 | |
| 842 | // Sleep briefly and try again |
| 843 | time.Sleep(time.Millisecond * time.Duration(5)) |
| 844 | } |
| 845 | } |
| 846 | |
| 847 | // Packets returns a channel of packets, allowing easy iterating over |
| 848 | // packets. Packets will be asynchronously read in from the underlying |
no test coverage detected