summaryrefslogtreecommitdiff
path: root/vendor/github.com/vishvananda/netlink/nl
diff options
context:
space:
mode:
authorValentin Rothberg <rothberg@redhat.com>2019-01-08 14:52:57 +0100
committerValentin Rothberg <rothberg@redhat.com>2019-01-11 13:38:11 +0100
commitbd40dcfc2bc7c9014ea1f33482fb63aacbcdfe87 (patch)
tree5f06e4e289f16d9164d692590a3fe6541b5384cf /vendor/github.com/vishvananda/netlink/nl
parent545f24421247c9f6251a634764db3f8f8070a812 (diff)
downloadpodman-bd40dcfc2bc7c9014ea1f33482fb63aacbcdfe87.tar.gz
podman-bd40dcfc2bc7c9014ea1f33482fb63aacbcdfe87.tar.bz2
podman-bd40dcfc2bc7c9014ea1f33482fb63aacbcdfe87.zip
vendor: update everything
* If possible, update each dependency to the latest available version. * Use releases over commit IDs and avoid vendoring branches. Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
Diffstat (limited to 'vendor/github.com/vishvananda/netlink/nl')
-rw-r--r--vendor/github.com/vishvananda/netlink/nl/addr_linux.go13
-rw-r--r--vendor/github.com/vishvananda/netlink/nl/link_linux.go75
-rw-r--r--vendor/github.com/vishvananda/netlink/nl/nl_linux.go242
-rw-r--r--vendor/github.com/vishvananda/netlink/nl/route_linux.go39
-rw-r--r--vendor/github.com/vishvananda/netlink/nl/seg6_linux.go111
-rw-r--r--vendor/github.com/vishvananda/netlink/nl/syscall.go10
-rw-r--r--vendor/github.com/vishvananda/netlink/nl/tc_linux.go35
7 files changed, 363 insertions, 162 deletions
diff --git a/vendor/github.com/vishvananda/netlink/nl/addr_linux.go b/vendor/github.com/vishvananda/netlink/nl/addr_linux.go
index fe362e9fa..50db3b4cd 100644
--- a/vendor/github.com/vishvananda/netlink/nl/addr_linux.go
+++ b/vendor/github.com/vishvananda/netlink/nl/addr_linux.go
@@ -1,17 +1,18 @@
package nl
import (
- "syscall"
"unsafe"
+
+ "golang.org/x/sys/unix"
)
type IfAddrmsg struct {
- syscall.IfAddrmsg
+ unix.IfAddrmsg
}
func NewIfAddrmsg(family int) *IfAddrmsg {
return &IfAddrmsg{
- IfAddrmsg: syscall.IfAddrmsg{
+ IfAddrmsg: unix.IfAddrmsg{
Family: uint8(family),
},
}
@@ -35,15 +36,15 @@ func NewIfAddrmsg(family int) *IfAddrmsg {
// SizeofIfAddrmsg = 0x8
func DeserializeIfAddrmsg(b []byte) *IfAddrmsg {
- return (*IfAddrmsg)(unsafe.Pointer(&b[0:syscall.SizeofIfAddrmsg][0]))
+ return (*IfAddrmsg)(unsafe.Pointer(&b[0:unix.SizeofIfAddrmsg][0]))
}
func (msg *IfAddrmsg) Serialize() []byte {
- return (*(*[syscall.SizeofIfAddrmsg]byte)(unsafe.Pointer(msg)))[:]
+ return (*(*[unix.SizeofIfAddrmsg]byte)(unsafe.Pointer(msg)))[:]
}
func (msg *IfAddrmsg) Len() int {
- return syscall.SizeofIfAddrmsg
+ return unix.SizeofIfAddrmsg
}
// struct ifa_cacheinfo {
diff --git a/vendor/github.com/vishvananda/netlink/nl/link_linux.go b/vendor/github.com/vishvananda/netlink/nl/link_linux.go
index a492246d8..84a3498dd 100644
--- a/vendor/github.com/vishvananda/netlink/nl/link_linux.go
+++ b/vendor/github.com/vishvananda/netlink/nl/link_linux.go
@@ -1,35 +1,11 @@
package nl
import (
- "syscall"
"unsafe"
)
const (
DEFAULT_CHANGE = 0xFFFFFFFF
- // doesn't exist in syscall
- IFLA_VFINFO_LIST = syscall.IFLA_IFALIAS + 1 + iota
- IFLA_STATS64
- IFLA_VF_PORTS
- IFLA_PORT_SELF
- IFLA_AF_SPEC
- IFLA_GROUP
- IFLA_NET_NS_FD
- IFLA_EXT_MASK
- IFLA_PROMISCUITY
- IFLA_NUM_TX_QUEUES
- IFLA_NUM_RX_QUEUES
- IFLA_CARRIER
- IFLA_PHYS_PORT_ID
- IFLA_CARRIER_CHANGES
- IFLA_PHYS_SWITCH_ID
- IFLA_LINK_NETNSID
- IFLA_PHYS_PORT_NAME
- IFLA_PROTO_DOWN
- IFLA_GSO_MAX_SEGS
- IFLA_GSO_MAX_SIZE
- IFLA_PAD
- IFLA_XDP
)
const (
@@ -118,6 +94,10 @@ const (
IFLA_MACVLAN_UNSPEC = iota
IFLA_MACVLAN_MODE
IFLA_MACVLAN_FLAGS
+ IFLA_MACVLAN_MACADDR_MODE
+ IFLA_MACVLAN_MACADDR
+ IFLA_MACVLAN_MACADDR_DATA
+ IFLA_MACVLAN_MACADDR_COUNT
IFLA_MACVLAN_MAX = IFLA_MACVLAN_FLAGS
)
@@ -130,6 +110,13 @@ const (
)
const (
+ MACVLAN_MACADDR_ADD = iota
+ MACVLAN_MACADDR_DEL
+ MACVLAN_MACADDR_FLUSH
+ MACVLAN_MACADDR_SET
+)
+
+const (
IFLA_BOND_UNSPEC = iota
IFLA_BOND_MODE
IFLA_BOND_ACTIVE_SLAVE
@@ -231,7 +218,8 @@ const (
* on/off switch
*/
IFLA_VF_STATS /* network device statistics */
- IFLA_VF_MAX = IFLA_VF_STATS
+ IFLA_VF_TRUST /* Trust state of VF */
+ IFLA_VF_MAX = IFLA_VF_TRUST
)
const (
@@ -259,6 +247,7 @@ const (
SizeofVfSpoofchk = 0x08
SizeofVfLinkState = 0x08
SizeofVfRssQueryEn = 0x08
+ SizeofVfTrust = 0x08
)
// struct ifla_vf_mac {
@@ -419,6 +408,35 @@ func (msg *VfRssQueryEn) Serialize() []byte {
return (*(*[SizeofVfRssQueryEn]byte)(unsafe.Pointer(msg)))[:]
}
+// struct ifla_vf_trust {
+// __u32 vf;
+// __u32 setting;
+// };
+
+type VfTrust struct {
+ Vf uint32
+ Setting uint32
+}
+
+func (msg *VfTrust) Len() int {
+ return SizeofVfTrust
+}
+
+func DeserializeVfTrust(b []byte) *VfTrust {
+ return (*VfTrust)(unsafe.Pointer(&b[0:SizeofVfTrust][0]))
+}
+
+func (msg *VfTrust) Serialize() []byte {
+ return (*(*[SizeofVfTrust]byte)(unsafe.Pointer(msg)))[:]
+}
+
+const (
+ XDP_FLAGS_UPDATE_IF_NOEXIST = 1 << iota
+ XDP_FLAGS_SKB_MODE
+ XDP_FLAGS_DRV_MODE
+ XDP_FLAGS_MASK = XDP_FLAGS_UPDATE_IF_NOEXIST | XDP_FLAGS_SKB_MODE | XDP_FLAGS_DRV_MODE
+)
+
const (
IFLA_XDP_UNSPEC = iota
IFLA_XDP_FD /* fd of xdp program to attach, or -1 to remove */
@@ -444,7 +462,12 @@ const (
IFLA_IPTUN_6RD_RELAY_PREFIX
IFLA_IPTUN_6RD_PREFIXLEN
IFLA_IPTUN_6RD_RELAY_PREFIXLEN
- IFLA_IPTUN_MAX = IFLA_IPTUN_6RD_RELAY_PREFIXLEN
+ IFLA_IPTUN_ENCAP_TYPE
+ IFLA_IPTUN_ENCAP_FLAGS
+ IFLA_IPTUN_ENCAP_SPORT
+ IFLA_IPTUN_ENCAP_DPORT
+ IFLA_IPTUN_COLLECT_METADATA
+ IFLA_IPTUN_MAX = IFLA_IPTUN_COLLECT_METADATA
)
const (
diff --git a/vendor/github.com/vishvananda/netlink/nl/nl_linux.go b/vendor/github.com/vishvananda/netlink/nl/nl_linux.go
index 1329acd86..bc8e82c2c 100644
--- a/vendor/github.com/vishvananda/netlink/nl/nl_linux.go
+++ b/vendor/github.com/vishvananda/netlink/nl/nl_linux.go
@@ -13,18 +13,19 @@ import (
"unsafe"
"github.com/vishvananda/netns"
+ "golang.org/x/sys/unix"
)
const (
// Family type definitions
- FAMILY_ALL = syscall.AF_UNSPEC
- FAMILY_V4 = syscall.AF_INET
- FAMILY_V6 = syscall.AF_INET6
+ FAMILY_ALL = unix.AF_UNSPEC
+ FAMILY_V4 = unix.AF_INET
+ FAMILY_V6 = unix.AF_INET6
FAMILY_MPLS = AF_MPLS
)
// SupportedNlFamilies contains the list of netlink families this netlink package supports
-var SupportedNlFamilies = []int{syscall.NETLINK_ROUTE, syscall.NETLINK_XFRM, syscall.NETLINK_NETFILTER}
+var SupportedNlFamilies = []int{unix.NETLINK_ROUTE, unix.NETLINK_XFRM, unix.NETLINK_NETFILTER}
var nextSeqNr uint32
@@ -77,161 +78,161 @@ type NetlinkRequestData interface {
// IfInfomsg is related to links, but it is used for list requests as well
type IfInfomsg struct {
- syscall.IfInfomsg
+ unix.IfInfomsg
}
// Create an IfInfomsg with family specified
func NewIfInfomsg(family int) *IfInfomsg {
return &IfInfomsg{
- IfInfomsg: syscall.IfInfomsg{
+ IfInfomsg: unix.IfInfomsg{
Family: uint8(family),
},
}
}
func DeserializeIfInfomsg(b []byte) *IfInfomsg {
- return (*IfInfomsg)(unsafe.Pointer(&b[0:syscall.SizeofIfInfomsg][0]))
+ return (*IfInfomsg)(unsafe.Pointer(&b[0:unix.SizeofIfInfomsg][0]))
}
func (msg *IfInfomsg) Serialize() []byte {
- return (*(*[syscall.SizeofIfInfomsg]byte)(unsafe.Pointer(msg)))[:]
+ return (*(*[unix.SizeofIfInfomsg]byte)(unsafe.Pointer(msg)))[:]
}
func (msg *IfInfomsg) Len() int {
- return syscall.SizeofIfInfomsg
+ return unix.SizeofIfInfomsg
}
func (msg *IfInfomsg) EncapType() string {
switch msg.Type {
case 0:
return "generic"
- case syscall.ARPHRD_ETHER:
+ case unix.ARPHRD_ETHER:
return "ether"
- case syscall.ARPHRD_EETHER:
+ case unix.ARPHRD_EETHER:
return "eether"
- case syscall.ARPHRD_AX25:
+ case unix.ARPHRD_AX25:
return "ax25"
- case syscall.ARPHRD_PRONET:
+ case unix.ARPHRD_PRONET:
return "pronet"
- case syscall.ARPHRD_CHAOS:
+ case unix.ARPHRD_CHAOS:
return "chaos"
- case syscall.ARPHRD_IEEE802:
+ case unix.ARPHRD_IEEE802:
return "ieee802"
- case syscall.ARPHRD_ARCNET:
+ case unix.ARPHRD_ARCNET:
return "arcnet"
- case syscall.ARPHRD_APPLETLK:
+ case unix.ARPHRD_APPLETLK:
return "atalk"
- case syscall.ARPHRD_DLCI:
+ case unix.ARPHRD_DLCI:
return "dlci"
- case syscall.ARPHRD_ATM:
+ case unix.ARPHRD_ATM:
return "atm"
- case syscall.ARPHRD_METRICOM:
+ case unix.ARPHRD_METRICOM:
return "metricom"
- case syscall.ARPHRD_IEEE1394:
+ case unix.ARPHRD_IEEE1394:
return "ieee1394"
- case syscall.ARPHRD_INFINIBAND:
+ case unix.ARPHRD_INFINIBAND:
return "infiniband"
- case syscall.ARPHRD_SLIP:
+ case unix.ARPHRD_SLIP:
return "slip"
- case syscall.ARPHRD_CSLIP:
+ case unix.ARPHRD_CSLIP:
return "cslip"
- case syscall.ARPHRD_SLIP6:
+ case unix.ARPHRD_SLIP6:
return "slip6"
- case syscall.ARPHRD_CSLIP6:
+ case unix.ARPHRD_CSLIP6:
return "cslip6"
- case syscall.ARPHRD_RSRVD:
+ case unix.ARPHRD_RSRVD:
return "rsrvd"
- case syscall.ARPHRD_ADAPT:
+ case unix.ARPHRD_ADAPT:
return "adapt"
- case syscall.ARPHRD_ROSE:
+ case unix.ARPHRD_ROSE:
return "rose"
- case syscall.ARPHRD_X25:
+ case unix.ARPHRD_X25:
return "x25"
- case syscall.ARPHRD_HWX25:
+ case unix.ARPHRD_HWX25:
return "hwx25"
- case syscall.ARPHRD_PPP:
+ case unix.ARPHRD_PPP:
return "ppp"
- case syscall.ARPHRD_HDLC:
+ case unix.ARPHRD_HDLC:
return "hdlc"
- case syscall.ARPHRD_LAPB:
+ case unix.ARPHRD_LAPB:
return "lapb"
- case syscall.ARPHRD_DDCMP:
+ case unix.ARPHRD_DDCMP:
return "ddcmp"
- case syscall.ARPHRD_RAWHDLC:
+ case unix.ARPHRD_RAWHDLC:
return "rawhdlc"
- case syscall.ARPHRD_TUNNEL:
+ case unix.ARPHRD_TUNNEL:
return "ipip"
- case syscall.ARPHRD_TUNNEL6:
+ case unix.ARPHRD_TUNNEL6:
return "tunnel6"
- case syscall.ARPHRD_FRAD:
+ case unix.ARPHRD_FRAD:
return "frad"
- case syscall.ARPHRD_SKIP:
+ case unix.ARPHRD_SKIP:
return "skip"
- case syscall.ARPHRD_LOOPBACK:
+ case unix.ARPHRD_LOOPBACK:
return "loopback"
- case syscall.ARPHRD_LOCALTLK:
+ case unix.ARPHRD_LOCALTLK:
return "ltalk"
- case syscall.ARPHRD_FDDI:
+ case unix.ARPHRD_FDDI:
return "fddi"
- case syscall.ARPHRD_BIF:
+ case unix.ARPHRD_BIF:
return "bif"
- case syscall.ARPHRD_SIT:
+ case unix.ARPHRD_SIT:
return "sit"
- case syscall.ARPHRD_IPDDP:
+ case unix.ARPHRD_IPDDP:
return "ip/ddp"
- case syscall.ARPHRD_IPGRE:
+ case unix.ARPHRD_IPGRE:
return "gre"
- case syscall.ARPHRD_PIMREG:
+ case unix.ARPHRD_PIMREG:
return "pimreg"
- case syscall.ARPHRD_HIPPI:
+ case unix.ARPHRD_HIPPI:
return "hippi"
- case syscall.ARPHRD_ASH:
+ case unix.ARPHRD_ASH:
return "ash"
- case syscall.ARPHRD_ECONET:
+ case unix.ARPHRD_ECONET:
return "econet"
- case syscall.ARPHRD_IRDA:
+ case unix.ARPHRD_IRDA:
return "irda"
- case syscall.ARPHRD_FCPP:
+ case unix.ARPHRD_FCPP:
return "fcpp"
- case syscall.ARPHRD_FCAL:
+ case unix.ARPHRD_FCAL:
return "fcal"
- case syscall.ARPHRD_FCPL:
+ case unix.ARPHRD_FCPL:
return "fcpl"
- case syscall.ARPHRD_FCFABRIC:
+ case unix.ARPHRD_FCFABRIC:
return "fcfb0"
- case syscall.ARPHRD_FCFABRIC + 1:
+ case unix.ARPHRD_FCFABRIC + 1:
return "fcfb1"
- case syscall.ARPHRD_FCFABRIC + 2:
+ case unix.ARPHRD_FCFABRIC + 2:
return "fcfb2"
- case syscall.ARPHRD_FCFABRIC + 3:
+ case unix.ARPHRD_FCFABRIC + 3:
return "fcfb3"
- case syscall.ARPHRD_FCFABRIC + 4:
+ case unix.ARPHRD_FCFABRIC + 4:
return "fcfb4"
- case syscall.ARPHRD_FCFABRIC + 5:
+ case unix.ARPHRD_FCFABRIC + 5:
return "fcfb5"
- case syscall.ARPHRD_FCFABRIC + 6:
+ case unix.ARPHRD_FCFABRIC + 6:
return "fcfb6"
- case syscall.ARPHRD_FCFABRIC + 7:
+ case unix.ARPHRD_FCFABRIC + 7:
return "fcfb7"
- case syscall.ARPHRD_FCFABRIC + 8:
+ case unix.ARPHRD_FCFABRIC + 8:
return "fcfb8"
- case syscall.ARPHRD_FCFABRIC + 9:
+ case unix.ARPHRD_FCFABRIC + 9:
return "fcfb9"
- case syscall.ARPHRD_FCFABRIC + 10:
+ case unix.ARPHRD_FCFABRIC + 10:
return "fcfb10"
- case syscall.ARPHRD_FCFABRIC + 11:
+ case unix.ARPHRD_FCFABRIC + 11:
return "fcfb11"
- case syscall.ARPHRD_FCFABRIC + 12:
+ case unix.ARPHRD_FCFABRIC + 12:
return "fcfb12"
- case syscall.ARPHRD_IEEE802_TR:
+ case unix.ARPHRD_IEEE802_TR:
return "tr"
- case syscall.ARPHRD_IEEE80211:
+ case unix.ARPHRD_IEEE80211:
return "ieee802.11"
- case syscall.ARPHRD_IEEE80211_PRISM:
+ case unix.ARPHRD_IEEE80211_PRISM:
return "ieee802.11/prism"
- case syscall.ARPHRD_IEEE80211_RADIOTAP:
+ case unix.ARPHRD_IEEE80211_RADIOTAP:
return "ieee802.11/radiotap"
- case syscall.ARPHRD_IEEE802154:
+ case unix.ARPHRD_IEEE802154:
return "ieee802.15.4"
case 65534:
@@ -243,7 +244,7 @@ func (msg *IfInfomsg) EncapType() string {
}
func rtaAlignOf(attrlen int) int {
- return (attrlen + syscall.RTA_ALIGNTO - 1) & ^(syscall.RTA_ALIGNTO - 1)
+ return (attrlen + unix.RTA_ALIGNTO - 1) & ^(unix.RTA_ALIGNTO - 1)
}
func NewIfInfomsgChild(parent *RtAttr, family int) *IfInfomsg {
@@ -254,7 +255,7 @@ func NewIfInfomsgChild(parent *RtAttr, family int) *IfInfomsg {
// Extend RtAttr to handle data and children
type RtAttr struct {
- syscall.RtAttr
+ unix.RtAttr
Data []byte
children []NetlinkRequestData
}
@@ -262,7 +263,7 @@ type RtAttr struct {
// Create a new Extended RtAttr object
func NewRtAttr(attrType int, data []byte) *RtAttr {
return &RtAttr{
- RtAttr: syscall.RtAttr{
+ RtAttr: unix.RtAttr{
Type: uint16(attrType),
},
children: []NetlinkRequestData{},
@@ -277,16 +278,21 @@ func NewRtAttrChild(parent *RtAttr, attrType int, data []byte) *RtAttr {
return attr
}
+// AddChild adds an existing RtAttr as a child.
+func (a *RtAttr) AddChild(attr *RtAttr) {
+ a.children = append(a.children, attr)
+}
+
func (a *RtAttr) Len() int {
if len(a.children) == 0 {
- return (syscall.SizeofRtAttr + len(a.Data))
+ return (unix.SizeofRtAttr + len(a.Data))
}
l := 0
for _, child := range a.children {
l += rtaAlignOf(child.Len())
}
- l += syscall.SizeofRtAttr
+ l += unix.SizeofRtAttr
return rtaAlignOf(l + len(a.Data))
}
@@ -319,7 +325,7 @@ func (a *RtAttr) Serialize() []byte {
}
type NetlinkRequest struct {
- syscall.NlMsghdr
+ unix.NlMsghdr
Data []NetlinkRequestData
RawData []byte
Sockets map[int]*SocketHandle
@@ -327,7 +333,7 @@ type NetlinkRequest struct {
// Serialize the Netlink Request into a byte array
func (req *NetlinkRequest) Serialize() []byte {
- length := syscall.SizeofNlMsghdr
+ length := unix.SizeofNlMsghdr
dataBytes := make([][]byte, len(req.Data))
for i, data := range req.Data {
dataBytes[i] = data.Serialize()
@@ -337,8 +343,8 @@ func (req *NetlinkRequest) Serialize() []byte {
req.Len = uint32(length)
b := make([]byte, length)
- hdr := (*(*[syscall.SizeofNlMsghdr]byte)(unsafe.Pointer(req)))[:]
- next := syscall.SizeofNlMsghdr
+ hdr := (*(*[unix.SizeofNlMsghdr]byte)(unsafe.Pointer(req)))[:]
+ next := unix.SizeofNlMsghdr
copy(b[0:next], hdr)
for _, data := range dataBytes {
for _, dataByte := range data {
@@ -421,10 +427,10 @@ done:
if m.Header.Pid != pid {
return nil, fmt.Errorf("Wrong pid %d, expected %d", m.Header.Pid, pid)
}
- if m.Header.Type == syscall.NLMSG_DONE {
+ if m.Header.Type == unix.NLMSG_DONE {
break done
}
- if m.Header.Type == syscall.NLMSG_ERROR {
+ if m.Header.Type == unix.NLMSG_ERROR {
native := NativeEndian()
error := int32(native.Uint32(m.Data[0:4]))
if error == 0 {
@@ -436,7 +442,7 @@ done:
continue
}
res = append(res, m.Data)
- if m.Header.Flags&syscall.NLM_F_MULTI == 0 {
+ if m.Header.Flags&unix.NLM_F_MULTI == 0 {
break done
}
}
@@ -449,10 +455,10 @@ done:
// the message is serialized
func NewNetlinkRequest(proto, flags int) *NetlinkRequest {
return &NetlinkRequest{
- NlMsghdr: syscall.NlMsghdr{
- Len: uint32(syscall.SizeofNlMsghdr),
+ NlMsghdr: unix.NlMsghdr{
+ Len: uint32(unix.SizeofNlMsghdr),
Type: uint16(proto),
- Flags: syscall.NLM_F_REQUEST | uint16(flags),
+ Flags: unix.NLM_F_REQUEST | uint16(flags),
Seq: atomic.AddUint32(&nextSeqNr, 1),
},
}
@@ -460,21 +466,21 @@ func NewNetlinkRequest(proto, flags int) *NetlinkRequest {
type NetlinkSocket struct {
fd int32
- lsa syscall.SockaddrNetlink
+ lsa unix.SockaddrNetlink
sync.Mutex
}
func getNetlinkSocket(protocol int) (*NetlinkSocket, error) {
- fd, err := syscall.Socket(syscall.AF_NETLINK, syscall.SOCK_RAW|syscall.SOCK_CLOEXEC, protocol)
+ fd, err := unix.Socket(unix.AF_NETLINK, unix.SOCK_RAW|unix.SOCK_CLOEXEC, protocol)
if err != nil {
return nil, err
}
s := &NetlinkSocket{
fd: int32(fd),
}
- s.lsa.Family = syscall.AF_NETLINK
- if err := syscall.Bind(fd, &s.lsa); err != nil {
- syscall.Close(fd)
+ s.lsa.Family = unix.AF_NETLINK
+ if err := unix.Bind(fd, &s.lsa); err != nil {
+ unix.Close(fd)
return nil, err
}
@@ -551,21 +557,21 @@ func executeInNetns(newNs, curNs netns.NsHandle) (func(), error) {
// 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)
+ fd, err := unix.Socket(unix.AF_NETLINK, unix.SOCK_RAW, protocol)
if err != nil {
return nil, err
}
s := &NetlinkSocket{
fd: int32(fd),
}
- s.lsa.Family = syscall.AF_NETLINK
+ s.lsa.Family = unix.AF_NETLINK
for _, g := range groups {
s.lsa.Groups |= (1 << (g - 1))
}
- if err := syscall.Bind(fd, &s.lsa); err != nil {
- syscall.Close(fd)
+ if err := unix.Bind(fd, &s.lsa); err != nil {
+ unix.Close(fd)
return nil, err
}
@@ -586,7 +592,7 @@ func SubscribeAt(newNs, curNs netns.NsHandle, protocol int, groups ...uint) (*Ne
func (s *NetlinkSocket) Close() {
fd := int(atomic.SwapInt32(&s.fd, -1))
- syscall.Close(fd)
+ unix.Close(fd)
}
func (s *NetlinkSocket) GetFd() int {
@@ -598,7 +604,7 @@ func (s *NetlinkSocket) Send(request *NetlinkRequest) error {
if fd < 0 {
return fmt.Errorf("Send called on a closed socket")
}
- if err := syscall.Sendto(fd, request.Serialize(), 0, &s.lsa); err != nil {
+ if err := unix.Sendto(fd, request.Serialize(), 0, &s.lsa); err != nil {
return err
}
return nil
@@ -609,26 +615,40 @@ func (s *NetlinkSocket) Receive() ([]syscall.NetlinkMessage, error) {
if fd < 0 {
return nil, fmt.Errorf("Receive called on a closed socket")
}
- rb := make([]byte, syscall.Getpagesize())
- nr, _, err := syscall.Recvfrom(fd, rb, 0)
+ rb := make([]byte, unix.Getpagesize())
+ nr, _, err := unix.Recvfrom(fd, rb, 0)
if err != nil {
return nil, err
}
- if nr < syscall.NLMSG_HDRLEN {
+ if nr < unix.NLMSG_HDRLEN {
return nil, fmt.Errorf("Got short response from netlink")
}
rb = rb[:nr]
return syscall.ParseNetlinkMessage(rb)
}
+// SetSendTimeout allows to set a send timeout on the socket
+func (s *NetlinkSocket) SetSendTimeout(timeout *unix.Timeval) error {
+ // Set a send timeout of SOCKET_SEND_TIMEOUT, this will allow the Send to periodically unblock and avoid that a routine
+ // remains stuck on a send on a closed fd
+ return unix.SetsockoptTimeval(int(s.fd), unix.SOL_SOCKET, unix.SO_SNDTIMEO, timeout)
+}
+
+// SetReceiveTimeout allows to set a receive timeout on the socket
+func (s *NetlinkSocket) SetReceiveTimeout(timeout *unix.Timeval) error {
+ // Set a read timeout of SOCKET_READ_TIMEOUT, this will allow the Read to periodically unblock and avoid that a routine
+ // remains stuck on a recvmsg on a closed fd
+ return unix.SetsockoptTimeval(int(s.fd), unix.SOL_SOCKET, unix.SO_RCVTIMEO, timeout)
+}
+
func (s *NetlinkSocket) GetPid() (uint32, error) {
fd := int(atomic.LoadInt32(&s.fd))
- lsa, err := syscall.Getsockname(fd)
+ lsa, err := unix.Getsockname(fd)
if err != nil {
return 0, err
}
switch v := lsa.(type) {
- case *syscall.SockaddrNetlink:
+ case *unix.SockaddrNetlink:
return v.Pid, nil
}
return 0, fmt.Errorf("Wrong socket type")
@@ -683,24 +703,24 @@ func Uint64Attr(v uint64) []byte {
func ParseRouteAttr(b []byte) ([]syscall.NetlinkRouteAttr, error) {
var attrs []syscall.NetlinkRouteAttr
- for len(b) >= syscall.SizeofRtAttr {
+ for len(b) >= unix.SizeofRtAttr {
a, vbuf, alen, err := netlinkRouteAttrAndValue(b)
if err != nil {
return nil, err
}
- ra := syscall.NetlinkRouteAttr{Attr: *a, Value: vbuf[:int(a.Len)-syscall.SizeofRtAttr]}
+ ra := syscall.NetlinkRouteAttr{Attr: syscall.RtAttr(*a), Value: vbuf[:int(a.Len)-unix.SizeofRtAttr]}
attrs = append(attrs, ra)
b = b[alen:]
}
return attrs, nil
}
-func netlinkRouteAttrAndValue(b []byte) (*syscall.RtAttr, []byte, int, error) {
- a := (*syscall.RtAttr)(unsafe.Pointer(&b[0]))
- if int(a.Len) < syscall.SizeofRtAttr || int(a.Len) > len(b) {
- return nil, nil, 0, syscall.EINVAL
+func netlinkRouteAttrAndValue(b []byte) (*unix.RtAttr, []byte, int, error) {
+ a := (*unix.RtAttr)(unsafe.Pointer(&b[0]))
+ if int(a.Len) < unix.SizeofRtAttr || int(a.Len) > len(b) {
+ return nil, nil, 0, unix.EINVAL
}
- return a, b[syscall.SizeofRtAttr:], rtaAlignOf(int(a.Len)), nil
+ return a, b[unix.SizeofRtAttr:], rtaAlignOf(int(a.Len)), nil
}
// SocketHandle contains the netlink socket and the associated
diff --git a/vendor/github.com/vishvananda/netlink/nl/route_linux.go b/vendor/github.com/vishvananda/netlink/nl/route_linux.go
index 1a064d65d..f6906fcaf 100644
--- a/vendor/github.com/vishvananda/netlink/nl/route_linux.go
+++ b/vendor/github.com/vishvananda/netlink/nl/route_linux.go
@@ -1,65 +1,66 @@
package nl
import (
- "syscall"
"unsafe"
+
+ "golang.org/x/sys/unix"
)
type RtMsg struct {
- syscall.RtMsg
+ unix.RtMsg
}
func NewRtMsg() *RtMsg {
return &RtMsg{
- RtMsg: syscall.RtMsg{
- Table: syscall.RT_TABLE_MAIN,
- Scope: syscall.RT_SCOPE_UNIVERSE,
- Protocol: syscall.RTPROT_BOOT,
- Type: syscall.RTN_UNICAST,
+ RtMsg: unix.RtMsg{
+ Table: unix.RT_TABLE_MAIN,
+ Scope: unix.RT_SCOPE_UNIVERSE,
+ Protocol: unix.RTPROT_BOOT,
+ Type: unix.RTN_UNICAST,
},
}
}
func NewRtDelMsg() *RtMsg {
return &RtMsg{
- RtMsg: syscall.RtMsg{
- Table: syscall.RT_TABLE_MAIN,
- Scope: syscall.RT_SCOPE_NOWHERE,
+ RtMsg: unix.RtMsg{
+ Table: unix.RT_TABLE_MAIN,
+ Scope: unix.RT_SCOPE_NOWHERE,
},
}
}
func (msg *RtMsg) Len() int {
- return syscall.SizeofRtMsg
+ return unix.SizeofRtMsg
}
func DeserializeRtMsg(b []byte) *RtMsg {
- return (*RtMsg)(unsafe.Pointer(&b[0:syscall.SizeofRtMsg][0]))
+ return (*RtMsg)(unsafe.Pointer(&b[0:unix.SizeofRtMsg][0]))
}
func (msg *RtMsg) Serialize() []byte {
- return (*(*[syscall.SizeofRtMsg]byte)(unsafe.Pointer(msg)))[:]
+ return (*(*[unix.SizeofRtMsg]byte)(unsafe.Pointer(msg)))[:]
}
type RtNexthop struct {
- syscall.RtNexthop
+ unix.RtNexthop
Children []NetlinkRequestData
}
func DeserializeRtNexthop(b []byte) *RtNexthop {
- return (*RtNexthop)(unsafe.Pointer(&b[0:syscall.SizeofRtNexthop][0]))
+ return (*RtNexthop)(unsafe.Pointer(&b[0:unix.SizeofRtNexthop][0]))
}
func (msg *RtNexthop) Len() int {
if len(msg.Children) == 0 {
- return syscall.SizeofRtNexthop
+ return unix.SizeofRtNexthop
}
l := 0
for _, child := range msg.Children {
l += rtaAlignOf(child.Len())
}
- l += syscall.SizeofRtNexthop
+ l += unix.SizeofRtNexthop
return rtaAlignOf(l)
}
@@ -67,8 +68,8 @@ func (msg *RtNexthop) Serialize() []byte {
length := msg.Len()
msg.RtNexthop.Len = uint16(length)
buf := make([]byte, length)
- copy(buf, (*(*[syscall.SizeofRtNexthop]byte)(unsafe.Pointer(msg)))[:])
- next := rtaAlignOf(syscall.SizeofRtNexthop)
+ copy(buf, (*(*[unix.SizeofRtNexthop]byte)(unsafe.Pointer(msg)))[:])
+ next := rtaAlignOf(unix.SizeofRtNexthop)
if len(msg.Children) > 0 {
for _, child := range msg.Children {
childBuf := child.Serialize()
diff --git a/vendor/github.com/vishvananda/netlink/nl/seg6_linux.go b/vendor/github.com/vishvananda/netlink/nl/seg6_linux.go
new file mode 100644
index 000000000..b3425f6b0
--- /dev/null
+++ b/vendor/github.com/vishvananda/netlink/nl/seg6_linux.go
@@ -0,0 +1,111 @@
+package nl
+
+import (
+ "errors"
+ "fmt"
+ "net"
+)
+
+type IPv6SrHdr struct {
+ nextHdr uint8
+ hdrLen uint8
+ routingType uint8
+ segmentsLeft uint8
+ firstSegment uint8
+ flags uint8
+ reserved uint16
+
+ Segments []net.IP
+}
+
+func (s1 *IPv6SrHdr) Equal(s2 IPv6SrHdr) bool {
+ if len(s1.Segments) != len(s2.Segments) {
+ return false
+ }
+ for i := range s1.Segments {
+ if s1.Segments[i].Equal(s2.Segments[i]) != true {
+ return false
+ }
+ }
+ return s1.nextHdr == s2.nextHdr &&
+ s1.hdrLen == s2.hdrLen &&
+ s1.routingType == s2.routingType &&
+ s1.segmentsLeft == s2.segmentsLeft &&
+ s1.firstSegment == s2.firstSegment &&
+ s1.flags == s2.flags
+ // reserved doesn't need to be identical.
+}
+
+// seg6 encap mode
+const (
+ SEG6_IPTUN_MODE_INLINE = iota
+ SEG6_IPTUN_MODE_ENCAP
+)
+
+// number of nested RTATTR
+// from include/uapi/linux/seg6_iptunnel.h
+const (
+ SEG6_IPTUNNEL_UNSPEC = iota
+ SEG6_IPTUNNEL_SRH
+ __SEG6_IPTUNNEL_MAX
+)
+const (
+ SEG6_IPTUNNEL_MAX = __SEG6_IPTUNNEL_MAX - 1
+)
+
+func EncodeSEG6Encap(mode int, segments []net.IP) ([]byte, error) {
+ nsegs := len(segments) // nsegs: number of segments
+ if nsegs == 0 {
+ return nil, errors.New("EncodeSEG6Encap: No Segment in srh")
+ }
+ b := make([]byte, 12, 12+len(segments)*16)
+ native := NativeEndian()
+ native.PutUint32(b, uint32(mode))
+ b[4] = 0 // srh.nextHdr (0 when calling netlink)
+ b[5] = uint8(16 * nsegs >> 3) // srh.hdrLen (in 8-octets unit)
+ b[6] = IPV6_SRCRT_TYPE_4 // srh.routingType (assigned by IANA)
+ b[7] = uint8(nsegs - 1) // srh.segmentsLeft
+ b[8] = uint8(nsegs - 1) // srh.firstSegment
+ b[9] = 0 // srh.flags (SR6_FLAG1_HMAC for srh_hmac)
+ // srh.reserved: Defined as "Tag" in draft-ietf-6man-segment-routing-header-07
+ native.PutUint16(b[10:], 0) // srh.reserved
+ for _, netIP := range segments {
+ b = append(b, netIP...) // srh.Segments
+ }
+ return b, nil
+}
+
+func DecodeSEG6Encap(buf []byte) (int, []net.IP, error) {
+ native := NativeEndian()
+ mode := int(native.Uint32(buf))
+ srh := IPv6SrHdr{
+ nextHdr: buf[4],
+ hdrLen: buf[5],
+ routingType: buf[6],
+ segmentsLeft: buf[7],
+ firstSegment: buf[8],
+ flags: buf[9],
+ reserved: native.Uint16(buf[10:12]),
+ }
+ buf = buf[12:]
+ if len(buf)%16 != 0 {
+ err := fmt.Errorf("DecodeSEG6Encap: error parsing Segment List (buf len: %d)\n", len(buf))
+ return mode, nil, err
+ }
+ for len(buf) > 0 {
+ srh.Segments = append(srh.Segments, net.IP(buf[:16]))
+ buf = buf[16:]
+ }
+ return mode, srh.Segments, nil
+}
+
+// Helper functions
+func SEG6EncapModeString(mode int) string {
+ switch mode {
+ case SEG6_IPTUN_MODE_INLINE:
+ return "inline"
+ case SEG6_IPTUN_MODE_ENCAP:
+ return "encap"
+ }
+ return "unknown"
+}
diff --git a/vendor/github.com/vishvananda/netlink/nl/syscall.go b/vendor/github.com/vishvananda/netlink/nl/syscall.go
index 3473e5363..fc631e0e5 100644
--- a/vendor/github.com/vishvananda/netlink/nl/syscall.go
+++ b/vendor/github.com/vishvananda/netlink/nl/syscall.go
@@ -65,4 +65,14 @@ const (
LWTUNNEL_ENCAP_IP
LWTUNNEL_ENCAP_ILA
LWTUNNEL_ENCAP_IP6
+ LWTUNNEL_ENCAP_SEG6
+ LWTUNNEL_ENCAP_BPF
+)
+
+// routing header types
+const (
+ IPV6_SRCRT_STRICT = 0x01 // Deprecated; will be removed
+ IPV6_SRCRT_TYPE_0 = 0 // Deprecated; will be removed
+ IPV6_SRCRT_TYPE_2 = 2 // IPv6 type 2 Routing Header
+ IPV6_SRCRT_TYPE_4 = 4 // Segment Routing with IPv6
)
diff --git a/vendor/github.com/vishvananda/netlink/nl/tc_linux.go b/vendor/github.com/vishvananda/netlink/nl/tc_linux.go
index e91fb21c5..94ebc290a 100644
--- a/vendor/github.com/vishvananda/netlink/nl/tc_linux.go
+++ b/vendor/github.com/vishvananda/netlink/nl/tc_linux.go
@@ -673,3 +673,38 @@ const (
TCA_FW_MASK
TCA_FW_MAX = TCA_FW_MASK
)
+
+const (
+ TCA_MATCHALL_UNSPEC = iota
+ TCA_MATCHALL_CLASSID
+ TCA_MATCHALL_ACT
+ TCA_MATCHALL_FLAGS
+)
+
+const (
+ TCA_FQ_UNSPEC = iota
+ TCA_FQ_PLIMIT // limit of total number of packets in queue
+ TCA_FQ_FLOW_PLIMIT // limit of packets per flow
+ TCA_FQ_QUANTUM // RR quantum
+ TCA_FQ_INITIAL_QUANTUM // RR quantum for new flow
+ TCA_FQ_RATE_ENABLE // enable/disable rate limiting
+ TCA_FQ_FLOW_DEFAULT_RATE // obsolete do not use
+ TCA_FQ_FLOW_MAX_RATE // per flow max rate
+ TCA_FQ_BUCKETS_LOG // log2(number of buckets)
+ TCA_FQ_FLOW_REFILL_DELAY // flow credit refill delay in usec
+ TCA_FQ_ORPHAN_MASK // mask applied to orphaned skb hashes
+ TCA_FQ_LOW_RATE_THRESHOLD // per packet delay under this rate
+)
+
+const (
+ TCA_FQ_CODEL_UNSPEC = iota
+ TCA_FQ_CODEL_TARGET
+ TCA_FQ_CODEL_LIMIT
+ TCA_FQ_CODEL_INTERVAL
+ TCA_FQ_CODEL_ECN
+ TCA_FQ_CODEL_FLOWS
+ TCA_FQ_CODEL_QUANTUM
+ TCA_FQ_CODEL_CE_THRESHOLD
+ TCA_FQ_CODEL_DROP_BATCH_SIZE
+ TCA_FQ_CODEL_MEMORY_LIMIT
+)