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