]> git.proxmox.com Git - mirror_frr.git/commit - lib/vty.c
pbrd: Add PBR to FRR
authorDonald Sharp <sharpd@cumulusnetworks.com>
Tue, 23 Jan 2018 18:11:36 +0000 (13:11 -0500)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Fri, 6 Apr 2018 17:22:43 +0000 (13:22 -0400)
commite5c83d9b314cb513e78707de5d29ec655dbdca7e
tree0ede3af459164c589f9892e7f6c93e82f08ad208
parent52483fa6ff0957032f73c6b6c4aa3402476a5b90
pbrd: Add PBR to FRR

This is an implementation of PBR for FRR.

This implemenation uses a combination of rules and
tables to determine how packets will flow.

PBR introduces a new concept of 'nexthop-groups' to
specify a group of nexthops that will be used for
ecmp.  Nexthop-groups are specified on the cli via:

nexthop-group DONNA
  nexthop 192.168.208.1
  nexthop 192.168.209.1
  nexthop 192.168.210.1
!

PBR sees the nexthop-group and installs these as a default
route with these nexthops starting at table 10000
robot# show pbr nexthop-groups
Nexthop-Group: DONNA Table: 10001 Valid: 1 Installed: 1
Valid: 1  nexthop 192.168.209.1
Valid: 1  nexthop 192.168.210.1
Valid: 1  nexthop 192.168.208.1

I have also introduced the ability to specify a table
in a 'show ip route table XXX' to see the specified tables.

robot# show ip route table 10001
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, P - PIM, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, D - SHARP,
       F - PBR,
       > - selected route, * - FIB route

F>* 0.0.0.0/0 [0/0] via 192.168.208.1, enp0s8, 00:14:25
  *                 via 192.168.209.1, enp0s9, 00:14:25
  *                 via 192.168.210.1, enp0s10, 00:14:25

PBR tracks PBR-MAPS via the pbr-map command:

!
pbr-map EVA seq 10
  match src-ip 4.3.4.0/24
  set nexthop-group DONNA
!
pbr-map EVA seq 20
  match dst-ip 4.3.5.0/24
  set nexthop-group DONNA
!

pbr-maps can have 'match src-ip <prefix>' and 'match dst-ip <prefix>'
to affect decisions about incoming packets.  Additionally if you
only have one nexthop to use for a pbr-map you do not need
to setup a nexthop-group and can specify 'set nexthop XXXX'.

To apply the pbr-map to an incoming interface you do this:

interface enp0s10
 pbr-policy EVA
!

When a pbr-map is applied to interfaces it can be installed
into the kernel as a rule:

[sharpd@robot frr1]$ ip rule show
0: from all lookup local
309: from 4.3.4.0/24 iif enp0s10 lookup 10001
319: from all to 4.3.5.0/24 iif enp0s10 lookup 10001
1000: from all lookup [l3mdev-table]
32766: from all lookup main
32767: from all lookup default

[sharpd@robot frr1]$ ip route show table 10001
default proto pbr metric 20
nexthop via 192.168.208.1 dev enp0s8 weight 1
nexthop via 192.168.209.1 dev enp0s9 weight 1
nexthop via 192.168.210.1 dev enp0s10 weight 1

The linux kernel now will use the rules and tables to properly
apply these policies.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Signed-off-by: Don Slice <dslice@cumulusnetworks.com>
Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
35 files changed:
Makefile.am
configure.ac
lib/command.c
lib/command.h
lib/route_types.txt
lib/vty.c
pbrd/.gitignore [new file with mode: 0644]
pbrd/Makefile [new file with mode: 0644]
pbrd/pbr_debug.c [new file with mode: 0644]
pbrd/pbr_debug.h [new file with mode: 0644]
pbrd/pbr_event.c [new file with mode: 0644]
pbrd/pbr_event.h [new file with mode: 0644]
pbrd/pbr_main.c [new file with mode: 0644]
pbrd/pbr_map.c [new file with mode: 0644]
pbrd/pbr_map.h [new file with mode: 0644]
pbrd/pbr_memory.c [new file with mode: 0644]
pbrd/pbr_memory.h [new file with mode: 0644]
pbrd/pbr_nht.c [new file with mode: 0644]
pbrd/pbr_nht.h [new file with mode: 0644]
pbrd/pbr_vty.c [new file with mode: 0644]
pbrd/pbr_vty.h [new file with mode: 0644]
pbrd/pbr_zebra.c [new file with mode: 0644]
pbrd/pbr_zebra.h [new file with mode: 0644]
pbrd/pbrd.conf.sample [new file with mode: 0644]
pbrd/subdir.am [new file with mode: 0644]
redhat/daemons
redhat/frr.spec.in
tools/etc/frr/daemons
tools/etc/frr/daemons.conf
tools/frr
vtysh/Makefile.am
vtysh/extract.pl.in
vtysh/vtysh.c
vtysh/vtysh.h
vtysh/vtysh_config.c