package device

import (
	"gvisor.dev/gvisor/pkg/tcpip/stack"
)

// Device is the interface that implemented by network layer devices (e.g. tun),
// and easy to use as stack.LinkEndpoint.
type Device interface {
	stack.LinkEndpoint

	// Name returns the current name of the device.
	Name() string

	// Type returns the driver type of the device.
	Type() string

	// Read packets from tun device
	Read(packet []byte) (int, error)

	// Write packets to tun device
	Write(packet []byte) (int, error)

	// Close stops and closes the device.
	Close() error

	// UseEndpoint work for gVisor stack
	UseEndpoint() error

	// UseIOBased work for other ip stack
	UseIOBased() error
}
