func (pc *packetSock) ReadFrom() ([]byte, net.IP, error) { pkt := make([]byte, maxIPHdrLen+udpHdrLen+MaxDHCPLen) n, _, err := unix.Recvfrom(pc.fd, pkt, 0) if err != nil { return nil, nil, err } // IP hdr len ihl := int(pkt[0]&0x0F) * 4 // Source IP address src := net.IP(pkt[12:16]) return pkt[ihl+udpHdrLen : n], src, nil }
func (d *afpacket) Read(to *ethernet.Frame) (err error) { to.Resize(d.ifce.MTU) for { *to = (*to)[:cap(*to)] var n int n, _, err = unix.Recvfrom(d.fd, []byte(*to), 0) if err != nil { return } *to = (*to)[:n] if !equalMAC(to.Source(), d.ifce.HardwareAddr) && (d.filter == nil || d.filter(*to)) { return } } }