Update vishvananda/netlink package

PR to update to vishvananda/netlink package

Signed-off-by: Jana Radhakrishnan <mrjana@docker.com>
This commit is contained in:
Jana Radhakrishnan 2015-06-30 11:10:08 -07:00
parent 10444cb448
commit a22d29b7cf
15 changed files with 276 additions and 50 deletions

View file

@ -132,7 +132,7 @@
}, },
{ {
"ImportPath": "github.com/vishvananda/netlink", "ImportPath": "github.com/vishvananda/netlink",
"Rev": "8eb64238879fed52fd51c5b30ad20b928fb4c36c" "Rev": "20397a138846e4d6590e01783ed023ed7e1c38a6"
}, },
{ {
"ImportPath": "github.com/vishvananda/netns", "ImportPath": "github.com/vishvananda/netns",

View file

@ -43,13 +43,19 @@ import (
) )
func main() { func main() {
mybridge := &netlink.Bridge{netlink.LinkAttrs{Name: "foo"}} la := netlink.NewLinkAttrs()
la.Name = "foo"
mybridge := &netlink.Bridge{la}}
_ := netlink.LinkAdd(mybridge) _ := netlink.LinkAdd(mybridge)
eth1, _ := netlink.LinkByName("eth1") eth1, _ := netlink.LinkByName("eth1")
netlink.LinkSetMaster(eth1, mybridge) 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: Add a new ip address to loopback:

View file

@ -14,8 +14,8 @@ type Addr struct {
} }
// String returns $ip/$netmask $label // String returns $ip/$netmask $label
func (addr Addr) String() string { func (a Addr) String() string {
return fmt.Sprintf("%s %s", addr.IPNet, addr.Label) return fmt.Sprintf("%s %s", a.IPNet, a.Label)
} }
// ParseAddr parses the string representation of an address in the // ParseAddr parses the string representation of an address in the

View file

@ -81,7 +81,7 @@ func AddrList(link Link, family int) ([]Addr, error) {
index = base.Index index = base.Index
} }
res := make([]Addr, 0) var res []Addr
for _, m := range msgs { for _, m := range msgs {
msg := nl.DeserializeIfAddrmsg(m) msg := nl.DeserializeIfAddrmsg(m)
@ -95,11 +95,17 @@ func AddrList(link Link, family int) ([]Addr, error) {
return nil, err return nil, err
} }
var local, dst *net.IPNet
var addr Addr var addr Addr
for _, attr := range attrs { for _, attr := range attrs {
switch attr.Attr.Type { switch attr.Attr.Type {
case syscall.IFA_ADDRESS: case syscall.IFA_ADDRESS:
addr.IPNet = &net.IPNet{ dst = &net.IPNet{
IP: attr.Value,
Mask: net.CIDRMask(int(msg.Prefixlen), 8*len(attr.Value)),
}
case syscall.IFA_LOCAL:
local = &net.IPNet{
IP: attr.Value, IP: attr.Value,
Mask: net.CIDRMask(int(msg.Prefixlen), 8*len(attr.Value)), Mask: net.CIDRMask(int(msg.Prefixlen), 8*len(attr.Value)),
} }
@ -107,6 +113,14 @@ func AddrList(link Link, family int) ([]Addr, error) {
addr.Label = string(attr.Value[:len(attr.Value)-1]) addr.Label = string(attr.Value[:len(attr.Value)-1])
} }
} }
// IFA_LOCAL should be there but if not, fall back to IFA_ADDRESS
if local != nil {
addr.IPNet = local
} else {
addr.IPNet = dst
}
res = append(res, addr) res = append(res, addr)
} }

View file

