func (r *Reader) readHeader() error { buf := make([]byte, 24) if n, err := io.ReadFull(r.r, buf); err != nil { return err } else if n < 24 { return errors.New("Not enough data for read") } if magic := binary.LittleEndian.Uint32(buf[0:4]); magic == magicNanoseconds { r.byteOrder = binary.LittleEndian r.nanoSecsFactor = 1 } else if magic == magicNanosecondsBigendian { r.byteOrder = binary.BigEndian r.nanoSecsFactor = 1 } else if magic == magicMicroseconds { r.byteOrder = binary.LittleEndian r.nanoSecsFactor = 1000 } else if magic == magicMicrosecondsBigendian { r.byteOrder = binary.BigEndian r.nanoSecsFactor = 1000 } else { return errors.New(fmt.Sprintf("Unknown maigc %x", magic)) } if r.versionMajor = r.byteOrder.Uint16(buf[4:6]); r.versionMajor != versionMajor { return errors.New(fmt.Sprintf("Unknown major version %d", r.versionMajor)) } if r.versionMinor = r.byteOrder.Uint16(buf[6:8]); r.versionMinor != versionMinor { return errors.New(fmt.Sprintf("Unknown minor version %d", r.versionMinor)) } // ignore timezone 8:12 and sigfigs 12:16 r.snaplen = r.byteOrder.Uint32(buf[16:20]) r.buf = make([]byte, r.snaplen+16) r.linkType = layers.LinkType(r.byteOrder.Uint32(buf[20:24])) return nil }
// LinkType returns pcap_datalink, as a layers.LinkType. func (p *Handle) LinkType() layers.LinkType { return layers.LinkType(C.pcap_datalink(p.cptr)) }