diff options
| author | jwijenbergh <jeroenwijenbergh@protonmail.com> | 2024-08-12 11:33:52 +0200 |
|---|---|---|
| committer | Jeroen Wijenbergh <46386452+jwijenbergh@users.noreply.github.com> | 2024-08-12 11:50:48 +0200 |
| commit | 05c180e7b28c4659b55e5bf1ebc4847e5b62230e (patch) | |
| tree | a3e33763a46076bcd6542899bcfce075d381be23 /util/util.go | |
| parent | f3c04d56ca67c2ff0b08bf75cc51ea8be14c84b9 (diff) | |
Util: Add a function to calculate the gateway
Diffstat (limited to 'util/util.go')
| -rw-r--r-- | util/util.go | 33 |
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 +} |
