Update vishvananda/netlink package
PR to update to vishvananda/netlink package Signed-off-by: Jana Radhakrishnan <mrjana@docker.com>
This commit is contained in:
parent
10444cb448
commit
a22d29b7cf
15 changed files with 276 additions and 50 deletions
2
libnetwork/Godeps/Godeps.json
generated
2
libnetwork/Godeps/Godeps.json
generated
|
@ -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",
|
||||||
|
|
8
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/README.md
generated
vendored
8
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/README.md
generated
vendored
|
@ -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:
|
||||||
|
|
||||||
|
|
4
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/addr.go
generated
vendored
4
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/addr.go
generated
vendored
|
@ -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
|
||||||
|
|
18
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/addr_linux.go
generated
vendored
18
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/addr_linux.go
generated
vendored
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
27
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/link.go
generated
vendored
27
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/link.go
generated
vendored
|
@ -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 {
|
||||||
|
|
88
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/link_linux.go
generated
vendored
88
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/link_linux.go
generated
vendored
|
@ -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
|
||||||
|
|
119
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/link_test.go
generated
vendored
119
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/link_test.go
generated
vendored
|
@ -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()
|
||||||
|
|
2
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/neigh_linux.go
generated
vendored
2
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/neigh_linux.go
generated
vendored
|
@ -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 {
|
||||||
|
|
15
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/nl/link_linux.go
generated
vendored
15
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/nl/link_linux.go
generated
vendored
|
@ -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
|
||||||
|
)
|
||||||
|
|
20
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/nl/nl_linux.go
generated
vendored
20
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/nl/nl_linux.go
generated
vendored
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
|
7
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/nl/xfrm_linux.go
generated
vendored
7
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/nl/xfrm_linux.go
generated
vendored
|
@ -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 {
|
||||||
|
|
2
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/protinfo.go
generated
vendored
2
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/protinfo.go
generated
vendored
|
@ -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")
|
||||||
}
|
}
|
||||||
|
|
4
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/route_linux.go
generated
vendored
4
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/route_linux.go
generated
vendored
|
@ -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():])
|
||||||
|
|
2
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/xfrm_policy_linux.go
generated
vendored
2
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/xfrm_policy_linux.go
generated
vendored
|
@ -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)
|
||||||
|
|
||||||
|
|
2
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/xfrm_state_linux.go
generated
vendored
2
libnetwork/Godeps/_workspace/src/github.com/vishvananda/netlink/xfrm_state_linux.go
generated
vendored
|
@ -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)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue