Finding largest netmask for given set of hosts
Edvard Majakari
edvard.majakari at staselog.com
Fri Aug 9 07:23:47 EDT 2002
I'm trying to construct a class method which returns the smallest possible
network (largest netmask) for given set of hosts.
Now, I have list of ip addresses in object variable self._list. Each IP
address is in binary format (32-bit long)
The algorithm is below:
def gen_mask(self):
nw = self._list[0] # initialise network to first ip address
nm = 0xFFFFFFFFL # initialise netmask to 255.255.255.255 (32)
# for every other ip in the list
for ip in self._list[1:]:
nw = nw & nm # AND network with netmask
# XOR the network with ip address. All differing bits
# should be ones after XOR, and all bits that are same should
# be ones
x = nw ^ ip
# now, if nw was 192.128.11.12 and first ip was 192.128.11.20,
# result of x should be 24L, which is corresponds to bitmask of
# 00000000000000000000000000011000. However, this is
# undesirable - we need a bitmask that has ones for the
# constant parts of the ip addresses and zeroes for the rest.
# by inverting x (~ x) we get
# 11111111111111111111111111100111, which still contains
# one at the end of the bitstring. We get rid of this bit
# by calling a function that zeroes all the rest bits after
# the first zero bit:
nm = zero_after_first_zero(dec2bin(~x))
# now nm (according to the example) is
# 11111111111111111111111111100000. We use this to
# to recalculate new network:
nw = nw & nm
# now nw should be 192.128.11.0 and netmask is 27
return nw
The problem is that in Python, it seems quite difficult to create a
routine dec2bin that would handle binary digits. I also doubt the
algorithm is the best for this kind of thing.
I wonder is there any existing Python modules that would do this kind of
thing? I searched one for days (using Google), but didn't find any..
--
# Edvard Majakari Software Engineer
# PGP PUBLIC KEY available Soli deo gloria - Glory to God alone!
$_ = '456476617264204d616a616b6172692c20612043687269737469616e20'; print
join('',map{chr hex}(split/(\w{2})/)),uc substr(crypt(60281449,'es'),2,4),"\n";
More information about the Python-list
mailing list