pkg/ibaddrparser/ib_data.go (42 lines of code) (raw):

// Copyright (c) Microsoft Corporation. // Licensed under the MIT license. package ibaddrparser import ( "fmt" "net" "strconv" "strings" ) // parsed from kvp_pool_0 , sample `NUMPAIRS:1|00155D33FF0B:172.16.1.2` func ParseIBAddrConfig(content []byte) (map[string]*net.IPNet, error) { segments := strings.Split(string(content), "|") if len(segments) != 2 { return nil, fmt.Errorf("invalid segments") } summarysegments := strings.Split(segments[0], ":") if len(summarysegments) != 2 { return nil, fmt.Errorf("invalid summary segment") } numPairs, err := strconv.Atoi(summarysegments[1]) if err != nil { return nil, err } if numPairs != len(segments)-1 { return nil, fmt.Errorf("number of pairs does not match") } ipoibConfig := make(map[string]*net.IPNet) for _, item := range segments[1:] { itemStrs := strings.Split(item, ":") if len(itemStrs) != 2 { return nil, fmt.Errorf("invalid item segment") } macAddr := itemStrs[0][0:2] + ":" + itemStrs[0][2:4] + ":" + itemStrs[0][4:6] + ":" + itemStrs[0][6:8] + ":" + itemStrs[0][8:10] + ":" + itemStrs[0][10:12] hardwareAddr, err := net.ParseMAC(macAddr) if err != nil { return nil, err } ipAddr := net.ParseIP(itemStrs[1]) if ipAddr == nil { return nil, fmt.Errorf("invalid ip address") } ipoibConfig[strings.ToLower(hardwareAddr.String())] = &net.IPNet{IP: ipAddr, Mask: net.CIDRMask(16, 32)} } return ipoibConfig, nil }