Documentation ¶
Overview ¶
Package rtnetlink allows the kernel's routing tables to be read and altered. Network routes, IP addresses, Link parameters, Neighbor setups, Queueing disciplines, Traffic classes and Packet classifiers may all be controlled. It is based on netlink messages.
A convenient, high-level API wrapper is available using package rtnl: https://godoc.org/github.com/jsimonetti/rtnetlink/rtnl.
The base rtnetlink library xplicitly only exposes a limited low-level API to rtnetlink. It is not the intention (nor wish) to create an iproute2 replacement.
When in doubt about your message structure it can always be useful to look at the message send by iproute2 using 'strace -f -esendmsg' or similar.
Another (and possibly even more flexible) way would be using 'nlmon' and wireshark. nlmod is a special kernel module which allows you to capture all (not just rtnetlink) netlink traffic inside the kernel. Be aware that this might be overwhelming on a system with a lot of netlink traffic.
# modprobe nlmon # ip link add type nlmon # ip link set nlmon0 up
At this point use wireshark or tcpdump on the nlmon0 interface to view all netlink traffic.
Have a look at the examples for common uses of rtnetlink.
Example (AddAddress) ¶
Add IP address '127.0.0.2/8' to an interface 'lo'
// Gather the interface Index iface, _ := net.InterfaceByName("lo") // Get an ip address to add to the interface addr, cidr, _ := net.ParseCIDR("127.0.0.2/8") // Dial a connection to the rtnetlink socket conn, err := rtnetlink.Dial(nil) if err != nil { log.Fatal(err) } defer conn.Close() // Test for the right address family for addr family := unix.AF_INET6 to4 := cidr.IP.To4() if to4 != nil { family = unix.AF_INET } // Calculate the prefix length ones, _ := cidr.Mask.Size() // Calculate the broadcast IP // Only used when family is AF_INET var brd net.IP if to4 != nil { brd = make(net.IP, len(to4)) binary.BigEndian.PutUint32(brd, binary.BigEndian.Uint32(to4)|^binary.BigEndian.Uint32(net.IP(cidr.Mask).To4())) } // Send the message using the rtnetlink.Conn err = conn.Address.New(&rtnetlink.AddressMessage{ Family: uint8(family), PrefixLength: uint8(ones), Scope: unix.RT_SCOPE_UNIVERSE, Index: uint32(iface.Index), Attributes: &rtnetlink.AddressAttributes{ Address: addr, Local: addr, Broadcast: brd, }, }) log.Fatal(err)
Output:
Example (AddRoute) ¶
Add a route
// Gather the interface Index iface, _ := net.InterfaceByName("lo") // Get a route to add _, dst, _ := net.ParseCIDR("192.168.0.0/16") // Get a gw to use gw := net.ParseIP("127.0.0.1") // Dial a connection to the rtnetlink socket conn, err := rtnetlink.Dial(nil) if err != nil { log.Fatal(err) } defer conn.Close() attr := rtnetlink.RouteAttributes{ Dst: dst.IP, OutIface: uint32(iface.Index), } if gw == nil { attr.Gateway = gw } ones, _ := dst.Mask.Size() err = conn.Route.Add(&rtnetlink.RouteMessage{ Family: unix.AF_INET, Table: unix.RT_TABLE_MAIN, Protocol: unix.RTPROT_BOOT, Scope: unix.RT_SCOPE_LINK, Type: unix.RTN_UNICAST, DstLength: uint8(ones), Attributes: attr, }) log.Fatal(err)
Output:
Example (DeleteAddress) ¶
Delete IP address '127.0.0.2/8' from interface 'lo'
// Gather the interface Index iface, _ := net.InterfaceByName("lo") // Get an ip address to delete from the interface addr, cidr, _ := net.ParseCIDR("127.0.0.2/8") // Dial a connection to the rtnetlink socket conn, err := rtnetlink.Dial(nil) if err != nil { log.Fatal(err) } defer conn.Close() // Test for the right address family for addr family := unix.AF_INET6 to4 := cidr.IP.To4() if to4 != nil { family = unix.AF_INET } // Calculate the prefix length ones, _ := cidr.Mask.Size() // Calculate the broadcast IP // Only used when family is AF_INET var brd net.IP if to4 != nil { brd = make(net.IP, len(to4)) binary.BigEndian.PutUint32(brd, binary.BigEndian.Uint32(to4)|^binary.BigEndian.Uint32(net.IP(cidr.Mask).To4())) } // Send the message using the rtnetlink.Conn err = conn.Address.Delete(&rtnetlink.AddressMessage{ Family: uint8(family), PrefixLength: uint8(ones), Index: uint32(iface.Index), Attributes: &rtnetlink.AddressAttributes{ Address: addr, Broadcast: brd, }, }) log.Fatal(err)
Output:
Example (ListAddress) ¶
List all IPv4 addresses configured on interface 'lo'
// Gather the interface Index iface, _ := net.InterfaceByName("lo") // Get an ip address to add to the interface family := uint8(unix.AF_INET) // Dial a connection to the rtnetlink socket conn, err := rtnetlink.Dial(nil) if err != nil { log.Fatal(err) } defer conn.Close() // Request a list of addresses msg, err := conn.Address.List() if err != nil { log.Fatal(err) } // Filter out the wanted messages and put them in the 'addr' slice. var addr []rtnetlink.AddressMessage for _, v := range msg { add := true if iface != nil && v.Index != uint32(iface.Index) { add = false } if family != 0 && v.Family != family { add = false } if add { addr = append(addr, v) } } log.Printf("%#v", addr)
Output:
Example (ListLink) ¶
List all interfaces
// Dial a connection to the rtnetlink socket conn, err := rtnetlink.Dial(nil) if err != nil { log.Fatal(err) } defer conn.Close() // Request a list of interfaces msg, err := conn.Link.List() if err != nil { log.Fatal(err) } log.Printf("%#v", msg)
Output:
Example (ListNeighbors) ¶
List all neighbors on interface 'lo'
// Gather the interface Index iface, _ := net.InterfaceByName("lo") // Get an ip address to add to the interface family := uint8(unix.AF_INET) // Dial a connection to the rtnetlink socket conn, err := rtnetlink.Dial(nil) if err != nil { log.Fatal(err) } defer conn.Close() // Request all neighbors msg, err := conn.Neigh.List() if err != nil { log.Fatal(err) } // Filter neighbors by family and interface index var neigh []rtnetlink.NeighMessage for _, v := range msg { add := true if iface != nil && v.Index != uint32(iface.Index) { add = false } if family != 0 && v.Family != uint16(family) { add = false } if add { neigh = append(neigh, v) } } log.Printf("%#v", neigh)
Output:
Example (ListRule) ¶
List all rules
// Dial a connection to the rtnetlink socket conn, err := rtnetlink.Dial(nil) if err != nil { log.Fatal(err) } defer conn.Close() // Request a list of rules rules, err := conn.Rule.List() if err != nil { log.Fatal(err) } for _, rule := range rules { log.Printf("%+v", rule) }
Output:
Example (SetLinkDown) ¶
Set the operational state an interface to Down
// Gather the interface Index iface, _ := net.InterfaceByName("dummy0") // Dial a connection to the rtnetlink socket conn, err := rtnetlink.Dial(nil) if err != nil { log.Fatal(err) } defer conn.Close() // Request the details of the interface msg, err := conn.Link.Get(uint32(iface.Index)) if err != nil { log.Fatal(err) } state := msg.Attributes.OperationalState // If the link is already down, return immediately if state == rtnetlink.OperStateDown { return } // Set the interface operationally Down err = conn.Link.Set(&rtnetlink.LinkMessage{ Family: 0x0, Type: msg.Type, Index: uint32(iface.Index), Flags: 0x0, Change: 0x1, }) log.Fatal(err)
Output:
Example (SetLinkHWAddr) ¶
Set the hw address of an interface
// Gather the interface Index iface, _ := net.InterfaceByName("dummy0") // Get a hw addr to set the interface to hwAddr, _ := net.ParseMAC("ce:9c:5b:98:55:9c") // Dial a connection to the rtnetlink socket conn, err := rtnetlink.Dial(nil) if err != nil { log.Fatal(err) } defer conn.Close() // Request the details of the interface msg, err := conn.Link.Get(uint32(iface.Index)) if err != nil { log.Fatal(err) } // Set the hw address of the interfaces err = conn.Link.Set(&rtnetlink.LinkMessage{ Family: 0x0, Type: msg.Type, Index: uint32(iface.Index), Flags: msg.Flags, Change: msg.Change, Attributes: &rtnetlink.LinkAttributes{ Address: hwAddr, }, }) log.Fatal(err)
Output:
Example (SetLinkUp) ¶
Set the operational state an interface to Up
// Gather the interface Index iface, _ := net.InterfaceByName("dummy0") // Dial a connection to the rtnetlink socket conn, err := rtnetlink.Dial(nil) if err != nil { log.Fatal(err) } defer conn.Close() // Request the details of the interface msg, err := conn.Link.Get(uint32(iface.Index)) if err != nil { log.Fatal(err) } state := msg.Attributes.OperationalState // If the link is already up, return immediately if state == rtnetlink.OperStateUp || state == rtnetlink.OperStateUnknown { return } // Set the interface operationally UP err = conn.Link.Set(&rtnetlink.LinkMessage{ Family: unix.AF_UNSPEC, Type: msg.Type, Index: uint32(iface.Index), Flags: unix.IFF_UP, Change: unix.IFF_UP, }) log.Fatal(err)
Output:
Index ¶
- func RegisterDriver(d LinkDriver) error
- type AddressAttributes
- type AddressMessage
- type AddressService
- type CacheInfo
- type Conn
- func (c *Conn) Close() error
- func (c *Conn) Execute(m Message, family uint16, flags netlink.HeaderFlags) ([]Message, error)
- func (c *Conn) Receive() ([]Message, []netlink.Message, error)
- func (c *Conn) Send(m Message, family uint16, flags netlink.HeaderFlags) (netlink.Message, error)
- func (c *Conn) SetOption(option netlink.ConnOption, enable bool) error
- func (c *Conn) SetReadDeadline(t time.Time) error
- type LinkAttributes
- type LinkData
- type LinkDriver
- type LinkDriverVerifier
- type LinkInfo
- type LinkMessage
- type LinkService
- func (l *LinkService) Delete(index uint32) error
- func (l *LinkService) Get(index uint32) (LinkMessage, error)
- func (l *LinkService) List() ([]LinkMessage, error)
- func (l *LinkService) ListByKind(kind string) ([]LinkMessage, error)
- func (l *LinkService) New(req *LinkMessage) error
- func (l *LinkService) Set(req *LinkMessage) error
- type LinkSlaveDriver
- type LinkStats
- type LinkStats64
- type LinkXDP
- type MPLSNextHop
- type Message
- type NeighAttributes
- type NeighCacheInfo
- type NeighMessage
- type NeighService
- type NetNS
- type NextHop
- type OperationalState
- type RTNextHop
- type RouteAttributes
- type RouteMessage
- type RouteMetrics
- type RouteService
- type RuleAttributes
- type RuleMessage
- type RulePortRange
- type RuleService
- type RuleUIDRange
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func RegisterDriver ¶
func RegisterDriver(d LinkDriver) error
RegisterDriver registers a driver with the link service This allows the driver to be used to encode/decode the link data
This function is not threadsafe. This should not be used after Dial
Types ¶
type AddressAttributes ¶
type AddressAttributes struct { Address net.IP // Interface Ip address Local net.IP // Local Ip address Label string Broadcast net.IP // Broadcast Ip address Anycast net.IP // Anycast Ip address CacheInfo CacheInfo // Address information Multicast net.IP // Multicast Ip address Flags uint32 // Address flags }
AddressAttributes contains all attributes for an interface.
type AddressMessage ¶
type AddressMessage struct { // Address family (current unix.AF_INET or unix.AF_INET6) Family uint8 // Prefix length PrefixLength uint8 // Contains address flags Flags uint8 // Address Scope Scope uint8 // Interface index Index uint32 // Optional attributes which are appended when not nil. Attributes *AddressAttributes }
A AddressMessage is a route netlink address message.
func (*AddressMessage) MarshalBinary ¶
func (m *AddressMessage) MarshalBinary() ([]byte, error)
MarshalBinary marshals a AddressMessage into a byte slice.
func (*AddressMessage) UnmarshalBinary ¶
func (m *AddressMessage) UnmarshalBinary(b []byte) error
UnmarshalBinary unmarshals the contents of a byte slice into a AddressMessage.
type AddressService ¶
type AddressService struct {
// contains filtered or unexported fields
}
AddressService is used to retrieve rtnetlink family information.
func (*AddressService) Delete ¶
func (a *AddressService) Delete(req *AddressMessage) error
Delete removes an address using the AddressMessage information.
func (*AddressService) List ¶
func (a *AddressService) List() ([]AddressMessage, error)
List retrieves all addresses.
func (*AddressService) New ¶
func (a *AddressService) New(req *AddressMessage) error
New creates a new address using the AddressMessage information.
type Conn ¶
type Conn struct { Link *LinkService Address *AddressService Route *RouteService Neigh *NeighService Rule *RuleService // contains filtered or unexported fields }
A Conn is a route netlink connection. A Conn can be used to send and receive route netlink messages to and from netlink.
func Dial ¶
Dial dials a route netlink connection. Config specifies optional configuration for the underlying netlink connection. If config is nil, a default configuration will be used.
func (*Conn) Execute ¶
Execute sends a single Message to netlink using Send, receives one or more replies using Receive, and then checks the validity of the replies against the request using netlink.Validate.
Execute acquires a lock for the duration of the function call which blocks concurrent calls to Send and Receive, in order to ensure consistency between generic netlink request/reply messages.
See the documentation of Send, Receive, and netlink.Validate for details about each function.
func (*Conn) Receive ¶
Receive receives one or more Messages from netlink. The netlink.Messages used to wrap each Message are available for later validation.
func (*Conn) Send ¶
Send sends a single Message to netlink, wrapping it in a netlink.Message using the specified generic netlink family and flags. On success, Send returns a copy of the netlink.Message with all parameters populated, for later validation.
type LinkAttributes ¶
type LinkAttributes struct { Address net.HardwareAddr // Interface L2 address Alias *string // Interface alias name Broadcast net.HardwareAddr // L2 broadcast address Carrier *uint8 // Current physical link state of the interface. CarrierChanges *uint32 // Number of times the link has seen a change from UP to DOWN and vice versa CarrierUpCount *uint32 // Number of times the link has been up CarrierDownCount *uint32 // Number of times the link has been down Index *uint32 // System-wide interface unique index identifier Info *LinkInfo // Detailed Interface Information LinkMode *uint8 // Interface link mode MTU uint32 // MTU of the device Name string // Device name NetDevGroup *uint32 // Interface network device group OperationalState OperationalState // Interface operation state PhysPortID *string // Interface unique physical port identifier within the NIC PhysPortName *string // Interface physical port name within the NIC PhysSwitchID *string // Unique physical switch identifier of a switch this port belongs to QueueDisc string // Queueing discipline Master *uint32 // Master device index (0 value un-enslaves) Stats *LinkStats // Interface Statistics Stats64 *LinkStats64 // Interface Statistics (64 bits version) TxQueueLen *uint32 // Interface transmit queue len in number of packets Type uint32 // Link type XDP *LinkXDP // Express Data Patch Information NetNS *NetNS // Interface network namespace }
LinkAttributes contains all attributes for an interface.
type LinkData ¶
LinkData implements the default LinkDriver interface for not registered drivers
func (*LinkData) New ¶
func (d *LinkData) New() LinkDriver
type LinkDriver ¶
type LinkDriver interface { // New returns a new instance of the LinkDriver New() LinkDriver // Encode the driver data into the netlink message attribute Encode(*netlink.AttributeEncoder) error // Decode the driver data from the netlink message attribute Decode(*netlink.AttributeDecoder) error // Return the driver kind as string, this will be matched with the LinkInfo.Kind to find a driver to decode the data Kind() string }
LinkDriver is the interface that wraps link-specific Encode, Decode, and Kind methods
type LinkDriverVerifier ¶
type LinkDriverVerifier interface { LinkDriver // Verify function run before Encode function to check for correctness and // pass related values that otherwise unavailable to the driver Verify(*LinkMessage) error }
LinkDriverVerifier defines a LinkDriver with Verify method
type LinkInfo ¶
type LinkInfo struct { Kind string // Driver name Data LinkDriver // Driver specific configuration stored as nested Netlink messages SlaveKind string // Slave driver name SlaveData LinkDriver // Slave driver specific configuration }
LinkInfo contains data for specific network types
type LinkMessage ¶
type LinkMessage struct { // Always set to AF_UNSPEC (0) Family uint16 // Device Type Type uint16 // Unique interface index, using a nonzero value with // NewLink will instruct the kernel to create a // device with the given index (kernel 3.7+ required) Index uint32 // Contains device flags, see netdevice(7) Flags uint32 // Change Flags, specifies which flags will be affected by the Flags field Change uint32 // Attributes List Attributes *LinkAttributes }
A LinkMessage is a route netlink link message.
func (*LinkMessage) MarshalBinary ¶
func (m *LinkMessage) MarshalBinary() ([]byte, error)
MarshalBinary marshals a LinkMessage into a byte slice.
func (*LinkMessage) UnmarshalBinary ¶
func (m *LinkMessage) UnmarshalBinary(b []byte) error
UnmarshalBinary unmarshals the contents of a byte slice into a LinkMessage.
type LinkService ¶
type LinkService struct {
// contains filtered or unexported fields
}
LinkService is used to retrieve rtnetlink family information.
func (*LinkService) Delete ¶
func (l *LinkService) Delete(index uint32) error
Delete removes an interface by index.
func (*LinkService) Get ¶
func (l *LinkService) Get(index uint32) (LinkMessage, error)
Get retrieves interface information by index.
func (*LinkService) List ¶
func (l *LinkService) List() ([]LinkMessage, error)
List retrieves all interfaces.
func (*LinkService) ListByKind ¶
func (l *LinkService) ListByKind(kind string) ([]LinkMessage, error)
ListByKind retrieves all interfaces of a specific kind.
func (*LinkService) New ¶
func (l *LinkService) New(req *LinkMessage) error
New creates a new interface using the LinkMessage information.
func (*LinkService) Set ¶
func (l *LinkService) Set(req *LinkMessage) error
Set sets interface attributes according to the LinkMessage information.
ref: https://lwn.net/Articles/236919/ We explicitly use RTM_NEWLINK to set link attributes instead of RTM_SETLINK because:
- using RTM_SETLINK is actually an old rtnetlink API, not supporting most attributes common today
- using RTM_NEWLINK is the preferred way to create AND update links
- RTM_NEWLINK is backward compatible to RTM_SETLINK
type LinkSlaveDriver ¶
type LinkSlaveDriver interface { LinkDriver // Slave method specifies driver is a slave link info Slave() }
LinkSlaveDriver defines a LinkDriver with Slave method
type LinkStats ¶
type LinkStats struct { RXPackets uint32 // total packets received TXPackets uint32 // total packets transmitted RXBytes uint32 // total bytes received TXBytes uint32 // total bytes transmitted RXErrors uint32 // bad packets received TXErrors uint32 // packet transmit problems RXDropped uint32 // no space in linux buffers TXDropped uint32 // no space available in linux Multicast uint32 // multicast packets received Collisions uint32 // detailed rx_errors: RXLengthErrors uint32 RXOverErrors uint32 // receiver ring buff overflow RXCRCErrors uint32 // recved pkt with crc error RXFrameErrors uint32 // recv'd frame alignment error RXFIFOErrors uint32 // recv'r fifo overrun RXMissedErrors uint32 // receiver missed packet // detailed tx_errors TXAbortedErrors uint32 TXCarrierErrors uint32 TXFIFOErrors uint32 TXHeartbeatErrors uint32 TXWindowErrors uint32 // for cslip etc RXCompressed uint32 TXCompressed uint32 RXNoHandler uint32 // dropped, no handler found }
LinkStats contains packet statistics
type LinkStats64 ¶
type LinkStats64 struct { RXPackets uint64 // total packets received TXPackets uint64 // total packets transmitted RXBytes uint64 // total bytes received TXBytes uint64 // total bytes transmitted RXErrors uint64 // bad packets received TXErrors uint64 // packet transmit problems RXDropped uint64 // no space in linux buffers TXDropped uint64 // no space available in linux Multicast uint64 // multicast packets received Collisions uint64 // detailed rx_errors: RXLengthErrors uint64 RXOverErrors uint64 // receiver ring buff overflow RXCRCErrors uint64 // recved pkt with crc error RXFrameErrors uint64 // recv'd frame alignment error RXFIFOErrors uint64 // recv'r fifo overrun RXMissedErrors uint64 // receiver missed packet // detailed tx_errors TXAbortedErrors uint64 TXCarrierErrors uint64 TXFIFOErrors uint64 TXHeartbeatErrors uint64 TXWindowErrors uint64 // for cslip etc RXCompressed uint64 TXCompressed uint64 RXNoHandler uint64 // dropped, no handler found RXOtherhostDropped uint64 // Number of packets dropped due to mismatch in destination MAC address. }
LinkStats64 contains packet statistics
type MPLSNextHop ¶
An MPLSNextHop is a route next hop using MPLS encapsulation.
type Message ¶
type Message interface { encoding.BinaryMarshaler encoding.BinaryUnmarshaler // contains filtered or unexported methods }
Message is the interface used for passing around different kinds of rtnetlink messages
type NeighAttributes ¶
type NeighAttributes struct { Address net.IP // a neighbor cache n/w layer destination address LLAddress net.HardwareAddr // a neighbor cache link layer address CacheInfo *NeighCacheInfo // cache statistics IfIndex uint32 }
NeighAttributes contains all attributes for a neighbor.
type NeighCacheInfo ¶
NeighCacheInfo contains neigh information
type NeighMessage ¶
type NeighMessage struct { // Always set to AF_UNSPEC (0) Family uint16 // Unique interface index Index uint32 // Neighbor State is a bitmask of neighbor states (see rtnetlink(7)) State uint16 // Neighbor flags Flags uint8 // Neighbor type Type uint8 // Attributes List Attributes *NeighAttributes }
A NeighMessage is a route netlink neighbor message.
func (*NeighMessage) MarshalBinary ¶
func (m *NeighMessage) MarshalBinary() ([]byte, error)
MarshalBinary marshals a NeighMessage into a byte slice.
func (*NeighMessage) UnmarshalBinary ¶
func (m *NeighMessage) UnmarshalBinary(b []byte) error
UnmarshalBinary unmarshals the contents of a byte slice into a NeighMessage.
type NeighService ¶
type NeighService struct {
// contains filtered or unexported fields
}
NeighService is used to retrieve rtnetlink family information.
func (*NeighService) Delete ¶
func (l *NeighService) Delete(index uint32) error
Delete removes an neighbor entry by index.
func (*NeighService) List ¶
func (l *NeighService) List() ([]NeighMessage, error)
List retrieves all neighbors.
func (*NeighService) New ¶
func (l *NeighService) New(req *NeighMessage) error
New creates a new interface using the LinkMessage information.
type NetNS ¶
type NetNS struct {
// contains filtered or unexported fields
}
NetNS represents a Linux network namespace handle to specify in LinkAttributes.
Use NetNSForPID to create a handle to the network namespace of an existing PID, or NetNSForFD for a handle to an existing network namespace created by another library.
func NetNSForFD ¶ added in v2.0.2
NetNSForFD returns a handle to an existing network namespace created by another library. It does not clone fd or manage its lifecycle in any way. The caller is responsible for making sure the underlying fd stays alive for the duration of any API calls using the NetNS.
func NetNSForPID ¶ added in v2.0.2
NetNSForPID returns a handle to the network namespace of an existing process given its pid. The process must be alive when the NetNS is used in any API calls.
The resulting NetNS doesn't hold a hard reference to the netns (it doesn't increase its refcount) and becomes invalid when the process it points to dies.
type NextHop ¶
type NextHop struct { Hop RTNextHop // a rtnexthop struct Gateway net.IP // that struct's nested Gateway attribute MPLS []MPLSNextHop // Any MPLS next hops for a route. }
NextHop wraps struct rtnexthop to provide access to nested attributes
type OperationalState ¶
type OperationalState uint8
OperationalState represents an interface's operational state.
const ( OperStateUnknown OperationalState = iota // status could not be determined OperStateNotPresent // down, due to some missing component (typically hardware) OperStateDown // down, either administratively or due to a fault OperStateLowerLayerDown // down, due to lower-layer interfaces OperStateTesting // operationally down, in some test mode OperStateDormant // down, waiting for some external event OperStateUp // interface is in a state to send and receive packets )
Constants that represent operational state of an interface
Adapted from https://elixir.bootlin.com/linux/v4.19.2/source/include/uapi/linux/if.h#L166
type RTNextHop ¶
type RTNextHop struct { Length uint16 // length of this hop including nested values Flags uint8 // flags defined in rtnetlink.h line 311 Hops uint8 IfIndex uint32 // the interface index number }
RTNextHop represents the netlink rtnexthop struct (not an attribute)
type RouteAttributes ¶
type RouteMessage ¶
type RouteMessage struct { Family uint8 // Address family (current unix.AF_INET or unix.AF_INET6) DstLength uint8 // Length of destination prefix SrcLength uint8 // Length of source prefix Tos uint8 // TOS filter Table uint8 // Routing table ID Protocol uint8 // Routing protocol Scope uint8 // Distance to the destination Type uint8 // Route type Flags uint32 Attributes RouteAttributes }
func (*RouteMessage) MarshalBinary ¶
func (m *RouteMessage) MarshalBinary() ([]byte, error)
func (*RouteMessage) UnmarshalBinary ¶
func (m *RouteMessage) UnmarshalBinary(b []byte) error
type RouteMetrics ¶
type RouteMetrics struct { AdvMSS uint32 Features uint32 InitCwnd uint32 InitRwnd uint32 MTU uint32 }
RouteMetrics holds some advanced metrics for a route
type RouteService ¶
type RouteService struct {
// contains filtered or unexported fields
}
func (*RouteService) Delete ¶
func (r *RouteService) Delete(req *RouteMessage) error
Delete existing route
func (*RouteService) Get ¶
func (r *RouteService) Get(req *RouteMessage) ([]RouteMessage, error)
Get Route(s)
func (*RouteService) Replace ¶
func (r *RouteService) Replace(req *RouteMessage) error
Replace or add new route
type RuleAttributes ¶
type RuleAttributes struct {
Src, Dst *net.IP
IIFName, OIFName *string
Goto *uint32
Priority *uint32
FwMark, FwMask *uint32
SrcRealm *uint16
DstRealm *uint16
TunID *uint64
Table *uint32
L3MDev *uint8
Protocol *uint8
IPProto *uint8
SuppressPrefixLen *uint32
SuppressIFGroup *uint32
UIDRange *RuleUIDRange
SPortRange *RulePortRange
DPortRange *RulePortRange
}
RuleAttributes contains all attributes for a rule.
type RuleMessage ¶
type RuleMessage struct { // Address family Family uint8 // Length of destination prefix DstLength uint8 // Length of source prefix SrcLength uint8 // Rule TOS TOS uint8 // Routing table identifier Table uint8 // Rule action Action uint8 // Rule flags Flags uint32 // Attributes List Attributes *RuleAttributes }
A RuleMessage is a route netlink link message.
func (*RuleMessage) MarshalBinary ¶
func (m *RuleMessage) MarshalBinary() ([]byte, error)
MarshalBinary marshals a LinkMessage into a byte slice.
func (*RuleMessage) UnmarshalBinary ¶
func (m *RuleMessage) UnmarshalBinary(b []byte) error
UnmarshalBinary unmarshals the contents of a byte slice into a LinkMessage.
type RulePortRange ¶
type RulePortRange struct {
Start, End uint16
}
RulePortRange defines start and end ports for a rule
type RuleService ¶
type RuleService struct {
// contains filtered or unexported fields
}
RuleService is used to retrieve rtnetlink family information.
func (*RuleService) Delete ¶
func (r *RuleService) Delete(req *RuleMessage) error
Delete existing rule
func (*RuleService) Get ¶
func (r *RuleService) Get(req *RuleMessage) ([]RuleMessage, error)
Get Rule(s)
func (*RuleService) Replace ¶
func (r *RuleService) Replace(req *RuleMessage) error
Replace or add new rule
type RuleUIDRange ¶
type RuleUIDRange struct {
Start, End uint16
}
RuleUIDRange defines the start and end for UID matches