@ -10,16 +10,29 @@ type Link interface {
Type() string Type() string
} }
type (
NsPid int
NsFd int
)
// LinkAttrs represents data shared by most link types // LinkAttrs represents data shared by most link types
type LinkAttrs struct { type LinkAttrs struct {
Index int Index int
MTU int MTU int
TxQLen uint32 // Transmit Queue Length TxQLen int // Transmit Queue Length
Name string Name string
HardwareAddr net.HardwareAddr HardwareAddr net.HardwareAddr
Flags net.Flags Flags net.Flags
ParentIndex int // index of the parent link device ParentIndex int // index of the parent link device
MasterIndex int // must be the index of a bridge MasterIndex int // must be the index of a bridge
Namespace interface{} // nil | NsPid | NsFd
}
// NewLinkAttrs returns LinkAttrs structure filled with default values
func NewLinkAttrs() LinkAttrs {
return LinkAttrs{
TxQLen: -1,
}
} }
// Device links cannot be created via netlink. These links // Device links cannot be created via netlink. These links
@ -76,9 +89,21 @@ func (vlan *Vlan) Type() string {
return "vlan" return "vlan"
} }
type MacvlanMode uint16
const (
MACVLAN_MODE_DEFAULT MacvlanMode = iota
MACVLAN_MODE_PRIVATE
MACVLAN_MODE_VEPA
MACVLAN_MODE_BRIDGE
MACVLAN_MODE_PASSTHRU
MACVLAN_MODE_SOURCE
)
// Macvlan links have ParentIndex set in their Attrs() // Macvlan links have ParentIndex set in their Attrs()
type Macvlan struct { type Macvlan struct {
LinkAttrs LinkAttrs
Mode MacvlanMode
} }
func (macvlan *Macvlan) Attrs() *LinkAttrs { func (macvlan *Macvlan) Attrs() *LinkAttrs {

View file

@ -13,6 +13,15 @@ import (
var native = nl.NativeEndian() var native = nl.NativeEndian()
var lookupByDump = false var lookupByDump = false
var macvlanModes = [...]uint32{
0,
nl.MACVLAN_MODE_PRIVATE,
nl.MACVLAN_MODE_VEPA,
nl.MACVLAN_MODE_BRIDGE,
nl.MACVLAN_MODE_PASSTHRU,
nl.MACVLAN_MODE_SOURCE,
}
func ensureIndex(link *LinkAttrs) { func ensureIndex(link *LinkAttrs) {
if link != nil && link.Index == 0 { if link != nil && link.Index == 0 {
newlink, _ := LinkByName(link.Name) newlink, _ := LinkByName(link.Name)
@ -39,7 +48,7 @@ func LinkSetUp(link Link) error {
return err return err
} }
// LinkSetUp disables link device. // LinkSetDown disables link device.
// Equivalent to: `ip link set $link down` // Equivalent to: `ip link set $link down`
func LinkSetDown(link Link) error { func LinkSetDown(link Link) error {
base := link.Attrs() base := link.Attrs()
@ -67,7 +76,7 @@ func LinkSetMTU(link Link, mtu int) error {
msg.Type = syscall.RTM_SETLINK msg.Type = syscall.RTM_SETLINK
msg.Flags = syscall.NLM_F_REQUEST msg.Flags = syscall.NLM_F_REQUEST
msg.Index = int32(base.Index) msg.Index = int32(base.Index)
msg.Change = nl.DEFAULT_CHANGE msg.Change = syscall.IFLA_MTU
req.AddData(msg) req.AddData(msg)
b := make([]byte, 4) b := make([]byte, 4)
@ -91,7 +100,7 @@ func LinkSetName(link Link, name string) error {
msg.Type = syscall.RTM_SETLINK msg.Type = syscall.RTM_SETLINK
msg.Flags = syscall.NLM_F_REQUEST msg.Flags = syscall.NLM_F_REQUEST
msg.Index = int32(base.Index) msg.Index = int32(base.Index)
msg.Change = nl.DEFAULT_CHANGE msg.Change = syscall.IFLA_IFNAME
req.AddData(msg) req.AddData(msg)
data := nl.NewRtAttr(syscall.IFLA_IFNAME, []byte(name)) data := nl.NewRtAttr(syscall.IFLA_IFNAME, []byte(name))
@ -112,7 +121,7 @@ func LinkSetHardwareAddr(link Link, hwaddr net.HardwareAddr) error {
msg.Type = syscall.RTM_SETLINK msg.Type = syscall.RTM_SETLINK
msg.Flags = syscall.NLM_F_REQUEST msg.Flags = syscall.NLM_F_REQUEST
msg.Index = int32(base.Index) msg.Index = int32(base.Index)
msg.Change = nl.DEFAULT_CHANGE msg.Change = syscall.IFLA_ADDRESS
req.AddData(msg) req.AddData(msg)
data := nl.NewRtAttr(syscall.IFLA_ADDRESS, []byte(hwaddr)) data := nl.NewRtAttr(syscall.IFLA_ADDRESS, []byte(hwaddr))
@ -145,7 +154,7 @@ func LinkSetMasterByIndex(link Link, masterIndex int) error {
msg.Type = syscall.RTM_SETLINK msg.Type = syscall.RTM_SETLINK
msg.Flags = syscall.NLM_F_REQUEST msg.Flags = syscall.NLM_F_REQUEST
msg.Index = int32(base.Index) msg.Index = int32(base.Index)
msg.Change = nl.DEFAULT_CHANGE msg.Change = syscall.IFLA_MASTER
req.AddData(msg) req.AddData(msg)
b := make([]byte, 4) b := make([]byte, 4)
@ -170,7 +179,7 @@ func LinkSetNsPid(link Link, nspid int) error {
msg.Type = syscall.RTM_SETLINK msg.Type = syscall.RTM_SETLINK
msg.Flags = syscall.NLM_F_REQUEST msg.Flags = syscall.NLM_F_REQUEST
msg.Index = int32(base.Index) msg.Index = int32(base.Index)
msg.Change = nl.DEFAULT_CHANGE msg.Change = syscall.IFLA_NET_NS_PID
req.AddData(msg) req.AddData(msg)
b := make([]byte, 4) b := make([]byte, 4)
@ -183,7 +192,7 @@ func LinkSetNsPid(link Link, nspid int) error {
return err return err
} }
// LinkSetNsPid puts the device into a new network namespace. The // LinkSetNsFd puts the device into a new network namespace. The
// fd must be an open file descriptor to a network namespace. // fd must be an open file descriptor to a network namespace.
// Similar to: `ip link set $link netns $ns` // Similar to: `ip link set $link netns $ns`
func LinkSetNsFd(link Link, fd int) error { func LinkSetNsFd(link Link, fd int) error {
@ -195,7 +204,7 @@ func LinkSetNsFd(link Link, fd int) error {
msg.Type = syscall.RTM_SETLINK msg.Type = syscall.RTM_SETLINK
msg.Flags = syscall.NLM_F_REQUEST msg.Flags = syscall.NLM_F_REQUEST
msg.Index = int32(base.Index) msg.Index = int32(base.Index)
msg.Change = nl.DEFAULT_CHANGE msg.Change = nl.IFLA_NET_NS_FD
req.AddData(msg) req.AddData(msg)
b := make([]byte, 4) b := make([]byte, 4)
@ -312,11 +321,28 @@ func LinkAdd(link Link) error {
req.AddData(mtu) req.AddData(mtu)
} }
if base.TxQLen >= 0 {
qlen := nl.NewRtAttr(syscall.IFLA_TXQLEN, nl.Uint32Attr(uint32(base.TxQLen)))
req.AddData(qlen)
}
if base.Namespace != nil {
var attr *nl.RtAttr
switch base.Namespace.(type) {
case NsPid:
val := nl.Uint32Attr(uint32(base.Namespace.(NsPid)))
attr = nl.NewRtAttr(syscall.IFLA_NET_NS_PID, val)
case NsFd:
val := nl.Uint32Attr(uint32(base.Namespace.(NsFd)))
attr = nl.NewRtAttr(nl.IFLA_NET_NS_FD, val)
}
req.AddData(attr)
}
linkInfo := nl.NewRtAttr(syscall.IFLA_LINKINFO, nil) linkInfo := nl.NewRtAttr(syscall.IFLA_LINKINFO, nil)
nl.NewRtAttrChild(linkInfo, nl.IFLA_INFO_KIND, nl.NonZeroTerminated(link.Type())) nl.NewRtAttrChild(linkInfo, nl.IFLA_INFO_KIND, nl.NonZeroTerminated(link.Type()))
nl.NewRtAttrChild(linkInfo, syscall.IFLA_TXQLEN, nl.Uint32Attr(base.TxQLen))
if vlan, ok := link.(*Vlan); ok { if vlan, ok := link.(*Vlan); ok {
b := make([]byte, 2) b := make([]byte, 2)
native.PutUint16(b, uint16(vlan.VlanId)) native.PutUint16(b, uint16(vlan.VlanId))
@ -327,15 +353,23 @@ func LinkAdd(link Link) error {
peer := nl.NewRtAttrChild(data, nl.VETH_INFO_PEER, nil) peer := nl.NewRtAttrChild(data, nl.VETH_INFO_PEER, nil)
nl.NewIfInfomsgChild(peer, syscall.AF_UNSPEC) nl.NewIfInfomsgChild(peer, syscall.AF_UNSPEC)
nl.NewRtAttrChild(peer, syscall.IFLA_IFNAME, nl.ZeroTerminated(veth.PeerName)) nl.NewRtAttrChild(peer, syscall.IFLA_IFNAME, nl.ZeroTerminated(veth.PeerName))
nl.NewRtAttrChild(peer, syscall.IFLA_TXQLEN, nl.Uint32Attr(base.TxQLen)) if base.TxQLen >= 0 {
nl.NewRtAttrChild(peer, syscall.IFLA_TXQLEN, nl.Uint32Attr(uint32(base.TxQLen)))
}
if base.MTU > 0 { if base.MTU > 0 {
nl.NewRtAttrChild(peer, syscall.IFLA_MTU, nl.Uint32Attr(uint32(base.MTU))) nl.NewRtAttrChild(peer, syscall.IFLA_MTU, nl.Uint32Attr(uint32(base.MTU)))
} }
} else if vxlan, ok := link.(*Vxlan); ok { } else if vxlan, ok := link.(*Vxlan); ok {
addVxlanAttrs(vxlan, linkInfo) addVxlanAttrs(vxlan, linkInfo)
} else if ipv, ok := link.(*IPVlan); ok { } else if ipv, ok := link.(*IPVlan); ok {
data := nl.NewRtAttrChild(linkInfo, nl.IFLA_INFO_DATA, nil) data := nl.NewRtAttrChild(linkInfo, nl.IFLA_INFO_DATA, nil)
nl.NewRtAttrChild(data, nl.IFLA_IPVLAN_MODE, nl.Uint16Attr(uint16(ipv.Mode))) nl.NewRtAttrChild(data, nl.IFLA_IPVLAN_MODE, nl.Uint16Attr(uint16(ipv.Mode)))
} else if macv, ok := link.(*Macvlan); ok {
if macv.Mode != MACVLAN_MODE_DEFAULT {
data := nl.NewRtAttrChild(linkInfo, nl.IFLA_INFO_DATA, nil)
nl.NewRtAttrChild(data, nl.IFLA_MACVLAN_MODE, nl.Uint32Attr(macvlanModes[macv.Mode]))
}
} }
req.AddData(linkInfo) req.AddData(linkInfo)
@ -483,6 +517,8 @@ func linkDeserialize(m []byte) (Link, error) {
link = &Vxlan{} link = &Vxlan{}
case "ipvlan": case "ipvlan":
link = &IPVlan{} link = &IPVlan{}
case "macvlan":
link = &Macvlan{}
default: default:
link = &Generic{LinkType: linkType} link = &Generic{LinkType: linkType}
} }
@ -498,6 +534,8 @@ func linkDeserialize(m []byte) (Link, error) {
parseVxlanData(link, data) parseVxlanData(link, data)
case "ipvlan": case "ipvlan":
parseIPVlanData(link, data) parseIPVlanData(link, data)
case "macvlan":
parseMacvlanData(link, data)
} }
} }
} }
@ -520,7 +558,7 @@ func linkDeserialize(m []byte) (Link, error) {
case syscall.IFLA_MASTER: case syscall.IFLA_MASTER:
base.MasterIndex = int(native.Uint32(attr.Value[0:4])) base.MasterIndex = int(native.Uint32(attr.Value[0:4]))
case syscall.IFLA_TXQLEN: case syscall.IFLA_TXQLEN:
base.TxQLen = native.Uint32(attr.Value[0:4]) base.TxQLen = int(native.Uint32(attr.Value[0:4]))
} }
} }
// Links that don't have IFLA_INFO_KIND are hardware devices // Links that don't have IFLA_INFO_KIND are hardware devices
@ -547,8 +585,7 @@ func LinkList() ([]Link, error) {
return nil, err return nil, err
} }
res := make([]Link, 0) var res []Link
for _, m := range msgs { for _, m := range msgs {
link, err := linkDeserialize(m) link, err := linkDeserialize(m)
if err != nil { if err != nil {
@ -593,7 +630,7 @@ func setProtinfoAttr(link Link, mode bool, attr int) error {
msg.Type = syscall.RTM_SETLINK msg.Type = syscall.RTM_SETLINK
msg.Flags = syscall.NLM_F_REQUEST msg.Flags = syscall.NLM_F_REQUEST
msg.Index = int32(base.Index) msg.Index = int32(base.Index)
msg.Change = nl.DEFAULT_CHANGE msg.Change = syscall.IFLA_PROTINFO | syscall.NLA_F_NESTED
req.AddData(msg) req.AddData(msg)
br := nl.NewRtAttr(syscall.IFLA_PROTINFO|syscall.NLA_F_NESTED, nil) br := nl.NewRtAttr(syscall.IFLA_PROTINFO|syscall.NLA_F_NESTED, nil)
@ -674,6 +711,27 @@ func parseIPVlanData(link Link, data []syscall.NetlinkRouteAttr) {
} }
} }
func parseMacvlanData(link Link, data []syscall.NetlinkRouteAttr) {
macv := link.(*Macvlan)
for _, datum := range data {
if datum.Attr.Type == nl.IFLA_MACVLAN_MODE {
switch native.Uint32(datum.Value[0:4]) {
case nl.MACVLAN_MODE_PRIVATE:
macv.Mode = MACVLAN_MODE_PRIVATE
case nl.MACVLAN_MODE_VEPA:
macv.Mode = MACVLAN_MODE_VEPA
case nl.MACVLAN_MODE_BRIDGE:
macv.Mode = MACVLAN_MODE_BRIDGE
case nl.MACVLAN_MODE_PASSTHRU:
macv.Mode = MACVLAN_MODE_PASSTHRU
case nl.MACVLAN_MODE_SOURCE:
macv.Mode = MACVLAN_MODE_SOURCE
}
return
}
}
}
// copied from pkg/net_linux.go // copied from pkg/net_linux.go
func linkFlags(rawFlags uint32) net.Flags { func linkFlags(rawFlags uint32) net.Flags {
var f net.Flags var f net.Flags

View file

@ -8,7 +8,10 @@ import (
"github.com/vishvananda/netns" "github.com/vishvananda/netns"
) )
const testTxQLen uint32 = 100 const (
testTxQLen int = 100
defaultTxQLen int = 1000
)
func testLinkAddDel(t *testing.T, link Link) { func testLinkAddDel(t *testing.T, link Link) {
links, err := LinkList() links, err := LinkList()
@ -50,9 +53,9 @@ func testLinkAddDel(t *testing.T, link Link) {
} }
} }
if veth, ok := link.(*Veth); ok { if veth, ok := result.(*Veth); ok {
if veth.TxQLen != testTxQLen { if rBase.TxQLen != base.TxQLen {
t.Fatalf("TxQLen is %d, should be %d", veth.TxQLen, testTxQLen) t.Fatalf("qlen is %d, should be %d", rBase.TxQLen, base.TxQLen)
} }
if rBase.MTU != base.MTU { if rBase.MTU != base.MTU {
t.Fatalf("MTU is %d, should be %d", rBase.MTU, base.MTU) t.Fatalf("MTU is %d, should be %d", rBase.MTU, base.MTU)
@ -91,6 +94,16 @@ func testLinkAddDel(t *testing.T, link Link) {
} }
} }
if macv, ok := link.(*Macvlan); ok {
other, ok := result.(*Macvlan)
if !ok {
t.Fatal("Result of create is not a macvlan")
}
if macv.Mode != other.Mode {
t.Fatalf("Got unexpected mode: %d, expected: %d", other.Mode, macv.Mode)
}
}
if err = LinkDel(link); err != nil { if err = LinkDel(link); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -199,7 +212,10 @@ func TestLinkAddDelMacvlan(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
testLinkAddDel(t, &Macvlan{LinkAttrs{Name: "bar", ParentIndex: parent.Attrs().Index}}) testLinkAddDel(t, &Macvlan{
LinkAttrs: LinkAttrs{Name: "bar", ParentIndex: parent.Attrs().Index},
Mode: MACVLAN_MODE_PRIVATE,
})
if err := LinkDel(parent); err != nil { if err := LinkDel(parent); err != nil {
t.Fatal(err) t.Fatal(err)
@ -213,6 +229,99 @@ func TestLinkAddDelVeth(t *testing.T) {
testLinkAddDel(t, &Veth{LinkAttrs{Name: "foo", TxQLen: testTxQLen, MTU: 1400}, "bar"}) testLinkAddDel(t, &Veth{LinkAttrs{Name: "foo", TxQLen: testTxQLen, MTU: 1400}, "bar"})
} }
func TestLinkAddVethWithDefaultTxQLen(t *testing.T) {
tearDown := setUpNetlinkTest(t)
defer tearDown()
la := NewLinkAttrs()
la.Name = "foo"
veth := &Veth{LinkAttrs: la, PeerName: "bar"}
if err := LinkAdd(veth); err != nil {
t.Fatal(err)
}
link, err := LinkByName("foo")
if err != nil {
t.Fatal(err)
}
if veth, ok := link.(*Veth); !ok {
t.Fatalf("unexpected link type: %T", link)
} else {
if veth.TxQLen != defaultTxQLen {
t.Fatalf("TxQLen is %d, should be %d", veth.TxQLen, defaultTxQLen)
}
}
peer, err := LinkByName("bar")
if err != nil {
t.Fatal(err)
}
if veth, ok := peer.(*Veth); !ok {
t.Fatalf("unexpected link type: %T", link)
} else {
if veth.TxQLen != defaultTxQLen {
t.Fatalf("TxQLen is %d, should be %d", veth.TxQLen, defaultTxQLen)
}
}
}
func TestLinkAddVethWithZeroTxQLen(t *testing.T) {
tearDown := setUpNetlinkTest(t)
defer tearDown()
la := NewLinkAttrs()
la.Name = "foo"
la.TxQLen = 0
veth := &Veth{LinkAttrs: la, PeerName: "bar"}
if err := LinkAdd(veth); err != nil {
t.Fatal(err)
}
link, err := LinkByName("foo")
if err != nil {
t.Fatal(err)
}
if veth, ok := link.(*Veth); !ok {
t.Fatalf("unexpected link type: %T", link)
} else {
if veth.TxQLen != 0 {
t.Fatalf("TxQLen is %d, should be %d", veth.TxQLen, 0)
}
}
peer, err := LinkByName("bar")
if err != nil {
t.Fatal(err)
}
if veth, ok := peer.(*Veth); !ok {
t.Fatalf("unexpected link type: %T", link)
} else {
if veth.TxQLen != 0 {
t.Fatalf("TxQLen is %d, should be %d", veth.TxQLen, 0)
}
}
}
func TestLinkAddDummyWithTxQLen(t *testing.T) {
tearDown := setUpNetlinkTest(t)
defer tearDown()
la := NewLinkAttrs()
la.Name = "foo"
la.TxQLen = 1500
dummy := &Dummy{LinkAttrs: la}
if err := LinkAdd(dummy); err != nil {
t.Fatal(err)
}
link, err := LinkByName("foo")
if err != nil {
t.Fatal(err)
}
if dummy, ok := link.(*Dummy); !ok {
t.Fatalf("unexpected link type: %T", link)
} else {
if dummy.TxQLen != 1500 {
t.Fatalf("TxQLen is %d, should be %d", dummy.TxQLen, 1500)
}
}
}
func TestLinkAddDelBridgeMaster(t *testing.T) { func TestLinkAddDelBridgeMaster(t *testing.T) {
tearDown := setUpNetlinkTest(t) tearDown := setUpNetlinkTest(t)
defer tearDown() defer tearDown()

View file

@ -141,7 +141,7 @@ func NeighList(linkIndex, family int) ([]Neigh, error) {
return nil, err return nil, err
} }
res := make([]Neigh, 0) var res []Neigh
for _, m := range msgs { for _, m := range msgs {
ndm := deserializeNdmsg(m) ndm := deserializeNdmsg(m)
if linkIndex != 0 && int(ndm.Index) != linkIndex { if linkIndex != 0 && int(ndm.Index) != linkIndex {

View file

@ -79,3 +79,18 @@ const (
// not defined in syscall // not defined in syscall
IFLA_NET_NS_FD = 28 IFLA_NET_NS_FD = 28
) )
const (
IFLA_MACVLAN_UNSPEC = iota
IFLA_MACVLAN_MODE
IFLA_MACVLAN_FLAGS
IFLA_MACVLAN_MAX = IFLA_MACVLAN_FLAGS
)
const (
MACVLAN_MODE_PRIVATE = 1
MACVLAN_MODE_VEPA = 2
MACVLAN_MODE_BRIDGE = 4
MACVLAN_MODE_PASSTHRU = 8
MACVLAN_MODE_SOURCE = 16
)

View file

@ -172,16 +172,16 @@ type NetlinkRequest struct {
} }
// Serialize the Netlink Request into a byte array // Serialize the Netlink Request into a byte array
func (msg *NetlinkRequest) Serialize() []byte { func (req *NetlinkRequest) Serialize() []byte {
length := syscall.SizeofNlMsghdr length := syscall.SizeofNlMsghdr
dataBytes := make([][]byte, len(msg.Data)) dataBytes := make([][]byte, len(req.Data))
for i, data := range msg.Data { for i, data := range req.Data {
dataBytes[i] = data.Serialize() dataBytes[i] = data.Serialize()
length = length + len(dataBytes[i]) length = length + len(dataBytes[i])
} }
msg.Len = uint32(length) req.Len = uint32(length)
b := make([]byte, length) b := make([]byte, length)
hdr := (*(*[syscall.SizeofNlMsghdr]byte)(unsafe.Pointer(msg)))[:] hdr := (*(*[syscall.SizeofNlMsghdr]byte)(unsafe.Pointer(req)))[:]
next := syscall.SizeofNlMsghdr next := syscall.SizeofNlMsghdr
copy(b[0:next], hdr) copy(b[0:next], hdr)
for _, data := range dataBytes { for _, data := range dataBytes {
@ -193,9 +193,9 @@ func (msg *NetlinkRequest) Serialize() []byte {
return b return b
} }
func (msg *NetlinkRequest) AddData(data NetlinkRequestData) { func (req *NetlinkRequest) AddData(data NetlinkRequestData) {
if data != nil { if data != nil {
msg.Data = append(msg.Data, data) req.Data = append(req.Data, data)
} }
} }
@ -218,11 +218,11 @@ func (req *NetlinkRequest) Execute(sockType int, resType uint16) ([][]byte, erro
return nil, err return nil, err
} }
res := make([][]byte, 0) var res [][]byte
done: done:
for { for {
msgs, err := s.Recieve() msgs, err := s.Receive()
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -294,7 +294,7 @@ func getNetlinkSocket(protocol int) (*NetlinkSocket, error) {
// Create a netlink socket with a given protocol (e.g. NETLINK_ROUTE) // Create a netlink socket with a given protocol (e.g. NETLINK_ROUTE)
// and subscribe it to multicast groups passed in variable argument list. // and subscribe it to multicast groups passed in variable argument list.
// Returns the netlink socket on whic hReceive() method can be called // Returns the netlink socket on which Receive() method can be called
// to retrieve the messages from the kernel. // to retrieve the messages from the kernel.
func Subscribe(protocol int, groups ...uint) (*NetlinkSocket, error) { func Subscribe(protocol int, groups ...uint) (*NetlinkSocket, error) {
fd, err := syscall.Socket(syscall.AF_NETLINK, syscall.SOCK_RAW, protocol) fd, err := syscall.Socket(syscall.AF_NETLINK, syscall.SOCK_RAW, protocol)
@ -329,7 +329,7 @@ func (s *NetlinkSocket) Send(request *NetlinkRequest) error {
return nil return nil
} }
func (s *NetlinkSocket) Recieve() ([]syscall.NetlinkMessage, error) { func (s *NetlinkSocket) Receive() ([]syscall.NetlinkMessage, error) {
rb := make([]byte, syscall.Getpagesize()) rb := make([]byte, syscall.Getpagesize())
nr, _, err := syscall.Recvfrom(s.fd, rb, 0) nr, _, err := syscall.Recvfrom(s.fd, rb, 0)
if err != nil { if err != nil {

View file

@ -104,9 +104,8 @@ func (x *XfrmAddress) ToIPNet(prefixlen uint8) *net.IPNet {
ip := x.ToIP() ip := x.ToIP()
if GetIPFamily(ip) == FAMILY_V4 { if GetIPFamily(ip) == FAMILY_V4 {
return &net.IPNet{IP: ip, Mask: net.CIDRMask(int(prefixlen), 32)} return &net.IPNet{IP: ip, Mask: net.CIDRMask(int(prefixlen), 32)}
} else {
return &net.IPNet{IP: ip, Mask: net.CIDRMask(int(prefixlen), 128)}
} }
return &net.IPNet{IP: ip, Mask: net.CIDRMask(int(prefixlen), 128)}
} }
func (x *XfrmAddress) FromIP(ip net.IP) { func (x *XfrmAddress) FromIP(ip net.IP) {
@ -125,8 +124,8 @@ func DeserializeXfrmAddress(b []byte) *XfrmAddress {
return (*XfrmAddress)(unsafe.Pointer(&b[0:SizeofXfrmAddress][0])) return (*XfrmAddress)(unsafe.Pointer(&b[0:SizeofXfrmAddress][0]))
} }
func (msg *XfrmAddress) Serialize() []byte { func (x *XfrmAddress) Serialize() []byte {
return (*(*[SizeofXfrmAddress]byte)(unsafe.Pointer(msg)))[:] return (*(*[SizeofXfrmAddress]byte)(unsafe.Pointer(x)))[:]
} }
// struct xfrm_selector { // struct xfrm_selector {

View file

@ -16,7 +16,7 @@ type Protinfo struct {
// String returns a list of enabled flags // String returns a list of enabled flags
func (prot *Protinfo) String() string { func (prot *Protinfo) String() string {
boolStrings := make([]string, 0) var boolStrings []string
if prot.Hairpin { if prot.Hairpin {
boolStrings = append(boolStrings, "Hairpin") boolStrings = append(boolStrings, "Hairpin")
} }

View file

@ -119,7 +119,7 @@ func RouteList(link Link, family int) ([]Route, error) {
} }
native := nl.NativeEndian() native := nl.NativeEndian()
res := make([]Route, 0) var res []Route
for _, m := range msgs { for _, m := range msgs {
msg := nl.DeserializeRtMsg(m) msg := nl.DeserializeRtMsg(m)
@ -193,7 +193,7 @@ func RouteGet(destination net.IP) ([]Route, error) {
} }
native := nl.NativeEndian() native := nl.NativeEndian()
res := make([]Route, 0) var res []Route
for _, m := range msgs { for _, m := range msgs {
msg := nl.DeserializeRtMsg(m) msg := nl.DeserializeRtMsg(m)
attrs, err := nl.ParseRouteAttr(m[msg.Len():]) attrs, err := nl.ParseRouteAttr(m[msg.Len():])

View file

@ -84,7 +84,7 @@ func XfrmPolicyList(family int) ([]XfrmPolicy, error) {
return nil, err return nil, err
} }
res := make([]XfrmPolicy, 0) var res []XfrmPolicy
for _, m := range msgs { for _, m := range msgs {
msg := nl.DeserializeXfrmUserpolicyInfo(m) msg := nl.DeserializeXfrmUserpolicyInfo(m)

View file

@ -118,7 +118,7 @@ func XfrmStateList(family int) ([]XfrmState, error) {
return nil, err return nil, err
} }
res := make([]XfrmState, 0) var res []XfrmState
for _, m := range msgs { for _, m := range msgs {
msg := nl.DeserializeXfrmUsersaInfo(m) msg := nl.DeserializeXfrmUsersaInfo(m)