summaryrefslogtreecommitdiff
path: root/util/util.go
diff options
context:
space:
mode:
authorjwijenbergh <jeroenwijenbergh@protonmail.com>2024-08-12 11:33:52 +0200
committerJeroen Wijenbergh <46386452+jwijenbergh@users.noreply.github.com>2024-08-12 11:50:48 +0200
commit05c180e7b28c4659b55e5bf1ebc4847e5b62230e (patch)
treea3e33763a46076bcd6542899bcfce075d381be23 /util/util.go
parentf3c04d56ca67c2ff0b08bf75cc51ea8be14c84b9 (diff)
Util: Add a function to calculate the gateway
Diffstat (limited to 'util/util.go')
-rw-r--r--util/util.go33
1 files changed, 33 insertions, 0 deletions
diff --git a/util/util.go b/util/util.go
new file mode 100644
index 0000000..c7816df
--- /dev/null
+++ b/util/util.go
@@ -0,0 +1,33 @@
+// package util defines public utility functions to be used by applications
+// these are outside of the client package as they can be used even if a client hasn't been created yet
+package util
+
+import (
+ "net"
+
+ "github.com/eduvpn/eduvpn-common/i18nerr"
+)
+
+// CalculateGateway takes a CIDR encoded subnet `cidr` and returns the gateway and an error
+func CalculateGateway(cidr string) (string, error) {
+ _, ipn, err := net.ParseCIDR(cidr)
+ if err != nil {
+ return "", i18nerr.WrapInternalf(err, "failed to parse CIDR for calculating gateway: %v", cidr)
+ }
+
+ ret := make(net.IP, len(ipn.IP))
+ copy(ret, ipn.IP)
+
+ for i := len(ret) - 1; i >= 0; i-- {
+ ret[i]++
+ if ret[i] > 0 {
+ break
+ }
+ }
+
+ if !ipn.Contains(ret) {
+ return "", i18nerr.Newf("IP network does not contain incremented IP: %v", ret)
+ }
+
+ return ret.String(), nil
+}