diff --git a/go.mod b/go.mod index eed6706c..c38b7273 100644 --- a/go.mod +++ b/go.mod @@ -60,7 +60,7 @@ require ( github.com/ugorji/go v0.0.0-20171019201919-bdcc60b419d1 // indirect github.com/ulikunitz/xz v0.5.4 github.com/vincent-petithory/dataurl v0.0.0-20160330182126-9a301d65acbb - github.com/vishvananda/netlink v0.0.0-20150217221648-2e9d285a7160 + github.com/vishvananda/netlink v0.0.0-20150710184826-9cff81214893 github.com/vishvananda/netns v0.0.0-20150710222425-604eaf189ee8 github.com/vmware/govmomi v0.15.0 github.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18 // indirect diff --git a/go.sum b/go.sum index 650f02e1..cb5d44fe 100644 --- a/go.sum +++ b/go.sum @@ -176,6 +176,8 @@ github.com/vincent-petithory/dataurl v0.0.0-20160330182126-9a301d65acbb h1:lyL3z github.com/vincent-petithory/dataurl v0.0.0-20160330182126-9a301d65acbb/go.mod h1:FHafX5vmDzyP+1CQATJn7WFKc9CvnvxyvZy6I1MrG/U= github.com/vishvananda/netlink v0.0.0-20150217221648-2e9d285a7160 h1:bIW5hzk/ElzcgxEsZQUxFZLh/nZ3PlYU4ZDd+6fD15w= github.com/vishvananda/netlink v0.0.0-20150217221648-2e9d285a7160/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= +github.com/vishvananda/netlink v0.0.0-20150710184826-9cff81214893 h1:aa5mTO5h2yn1zhd6HH0IJDBRZdwocPbqrf3ci22Ni1U= +github.com/vishvananda/netlink v0.0.0-20150710184826-9cff81214893/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netns v0.0.0-20150710222425-604eaf189ee8 h1:MmJ82dMUwQ+0jmeFg/iWripmd3D+GlYUu/CV2m7hJto= github.com/vishvananda/netns v0.0.0-20150710222425-604eaf189ee8/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= github.com/vmware/govmomi v0.15.0 h1:fVMjwFASkUIGenwURwP0ruAzTjka0l2AV9wtARwkJLI= diff --git a/vendor/github.com/vishvananda/netlink/README.md b/vendor/github.com/vishvananda/netlink/README.md index 555f8865..8cd50a93 100644 --- a/vendor/github.com/vishvananda/netlink/README.md +++ b/vendor/github.com/vishvananda/netlink/README.md @@ -43,13 +43,19 @@ import ( ) func main() { - mybridge := &netlink.Bridge{netlink.LinkAttrs{Name: "foo"}} + 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: diff --git a/vendor/github.com/vishvananda/netlink/addr.go b/vendor/github.com/vishvananda/netlink/addr.go index 5c12f4e9..9bbaf508 100644 --- a/vendor/github.com/vishvananda/netlink/addr.go +++ b/vendor/github.com/vishvananda/netlink/addr.go @@ -14,8 +14,8 @@ type Addr struct { } // String returns $ip/$netmask $label -func (addr Addr) String() string { - return fmt.Sprintf("%s %s", addr.IPNet, addr.Label) +func (a Addr) String() string { + return fmt.Sprintf("%s %s", a.IPNet, a.Label) } // ParseAddr parses the string representation of an address in the diff --git a/vendor/github.com/vishvananda/netlink/addr_linux.go b/vendor/github.com/vishvananda/netlink/addr_linux.go index dd26f4ae..19aac0fb 100644 --- a/vendor/github.com/vishvananda/netlink/addr_linux.go +++ b/vendor/github.com/vishvananda/netlink/addr_linux.go @@ -81,7 +81,7 @@ func AddrList(link Link, family int) ([]Addr, error) { index = base.Index } - res := make([]Addr, 0) + var res []Addr for _, m := range msgs { msg := nl.DeserializeIfAddrmsg(m) @@ -95,11 +95,17 @@ func AddrList(link Link, family int) ([]Addr, error) { return nil, err } + var local, dst *net.IPNet var addr Addr for _, attr := range attrs { switch attr.Attr.Type { 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, 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]) } } + + // 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) } diff --git a/vendor/github.com/vishvananda/netlink/link.go b/vendor/github.com/vishvananda/netlink/link.go index 276c2f80..af51e3f0 100644 --- a/vendor/github.com/vishvananda/netlink/link.go +++ b/vendor/github.com/vishvananda/netlink/link.go @@ -10,16 +10,29 @@ type Link interface { Type() string } +type ( + NsPid int + NsFd int +) + // LinkAttrs represents data shared by most link types type LinkAttrs struct { Index int MTU int - TxQLen uint32 // Transmit Queue Length + TxQLen int // Transmit Queue Length Name string HardwareAddr net.HardwareAddr Flags net.Flags - ParentIndex int // index of the parent link device - MasterIndex int // must be the index of a bridge + ParentIndex int // index of the parent link device + 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 @@ -76,9 +89,21 @@ func (vlan *Vlan) Type() string { 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() type Macvlan struct { LinkAttrs + Mode MacvlanMode } func (macvlan *Macvlan) Attrs() *LinkAttrs { diff --git a/vendor/github.com/vishvananda/netlink/link_linux.go b/vendor/github.com/vishvananda/netlink/link_linux.go index aedea165..2b800d14 100644 --- a/vendor/github.com/vishvananda/netlink/link_linux.go +++ b/vendor/github.com/vishvananda/netlink/link_linux.go @@ -13,6 +13,15 @@ import ( var native = nl.NativeEndian() 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) { if link != nil && link.Index == 0 { newlink, _ := LinkByName(link.Name) @@ -39,7 +48,7 @@ func LinkSetUp(link Link) error { return err } -// LinkSetUp disables link device. +// LinkSetDown disables link device. // Equivalent to: `ip link set $link down` func LinkSetDown(link Link) error { base := link.Attrs() @@ -67,7 +76,7 @@ func LinkSetMTU(link Link, mtu int) error { msg.Type = syscall.RTM_SETLINK msg.Flags = syscall.NLM_F_REQUEST msg.Index = int32(base.Index) - msg.Change = nl.DEFAULT_CHANGE + msg.Change = syscall.IFLA_MTU req.AddData(msg) b := make([]byte, 4) @@ -91,7 +100,7 @@ func LinkSetName(link Link, name string) error { msg.Type = syscall.RTM_SETLINK msg.Flags = syscall.NLM_F_REQUEST msg.Index = int32(base.Index) - msg.Change = nl.DEFAULT_CHANGE + msg.Change = syscall.IFLA_IFNAME req.AddData(msg) 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.Flags = syscall.NLM_F_REQUEST msg.Index = int32(base.Index) - msg.Change = nl.DEFAULT_CHANGE + msg.Change = syscall.IFLA_ADDRESS req.AddData(msg) 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.Flags = syscall.NLM_F_REQUEST msg.Index = int32(base.Index) - msg.Change = nl.DEFAULT_CHANGE + msg.Change = syscall.IFLA_MASTER req.AddData(msg) b := make([]byte, 4) @@ -170,7 +179,7 @@ func LinkSetNsPid(link Link, nspid int) error { msg.Type = syscall.RTM_SETLINK msg.Flags = syscall.NLM_F_REQUEST msg.Index = int32(base.Index) - msg.Change = nl.DEFAULT_CHANGE + msg.Change = syscall.IFLA_NET_NS_PID req.AddData(msg) b := make([]byte, 4) @@ -183,7 +192,7 @@ func LinkSetNsPid(link Link, nspid int) error { 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. // Similar to: `ip link set $link netns $ns` func LinkSetNsFd(link Link, fd int) error { @@ -195,7 +204,7 @@ func LinkSetNsFd(link Link, fd int) error { msg.Type = syscall.RTM_SETLINK msg.Flags = syscall.NLM_F_REQUEST msg.Index = int32(base.Index) - msg.Change = nl.DEFAULT_CHANGE + msg.Change = nl.IFLA_NET_NS_FD req.AddData(msg) b := make([]byte, 4) @@ -312,11 +321,28 @@ func LinkAdd(link Link) error { 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) 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 { b := make([]byte, 2) native.PutUint16(b, uint16(vlan.VlanId)) @@ -327,15 +353,23 @@ func LinkAdd(link Link) error { peer := nl.NewRtAttrChild(data, nl.VETH_INFO_PEER, nil) nl.NewIfInfomsgChild(peer, syscall.AF_UNSPEC) 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 { nl.NewRtAttrChild(peer, syscall.IFLA_MTU, nl.Uint32Attr(uint32(base.MTU))) } + } else if vxlan, ok := link.(*Vxlan); ok { addVxlanAttrs(vxlan, linkInfo) } else if ipv, ok := link.(*IPVlan); ok { data := nl.NewRtAttrChild(linkInfo, nl.IFLA_INFO_DATA, nil) 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) @@ -483,6 +517,8 @@ func linkDeserialize(m []byte) (Link, error) { link = &Vxlan{} case "ipvlan": link = &IPVlan{} + case "macvlan": + link = &Macvlan{} default: link = &Generic{LinkType: linkType} } @@ -498,6 +534,8 @@ func linkDeserialize(m []byte) (Link, error) { parseVxlanData(link, data) case "ipvlan": parseIPVlanData(link, data) + case "macvlan": + parseMacvlanData(link, data) } } } @@ -520,7 +558,7 @@ func linkDeserialize(m []byte) (Link, error) { case syscall.IFLA_MASTER: base.MasterIndex = int(native.Uint32(attr.Value[0:4])) 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 @@ -547,8 +585,7 @@ func LinkList() ([]Link, error) { return nil, err } - res := make([]Link, 0) - + var res []Link for _, m := range msgs { link, err := linkDeserialize(m) if err != nil { @@ -593,7 +630,7 @@ func setProtinfoAttr(link Link, mode bool, attr int) error { msg.Type = syscall.RTM_SETLINK msg.Flags = syscall.NLM_F_REQUEST msg.Index = int32(base.Index) - msg.Change = nl.DEFAULT_CHANGE + msg.Change = syscall.IFLA_PROTINFO | syscall.NLA_F_NESTED req.AddData(msg) 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 func linkFlags(rawFlags uint32) net.Flags { var f net.Flags diff --git a/vendor/github.com/vishvananda/netlink/neigh_linux.go b/vendor/github.com/vishvananda/netlink/neigh_linux.go index 1fdaa3a3..620a0ee7 100644 --- a/vendor/github.com/vishvananda/netlink/neigh_linux.go +++ b/vendor/github.com/vishvananda/netlink/neigh_linux.go @@ -141,7 +141,7 @@ func NeighList(linkIndex, family int) ([]Neigh, error) { return nil, err } - res := make([]Neigh, 0) + var res []Neigh for _, m := range msgs { ndm := deserializeNdmsg(m) if linkIndex != 0 && int(ndm.Index) != linkIndex { diff --git a/vendor/github.com/vishvananda/netlink/nl/link_linux.go b/vendor/github.com/vishvananda/netlink/nl/link_linux.go index ab0dede6..64ef5fdb 100644 --- a/vendor/github.com/vishvananda/netlink/nl/link_linux.go +++ b/vendor/github.com/vishvananda/netlink/nl/link_linux.go @@ -79,3 +79,18 @@ const ( // not defined in syscall 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 +) diff --git a/vendor/github.com/vishvananda/netlink/nl/nl_linux.go b/vendor/github.com/vishvananda/netlink/nl/nl_linux.go index 72f28137..3cb137d0 100644 --- a/vendor/github.com/vishvananda/netlink/nl/nl_linux.go +++ b/vendor/github.com/vishvananda/netlink/nl/nl_linux.go @@ -39,8 +39,9 @@ func NativeEndian() binary.ByteOrder { var x uint32 = 0x01020304 if *(*byte)(unsafe.Pointer(&x)) == 0x01 { nativeEndian = binary.BigEndian + } else { + nativeEndian = binary.LittleEndian } - nativeEndian = binary.LittleEndian } return nativeEndian } @@ -172,16 +173,16 @@ type NetlinkRequest struct { } // Serialize the Netlink Request into a byte array -func (msg *NetlinkRequest) Serialize() []byte { +func (req *NetlinkRequest) Serialize() []byte { length := syscall.SizeofNlMsghdr - dataBytes := make([][]byte, len(msg.Data)) - for i, data := range msg.Data { + dataBytes := make([][]byte, len(req.Data)) + for i, data := range req.Data { dataBytes[i] = data.Serialize() length = length + len(dataBytes[i]) } - msg.Len = uint32(length) + req.Len = uint32(length) b := make([]byte, length) - hdr := (*(*[syscall.SizeofNlMsghdr]byte)(unsafe.Pointer(msg)))[:] + hdr := (*(*[syscall.SizeofNlMsghdr]byte)(unsafe.Pointer(req)))[:] next := syscall.SizeofNlMsghdr copy(b[0:next], hdr) for _, data := range dataBytes { @@ -193,9 +194,9 @@ func (msg *NetlinkRequest) Serialize() []byte { return b } -func (msg *NetlinkRequest) AddData(data NetlinkRequestData) { +func (req *NetlinkRequest) AddData(data NetlinkRequestData) { if data != nil { - msg.Data = append(msg.Data, data) + req.Data = append(req.Data, data) } } @@ -218,11 +219,11 @@ func (req *NetlinkRequest) Execute(sockType int, resType uint16) ([][]byte, erro return nil, err } - res := make([][]byte, 0) + var res [][]byte done: for { - msgs, err := s.Recieve() + msgs, err := s.Receive() if err != nil { return nil, err } @@ -294,7 +295,7 @@ func getNetlinkSocket(protocol int) (*NetlinkSocket, error) { // Create a netlink socket with a given protocol (e.g. NETLINK_ROUTE) // 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. func Subscribe(protocol int, groups ...uint) (*NetlinkSocket, error) { fd, err := syscall.Socket(syscall.AF_NETLINK, syscall.SOCK_RAW, protocol) @@ -329,7 +330,7 @@ func (s *NetlinkSocket) Send(request *NetlinkRequest) error { return nil } -func (s *NetlinkSocket) Recieve() ([]syscall.NetlinkMessage, error) { +func (s *NetlinkSocket) Receive() ([]syscall.NetlinkMessage, error) { rb := make([]byte, syscall.Getpagesize()) nr, _, err := syscall.Recvfrom(s.fd, rb, 0) if err != nil { diff --git a/vendor/github.com/vishvananda/netlink/nl/xfrm_linux.go b/vendor/github.com/vishvananda/netlink/nl/xfrm_linux.go index d9531308..d24637d2 100644 --- a/vendor/github.com/vishvananda/netlink/nl/xfrm_linux.go +++ b/vendor/github.com/vishvananda/netlink/nl/xfrm_linux.go @@ -104,9 +104,8 @@ func (x *XfrmAddress) ToIPNet(prefixlen uint8) *net.IPNet { ip := x.ToIP() if GetIPFamily(ip) == FAMILY_V4 { 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) { @@ -125,8 +124,8 @@ func DeserializeXfrmAddress(b []byte) *XfrmAddress { return (*XfrmAddress)(unsafe.Pointer(&b[0:SizeofXfrmAddress][0])) } -func (msg *XfrmAddress) Serialize() []byte { - return (*(*[SizeofXfrmAddress]byte)(unsafe.Pointer(msg)))[:] +func (x *XfrmAddress) Serialize() []byte { + return (*(*[SizeofXfrmAddress]byte)(unsafe.Pointer(x)))[:] } // struct xfrm_selector { diff --git a/vendor/github.com/vishvananda/netlink/protinfo.go b/vendor/github.com/vishvananda/netlink/protinfo.go index a5d330cb..f39ab8f4 100644 --- a/vendor/github.com/vishvananda/netlink/protinfo.go +++ b/vendor/github.com/vishvananda/netlink/protinfo.go @@ -1,12 +1,10 @@ package netlink import ( - "fmt" - "syscall" - - "github.com/vishvananda/netlink/nl" + "strings" ) +// Protinfo represents bridge flags from netlink. type Protinfo struct { Hairpin bool Guard bool @@ -16,6 +14,30 @@ type Protinfo struct { Flood bool } +// String returns a list of enabled flags +func (prot *Protinfo) String() string { + var boolStrings []string + if prot.Hairpin { + boolStrings = append(boolStrings, "Hairpin") + } + if prot.Guard { + boolStrings = append(boolStrings, "Guard") + } + if prot.FastLeave { + boolStrings = append(boolStrings, "FastLeave") + } + if prot.RootBlock { + boolStrings = append(boolStrings, "RootBlock") + } + if prot.Learning { + boolStrings = append(boolStrings, "Learning") + } + if prot.Flood { + boolStrings = append(boolStrings, "Flood") + } + return strings.Join(boolStrings, " ") +} + func boolToByte(x bool) []byte { if x { return []byte{1} @@ -29,55 +51,3 @@ func byteToBool(x byte) bool { } return false } - -func LinkGetProtinfo(link Link) (Protinfo, error) { - base := link.Attrs() - ensureIndex(base) - var pi Protinfo - req := nl.NewNetlinkRequest(syscall.RTM_GETLINK, syscall.NLM_F_DUMP) - msg := nl.NewIfInfomsg(syscall.AF_BRIDGE) - req.AddData(msg) - msgs, err := req.Execute(syscall.NETLINK_ROUTE, 0) - if err != nil { - return pi, err - } - - for _, m := range msgs { - ans := nl.DeserializeIfInfomsg(m) - if int(ans.Index) != base.Index { - continue - } - attrs, err := nl.ParseRouteAttr(m[ans.Len():]) - if err != nil { - return pi, err - } - for _, attr := range attrs { - if attr.Attr.Type != syscall.IFLA_PROTINFO|syscall.NLA_F_NESTED { - continue - } - infos, err := nl.ParseRouteAttr(attr.Value) - if err != nil { - return pi, err - } - var pi Protinfo - for _, info := range infos { - switch info.Attr.Type { - case nl.IFLA_BRPORT_MODE: - pi.Hairpin = byteToBool(info.Value[0]) - case nl.IFLA_BRPORT_GUARD: - pi.Guard = byteToBool(info.Value[0]) - case nl.IFLA_BRPORT_FAST_LEAVE: - pi.FastLeave = byteToBool(info.Value[0]) - case nl.IFLA_BRPORT_PROTECT: - pi.RootBlock = byteToBool(info.Value[0]) - case nl.IFLA_BRPORT_LEARNING: - pi.Learning = byteToBool(info.Value[0]) - case nl.IFLA_BRPORT_UNICAST_FLOOD: - pi.Flood = byteToBool(info.Value[0]) - } - } - return pi, nil - } - } - return pi, fmt.Errorf("Device with index %d not found", base.Index) -} diff --git a/vendor/github.com/vishvananda/netlink/protinfo_linux.go b/vendor/github.com/vishvananda/netlink/protinfo_linux.go new file mode 100644 index 00000000..7181eba1 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/protinfo_linux.go @@ -0,0 +1,60 @@ +package netlink + +import ( + "fmt" + "syscall" + + "github.com/vishvananda/netlink/nl" +) + +func LinkGetProtinfo(link Link) (Protinfo, error) { + base := link.Attrs() + ensureIndex(base) + var pi Protinfo + req := nl.NewNetlinkRequest(syscall.RTM_GETLINK, syscall.NLM_F_DUMP) + msg := nl.NewIfInfomsg(syscall.AF_BRIDGE) + req.AddData(msg) + msgs, err := req.Execute(syscall.NETLINK_ROUTE, 0) + if err != nil { + return pi, err + } + + for _, m := range msgs { + ans := nl.DeserializeIfInfomsg(m) + if int(ans.Index) != base.Index { + continue + } + attrs, err := nl.ParseRouteAttr(m[ans.Len():]) + if err != nil { + return pi, err + } + for _, attr := range attrs { + if attr.Attr.Type != syscall.IFLA_PROTINFO|syscall.NLA_F_NESTED { + continue + } + infos, err := nl.ParseRouteAttr(attr.Value) + if err != nil { + return pi, err + } + var pi Protinfo + for _, info := range infos { + switch info.Attr.Type { + case nl.IFLA_BRPORT_MODE: + pi.Hairpin = byteToBool(info.Value[0]) + case nl.IFLA_BRPORT_GUARD: + pi.Guard = byteToBool(info.Value[0]) + case nl.IFLA_BRPORT_FAST_LEAVE: + pi.FastLeave = byteToBool(info.Value[0]) + case nl.IFLA_BRPORT_PROTECT: + pi.RootBlock = byteToBool(info.Value[0]) + case nl.IFLA_BRPORT_LEARNING: + pi.Learning = byteToBool(info.Value[0]) + case nl.IFLA_BRPORT_UNICAST_FLOOD: + pi.Flood = byteToBool(info.Value[0]) + } + } + return pi, nil + } + } + return pi, fmt.Errorf("Device with index %d not found", base.Index) +} diff --git a/vendor/github.com/vishvananda/netlink/route_linux.go b/vendor/github.com/vishvananda/netlink/route_linux.go index 81182f3f..88fa6db0 100644 --- a/vendor/github.com/vishvananda/netlink/route_linux.go +++ b/vendor/github.com/vishvananda/netlink/route_linux.go @@ -25,7 +25,7 @@ func RouteDel(route *Route) error { } func routeHandle(route *Route, req *nl.NetlinkRequest) error { - if route.Dst.IP == nil && route.Src == nil && route.Gw == nil { + if (route.Dst == nil || route.Dst.IP == nil) && route.Src == nil && route.Gw == nil { return fmt.Errorf("one of Dst.IP, Src, or Gw must not be nil") } @@ -34,7 +34,7 @@ func routeHandle(route *Route, req *nl.NetlinkRequest) error { family := -1 var rtAttrs []*nl.RtAttr - if route.Dst.IP != nil { + if route.Dst != nil && route.Dst.IP != nil { dstLen, _ := route.Dst.Mask.Size() msg.Dst_len = uint8(dstLen) dstFamily := nl.GetIPFamily(route.Dst.IP) @@ -119,7 +119,7 @@ func RouteList(link Link, family int) ([]Route, error) { } native := nl.NativeEndian() - res := make([]Route, 0) + var res []Route for _, m := range msgs { msg := nl.DeserializeRtMsg(m) @@ -193,7 +193,7 @@ func RouteGet(destination net.IP) ([]Route, error) { } native := nl.NativeEndian() - res := make([]Route, 0) + var res []Route for _, m := range msgs { msg := nl.DeserializeRtMsg(m) attrs, err := nl.ParseRouteAttr(m[msg.Len():]) diff --git a/vendor/github.com/vishvananda/netlink/xfrm_policy_linux.go b/vendor/github.com/vishvananda/netlink/xfrm_policy_linux.go index 6fe1b637..2daf6dc8 100644 --- a/vendor/github.com/vishvananda/netlink/xfrm_policy_linux.go +++ b/vendor/github.com/vishvananda/netlink/xfrm_policy_linux.go @@ -84,7 +84,7 @@ func XfrmPolicyList(family int) ([]XfrmPolicy, error) { return nil, err } - res := make([]XfrmPolicy, 0) + var res []XfrmPolicy for _, m := range msgs { msg := nl.DeserializeXfrmUserpolicyInfo(m) diff --git a/vendor/github.com/vishvananda/netlink/xfrm_state_linux.go b/vendor/github.com/vishvananda/netlink/xfrm_state_linux.go index 0f1fbd0e..5f44ec85 100644 --- a/vendor/github.com/vishvananda/netlink/xfrm_state_linux.go +++ b/vendor/github.com/vishvananda/netlink/xfrm_state_linux.go @@ -118,7 +118,7 @@ func XfrmStateList(family int) ([]XfrmState, error) { return nil, err } - res := make([]XfrmState, 0) + var res []XfrmState for _, m := range msgs { msg := nl.DeserializeXfrmUsersaInfo(m) diff --git a/vendor/modules.txt b/vendor/modules.txt index 65c7fbd9..e7f11f98 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -42,8 +42,8 @@ github.com/ajeddeloh/yaml # github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf github.com/alecthomas/units # github.com/aws/aws-sdk-go v1.19.11 -github.com/aws/aws-sdk-go/aws github.com/aws/aws-sdk-go/aws/awserr +github.com/aws/aws-sdk-go/aws github.com/aws/aws-sdk-go/aws/client github.com/aws/aws-sdk-go/aws/credentials github.com/aws/aws-sdk-go/aws/endpoints @@ -291,7 +291,7 @@ github.com/ulikunitz/xz/lzma github.com/ulikunitz/xz/internal/hash # github.com/vincent-petithory/dataurl v0.0.0-20160330182126-9a301d65acbb github.com/vincent-petithory/dataurl -# github.com/vishvananda/netlink v0.0.0-20150217221648-2e9d285a7160 +# github.com/vishvananda/netlink v0.0.0-20150710184826-9cff81214893 github.com/vishvananda/netlink github.com/vishvananda/netlink/nl # github.com/vishvananda/netns v0.0.0-20150710222425-604eaf189ee8