mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
f3e1aff81d
full diffs: -fc5a7d91d5...62a13ae87c
-b2de5d10e3
...v1.0.0 -604eaf189e
...13995c7128ccc8e51e9a6bd2b551020a27180abd notable changes in libnetwork: - docker/libnetwork#2366 Bump vishvananda/netlink to 1.0.0 - docker/libnetwork#2339 controller: Check if IPTables is enabled for arrangeUserFilterRule - addresses docker/libnetwork#2158 dockerd when run with --iptables=false modifies iptables by adding DOCKER-USER - addresses moby/moby#35777 With iptables=false dockerd still creates DOCKER-USER chain and rules - addresses docker/for-linux#136 dockerd --iptables=false adds DOCKER-USER chain and modify FORWARD chain anyway - docker/libnetwork#2394 Make DNS records and queries case-insensitive - addresses moby/moby#28689 Embedded DNS is case-sensitive - addresses moby/moby#21169 hostnames with new networking are case-sensitive Signed-off-by: Sebastiaan van Stijn <github@gone.nl> (cherry picked from commit344b093258
) Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
115 lines
3.6 KiB
Go
115 lines
3.6 KiB
Go
package netlink
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/vishvananda/netlink/nl"
|
|
"golang.org/x/sys/unix"
|
|
)
|
|
|
|
// BridgeVlanList gets a map of device id to bridge vlan infos.
|
|
// Equivalent to: `bridge vlan show`
|
|
func BridgeVlanList() (map[int32][]*nl.BridgeVlanInfo, error) {
|
|
return pkgHandle.BridgeVlanList()
|
|
}
|
|
|
|
// BridgeVlanList gets a map of device id to bridge vlan infos.
|
|
// Equivalent to: `bridge vlan show`
|
|
func (h *Handle) BridgeVlanList() (map[int32][]*nl.BridgeVlanInfo, error) {
|
|
req := h.newNetlinkRequest(unix.RTM_GETLINK, unix.NLM_F_DUMP)
|
|
msg := nl.NewIfInfomsg(unix.AF_BRIDGE)
|
|
req.AddData(msg)
|
|
req.AddData(nl.NewRtAttr(unix.IFLA_EXT_MASK, nl.Uint32Attr(uint32(nl.RTEXT_FILTER_BRVLAN))))
|
|
|
|
msgs, err := req.Execute(unix.NETLINK_ROUTE, unix.RTM_NEWLINK)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
ret := make(map[int32][]*nl.BridgeVlanInfo)
|
|
for _, m := range msgs {
|
|
msg := nl.DeserializeIfInfomsg(m)
|
|
|
|
attrs, err := nl.ParseRouteAttr(m[msg.Len():])
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
for _, attr := range attrs {
|
|
switch attr.Attr.Type {
|
|
case unix.IFLA_AF_SPEC:
|
|
//nested attr
|
|
nestAttrs, err := nl.ParseRouteAttr(attr.Value)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to parse nested attr %v", err)
|
|
}
|
|
for _, nestAttr := range nestAttrs {
|
|
switch nestAttr.Attr.Type {
|
|
case nl.IFLA_BRIDGE_VLAN_INFO:
|
|
vlanInfo := nl.DeserializeBridgeVlanInfo(nestAttr.Value)
|
|
ret[msg.Index] = append(ret[msg.Index], vlanInfo)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return ret, nil
|
|
}
|
|
|
|
// BridgeVlanAdd adds a new vlan filter entry
|
|
// Equivalent to: `bridge vlan add dev DEV vid VID [ pvid ] [ untagged ] [ self ] [ master ]`
|
|
func BridgeVlanAdd(link Link, vid uint16, pvid, untagged, self, master bool) error {
|
|
return pkgHandle.BridgeVlanAdd(link, vid, pvid, untagged, self, master)
|
|
}
|
|
|
|
// BridgeVlanAdd adds a new vlan filter entry
|
|
// Equivalent to: `bridge vlan add dev DEV vid VID [ pvid ] [ untagged ] [ self ] [ master ]`
|
|
func (h *Handle) BridgeVlanAdd(link Link, vid uint16, pvid, untagged, self, master bool) error {
|
|
return h.bridgeVlanModify(unix.RTM_SETLINK, link, vid, pvid, untagged, self, master)
|
|
}
|
|
|
|
// BridgeVlanDel adds a new vlan filter entry
|
|
// Equivalent to: `bridge vlan del dev DEV vid VID [ pvid ] [ untagged ] [ self ] [ master ]`
|
|
func BridgeVlanDel(link Link, vid uint16, pvid, untagged, self, master bool) error {
|
|
return pkgHandle.BridgeVlanDel(link, vid, pvid, untagged, self, master)
|
|
}
|
|
|
|
// BridgeVlanDel adds a new vlan filter entry
|
|
// Equivalent to: `bridge vlan del dev DEV vid VID [ pvid ] [ untagged ] [ self ] [ master ]`
|
|
func (h *Handle) BridgeVlanDel(link Link, vid uint16, pvid, untagged, self, master bool) error {
|
|
return h.bridgeVlanModify(unix.RTM_DELLINK, link, vid, pvid, untagged, self, master)
|
|
}
|
|
|
|
func (h *Handle) bridgeVlanModify(cmd int, link Link, vid uint16, pvid, untagged, self, master bool) error {
|
|
base := link.Attrs()
|
|
h.ensureIndex(base)
|
|
req := h.newNetlinkRequest(cmd, unix.NLM_F_ACK)
|
|
|
|
msg := nl.NewIfInfomsg(unix.AF_BRIDGE)
|
|
msg.Index = int32(base.Index)
|
|
req.AddData(msg)
|
|
|
|
br := nl.NewRtAttr(unix.IFLA_AF_SPEC, nil)
|
|
var flags uint16
|
|
if self {
|
|
flags |= nl.BRIDGE_FLAGS_SELF
|
|
}
|
|
if master {
|
|
flags |= nl.BRIDGE_FLAGS_MASTER
|
|
}
|
|
if flags > 0 {
|
|
nl.NewRtAttrChild(br, nl.IFLA_BRIDGE_FLAGS, nl.Uint16Attr(flags))
|
|
}
|
|
vlanInfo := &nl.BridgeVlanInfo{Vid: vid}
|
|
if pvid {
|
|
vlanInfo.Flags |= nl.BRIDGE_VLAN_INFO_PVID
|
|
}
|
|
if untagged {
|
|
vlanInfo.Flags |= nl.BRIDGE_VLAN_INFO_UNTAGGED
|
|
}
|
|
nl.NewRtAttrChild(br, nl.IFLA_BRIDGE_VLAN_INFO, vlanInfo.Serialize())
|
|
req.AddData(br)
|
|
_, err := req.Execute(unix.NETLINK_ROUTE, 0)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|