add README

This commit is contained in:
Alexander Zubkov
2021-12-01 17:00:34 +01:00
parent bc915d32cf
commit 078371692f

95
README Normal file
View File

@@ -0,0 +1,95 @@
# plag
Tools to optimize a list of IP (v4 or v6) prefixes.
The tools read prefix list on stdin and output the result to stdout.
- plagmax - returns a minimal superset of prefixes (loose mode)
- plageq - aggregates to equal set of prefixes with submasks
## plagmax
`plagmax` aggregates prefixes in loose mode, in case where all subprefixes
are also allowed.
So in the output all subprefixes are ignored and neighbour prefixes are folded.
### Example
Input:
```
10.0.0.0/24
10.0.1.0/24
10.0.2.0/24
10.0.2.1/32
10.0.3.0/24
```
Output:
```
10.0.0.0/22
```
## plageq
`plagmax` aggregates prefixes in strict mode.
So it does not add or remove prefixes, but aggregates sets of subprefixes
with the same mask into larger prefixes with a submask.
It tries to get the minimal number of prefixes in its output.
### Example
Input:
```
10.0.0.0/24
10.0.1.0/24
10.0.2.0/24
10.0.2.1/32
10.0.3.0/24
```
Output:
```
10.0.0.0/22{24,24}
10.0.2.1/32
```
## Building
You will need only a C compiler and a standard library to build the tools.
A simple `make` run should do the job.
```bash
$ make
gcc -O3 -o lib.o -c lib.c
gcc -O3 -o plagmax plagmax.c lib.o
gcc -O3 -o plageq plageq.c lib.o
```
## Running
The tools read stdin where they expect IP prefixes one per line.
Prefixes are of the standard form: `<IP>[/<mask>]`.
Both IPv4 and IPv6 are allowed, you can freely mix them
and the input doesn't need to be sorted.
Mask part is optional, in this case prefix is considered a single IP
and the default of `32` for IPv4 and `128` for IPv6 is used.
`plagmax` outputs simple prefixes in the same format and
`plageq` outputs prefixes with added submask range:
`<IP>/<mask>{<low>,<high>}`
This matches all prefixes, having masks in range `<low>`-`<high>`
(inclusive) that lie inside the prefix `<IP>/<mask>`.
In case `<mask> = <low> = <high>` the submasks part is omitted.
This notation of submasks is used in `bird` routing daemon.
You can use `bgpq4` tool for example to fetch the list of prefixes
and pipe its output to the tools:
```bash
bgpq4 -4 -F '%n/%l\n' as-set-name | ./plageq > as-set-name.ipv4.strict.txt
bgpq4 -6 -F '%n/%l\n' as-set-name | ./plagmax > as-set-name.ipv6.loose.txt
```