mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
344b093258
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>
168 lines
3.7 KiB
Go
168 lines
3.7 KiB
Go
package netlink
|
|
|
|
import (
|
|
"fmt"
|
|
"syscall"
|
|
|
|
"github.com/vishvananda/netlink/nl"
|
|
"golang.org/x/sys/unix"
|
|
)
|
|
|
|
type GenlOp struct {
|
|
ID uint32
|
|
Flags uint32
|
|
}
|
|
|
|
type GenlMulticastGroup struct {
|
|
ID uint32
|
|
Name string
|
|
}
|
|
|
|
type GenlFamily struct {
|
|
ID uint16
|
|
HdrSize uint32
|
|
Name string
|
|
Version uint32
|
|
MaxAttr uint32
|
|
Ops []GenlOp
|
|
Groups []GenlMulticastGroup
|
|
}
|
|
|
|
func parseOps(b []byte) ([]GenlOp, error) {
|
|
attrs, err := nl.ParseRouteAttr(b)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
ops := make([]GenlOp, 0, len(attrs))
|
|
for _, a := range attrs {
|
|
nattrs, err := nl.ParseRouteAttr(a.Value)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var op GenlOp
|
|
for _, na := range nattrs {
|
|
switch na.Attr.Type {
|
|
case nl.GENL_CTRL_ATTR_OP_ID:
|
|
op.ID = native.Uint32(na.Value)
|
|
case nl.GENL_CTRL_ATTR_OP_FLAGS:
|
|
op.Flags = native.Uint32(na.Value)
|
|
}
|
|
}
|
|
ops = append(ops, op)
|
|
}
|
|
return ops, nil
|
|
}
|
|
|
|
func parseMulticastGroups(b []byte) ([]GenlMulticastGroup, error) {
|
|
attrs, err := nl.ParseRouteAttr(b)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
groups := make([]GenlMulticastGroup, 0, len(attrs))
|
|
for _, a := range attrs {
|
|
nattrs, err := nl.ParseRouteAttr(a.Value)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var g GenlMulticastGroup
|
|
for _, na := range nattrs {
|
|
switch na.Attr.Type {
|
|
case nl.GENL_CTRL_ATTR_MCAST_GRP_NAME:
|
|
g.Name = nl.BytesToString(na.Value)
|
|
case nl.GENL_CTRL_ATTR_MCAST_GRP_ID:
|
|
g.ID = native.Uint32(na.Value)
|
|
}
|
|
}
|
|
groups = append(groups, g)
|
|
}
|
|
return groups, nil
|
|
}
|
|
|
|
func (f *GenlFamily) parseAttributes(attrs []syscall.NetlinkRouteAttr) error {
|
|
for _, a := range attrs {
|
|
switch a.Attr.Type {
|
|
case nl.GENL_CTRL_ATTR_FAMILY_NAME:
|
|
f.Name = nl.BytesToString(a.Value)
|
|
case nl.GENL_CTRL_ATTR_FAMILY_ID:
|
|
f.ID = native.Uint16(a.Value)
|
|
case nl.GENL_CTRL_ATTR_VERSION:
|
|
f.Version = native.Uint32(a.Value)
|
|
case nl.GENL_CTRL_ATTR_HDRSIZE:
|
|
f.HdrSize = native.Uint32(a.Value)
|
|
case nl.GENL_CTRL_ATTR_MAXATTR:
|
|
f.MaxAttr = native.Uint32(a.Value)
|
|
case nl.GENL_CTRL_ATTR_OPS:
|
|
ops, err := parseOps(a.Value)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
f.Ops = ops
|
|
case nl.GENL_CTRL_ATTR_MCAST_GROUPS:
|
|
groups, err := parseMulticastGroups(a.Value)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
f.Groups = groups
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func parseFamilies(msgs [][]byte) ([]*GenlFamily, error) {
|
|
families := make([]*GenlFamily, 0, len(msgs))
|
|
for _, m := range msgs {
|
|
attrs, err := nl.ParseRouteAttr(m[nl.SizeofGenlmsg:])
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
family := &GenlFamily{}
|
|
if err := family.parseAttributes(attrs); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
families = append(families, family)
|
|
}
|
|
return families, nil
|
|
}
|
|
|
|
func (h *Handle) GenlFamilyList() ([]*GenlFamily, error) {
|
|
msg := &nl.Genlmsg{
|
|
Command: nl.GENL_CTRL_CMD_GETFAMILY,
|
|
Version: nl.GENL_CTRL_VERSION,
|
|
}
|
|
req := h.newNetlinkRequest(nl.GENL_ID_CTRL, unix.NLM_F_DUMP)
|
|
req.AddData(msg)
|
|
msgs, err := req.Execute(unix.NETLINK_GENERIC, 0)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return parseFamilies(msgs)
|
|
}
|
|
|
|
func GenlFamilyList() ([]*GenlFamily, error) {
|
|
return pkgHandle.GenlFamilyList()
|
|
}
|
|
|
|
func (h *Handle) GenlFamilyGet(name string) (*GenlFamily, error) {
|
|
msg := &nl.Genlmsg{
|
|
Command: nl.GENL_CTRL_CMD_GETFAMILY,
|
|
Version: nl.GENL_CTRL_VERSION,
|
|
}
|
|
req := h.newNetlinkRequest(nl.GENL_ID_CTRL, 0)
|
|
req.AddData(msg)
|
|
req.AddData(nl.NewRtAttr(nl.GENL_CTRL_ATTR_FAMILY_NAME, nl.ZeroTerminated(name)))
|
|
msgs, err := req.Execute(unix.NETLINK_GENERIC, 0)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
families, err := parseFamilies(msgs)
|
|
if len(families) != 1 {
|
|
return nil, fmt.Errorf("invalid response for GENL_CTRL_CMD_GETFAMILY")
|
|
}
|
|
return families[0], nil
|
|
}
|
|
|
|
func GenlFamilyGet(name string) (*GenlFamily, error) {
|
|
return pkgHandle.GenlFamilyGet(name)
|
|
}
|