func (packet *Packet) ParseL3() {
	packet.L3 = packet.unparsed()
}
ParseL3 set pointer to start of L3 header
package packet
import (
	"fmt"
	"unsafe"
	. "github.com/intel-go/nff-go/common"
	"github.com/intel-go/nff-go/internal/low"
	"github.com/intel-go/nff-go/types"
)
var mbufStructSize uintptr
var hwtxchecksum bool
var nonPerfMempool *low.Mempool
func init() {
	var t1 low.Mbuf
	mbufStructSize = unsafe.Sizeof(t1)
	var t2 Packet
	packetStructSize := unsafe.Sizeof(t2)
	if err := low.SetPacketStructSize(int(packetStructSize)); err != nil {
		LogFatal(Debug, err)
	}
}
type EtherHdr struct {
	DAddr     types.MACAddress  
	SAddr     types.MACAddress  
	EtherType uint16            
}
func (hdr *EtherHdr) String() string {
	return fmt.Sprintf(`L2 protocol: Ethernet, EtherType: 0x%04x (%s)
Ethernet Source: %s
Ethernet Destination: %s
`,
		hdr.EtherType, getEtherTypeName(hdr.EtherType),
		hdr.SAddr.String(),
		hdr.DAddr.String())
}
var (
	etherTypeNameLookupTable = map[uint16]string{
		types.SwapIPV4Number: "IPv4",
		types.SwapARPNumber:  "ARP",
		types.SwapVLANNumber: "VLAN",
		types.SwapMPLSNumber: "MPLS",
		types.SwapIPV6Number: "IPv6",
	}
)
func getEtherTypeName(et uint16) string {
	ret, ok := etherTypeNameLookupTable[et]
	if !ok {
		return "unknown"
	}
	return ret
}
type IPv4Hdr struct {
	VersionIhl     uint8              
	TypeOfService  uint8              
	TotalLength    uint16             
	PacketID       uint16             
	FragmentOffset uint16             
	TimeToLive     uint8              
	NextProtoID    uint8              
	HdrChecksum    uint16             
	SrcAddr        types.IPv4Address  
	DstAddr        types.IPv4Address  
}
func (hdr *IPv4Hdr) String() string {
	r0 := "    L3 protocol: IPv4\n"
	r1 := "    IPv4 Source: " + hdr.SrcAddr.String() + "\n"
	r2 := "    IPv4 Destination: " + hdr.DstAddr.String() + "\n"
	return r0 + r1 + r2
}
type IPv6Hdr struct {
	VtcFlow    uint32             
	PayloadLen uint16             
	Proto      uint8              
	HopLimits  uint8              
	SrcAddr    types.IPv6Address  
	DstAddr    types.IPv6Address  
}
func (hdr *IPv6Hdr) String() string {
	return fmt.Sprintf(`    L3 protocol: IPv6
    IPv6 Source: %s
    IPv6 Destination %s
`, hdr.SrcAddr.String(), hdr.DstAddr.String())
}
type TCPHdr struct {
	SrcPort  uint16          
	DstPort  uint16          
	SentSeq  uint32          
	RecvAck  uint32          
	DataOff  uint8           
	TCPFlags types.TCPFlags  
	RxWin    uint16          
	Cksum    uint16          
	TCPUrp   uint16          
}
func (hdr *TCPHdr) String() string {
	r0 := "        L4 protocol: TCP\n"
	r1 := fmt.Sprintf("        L4 Source: %d\n", SwapBytesUint16(hdr.SrcPort))
	r2 := fmt.Sprintf("        L4 Destination: %d\n", SwapBytesUint16(hdr.DstPort))
	return r0 + r1 + r2
}
type UDPHdr struct {
	SrcPort    uint16  
	DstPort    uint16  
	DgramLen   uint16  
	DgramCksum uint16  
}
func (hdr *UDPHdr) String() string {
	r0 := "        L4 protocol: UDP\n"
	r1 := fmt.Sprintf("        L4 Source: %d\n", SwapBytesUint16(hdr.SrcPort))
	r2 := fmt.Sprintf("        L4 Destination: %d\n", SwapBytesUint16(hdr.DstPort))
	return r0 + r1 + r2
}
type ICMPHdr struct {
	Type       uint8   
	Code       uint8   
	Cksum      uint16  
	Identifier uint16  
	SeqNum     uint16  
}
func (hdr *ICMPHdr) String() string {
	r0 := "        L4 protocol: ICMP\n"
	r1 := fmt.Sprintf("        ICMP Type: %d\n", hdr.Type)
	r2 := fmt.Sprintf("        ICMP Code: %d\n", hdr.Code)
	r3 := fmt.Sprintf("        ICMP Cksum: %d\n", SwapBytesUint16(hdr.Cksum))
	r4 := fmt.Sprintf("        ICMP Identifier: %d\n", SwapBytesUint16(hdr.Identifier))
	r5 := fmt.Sprintf("        ICMP SeqNum: %d\n", SwapBytesUint16(hdr.SeqNum))
	return r0 + r1 + r2 + r3 + r4 + r5
}
type Packet struct {
	L3   unsafe.Pointer  
	L4   unsafe.Pointer  
	Data unsafe.Pointer  
	Ether *EtherHdr  
	CMbuf *low.Mbuf  
	Next *Packet  
}
func (packet *Packet) unparsed() unsafe.Pointer {
	ether := unsafe.Pointer(packet.Ether)
	return unsafe.Pointer(uintptr(ether) + types.EtherLen)
}
func (packet *Packet) StartAtOffset(offset uintptr) unsafe.Pointer {
	start := unsafe.Pointer(packet.Ether)
	return unsafe.Pointer(uintptr(start) + offset)
}