Index: trunk/exodus/forms.py
===================================================================
--- trunk/exodus/forms.py	(revision 6453)
+++ trunk/exodus/forms.py	(revision 6454)
@@ -118,2 +118,4 @@
         else:
             return link
+
+    #XXX: change SSID when iface.name changes    
Index: trunk/exodus/models.py
===================================================================
--- trunk/exodus/models.py	(revision 6453)
+++ trunk/exodus/models.py	(revision 6454)
@@ -126,19 +126,28 @@
         return "%s/%s" % (self.node, self.iface)
 
+    def save(self, force_insert=False, force_update=False):
+        super(Interface, self).save(force_insert, force_update)
+        # If link is not defined we link to self.
+        #XXX: need to assign an IP address in forms.
+        if not self.link:
+            self.link = self
+            super(Interface, self).save(force_insert, force_update)
+        
+
 #
 # XXX: Currently not used, require rethinking wether we _really_ still needs
 # this feature as we going to use a new interlink IP naming model
-class InterfaceAlias(models.Model):
-    iface = models.ForeignKey(Interface,related_name='child')
-    ip = models.IPAddressField(unique=True)
-    netmask = models.IntegerField(default=30)
-    shortdesc = models.CharField(blank=True, max_length=10)
-    desc = models.CharField(blank=True, max_length=100)
-    linkAlias = models.ForeignKey('self', blank=True, null=True)
-    link = models.ForeignKey(Interface, blank=True, null=True)
-   
-    def __unicode__(self):
-        return "Alias %s" % (self.iface)
-
+#class InterfaceAlias(models.Model):
+#    iface = models.ForeignKey(Interface,related_name='child')
+#    ip = models.IPAddressField(unique=True)
+#    netmask = models.IntegerField(default=30)
+#    shortdesc = models.CharField(blank=True, max_length=10)
+#    desc = models.CharField(blank=True, max_length=100)
+#    linkAlias = models.ForeignKey('self', blank=True, null=True)
+#    link = models.ForeignKey(Interface, blank=True, null=True)
+#   
+#    def __unicode__(self):
+#        return "Alias %s" % (self.iface)
+#
 #
 # XXX: Needs rethinking, dhcp[start|stop] could be removed if whole publicAP is
@@ -165,5 +174,6 @@
     macaddress = models.CharField(max_length=17)
     address = models.IPAddressField()
-    PublicAP = models.ForeignKey(Interface)
+    public_accesspoint = models.ForeignKey(Interface)
+
 
     class Meta:
Index: trunk/exodus/wlipcalc.py
===================================================================
--- trunk/exodus/wlipcalc.py	(revision 6454)
+++ trunk/exodus/wlipcalc.py	(revision 6454)
@@ -0,0 +1,70 @@
+from exodus.settings import MASTERIP_NETMASK
+from exodus import wllogic as wl
+
+class IPCalc(object):
+    """Calculates an ip space given a node and a netmask. 
+
+    Given a netmask, this class calculates what the network, broadcast
+    and list of ipaddresses is.
+    """
+
+    #XXX: don't allow for /31
+    #XXX: we compensate for network and broadcast, but this shouln't be
+    #XXX: a /25 doesn't work 
+    #XXX: something goes wrong with a /28 with the broadcast addr
+    #       when using a /32
+    def __init__(self, node, free_netmask):
+        if free_netmask < MASTERIP_NETMASK or free_netmask > 32:
+            raise ValueError, 'Netmask out of bounds.'
+
+        self.node = node
+        self.free_netmask = free_netmask
+
+        self.master_ip = node.masterip
+        self.master_netmask = MASTERIP_NETMASK
+
+        # calculate the number of ipaddresses in the subnetmask
+        self.master_ip_size = self._ip_size(self.master_netmask)
+        self.new_ip_size = self._ip_size(self.free_netmask)
+        
+        # generate a list of all used_ipaddresses
+        # we take only the ip addresses of the interfaces that are
+        # linked to itself, because they are 'master' and the slaves
+        # fall in their subnet. 
+        used_list = [self.master_ip] 
+        for i in node.interface_set.all():
+            #XXX: rewrite to if i.ip in masterip??
+            if i.id == i.link_id:
+                ip_size = self._ip_size(i.netmask)
+                network_addr = wl.network(i.ip, i.netmask)
+                for j in range(ip_size):
+                    used_list.append(wl.show_addr(network_addr + j))
+
+        import pdb; pdb.set_trace() ; 
+
+        network_addr = wl.network(self.master_ip, self.master_netmask)
+        for i in range(self.master_ip_size/self.new_ip_size):
+            network_addr += i 
+            k = 0
+            for j in range(self.new_ip_size):
+                new_ip = wl.show_addr(network_addr + j) 
+                if new_ip not in used_list:
+                    k += 1 
+            if k == self.new_ip_size:
+                self.network = wl.get_network(wl.show_addr( 
+                        network_addr),self.free_netmask)
+                break 
+   
+        # define usefull variables 
+        self.netmask = self.free_netmask
+        self.broadcast = wl.get_broadcast(self.network, self.netmask)
+        # get all ips in network, but make compensate for first and last
+        first_ip = wl.parse_addr(self.network) + 1
+        self.ips = []
+        for i in range(self.new_ip_size-1):
+            self.ips.append(wl.show_addr(network_addr + i))                    
+
+
+        #self.ip = network_ip
+    def _ip_size(self, netmask):
+        return int(pow(2,32 - netmask))
Index: trunk/exodus/wllogic.py
===================================================================
--- trunk/exodus/wllogic.py	(revision 6453)
+++ trunk/exodus/wllogic.py	(revision 6454)
@@ -175,2 +175,5 @@
 		return 32	
 	return int(32) - int(ceil(log(number_ifaces+2,2)))
+
+
+
