| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- // Package raw enables reading and writing data at the device driver level for
- // a network interface.
- package raw
- import (
- "errors"
- "net"
- "time"
- "golang.org/x/net/bpf"
- )
- var (
- // ErrNotImplemented is returned when certain functionality is not yet
- // implemented for the host operating system.
- ErrNotImplemented = errors.New("raw: not implemented")
- )
- var _ net.Addr = &Addr{}
- // Addr is a network address which can be used to contact other machines, using
- // their hardware addresses.
- type Addr struct {
- HardwareAddr net.HardwareAddr
- }
- // Network returns the address's network name, "raw".
- func (a *Addr) Network() string {
- return "raw"
- }
- // String returns the address's hardware address.
- func (a *Addr) String() string {
- return a.HardwareAddr.String()
- }
- var _ net.PacketConn = &Conn{}
- // Conn is an implementation of the net.PacketConn interface which can send
- // and receive data at the network interface device driver level.
- type Conn struct {
- // packetConn is the operating system-specific implementation of
- // a raw connection.
- p *packetConn
- }
- // ReadFrom implements the net.PacketConn ReadFrom method.
- func (c *Conn) ReadFrom(b []byte) (int, net.Addr, error) {
- return c.p.ReadFrom(b)
- }
- // WriteTo implements the net.PacketConn WriteTo method.
- func (c *Conn) WriteTo(b []byte, addr net.Addr) (int, error) {
- return c.p.WriteTo(b, addr)
- }
- // Close closes the connection.
- func (c *Conn) Close() error {
- return c.p.Close()
- }
- // LocalAddr returns the local network address.
- func (c *Conn) LocalAddr() net.Addr {
- return c.p.LocalAddr()
- }
- // SetDeadline implements the net.PacketConn SetDeadline method.
- func (c *Conn) SetDeadline(t time.Time) error {
- return c.p.SetDeadline(t)
- }
- // SetReadDeadline implements the net.PacketConn SetReadDeadline method.
- func (c *Conn) SetReadDeadline(t time.Time) error {
- return c.p.SetReadDeadline(t)
- }
- // SetWriteDeadline implements the net.PacketConn SetWriteDeadline method.
- func (c *Conn) SetWriteDeadline(t time.Time) error {
- return c.p.SetWriteDeadline(t)
- }
- var _ bpf.Setter = &Conn{}
- // SetBPF attaches an assembled BPF program to the connection.
- func (c *Conn) SetBPF(filter []bpf.RawInstruction) error {
- return c.p.SetBPF(filter)
- }
- // SetPromiscuous enables or disables promiscuous mode on the interface, allowing it
- // to receive traffic that is not addressed to the interface.
- func (c *Conn) SetPromiscuous(b bool) error {
- return c.p.SetPromiscuous(b)
- }
- // Stats contains statistics about a Conn.
- type Stats struct {
- // The total number of packets received.
- Packets uint64
- // The number of packets dropped.
- Drops uint64
- }
- // Stats retrieves statistics from the Conn.
- //
- // Only supported on Linux at this time.
- func (c *Conn) Stats() (*Stats, error) {
- return c.p.Stats()
- }
- // ListenPacket creates a net.PacketConn which can be used to send and receive
- // data at the network interface device driver level.
- //
- // ifi specifies the network interface which will be used to send and receive
- // data.
- //
- // proto specifies the protocol (usually the EtherType) which should be
- // captured and transmitted. proto, if needed, is automatically converted to
- // network byte order (big endian), akin to the htons() function in C.
- //
- // cfg specifies optional configuration which may be operating system-specific.
- // A nil Config is equivalent to the default configuration: send and receive
- // data at the network interface device driver level (usually raw Ethernet frames).
- func ListenPacket(ifi *net.Interface, proto uint16, cfg *Config) (*Conn, error) {
- // A nil config is an empty Config.
- if cfg == nil {
- cfg = &Config{}
- }
- p, err := listenPacket(ifi, proto, *cfg)
- if err != nil {
- return nil, err
- }
- return &Conn{
- p: p,
- }, nil
- }
- // A Config can be used to specify additional options for a Conn.
- type Config struct {
- // Linux only: call socket(7) with SOCK_DGRAM instead of SOCK_RAW.
- // Has no effect on other operating systems.
- LinuxSockDGRAM bool
- // Linux only: do not accumulate packet socket statistic counters. Packet
- // socket statistics are reset on each call to retrieve them via getsockopt,
- // but this package's default behavior is to continue accumulating the
- // statistics internally per Conn. To use the Linux default behavior of
- // resetting statistics on each call to Stats, set this value to true.
- NoCumulativeStats bool
- // Linux only: initial filter to apply to the connection. This avoids
- // capturing random packets before SetBPF is called.
- Filter []bpf.RawInstruction
- // BSD only: configure the BPF direction flag to allow selection of inbound
- // only (0 - default) or bidirectional (1) packet processing.
- // Has no effect on other operating systems.
- BPFDirection int
- }
|