Enable multicast on interfaces, to allow mDNS (avahi-daemon)

This commit is contained in:
MaMe82 2018-08-06 15:38:50 +02:00
parent fb4eb763d6
commit d6d8ce789f
2 changed files with 56 additions and 1 deletions

View File

@ -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 {

View File

@ -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 }
}
}