initial implementation of IP allocator, only using memory storage
diff --git a/ip-allocator/allocate.go b/ip-allocator/allocate.go
new file mode 100644
index 0000000..11eded4
--- /dev/null
+++ b/ip-allocator/allocate.go
@@ -0,0 +1,42 @@
+package main
+
+func Allocate(store Storage, mac string) (string, error) {
+	// Check to see if an IP address is already allocated and if so just
+	// return that value
+	ip, err := store.Get(mac)
+	if err != nil {
+		return "", err
+	}
+
+	if ip != "" {
+		return ip, nil
+	}
+
+	// This MAC does not already have an IP assigned, so pull then next
+	// one off the available queue and return it
+	ip, err = store.Dequeue()
+	if err != nil {
+		return "", err
+	}
+	err = store.Put(mac, ip)
+	if err != nil {
+		store.Enqueue(ip)
+		return "", err
+	}
+	return ip, nil
+}
+
+func Release(store Storage, mac string) error {
+	ip, err := store.Remove(mac)
+	if err != nil {
+		return err
+	}
+
+	if ip != "" {
+		err = store.Enqueue(ip)
+		if err != nil {
+			return err
+		}
+	}
+	return nil
+}