# A Simple IPv4 Prefix Summarization Procedure

#### Overview

In this short blog post we are going to present a simple procedure for IPv4 prefix summarization. The procedure is based on the one found in “Optimal Routing Design” book by Russ White, Don Slice and Alvaro Retana, but differs in some respects. The process is three step, and require the use of Windows calculator for ease of computation. No binary breakdowns are involved, just some basic arithmetic. For the sake of simplicity, we skip all proofs, as those are trivial. The same approach could be adopted for use with IPv6 prefixes, provided that decimal arithmetic is replaced with hexadecimal.

#### Scenario

We are going to use an example to demonstrate the method. Here is the task: find the optimal (longest prefix length) summary prefix for the following set of subnets:

192.168.100.0/22

192.168.101.0/24

192.168.99.0/24

192.168.102.0/24

192.168.105.0/24

192.168.98.0/23

This example is taken from the wikipedia article: http://en.wikipedia.org/wiki/Supernet that illustrates the use of **binary breakdown** for the purpose of address summarization.

#### Preparations

It does not matter if the subnets have different prefix lengths – you may simply ignore these, as the resulting summary will use its own prefix length. Sort the prefixes in ascending order, starting with lowest and to the highest 32-bit number. Find the octet where the prefixes differ (we would call it “changing octet” from here on). In our case this is the 3rd octet (98, 99 etc):

192.168.98.0/23

192.168.99.0/24

192.168.100.0/22

192.168.101.0/24

192.168.102.0/24

192.168.105.0/24

You only need to sort the prefixes to find the lowest and the highest changing octet values. The changing octet position also gives us the corresponding “positional prefix length”. If this octet is the first in the prefix, the positional prefix length is 8, if it's the second then the positional prefix length is 16, next 24 for third and 32 for fourth position in the dotted-decimal form.

#### Step 1:

Take the highest and lowest changing octets and perform XOR operation on them. You may use Windows calculator or any other utility that allows for logical operations on decimal numbers: "98 XOR 105 = 11". Next, take the lowest power of “2” that is **strictly** greater than the resulting number (even if the result is a power of two itself). In our case it is 16. Let's call this number as “y”. After that, find the number z, so that "2^z=y" (here "^" means power, not XOR like in C), i.e. take Log2 of "y": "z = Log2(y) = Log2(16) = 4". You may use a short table of powers of 2 ranging from 2^0 to 2^8 – you don’t need more as you deal with just a single octet. It’s easy to memorize these numbers too. Notice that dealing with IPv6 would require the table of 16 elements (2^0 through 2^16).

**Note** The original method found in “Optimal Routing Design” uses subtraction operation instead of XOR at this step. It could be shown that subtraction does not work in all cases. For example, it does not reveal the correct highest mismatching bit position in the case of: 10.1.66.0 and 10.1.69.0 as "69-66=3" (incorrectly approximated by 2^2) while "69 XOR 66 = 7" (correctly approximated by 2^3). The reason being are "arithmetic underflows" that happen with subtraction.

#### Step 2:

Take the any changing octet value, e.g. the lowest one, and divide it by “y” then drop the remainder: "98/16 = 6.125" rounded to 6 (“floor” function). Now multiply 6 by “y” again to yield 96 – this is the base octet of the summary address. The summary prefix now looks like: 192.168.96.0. Effectively, these two operations represent logical binary shift right and left to mask the changing bits. Yes, you may take ANY octect from the set of prefixes - the result will be the same.

#### Step 3:

The final step is finding the summary prefix length. Take the positional prefix length corresponding to the changing octet, as described previously. In our case it’s the third octet, and thus the positional prefix length is 24. Now subtract "z" from this number to get “x” – the summary prefix length: "x=24-z=24-4=20". The summary prefix is: 192.168.y.0/x = 192.168.96.0/20

#### Step 4 (Optional):

Convert prefix length into network mask, if needed. To accomplish this, take 256 and subtract “y”: 256-16=240. This is the netmask component that corresponds to the summary base octet: 192.168.96.0 255.255.240.0

#### Example 1

Take the following subnets:

10.1.57.0/24

10.1.59.0/24

10.1.61.0/24

Changing octet – 3rd, positional prefix length = 24. Next step: "61 XOR 57 = 4" thus "y = 8, z=3; 57/y = 57/8 = 7.125" and the base octet is "7*8=56". The prefix length is "24-3=21". Summary prefix is: 10.1.56.0/21 or 10.1.56.0 255.255.248.0

#### Example 2

Take the following subnets:

192.168.97.0/23

192.168.100.0/22

Changing octet – 3rd, positional prefix length = 24. Next step: "100 XOR 97 = 5", "y = 8, z = 3 97/8 = 12.125", base = "12*8=96". The prefix length = "24-3=21". Summary Prefix: 192.168.96.0/21 or 192.168.96.0 255.255.248.0

#### Example 3

Take the following subnets:

172.16.14.0/24

172.16.17.0/24

172.16.25.0/24

Changing Octet - 3rd, positional prefix length = 24. Next Step: "25 XOR 14 = 23, y = 32, z = 5; 14/32 = 0.43", base octet = 0. Summary length: "24-5=19". Summary prefix: 172.16.0.0/19 or 172.16.0.0 255.255.224.0. Notice that this summary address could be too exhaustive in terms of overlapped address space. You may want to summarize just two prefixes: 172.16.17.0 and 172.16.25.0 and leak 172.16.14.0: summary of 172.16.17.0 and 172.16.25.0 = 172.16.16.0/20 and 172.16.14.0/24 is left un-summarized.

#### Conclusions

The procedure presented in this article could be useful when dealing with large-scale networks and configuring manual IPv4 prefix summarization. You may avoid complicated binary conversions and simply use the calculator to find the resulting prefix.