From d6d8ce789fd236959c9c0c6df2dbfb017e614bd0 Mon Sep 17 00:00:00 2001 From: MaMe82 Date: Mon, 6 Aug 2018 15:38:50 +0200 Subject: [PATCH] Enable multicast on interfaces, to allow mDNS (avahi-daemon) --- netlink/netlink_linux.go | 33 +++++++++++++++++++++++++++++++++ service/network.go | 24 +++++++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/netlink/netlink_linux.go b/netlink/netlink_linux.go index 2773e34..f88516a 100644 --- a/netlink/netlink_linux.go +++ b/netlink/netlink_linux.go @@ -587,6 +587,38 @@ func NetworkSetMacAddress(iface *net.Interface, macaddr string) error { return s.HandleAck(wb.Seq) } +//Added by MaMe82 +// Bring down a particular network interface. +// This is identical to running: ip link set $name down +func NetworkSetMulticast(iface *net.Interface, enable bool) error { + s, err := getNetlinkSocket() + if err != nil { + return err + } + defer s.Close() + + wb := newNetlinkRequest(syscall.RTM_SETLINK, syscall.NLM_F_ACK) + + msg := newIfInfomsg(syscall.AF_UNSPEC) + msg.Index = int32(iface.Index) + msg.Flags = syscall.NLM_F_REQUEST + msg.Change = DEFAULT_CHANGE + msg.IfInfomsg.Change |= syscall.IFF_MULTICAST + if enable { + msg.IfInfomsg.Flags |= syscall.IFF_MULTICAST + } else { + msg.IfInfomsg.Flags = uint32(int(msg.IfInfomsg.Flags) & ^syscall.IFF_MULTICAST) + } + + wb.AddData(msg) + + if err := s.Send(wb); err != nil { + return err + } + + return s.HandleAck(wb.Seq) +} + // Set link Maximum Transmission Unit // This is identical to running: ip link set dev $name mtu $MTU // bridge is a bitch here https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=292088 @@ -616,6 +648,7 @@ func NetworkSetMTU(iface *net.Interface, mtu int) error { return s.HandleAck(wb.Seq) } + // Set link queue length // This is identical to running: ip link set dev $name txqueuelen $QLEN func NetworkSetTxQueueLen(iface *net.Interface, txQueueLen int) error { diff --git a/service/network.go b/service/network.go index bf51c39..58a2e5b 100644 --- a/service/network.go +++ b/service/network.go @@ -136,11 +136,17 @@ func ConfigureInterface(settings *pb.EthernetInterfaceSettings) (err error) { if settings.Enabled { log.Printf("Setting Interface %s to UP\n", iface.Name) err = netlink.NetworkLinkUp(iface) + if err != nil { return err } + log.Printf("Setting Interface %s to MULTICAST to ON\n", iface.Name) + err = netlink.NetworkSetMulticast(iface, true) + if err != nil { return err } + } else { log.Printf("Setting Interface %s to DOWN\n", iface.Name) err = netlink.NetworkLinkDown(iface) + if err != nil { return err } } - if err != nil { return err } + case pb.EthernetInterfaceSettings_DHCP_SERVER: //Generate net ipNet, err := IpNetFromIPv4AndNetmask(settings.IpAddress4, settings.Netmask4) @@ -155,6 +161,11 @@ func ConfigureInterface(settings *pb.EthernetInterfaceSettings) (err error) { if settings.Enabled { log.Printf("Setting Interface %s to UP\n", iface.Name) err = netlink.NetworkLinkUp(iface) + if err != nil { return err } + log.Printf("Setting Interface %s to MULTICAST to ON\n", iface.Name) + err = netlink.NetworkSetMulticast(iface, true) + if err != nil { return err } + //check DhcpServerSettings if settings.DhcpServerSettings == nil { @@ -194,7 +205,18 @@ func ConfigureInterface(settings *pb.EthernetInterfaceSettings) (err error) { case pb.EthernetInterfaceSettings_DHCP_CLIENT: netlink.NetworkLinkFlush(iface) if settings.Enabled { + log.Printf("Setting Interface %s to UP\n", iface.Name) + err = netlink.NetworkLinkUp(iface) + if err != nil { return err } + log.Printf("Setting Interface %s to MULTICAST to ON\n", iface.Name) + err = netlink.NetworkSetMulticast(iface, true) + if err != nil { return err } + StartDHCPClient(settings.Name) + } else { + log.Printf("Setting Interface %s to DOWN\n", iface.Name) + err = netlink.NetworkLinkDown(iface) + if err != nil { return err } } }