summaryrefslogtreecommitdiff
path: root/soundbox/interfaces.go
blob: 04839c767ea50d00e51a52f23c88158c07c7933a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package soundbox

import (
	"fmt"
	"net"
)

// getInterface is a function guessing which interface should be used for
// soundbox streaming. This is required since soundbox relies on communication
// via IPv6 link-local addresses which require a specified interface to allow
// communication. This function returns the first interface it finds which is
// up and has a link-local address assigned.
func getInterface() (net.Interface, error) {
	all, err := net.Interfaces()
	if err != nil {
		return net.Interface{}, err
	}

	for _, iface := range all {
		if iface.Flags&net.FlagUp == 0 {
			continue
		}
		addresses, err := iface.Addrs()
		if err != nil {
			return net.Interface{}, err
		}
		for _, addr := range addresses {
			ip, _, err := net.ParseCIDR(addr.String())
			if err != nil {
				return net.Interface{}, err
			}
			if ip.IsLinkLocalUnicast() {
				return iface, nil
			}
		}
	}

	return net.Interface{}, fmt.Errorf("No interface found for soundbox streaming")
}