github.com/Cloud-Foundations/Dominator@v0.3.4/lib/net/getBridgeVlanId.go (about) 1 package net 2 3 import ( 4 "fmt" 5 "os" 6 "path/filepath" 7 "strings" 8 9 "github.com/Cloud-Foundations/Dominator/lib/fsutil" 10 ) 11 12 const procNetVlan = "/proc/net/vlan" 13 14 func getBridgeVlanId(bridgeIf string) (int, error) { 15 dirname := filepath.Join(sysClassNet, bridgeIf, "brif") 16 ifNames, err := fsutil.ReadDirnames(dirname, false) 17 if err != nil { 18 return 0, err 19 } 20 retval := -1 21 for _, ifName := range ifNames { 22 if strings.HasPrefix(ifName, "tap") { 23 continue 24 } 25 if strings.HasSuffix(ifName, "-ll") { 26 continue 27 } 28 _, err := os.Stat(filepath.Join(sysClassNet, ifName, "tun_flags")) 29 if err == nil { 30 continue 31 } 32 vlanId, err := readVlanId(filepath.Join(procNetVlan, ifName)) 33 if err != nil { 34 return 0, err 35 } 36 if vlanId >= 0 { 37 return int(vlanId), nil 38 } 39 retval = 0 40 } 41 return retval, nil 42 } 43 44 func readVlanId(filename string) (uint, error) { 45 file, err := os.Open(filename) 46 if err != nil { 47 if os.IsNotExist(err) { 48 return 0, nil 49 } 50 return 0, err 51 } 52 defer file.Close() 53 var dummy string 54 var vlanId uint 55 _, err = fmt.Fscanf(file, "%s VID: %d %s", &dummy, &vlanId, &dummy) 56 if err != nil { 57 return 0, err 58 } 59 return vlanId, nil 60 }