The subnets which join to make the current subnet. In the case that self contains only one IP (self._prefixlen == 32 for IPv4 or self._prefixlen == 128 for IPv6), yield an iterator with just ourself. Args: prefixlen_diff: An integer, the amount the prefi
(self, prefixlen_diff=1, new_prefix=None)
| 922 | return (self.version, self.network_address, self.netmask) |
| 923 | |
| 924 | def subnets(self, prefixlen_diff=1, new_prefix=None): |
| 925 | """The subnets which join to make the current subnet. |
| 926 | |
| 927 | In the case that self contains only one IP |
| 928 | (self._prefixlen == 32 for IPv4 or self._prefixlen == 128 |
| 929 | for IPv6), yield an iterator with just ourself. |
| 930 | |
| 931 | Args: |
| 932 | prefixlen_diff: An integer, the amount the prefix length |
| 933 | should be increased by. This should not be set if |
| 934 | new_prefix is also set. |
| 935 | new_prefix: The desired new prefix length. This must be a |
| 936 | larger number (smaller prefix) than the existing prefix. |
| 937 | This should not be set if prefixlen_diff is also set. |
| 938 | |
| 939 | Returns: |
| 940 | An iterator of IPv(4|6) objects. |
| 941 | |
| 942 | Raises: |
| 943 | ValueError: The prefixlen_diff is too small or too large. |
| 944 | OR |
| 945 | prefixlen_diff and new_prefix are both set or new_prefix |
| 946 | is a smaller number than the current prefix (smaller |
| 947 | number means a larger network) |
| 948 | |
| 949 | """ |
| 950 | if self._prefixlen == self.max_prefixlen: |
| 951 | yield self |
| 952 | return |
| 953 | |
| 954 | if new_prefix is not None: |
| 955 | if new_prefix < self._prefixlen: |
| 956 | raise ValueError('new prefix must be longer') |
| 957 | if prefixlen_diff != 1: |
| 958 | raise ValueError('cannot set prefixlen_diff and new_prefix') |
| 959 | prefixlen_diff = new_prefix - self._prefixlen |
| 960 | |
| 961 | if prefixlen_diff < 0: |
| 962 | raise ValueError('prefix length diff must be > 0') |
| 963 | new_prefixlen = self._prefixlen + prefixlen_diff |
| 964 | |
| 965 | if new_prefixlen > self.max_prefixlen: |
| 966 | raise ValueError( |
| 967 | 'prefix length diff %d is invalid for netblock %s' % ( |
| 968 | new_prefixlen, self)) |
| 969 | |
| 970 | start = int(self.network_address) |
| 971 | end = int(self.broadcast_address) + 1 |
| 972 | step = (int(self.hostmask) + 1) >> prefixlen_diff |
| 973 | for new_addr in range(start, end, step): |
| 974 | current = self.__class__((new_addr, new_prefixlen)) |
| 975 | yield current |
| 976 | |
| 977 | def supernet(self, prefixlen_diff=1, new_prefix=None): |
| 978 | """The supernet containing the current network. |