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  }