First Commit of Voltha-Go-Controller from Radisys

Change-Id: I8e2e908e7ab09a4fe3d86849da18b6d69dcf4ab0
diff --git a/internal/pkg/util/utils.go b/internal/pkg/util/utils.go
new file mode 100644
index 0000000..0711053
--- /dev/null
+++ b/internal/pkg/util/utils.go
@@ -0,0 +1,148 @@
+/*
+* Copyright 2022-present Open Networking Foundation
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+package util
+
+import (
+	"encoding/binary"
+	"net"
+	"strings"
+
+	"voltha-go-controller/internal/pkg/of"
+)
+
+// RemoveFromSlice to remove particular value from given slice.
+func RemoveFromSlice(s []string, value string) []string {
+	i := 0
+	for i = 0; i < len(s); i++ {
+		if s[i] == value {
+			break
+		}
+	}
+	if i != len(s) {
+		//It means value is found in the slice
+		s[len(s)-1], s[i] = s[i], s[len(s)-1]
+		return s[:len(s)-1]
+	}
+	return s
+}
+
+//IsSliceSame - check and return true if the two slices are identical
+func IsSliceSame(ref, rcvd []uint32) bool {
+
+	var found bool
+	if len(ref) != len(rcvd) {
+		return false
+	}
+
+	for _, refEntry := range ref {
+		found = false
+
+		for _, rcvdEntry := range rcvd {
+			if refEntry == rcvdEntry {
+				found = true
+				break
+			}
+		}
+		if !found {
+			return false
+		}
+	}
+	return true
+}
+
+//IsPbitSliceSame - check and return true if the two slices are identical
+func IsPbitSliceSame(ref, rcvd []of.PbitType) bool {
+
+	var found bool
+	if len(ref) != len(rcvd) {
+		return false
+	}
+
+	for _, refEntry := range ref {
+		found = false
+
+		for _, rcvdEntry := range rcvd {
+			if refEntry == rcvdEntry {
+				found = true
+				break
+			}
+		}
+		if !found {
+			return false
+		}
+	}
+	return true
+}
+
+// IsNniPort is to check if given port is Nni Port.
+func IsNniPort(id uint32) bool {
+	return (id >= 0x100000)
+}
+
+// Uint32ToByte to convert uint32 to byte
+func Uint32ToByte(value uint32) []byte {
+	byteValue := make([]byte, 4)
+	binary.BigEndian.PutUint32(byteValue[0:4], value)
+	return byteValue
+}
+
+// IP2LongConv convert ip address to integer value.
+func IP2LongConv(ip net.IP) uint32 {
+	if len(ip) == 16 {
+		return binary.BigEndian.Uint32(ip[12:16])
+	}
+	return binary.BigEndian.Uint32(ip)
+}
+
+// Long2ipConv convert integer to ip address.
+func Long2ipConv(nn uint32) net.IP {
+	ip := make(net.IP, 4)
+	binary.BigEndian.PutUint32(ip, nn)
+	return ip
+}
+
+// GetExpIPList converts list or range of IPs to expanded IP list
+func GetExpIPList(ips []string) []net.IP {
+	ipList := []net.IP{}
+
+	for _, ipOrRange := range ips {
+		if strings.Contains(ipOrRange, "-") {
+			var splits = strings.Split(ipOrRange, "-")
+			ipStart := IP2LongConv(net.ParseIP(splits[0]))
+			ipEnd := IP2LongConv(net.ParseIP(splits[1]))
+
+			for i := ipStart; i <= ipEnd; i++ {
+				ipList = append(ipList, Long2ipConv(i))
+			}
+		} else {
+			ipList = append(ipList, net.ParseIP(ipOrRange))
+		}
+	}
+	return ipList
+}
+
+// MacAddrsMatch for comparison of MAC addresses and return true if MAC addresses matches
+func MacAddrsMatch(addr1 net.HardwareAddr, addr2 net.HardwareAddr) bool {
+	if len(addr1) != len(addr2) {
+		return false
+	}
+	for i := 0; i < len(addr1); i++ {
+		if addr1[i] != addr2[i] {
+			return false
+		}
+	}
+	return true
+}