2023-04-13 17:00:01 +02:00
|
|
|
package stdnet
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"net"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"github.com/pion/transport/v2"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
|
|
)
|
|
|
|
|
|
|
|
type mobileIFaceDiscover struct {
|
|
|
|
externalDiscover ExternalIFaceDiscover
|
|
|
|
}
|
|
|
|
|
|
|
|
func newMobileIFaceDiscover(externalDiscover ExternalIFaceDiscover) *mobileIFaceDiscover {
|
|
|
|
return &mobileIFaceDiscover{
|
|
|
|
externalDiscover: externalDiscover,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *mobileIFaceDiscover) iFaces() ([]*transport.Interface, error) {
|
|
|
|
ifacesString, err := m.externalDiscover.IFaces()
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
interfaces := m.parseInterfacesString(ifacesString)
|
|
|
|
return interfaces, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *mobileIFaceDiscover) parseInterfacesString(interfaces string) []*transport.Interface {
|
|
|
|
ifs := []*transport.Interface{}
|
|
|
|
|
|
|
|
for _, iface := range strings.Split(interfaces, "\n") {
|
|
|
|
if strings.TrimSpace(iface) == "" {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
fields := strings.Split(iface, "|")
|
|
|
|
if len(fields) != 2 {
|
|
|
|
log.Warnf("parseInterfacesString: unable to split %q", iface)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
var name string
|
|
|
|
var index, mtu int
|
|
|
|
var up, broadcast, loopback, pointToPoint, multicast bool
|
|
|
|
_, err := fmt.Sscanf(fields[0], "%s %d %d %t %t %t %t %t",
|
|
|
|
&name, &index, &mtu, &up, &broadcast, &loopback, &pointToPoint, &multicast)
|
|
|
|
if err != nil {
|
|
|
|
log.Warnf("parseInterfacesString: unable to parse %q: %v", iface, err)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
newIf := net.Interface{
|
|
|
|
Name: name,
|
|
|
|
Index: index,
|
|
|
|
MTU: mtu,
|
|
|
|
}
|
|
|
|
if up {
|
|
|
|
newIf.Flags |= net.FlagUp
|
|
|
|
}
|
|
|
|
if broadcast {
|
|
|
|
newIf.Flags |= net.FlagBroadcast
|
|
|
|
}
|
|
|
|
if loopback {
|
|
|
|
newIf.Flags |= net.FlagLoopback
|
|
|
|
}
|
|
|
|
if pointToPoint {
|
|
|
|
newIf.Flags |= net.FlagPointToPoint
|
|
|
|
}
|
|
|
|
if multicast {
|
|
|
|
newIf.Flags |= net.FlagMulticast
|
|
|
|
}
|
|
|
|
|
|
|
|
ifc := transport.NewInterface(newIf)
|
|
|
|
|
|
|
|
addrs := strings.Trim(fields[1], " \n")
|
|
|
|
foundAddress := false
|
|
|
|
for _, addr := range strings.Split(addrs, " ") {
|
2023-04-14 15:40:27 +02:00
|
|
|
if strings.Contains(addr, "%") {
|
|
|
|
continue
|
|
|
|
}
|
2023-04-13 17:00:01 +02:00
|
|
|
ip, ipNet, err := net.ParseCIDR(addr)
|
|
|
|
if err != nil {
|
|
|
|
log.Warnf("%s", err)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
ipNet.IP = ip
|
|
|
|
ifc.AddAddress(ipNet)
|
|
|
|
foundAddress = true
|
|
|
|
}
|
|
|
|
if foundAddress {
|
|
|
|
ifs = append(ifs, ifc)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return ifs
|
|
|
|
}
|