Simple netlink library for go.
Go Makefile
Latest commit 90b9ee5 Jan 5, 2017 @ejj ejj committed with Fix the RouteList() prototype on non-linux platforms
The RouteList() function prototype had become out of sync with its
Linux counterpart.  This patch updates it.
Permalink
Failed to load latest commit information.
nl Add support for VRF. With this change we can create VRF interface. Jan 5, 2017
.travis.yml make the gre test pass Dec 18, 2015
LICENSE Initial commit of netlink package Sep 1, 2014
Makefile Serialize Handle's sockets access (#124) May 18, 2016
README.md Fixed typos in README and docstrings (#132) Jun 15, 2016
addr.go Add support for VTI and IPIP Nov 23, 2016
addr_linux.go Add support for VTI and IPIP Nov 23, 2016
addr_test.go Add support for VTI and IPIP Nov 23, 2016
bpf_linux.go Add support for xdp set/get of a bpf program (#156) Aug 25, 2016
class.go fix darwin build by moving code (#138) Jun 15, 2016
class_linux.go fix darwin build by moving code (#138) Jun 15, 2016
class_test.go Cleanup from golint and go vet Mar 20, 2016
filter.go filter: fix recursive string call (#162) Aug 25, 2016
filter_linux.go export encode actions Jun 25, 2016
filter_test.go Add support for xdp set/get of a bpf program (#156) Aug 25, 2016
handle_linux.go Allow setting socket timeout on Handle Nov 15, 2016
handle_test.go Allow setting socket timeout on Handle Nov 15, 2016
handle_unspecified.go Implement handle on non-linux platforms Dec 19, 2016
link.go Add support for VRF. With this change we can create VRF interface. Jan 5, 2017
link_linux.go Add support for VRF. With this change we can create VRF interface. Jan 5, 2017
link_test.go Parse IFLA_PROTINFO in LinkDeserialize Dec 3, 2016
link_tuntap_linux.go Drop cgo usage for ifReq structure. Oct 2, 2015
neigh.go Use LinkIndex instead of Link obj in Route, Neigh Oct 13, 2014
neigh_linux.go Add proxy support to the neighbor functions (#149) Aug 23, 2016
neigh_test.go Add proxy support to the neighbor functions (#149) Aug 23, 2016
netlink.go fix darwin build by moving code (#138) Jun 15, 2016
netlink_linux.go fix darwin build by moving code (#138) Jun 15, 2016
netlink_test.go IPVlan support Feb 11, 2015
netlink_unspecified.go Fix the RouteList() prototype on non-linux platforms Jan 10, 2017
protinfo.go protinfo: return value of evaluated expression Dec 13, 2016
protinfo_linux.go Parse IFLA_PROTINFO in LinkDeserialize Dec 3, 2016
protinfo_test.go Change logic of setting protinfo attrs Feb 17, 2015
qdisc.go fix darwin build by moving code (#138) Jun 15, 2016
qdisc_linux.go Fix a panic in parseTbfData. Jan 5, 2017
qdisc_test.go [qdisc] add support for replace/change Nov 12, 2015
route.go fix darwin build by moving code (#138) Jun 15, 2016
route_linux.go Enable RouteListFiltered to seach default routes Nov 22, 2016
route_test.go Enable RouteListFiltered to seach default routes Nov 22, 2016
route_unspecified.go fix darwin build by moving code (#138) Jun 15, 2016
rule.go fix darwin build by moving code (#138) Jun 15, 2016
rule_linux.go Fix bug in ruleHandle: allocate different buffers for each rtattr Nov 4, 2016
rule_test.go Cleanup from golint and go vet Mar 20, 2016
xfrm.go fix darwin build by moving code (#138) Jun 15, 2016
xfrm_policy.go Allow SPI to be passed in policy template (#127) May 25, 2016
xfrm_policy_linux.go Allow SPI to be passed in policy template (#127) May 25, 2016
xfrm_policy_test.go Allow SPI to be passed in policy template (#127) May 25, 2016
xfrm_state.go Add support for Authenticated Encryption with Associated Data (AEAD) (#… Jun 29, 2016
xfrm_state_linux.go Fix bug in xfrmStateGetOrDelete (#155) Jul 29, 2016
xfrm_state_test.go Fix bug in xfrmStateGetOrDelete (#155) Jul 29, 2016

README.md

netlink - netlink library for go

Build Status GoDoc

The netlink package provides a simple netlink library for go. Netlink is the interface a user-space program in linux uses to communicate with the kernel. It can be used to add and remove interfaces, set ip addresses and routes, and configure ipsec. Netlink communication requires elevated privileges, so in most cases this code needs to be run as root. Since low-level netlink messages are inscrutable at best, the library attempts to provide an api that is loosely modeled on the CLI provided by iproute2. Actions like ip link add will be accomplished via a similarly named function like AddLink(). This library began its life as a fork of the netlink functionality in docker/libcontainer but was heavily rewritten to improve testability, performance, and to add new functionality like ipsec xfrm handling.

Local Build and Test

You can use go get command:

go get github.com/vishvananda/netlink

Testing dependencies:

go get github.com/vishvananda/netns

Testing (requires root):

sudo -E go test github.com/vishvananda/netlink

Examples

Add a new bridge and add eth1 into it:

package main

import (
    "net"
    "github.com/vishvananda/netlink"
)

func main() {
    la := netlink.NewLinkAttrs()
    la.Name = "foo"
    mybridge := &netlink.Bridge{la}}
    _ := netlink.LinkAdd(mybridge)
    eth1, _ := netlink.LinkByName("eth1")
    netlink.LinkSetMaster(eth1, mybridge)
}

Note NewLinkAttrs constructor, it sets default values in structure. For now it sets only TxQLen to -1, so kernel will set default by itself. If you're using simple initialization(LinkAttrs{Name: "foo"}) TxQLen will be set to 0 unless you specify it like LinkAttrs{Name: "foo", TxQLen: 1000}.

Add a new ip address to loopback:

package main

import (
    "net"
    "github.com/vishvananda/netlink"
)

func main() {
    lo, _ := netlink.LinkByName("lo")
    addr, _ := netlink.ParseAddr("169.254.169.254/32")
    netlink.AddrAdd(lo, addr)
}

Future Work

Many pieces of netlink are not yet fully supported in the high-level interface. Aspects of virtually all of the high-level objects don't exist. Many of the underlying primitives are there, so its a matter of putting the right fields into the high-level objects and making sure that they are serialized and deserialized correctly in the Add and List methods.

There are also a few pieces of low level netlink functionality that still need to be implemented. Routing rules are not in place and some of the more advanced link types. Hopefully there is decent structure and testing in place to make these fairly straightforward to add.