From 57fb2a2b352e3efaf8c7c442fc7645179d6fa291 Mon Sep 17 00:00:00 2001 From: Anthony Romano Date: Mon, 7 Nov 2016 16:17:52 -0800 Subject: [PATCH] vendor: unvendor gopcap so travis CI works --- .../github.com/akrennmair/gopcap/LICENSE | 27 - .../github.com/akrennmair/gopcap/decode.go | 527 ------------------ cmd/vendor/github.com/akrennmair/gopcap/io.go | 206 ------- .../github.com/akrennmair/gopcap/pcap.go | 266 --------- glide.lock | 2 - glide.yaml | 2 - 6 files changed, 1030 deletions(-) delete mode 100644 cmd/vendor/github.com/akrennmair/gopcap/LICENSE delete mode 100644 cmd/vendor/github.com/akrennmair/gopcap/decode.go delete mode 100644 cmd/vendor/github.com/akrennmair/gopcap/io.go delete mode 100644 cmd/vendor/github.com/akrennmair/gopcap/pcap.go diff --git a/cmd/vendor/github.com/akrennmair/gopcap/LICENSE b/cmd/vendor/github.com/akrennmair/gopcap/LICENSE deleted file mode 100644 index 385fac9f2..000000000 --- a/cmd/vendor/github.com/akrennmair/gopcap/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2009-2011 Andreas Krennmair. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Andreas Krennmair nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/cmd/vendor/github.com/akrennmair/gopcap/decode.go b/cmd/vendor/github.com/akrennmair/gopcap/decode.go deleted file mode 100644 index 4db19c0a5..000000000 --- a/cmd/vendor/github.com/akrennmair/gopcap/decode.go +++ /dev/null @@ -1,527 +0,0 @@ -package pcap - -import ( - "encoding/binary" - "fmt" - "net" - "reflect" - "strings" -) - -const ( - TYPE_IP = 0x0800 - TYPE_ARP = 0x0806 - TYPE_IP6 = 0x86DD - TYPE_VLAN = 0x8100 - - IP_ICMP = 1 - IP_INIP = 4 - IP_TCP = 6 - IP_UDP = 17 -) - -const ( - ERRBUF_SIZE = 256 - - // According to pcap-linktype(7). - LINKTYPE_NULL = 0 - LINKTYPE_ETHERNET = 1 - LINKTYPE_TOKEN_RING = 6 - LINKTYPE_ARCNET = 7 - LINKTYPE_SLIP = 8 - LINKTYPE_PPP = 9 - LINKTYPE_FDDI = 10 - LINKTYPE_ATM_RFC1483 = 100 - LINKTYPE_RAW = 101 - LINKTYPE_PPP_HDLC = 50 - LINKTYPE_PPP_ETHER = 51 - LINKTYPE_C_HDLC = 104 - LINKTYPE_IEEE802_11 = 105 - LINKTYPE_FRELAY = 107 - LINKTYPE_LOOP = 108 - LINKTYPE_LINUX_SLL = 113 - LINKTYPE_LTALK = 104 - LINKTYPE_PFLOG = 117 - LINKTYPE_PRISM_HEADER = 119 - LINKTYPE_IP_OVER_FC = 122 - LINKTYPE_SUNATM = 123 - LINKTYPE_IEEE802_11_RADIO = 127 - LINKTYPE_ARCNET_LINUX = 129 - LINKTYPE_LINUX_IRDA = 144 - LINKTYPE_LINUX_LAPD = 177 -) - -type addrHdr interface { - SrcAddr() string - DestAddr() string - Len() int -} - -type addrStringer interface { - String(addr addrHdr) string -} - -func decodemac(pkt []byte) uint64 { - mac := uint64(0) - for i := uint(0); i < 6; i++ { - mac = (mac << 8) + uint64(pkt[i]) - } - return mac -} - -// Decode decodes the headers of a Packet. -func (p *Packet) Decode() { - if len(p.Data) <= 14 { - return - } - - p.Type = int(binary.BigEndian.Uint16(p.Data[12:14])) - p.DestMac = decodemac(p.Data[0:6]) - p.SrcMac = decodemac(p.Data[6:12]) - - if len(p.Data) >= 15 { - p.Payload = p.Data[14:] - } - - switch p.Type { - case TYPE_IP: - p.decodeIp() - case TYPE_IP6: - p.decodeIp6() - case TYPE_ARP: - p.decodeArp() - case TYPE_VLAN: - p.decodeVlan() - } -} - -func (p *Packet) headerString(headers []interface{}) string { - // If there's just one header, return that. - if len(headers) == 1 { - if hdr, ok := headers[0].(fmt.Stringer); ok { - return hdr.String() - } - } - // If there are two headers (IPv4/IPv6 -> TCP/UDP/IP..) - if len(headers) == 2 { - // Commonly the first header is an address. - if addr, ok := p.Headers[0].(addrHdr); ok { - if hdr, ok := p.Headers[1].(addrStringer); ok { - return fmt.Sprintf("%s %s", p.Time, hdr.String(addr)) - } - } - } - // For IP in IP, we do a recursive call. - if len(headers) >= 2 { - if addr, ok := headers[0].(addrHdr); ok { - if _, ok := headers[1].(addrHdr); ok { - return fmt.Sprintf("%s > %s IP in IP: ", - addr.SrcAddr(), addr.DestAddr(), p.headerString(headers[1:])) - } - } - } - - var typeNames []string - for _, hdr := range headers { - typeNames = append(typeNames, reflect.TypeOf(hdr).String()) - } - - return fmt.Sprintf("unknown [%s]", strings.Join(typeNames, ",")) -} - -// String prints a one-line representation of the packet header. -// The output is suitable for use in a tcpdump program. -func (p *Packet) String() string { - // If there are no headers, print "unsupported protocol". - if len(p.Headers) == 0 { - return fmt.Sprintf("%s unsupported protocol %d", p.Time, int(p.Type)) - } - return fmt.Sprintf("%s %s", p.Time, p.headerString(p.Headers)) -} - -// Arphdr is a ARP packet header. -type Arphdr struct { - Addrtype uint16 - Protocol uint16 - HwAddressSize uint8 - ProtAddressSize uint8 - Operation uint16 - SourceHwAddress []byte - SourceProtAddress []byte - DestHwAddress []byte - DestProtAddress []byte -} - -func (arp *Arphdr) String() (s string) { - switch arp.Operation { - case 1: - s = "ARP request" - case 2: - s = "ARP Reply" - } - if arp.Addrtype == LINKTYPE_ETHERNET && arp.Protocol == TYPE_IP { - s = fmt.Sprintf("%012x (%s) > %012x (%s)", - decodemac(arp.SourceHwAddress), arp.SourceProtAddress, - decodemac(arp.DestHwAddress), arp.DestProtAddress) - } else { - s = fmt.Sprintf("addrtype = %d protocol = %d", arp.Addrtype, arp.Protocol) - } - return -} - -func (p *Packet) decodeArp() { - if len(p.Payload) < 8 { - return - } - - pkt := p.Payload - arp := new(Arphdr) - arp.Addrtype = binary.BigEndian.Uint16(pkt[0:2]) - arp.Protocol = binary.BigEndian.Uint16(pkt[2:4]) - arp.HwAddressSize = pkt[4] - arp.ProtAddressSize = pkt[5] - arp.Operation = binary.BigEndian.Uint16(pkt[6:8]) - - if len(pkt) < int(8+2*arp.HwAddressSize+2*arp.ProtAddressSize) { - return - } - arp.SourceHwAddress = pkt[8 : 8+arp.HwAddressSize] - arp.SourceProtAddress = pkt[8+arp.HwAddressSize : 8+arp.HwAddressSize+arp.ProtAddressSize] - arp.DestHwAddress = pkt[8+arp.HwAddressSize+arp.ProtAddressSize : 8+2*arp.HwAddressSize+arp.ProtAddressSize] - arp.DestProtAddress = pkt[8+2*arp.HwAddressSize+arp.ProtAddressSize : 8+2*arp.HwAddressSize+2*arp.ProtAddressSize] - - p.Headers = append(p.Headers, arp) - - if len(pkt) >= int(8+2*arp.HwAddressSize+2*arp.ProtAddressSize) { - p.Payload = p.Payload[8+2*arp.HwAddressSize+2*arp.ProtAddressSize:] - } -} - -// IPadr is the header of an IP packet. -type Iphdr struct { - Version uint8 - Ihl uint8 - Tos uint8 - Length uint16 - Id uint16 - Flags uint8 - FragOffset uint16 - Ttl uint8 - Protocol uint8 - Checksum uint16 - SrcIp []byte - DestIp []byte -} - -func (p *Packet) decodeIp() { - if len(p.Payload) < 20 { - return - } - - pkt := p.Payload - ip := new(Iphdr) - - ip.Version = uint8(pkt[0]) >> 4 - ip.Ihl = uint8(pkt[0]) & 0x0F - ip.Tos = pkt[1] - ip.Length = binary.BigEndian.Uint16(pkt[2:4]) - ip.Id = binary.BigEndian.Uint16(pkt[4:6]) - flagsfrags := binary.BigEndian.Uint16(pkt[6:8]) - ip.Flags = uint8(flagsfrags >> 13) - ip.FragOffset = flagsfrags & 0x1FFF - ip.Ttl = pkt[8] - ip.Protocol = pkt[9] - ip.Checksum = binary.BigEndian.Uint16(pkt[10:12]) - ip.SrcIp = pkt[12:16] - ip.DestIp = pkt[16:20] - - pEnd := int(ip.Length) - if pEnd > len(pkt) { - pEnd = len(pkt) - } - - if len(pkt) >= pEnd && int(ip.Ihl*4) < pEnd { - p.Payload = pkt[ip.Ihl*4 : pEnd] - } else { - p.Payload = []byte{} - } - - p.Headers = append(p.Headers, ip) - p.IP = ip - - switch ip.Protocol { - case IP_TCP: - p.decodeTcp() - case IP_UDP: - p.decodeUdp() - case IP_ICMP: - p.decodeIcmp() - case IP_INIP: - p.decodeIp() - } -} - -func (ip *Iphdr) SrcAddr() string { return net.IP(ip.SrcIp).String() } -func (ip *Iphdr) DestAddr() string { return net.IP(ip.DestIp).String() } -func (ip *Iphdr) Len() int { return int(ip.Length) } - -type Vlanhdr struct { - Priority byte - DropEligible bool - VlanIdentifier int - Type int // Not actually part of the vlan header, but the type of the actual packet -} - -func (v *Vlanhdr) String() { - fmt.Sprintf("VLAN Priority:%d Drop:%v Tag:%d", v.Priority, v.DropEligible, v.VlanIdentifier) -} - -func (p *Packet) decodeVlan() { - pkt := p.Payload - vlan := new(Vlanhdr) - if len(pkt) < 4 { - return - } - - vlan.Priority = (pkt[2] & 0xE0) >> 13 - vlan.DropEligible = pkt[2]&0x10 != 0 - vlan.VlanIdentifier = int(binary.BigEndian.Uint16(pkt[:2])) & 0x0FFF - vlan.Type = int(binary.BigEndian.Uint16(p.Payload[2:4])) - p.Headers = append(p.Headers, vlan) - - if len(pkt) >= 5 { - p.Payload = p.Payload[4:] - } - - switch vlan.Type { - case TYPE_IP: - p.decodeIp() - case TYPE_IP6: - p.decodeIp6() - case TYPE_ARP: - p.decodeArp() - } -} - -type Tcphdr struct { - SrcPort uint16 - DestPort uint16 - Seq uint32 - Ack uint32 - DataOffset uint8 - Flags uint16 - Window uint16 - Checksum uint16 - Urgent uint16 - Data []byte -} - -const ( - TCP_FIN = 1 << iota - TCP_SYN - TCP_RST - TCP_PSH - TCP_ACK - TCP_URG - TCP_ECE - TCP_CWR - TCP_NS -) - -func (p *Packet) decodeTcp() { - if len(p.Payload) < 20 { - return - } - - pkt := p.Payload - tcp := new(Tcphdr) - tcp.SrcPort = binary.BigEndian.Uint16(pkt[0:2]) - tcp.DestPort = binary.BigEndian.Uint16(pkt[2:4]) - tcp.Seq = binary.BigEndian.Uint32(pkt[4:8]) - tcp.Ack = binary.BigEndian.Uint32(pkt[8:12]) - tcp.DataOffset = (pkt[12] & 0xF0) >> 4 - tcp.Flags = binary.BigEndian.Uint16(pkt[12:14]) & 0x1FF - tcp.Window = binary.BigEndian.Uint16(pkt[14:16]) - tcp.Checksum = binary.BigEndian.Uint16(pkt[16:18]) - tcp.Urgent = binary.BigEndian.Uint16(pkt[18:20]) - if len(pkt) >= int(tcp.DataOffset*4) { - p.Payload = pkt[tcp.DataOffset*4:] - } - p.Headers = append(p.Headers, tcp) - p.TCP = tcp -} - -func (tcp *Tcphdr) String(hdr addrHdr) string { - return fmt.Sprintf("TCP %s:%d > %s:%d %s SEQ=%d ACK=%d LEN=%d", - hdr.SrcAddr(), int(tcp.SrcPort), hdr.DestAddr(), int(tcp.DestPort), - tcp.FlagsString(), int64(tcp.Seq), int64(tcp.Ack), hdr.Len()) -} - -func (tcp *Tcphdr) FlagsString() string { - var sflags []string - if 0 != (tcp.Flags & TCP_SYN) { - sflags = append(sflags, "syn") - } - if 0 != (tcp.Flags & TCP_FIN) { - sflags = append(sflags, "fin") - } - if 0 != (tcp.Flags & TCP_ACK) { - sflags = append(sflags, "ack") - } - if 0 != (tcp.Flags & TCP_PSH) { - sflags = append(sflags, "psh") - } - if 0 != (tcp.Flags & TCP_RST) { - sflags = append(sflags, "rst") - } - if 0 != (tcp.Flags & TCP_URG) { - sflags = append(sflags, "urg") - } - if 0 != (tcp.Flags & TCP_NS) { - sflags = append(sflags, "ns") - } - if 0 != (tcp.Flags & TCP_CWR) { - sflags = append(sflags, "cwr") - } - if 0 != (tcp.Flags & TCP_ECE) { - sflags = append(sflags, "ece") - } - return fmt.Sprintf("[%s]", strings.Join(sflags, " ")) -} - -type Udphdr struct { - SrcPort uint16 - DestPort uint16 - Length uint16 - Checksum uint16 -} - -func (p *Packet) decodeUdp() { - if len(p.Payload) < 8 { - return - } - - pkt := p.Payload - udp := new(Udphdr) - udp.SrcPort = binary.BigEndian.Uint16(pkt[0:2]) - udp.DestPort = binary.BigEndian.Uint16(pkt[2:4]) - udp.Length = binary.BigEndian.Uint16(pkt[4:6]) - udp.Checksum = binary.BigEndian.Uint16(pkt[6:8]) - p.Headers = append(p.Headers, udp) - p.UDP = udp - if len(p.Payload) >= 8 { - p.Payload = pkt[8:] - } -} - -func (udp *Udphdr) String(hdr addrHdr) string { - return fmt.Sprintf("UDP %s:%d > %s:%d LEN=%d CHKSUM=%d", - hdr.SrcAddr(), int(udp.SrcPort), hdr.DestAddr(), int(udp.DestPort), - int(udp.Length), int(udp.Checksum)) -} - -type Icmphdr struct { - Type uint8 - Code uint8 - Checksum uint16 - Id uint16 - Seq uint16 - Data []byte -} - -func (p *Packet) decodeIcmp() *Icmphdr { - if len(p.Payload) < 8 { - return nil - } - - pkt := p.Payload - icmp := new(Icmphdr) - icmp.Type = pkt[0] - icmp.Code = pkt[1] - icmp.Checksum = binary.BigEndian.Uint16(pkt[2:4]) - icmp.Id = binary.BigEndian.Uint16(pkt[4:6]) - icmp.Seq = binary.BigEndian.Uint16(pkt[6:8]) - p.Payload = pkt[8:] - p.Headers = append(p.Headers, icmp) - return icmp -} - -func (icmp *Icmphdr) String(hdr addrHdr) string { - return fmt.Sprintf("ICMP %s > %s Type = %d Code = %d ", - hdr.SrcAddr(), hdr.DestAddr(), icmp.Type, icmp.Code) -} - -func (icmp *Icmphdr) TypeString() (result string) { - switch icmp.Type { - case 0: - result = fmt.Sprintf("Echo reply seq=%d", icmp.Seq) - case 3: - switch icmp.Code { - case 0: - result = "Network unreachable" - case 1: - result = "Host unreachable" - case 2: - result = "Protocol unreachable" - case 3: - result = "Port unreachable" - default: - result = "Destination unreachable" - } - case 8: - result = fmt.Sprintf("Echo request seq=%d", icmp.Seq) - case 30: - result = "Traceroute" - } - return -} - -type Ip6hdr struct { - // http://www.networksorcery.com/enp/protocol/ipv6.htm - Version uint8 // 4 bits - TrafficClass uint8 // 8 bits - FlowLabel uint32 // 20 bits - Length uint16 // 16 bits - NextHeader uint8 // 8 bits, same as Protocol in Iphdr - HopLimit uint8 // 8 bits - SrcIp []byte // 16 bytes - DestIp []byte // 16 bytes -} - -func (p *Packet) decodeIp6() { - if len(p.Payload) < 40 { - return - } - - pkt := p.Payload - ip6 := new(Ip6hdr) - ip6.Version = uint8(pkt[0]) >> 4 - ip6.TrafficClass = uint8((binary.BigEndian.Uint16(pkt[0:2]) >> 4) & 0x00FF) - ip6.FlowLabel = binary.BigEndian.Uint32(pkt[0:4]) & 0x000FFFFF - ip6.Length = binary.BigEndian.Uint16(pkt[4:6]) - ip6.NextHeader = pkt[6] - ip6.HopLimit = pkt[7] - ip6.SrcIp = pkt[8:24] - ip6.DestIp = pkt[24:40] - - if len(p.Payload) >= 40 { - p.Payload = pkt[40:] - } - - p.Headers = append(p.Headers, ip6) - - switch ip6.NextHeader { - case IP_TCP: - p.decodeTcp() - case IP_UDP: - p.decodeUdp() - case IP_ICMP: - p.decodeIcmp() - case IP_INIP: - p.decodeIp() - } -} - -func (ip6 *Ip6hdr) SrcAddr() string { return net.IP(ip6.SrcIp).String() } -func (ip6 *Ip6hdr) DestAddr() string { return net.IP(ip6.DestIp).String() } -func (ip6 *Ip6hdr) Len() int { return int(ip6.Length) } diff --git a/cmd/vendor/github.com/akrennmair/gopcap/io.go b/cmd/vendor/github.com/akrennmair/gopcap/io.go deleted file mode 100644 index b00bee993..000000000 --- a/cmd/vendor/github.com/akrennmair/gopcap/io.go +++ /dev/null @@ -1,206 +0,0 @@ -package pcap - -import ( - "encoding/binary" - "fmt" - "io" - "time" -) - -// FileHeader is the parsed header of a pcap file. -// http://wiki.wireshark.org/Development/LibpcapFileFormat -type FileHeader struct { - MagicNumber uint32 - VersionMajor uint16 - VersionMinor uint16 - TimeZone int32 - SigFigs uint32 - SnapLen uint32 - Network uint32 -} - -type PacketTime struct { - Sec int32 - Usec int32 -} - -// Convert the PacketTime to a go Time struct. -func (p *PacketTime) Time() time.Time { - return time.Unix(int64(p.Sec), int64(p.Usec)*1000) -} - -// Packet is a single packet parsed from a pcap file. -// -// Convenient access to IP, TCP, and UDP headers is provided after Decode() -// is called if the packet is of the appropriate type. -type Packet struct { - Time time.Time // packet send/receive time - Caplen uint32 // bytes stored in the file (caplen <= len) - Len uint32 // bytes sent/received - Data []byte // packet data - - Type int // protocol type, see LINKTYPE_* - DestMac uint64 - SrcMac uint64 - - Headers []interface{} // decoded headers, in order - Payload []byte // remaining non-header bytes - - IP *Iphdr // IP header (for IP packets, after decoding) - TCP *Tcphdr // TCP header (for TCP packets, after decoding) - UDP *Udphdr // UDP header (for UDP packets after decoding) -} - -// Reader parses pcap files. -type Reader struct { - flip bool - buf io.Reader - err error - fourBytes []byte - twoBytes []byte - sixteenBytes []byte - Header FileHeader -} - -// NewReader reads pcap data from an io.Reader. -func NewReader(reader io.Reader) (*Reader, error) { - r := &Reader{ - buf: reader, - fourBytes: make([]byte, 4), - twoBytes: make([]byte, 2), - sixteenBytes: make([]byte, 16), - } - switch magic := r.readUint32(); magic { - case 0xa1b2c3d4: - r.flip = false - case 0xd4c3b2a1: - r.flip = true - default: - return nil, fmt.Errorf("pcap: bad magic number: %0x", magic) - } - r.Header = FileHeader{ - MagicNumber: 0xa1b2c3d4, - VersionMajor: r.readUint16(), - VersionMinor: r.readUint16(), - TimeZone: r.readInt32(), - SigFigs: r.readUint32(), - SnapLen: r.readUint32(), - Network: r.readUint32(), - } - return r, nil -} - -// Next returns the next packet or nil if no more packets can be read. -func (r *Reader) Next() *Packet { - d := r.sixteenBytes - r.err = r.read(d) - if r.err != nil { - return nil - } - timeSec := asUint32(d[0:4], r.flip) - timeUsec := asUint32(d[4:8], r.flip) - capLen := asUint32(d[8:12], r.flip) - origLen := asUint32(d[12:16], r.flip) - - data := make([]byte, capLen) - if r.err = r.read(data); r.err != nil { - return nil - } - return &Packet{ - Time: time.Unix(int64(timeSec), int64(timeUsec)), - Caplen: capLen, - Len: origLen, - Data: data, - } -} - -func (r *Reader) read(data []byte) error { - var err error - n, err := r.buf.Read(data) - for err == nil && n != len(data) { - var chunk int - chunk, err = r.buf.Read(data[n:]) - n += chunk - } - if len(data) == n { - return nil - } - return err -} - -func (r *Reader) readUint32() uint32 { - data := r.fourBytes - if r.err = r.read(data); r.err != nil { - return 0 - } - return asUint32(data, r.flip) -} - -func (r *Reader) readInt32() int32 { - data := r.fourBytes - if r.err = r.read(data); r.err != nil { - return 0 - } - return int32(asUint32(data, r.flip)) -} - -func (r *Reader) readUint16() uint16 { - data := r.twoBytes - if r.err = r.read(data); r.err != nil { - return 0 - } - return asUint16(data, r.flip) -} - -// Writer writes a pcap file. -type Writer struct { - writer io.Writer - buf []byte -} - -// NewWriter creates a Writer that stores output in an io.Writer. -// The FileHeader is written immediately. -func NewWriter(writer io.Writer, header *FileHeader) (*Writer, error) { - w := &Writer{ - writer: writer, - buf: make([]byte, 24), - } - binary.LittleEndian.PutUint32(w.buf, header.MagicNumber) - binary.LittleEndian.PutUint16(w.buf[4:], header.VersionMajor) - binary.LittleEndian.PutUint16(w.buf[6:], header.VersionMinor) - binary.LittleEndian.PutUint32(w.buf[8:], uint32(header.TimeZone)) - binary.LittleEndian.PutUint32(w.buf[12:], header.SigFigs) - binary.LittleEndian.PutUint32(w.buf[16:], header.SnapLen) - binary.LittleEndian.PutUint32(w.buf[20:], header.Network) - if _, err := writer.Write(w.buf); err != nil { - return nil, err - } - return w, nil -} - -// Writer writes a packet to the underlying writer. -func (w *Writer) Write(pkt *Packet) error { - binary.LittleEndian.PutUint32(w.buf, uint32(pkt.Time.Unix())) - binary.LittleEndian.PutUint32(w.buf[4:], uint32(pkt.Time.Nanosecond())) - binary.LittleEndian.PutUint32(w.buf[8:], uint32(pkt.Time.Unix())) - binary.LittleEndian.PutUint32(w.buf[12:], pkt.Len) - if _, err := w.writer.Write(w.buf[:16]); err != nil { - return err - } - _, err := w.writer.Write(pkt.Data) - return err -} - -func asUint32(data []byte, flip bool) uint32 { - if flip { - return binary.BigEndian.Uint32(data) - } - return binary.LittleEndian.Uint32(data) -} - -func asUint16(data []byte, flip bool) uint16 { - if flip { - return binary.BigEndian.Uint16(data) - } - return binary.LittleEndian.Uint16(data) -} diff --git a/cmd/vendor/github.com/akrennmair/gopcap/pcap.go b/cmd/vendor/github.com/akrennmair/gopcap/pcap.go deleted file mode 100644 index 1b393c552..000000000 --- a/cmd/vendor/github.com/akrennmair/gopcap/pcap.go +++ /dev/null @@ -1,266 +0,0 @@ -// Interface to both live and offline pcap parsing. -package pcap - -/* -#cgo linux LDFLAGS: -lpcap -#cgo freebsd LDFLAGS: -lpcap -#cgo darwin LDFLAGS: -lpcap -#cgo windows CFLAGS: -I C:/WpdPack/Include -#cgo windows,386 LDFLAGS: -L C:/WpdPack/Lib -lwpcap -#cgo windows,amd64 LDFLAGS: -L C:/WpdPack/Lib/x64 -lwpcap -#include -#include - -// Workaround for not knowing how to cast to const u_char** -int hack_pcap_next_ex(pcap_t *p, struct pcap_pkthdr **pkt_header, - u_char **pkt_data) { - return pcap_next_ex(p, pkt_header, (const u_char **)pkt_data); -} -*/ -import "C" -import ( - "errors" - "net" - "syscall" - "time" - "unsafe" -) - -type Pcap struct { - cptr *C.pcap_t -} - -type Stat struct { - PacketsReceived uint32 - PacketsDropped uint32 - PacketsIfDropped uint32 -} - -type Interface struct { - Name string - Description string - Addresses []IFAddress - // TODO: add more elements -} - -type IFAddress struct { - IP net.IP - Netmask net.IPMask - // TODO: add broadcast + PtP dst ? -} - -func (p *Pcap) Next() (pkt *Packet) { - rv, _ := p.NextEx() - return rv -} - -// Openlive opens a device and returns a *Pcap handler -func Openlive(device string, snaplen int32, promisc bool, timeout_ms int32) (handle *Pcap, err error) { - var buf *C.char - buf = (*C.char)(C.calloc(ERRBUF_SIZE, 1)) - h := new(Pcap) - var pro int32 - if promisc { - pro = 1 - } - - dev := C.CString(device) - defer C.free(unsafe.Pointer(dev)) - - h.cptr = C.pcap_open_live(dev, C.int(snaplen), C.int(pro), C.int(timeout_ms), buf) - if nil == h.cptr { - handle = nil - err = errors.New(C.GoString(buf)) - } else { - handle = h - } - C.free(unsafe.Pointer(buf)) - return -} - -func Openoffline(file string) (handle *Pcap, err error) { - var buf *C.char - buf = (*C.char)(C.calloc(ERRBUF_SIZE, 1)) - h := new(Pcap) - - cf := C.CString(file) - defer C.free(unsafe.Pointer(cf)) - - h.cptr = C.pcap_open_offline(cf, buf) - if nil == h.cptr { - handle = nil - err = errors.New(C.GoString(buf)) - } else { - handle = h - } - C.free(unsafe.Pointer(buf)) - return -} - -func (p *Pcap) NextEx() (pkt *Packet, result int32) { - var pkthdr *C.struct_pcap_pkthdr - - var buf_ptr *C.u_char - var buf unsafe.Pointer - result = int32(C.hack_pcap_next_ex(p.cptr, &pkthdr, &buf_ptr)) - - buf = unsafe.Pointer(buf_ptr) - if nil == buf { - return - } - - pkt = new(Packet) - pkt.Time = time.Unix(int64(pkthdr.ts.tv_sec), int64(pkthdr.ts.tv_usec)*1000) - pkt.Caplen = uint32(pkthdr.caplen) - pkt.Len = uint32(pkthdr.len) - pkt.Data = C.GoBytes(buf, C.int(pkthdr.caplen)) - return -} - -func (p *Pcap) Close() { - C.pcap_close(p.cptr) -} - -func (p *Pcap) Geterror() error { - return errors.New(C.GoString(C.pcap_geterr(p.cptr))) -} - -func (p *Pcap) Getstats() (stat *Stat, err error) { - var cstats _Ctype_struct_pcap_stat - if -1 == C.pcap_stats(p.cptr, &cstats) { - return nil, p.Geterror() - } - stats := new(Stat) - stats.PacketsReceived = uint32(cstats.ps_recv) - stats.PacketsDropped = uint32(cstats.ps_drop) - stats.PacketsIfDropped = uint32(cstats.ps_ifdrop) - - return stats, nil -} - -func (p *Pcap) Setfilter(expr string) (err error) { - var bpf _Ctype_struct_bpf_program - cexpr := C.CString(expr) - defer C.free(unsafe.Pointer(cexpr)) - - if -1 == C.pcap_compile(p.cptr, &bpf, cexpr, 1, 0) { - return p.Geterror() - } - - if -1 == C.pcap_setfilter(p.cptr, &bpf) { - C.pcap_freecode(&bpf) - return p.Geterror() - } - C.pcap_freecode(&bpf) - return nil -} - -func Version() string { - return C.GoString(C.pcap_lib_version()) -} - -func (p *Pcap) Datalink() int { - return int(C.pcap_datalink(p.cptr)) -} - -func (p *Pcap) Setdatalink(dlt int) error { - if -1 == C.pcap_set_datalink(p.cptr, C.int(dlt)) { - return p.Geterror() - } - return nil -} - -func DatalinkValueToName(dlt int) string { - if name := C.pcap_datalink_val_to_name(C.int(dlt)); name != nil { - return C.GoString(name) - } - return "" -} - -func DatalinkValueToDescription(dlt int) string { - if desc := C.pcap_datalink_val_to_description(C.int(dlt)); desc != nil { - return C.GoString(desc) - } - return "" -} - -func Findalldevs() (ifs []Interface, err error) { - var buf *C.char - buf = (*C.char)(C.calloc(ERRBUF_SIZE, 1)) - defer C.free(unsafe.Pointer(buf)) - var alldevsp *C.pcap_if_t - - if -1 == C.pcap_findalldevs((**C.pcap_if_t)(&alldevsp), buf) { - return nil, errors.New(C.GoString(buf)) - } - defer C.pcap_freealldevs((*C.pcap_if_t)(alldevsp)) - dev := alldevsp - var i uint32 - for i = 0; dev != nil; dev = (*C.pcap_if_t)(dev.next) { - i++ - } - ifs = make([]Interface, i) - dev = alldevsp - for j := uint32(0); dev != nil; dev = (*C.pcap_if_t)(dev.next) { - var iface Interface - iface.Name = C.GoString(dev.name) - iface.Description = C.GoString(dev.description) - iface.Addresses = findalladdresses(dev.addresses) - // TODO: add more elements - ifs[j] = iface - j++ - } - return -} - -func findalladdresses(addresses *_Ctype_struct_pcap_addr) (retval []IFAddress) { - // TODO - make it support more than IPv4 and IPv6? - retval = make([]IFAddress, 0, 1) - for curaddr := addresses; curaddr != nil; curaddr = (*_Ctype_struct_pcap_addr)(curaddr.next) { - var a IFAddress - var err error - if a.IP, err = sockaddr_to_IP((*syscall.RawSockaddr)(unsafe.Pointer(curaddr.addr))); err != nil { - continue - } - if a.Netmask, err = sockaddr_to_IP((*syscall.RawSockaddr)(unsafe.Pointer(curaddr.addr))); err != nil { - continue - } - retval = append(retval, a) - } - return -} - -func sockaddr_to_IP(rsa *syscall.RawSockaddr) (IP []byte, err error) { - switch rsa.Family { - case syscall.AF_INET: - pp := (*syscall.RawSockaddrInet4)(unsafe.Pointer(rsa)) - IP = make([]byte, 4) - for i := 0; i < len(IP); i++ { - IP[i] = pp.Addr[i] - } - return - case syscall.AF_INET6: - pp := (*syscall.RawSockaddrInet6)(unsafe.Pointer(rsa)) - IP = make([]byte, 16) - for i := 0; i < len(IP); i++ { - IP[i] = pp.Addr[i] - } - return - } - err = errors.New("Unsupported address type") - return -} - -func (p *Pcap) Inject(data []byte) (err error) { - buf := (*C.char)(C.malloc((C.size_t)(len(data)))) - - for i := 0; i < len(data); i++ { - *(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(buf)) + uintptr(i))) = data[i] - } - - if -1 == C.pcap_sendpacket(p.cptr, (*C.u_char)(unsafe.Pointer(buf)), (C.int)(len(data))) { - err = p.Geterror() - } - C.free(unsafe.Pointer(buf)) - return -} diff --git a/glide.lock b/glide.lock index a220a9b9a..1f9065850 100644 --- a/glide.lock +++ b/glide.lock @@ -3,8 +3,6 @@ updated: 2016-10-25T10:52:07.505501079-07:00 imports: - name: bitbucket.org/ww/goautoneg version: 75cd24fc2f2c2a2088577d12123ddee5f54e0675 -- name: github.com/akrennmair/gopcap - version: 00e11033259acb75598ba416495bb708d864a010 - name: github.com/beorn7/perks version: b965b613227fddccbfffe13eae360ed3fa822f8d subpackages: diff --git a/glide.yaml b/glide.yaml index f79d9659f..d38c611f6 100644 --- a/glide.yaml +++ b/glide.yaml @@ -2,8 +2,6 @@ package: github.com/coreos/etcd import: - package: bitbucket.org/ww/goautoneg version: '''75cd24fc2f2c2a2088577d12123ddee5f54e0675''' -- package: github.com/akrennmair/gopcap - version: 00e11033259acb75598ba416495bb708d864a010 - package: github.com/beorn7/perks version: b965b613227fddccbfffe13eae360ed3fa822f8d subpackages: