The supernet containing the current network. Args: prefixlen_diff: An integer, the amount the prefix length of the network should be decreased by. For example, given a /24 network and a prefixlen_diff of 3, a supernet with a /21 netmask
(self, prefixlen_diff=1, new_prefix=None)
| 972 | yield current |
| 973 | |
| 974 | def supernet(self, prefixlen_diff=1, new_prefix=None): |
| 975 | """The supernet containing the current network. |
| 976 | |
| 977 | Args: |
| 978 | prefixlen_diff: An integer, the amount the prefix length of |
| 979 | the network should be decreased by. For example, given a |
| 980 | /24 network and a prefixlen_diff of 3, a supernet with a |
| 981 | /21 netmask is returned. |
| 982 | |
| 983 | Returns: |
| 984 | An IPv4 network object. |
| 985 | |
| 986 | Raises: |
| 987 | ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have |
| 988 | a negative prefix length. |
| 989 | OR |
| 990 | If prefixlen_diff and new_prefix are both set or new_prefix is a |
| 991 | larger number than the current prefix (larger number means a |
| 992 | smaller network) |
| 993 | |
| 994 | """ |
| 995 | if self._prefixlen == 0: |
| 996 | return self |
| 997 | |
| 998 | if new_prefix is not None: |
| 999 | if new_prefix > self._prefixlen: |
| 1000 | raise ValueError('new prefix must be shorter') |
| 1001 | if prefixlen_diff != 1: |
| 1002 | raise ValueError('cannot set prefixlen_diff and new_prefix') |
| 1003 | prefixlen_diff = self._prefixlen - new_prefix |
| 1004 | |
| 1005 | new_prefixlen = self.prefixlen - prefixlen_diff |
| 1006 | if new_prefixlen < 0: |
| 1007 | raise ValueError( |
| 1008 | 'current prefixlen is %d, cannot have a prefixlen_diff of %d' % |
| 1009 | (self.prefixlen, prefixlen_diff)) |
| 1010 | return self.__class__(( |
| 1011 | int(self.network_address) & (int(self.netmask) << prefixlen_diff), |
| 1012 | new_prefixlen |
| 1013 | )) |
| 1014 | |
| 1015 | @property |
| 1016 | def is_multicast(self): |