osrg / gobgp

BGP implemented in the Go Programming Language
https://osrg.github.io/gobgp/
Apache License 2.0
3.6k stars 685 forks source link

L2 EVPN routes not pulled from FRR/Zebra #2706

Open simonbirtles opened 12 months ago

simonbirtles commented 12 months ago

Running FRR/Zebra (8.1) and GoBGP (3.180.0) on the same host (ubuntu 22.04) with KVM. On the host a VLXAN interface is configured which is connected to a bridge, the bridge is connected to the KVM virtual network that a VM is connected to.

IP Interface Host Output

root@192:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:8b:c5:be brd ff:ff:ff:ff:ff:ff
    altname enp11s0
    inet 10.243.176.192/24 brd 10.243.176.255 scope global ens192
       valid_lft forever preferred_lft forever
    inet6 fe80::250:56ff:fe8b:c5be/64 scope link
       valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 52:54:00:f9:0d:7a brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
4: vxlan9999: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br9999 state UNKNOWN group default qlen 1000
    link/ether ba:91:3d:ab:2b:f3 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::947b:6aff:fef5:8c31/64 scope link
       valid_lft forever preferred_lft forever
5: br9999: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 92:a9:79:75:7b:0d brd ff:ff:ff:ff:ff:ff
    inet6 fe80::947b:6aff:fef5:8c31/64 scope link
       valid_lft forever preferred_lft forever
6: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br9999 state UNKNOWN group default qlen 1000
    link/ether fe:54:00:49:56:6c brd ff:ff:ff:ff:ff:ff
    inet6 fe80::fc54:ff:fe49:566c/64 scope link
       valid_lft forever preferred_lft forever
root@192:~#

The problem is that GoBGP does not receive L2EVPN MAC entries from FRR/Zebra.

FRR/Zebra has the MAC (52:54:00:49:56:6c) entry in the BGP table for the virtual machine, validated the VM to VXLAN interface by pinging from the VM to a random IP and inspecting traffic on the VXLAN interface where the ARPs are seen, further validated as the output below shows.

FRR EVPN MAC

192# show evpn mac vni all detail

VNI 9999 #MACs (local and remote) 2

MAC: 92:a9:79:75:7b:0d
 Intf: br9999(5) VLAN: 1 Default-gateway Mac
 Sync-info: neigh#: 0
 Local Seq: 0 Remote Seq: 0
 Uptime: 01:47:30
 Neighbors:
    fe80::947b:6aff:fef5:8c31 Active

MAC: 52:54:00:49:56:6c
 Intf: vnet0(6) VLAN: 0
 Sync-info: neigh#: 0
 Local Seq: 0 Remote Seq: 0
 Uptime: 01:47:30
 Neighbors:
    No Neighbors

FRR BGP L2VPN

192# show bgp l2vpn evpn
BGP table version is 3, local router ID is 192.168.122.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal
Origin codes: i - IGP, e - EGP, ? - incomplete
EVPN type-1 prefix: [1]:[EthTag]:[ESI]:[IPlen]:[VTEP-IP]
EVPN type-2 prefix: [2]:[EthTag]:[MAClen]:[MAC]:[IPlen]:[IP]
EVPN type-3 prefix: [3]:[EthTag]:[IPlen]:[OrigIP]
EVPN type-4 prefix: [4]:[ESI]:[IPlen]:[OrigIP]
EVPN type-5 prefix: [5]:[EthTag]:[IPlen]:[IP]

   Network          Next Hop            Metric LocPrf Weight Path
Route Distinguisher: 192.168.122.1:2
*> [2]:[0]:[48]:[52:54:00:49:56:6c]
                    10.243.176.191                     32768 i
                    ET:8 RT:65000:9999
*> [2]:[0]:[48]:[92:a9:79:75:7b:0d]:[128]:[fe80::947b:6aff:fef5:8c31]
                    10.243.176.191                     32768 i
                    ET:8 RT:65000:9999
*> [3]:[0]:[32]:[10.243.176.191]
                    10.243.176.191                     32768 i
                    ET:8 RT:65000:9999

Displayed 3 out of 3 total prefixes
192#

FRR Route Table

192# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
       f - OpenFabric,
       > - selected route, * - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure

K>* 0.0.0.0/0 [0/0] via 10.243.176.254, ens192, 00:07:04
C>* 10.243.176.0/24 is directly connected, ens192, 00:07:04
192#

The FRR configuration is

192# show run
Building configuration...

Current configuration:
!
frr version 8.1
frr defaults traditional
hostname 192
log syslog informational
no ipv6 forwarding
service integrated-vtysh-config
!
router bgp 65000
 bgp default l2vpn-evpn
 !
 # no peering as only using FRR to provide routes to GoBGP
 address-family l2vpn evpn
  advertise-all-vni
  advertise-svi-ip
 exit-address-family
exit
!
end

GoBGP is configured as follows

root@192:~# cat /etc/gobgpd.conf
global:
  config:
    as: 65000
    router-id: 10.243.176.192
    port: 179
    local-address-list:
      - 10.243.176.192
  apply-policy:
    config:
      default-import-policy: accept-route
      default-export-policy: accept-route

neighbors:
  - config:
      peer-as: 65000
      auth-password: password
      neighbor-address: 10.243.176.191
      # local-as: 1000
      # remove-private-as: all
    as-path-options:
      config:
        allow-own-as: 1
        # replace-peer-as: true
    afi-safis:
      - config:
          afi-safi-name: l2vpn-evpn

zebra:
  config:
    enabled: true
    url: unix:/var/run/frr/zserv.api
    redistribute-route-type-list:
      - wildcard
    version: 6
    software-name: frr8.1

As the redistribute-route-type-list is set to wildcard (temp for debug, should be bgp only) the connected and static routes are pulled in by GoBGP as shown

GoBGP Global RIB

root@192:~# gobgp global rib
   Network              Next Hop             AS_PATH              Age        Attrs
*> 0.0.0.0/0            10.243.176.254                            01:52:43   [{Origin: i} {Med: 0}]
*> 10.243.176.0/24      0.0.0.0                                   01:52:43   [{Origin: i} {Med: 0}]

But EVPN routes are not.

GoBGP EVPN Routes

root@192:~# gobgp global rib -a evpn
Network not in table
root@192:~#

It doesn't seem like a FRR/Zebra issue hence raising the issue here.

SkalaNetworks commented 11 months ago

I tried reproducing the issue and found the exact same result, no routes are imported into GoBGP from Zebra, I don't know if the feature simply isn't there of if it's a bug. The alternative is simply to peer FRR with GoBGP to get the routes in. But I'd much prefer the alternative.

fujita commented 11 months ago

I guess that the feature isn't implemented.

mbanatt commented 11 months ago

unsubscribe

On Sun, Oct 15, 2023, 13:46 SkalaNetworks @.***> wrote:

I tried reproducing the issue and found the exact same result, no routes are imported into GoBGP from Zebra, I don't know if the feature simply isn't there of if it's a bug. The alternative is simply to peer FRR with GoBGP to get the routes in. But I'd much prefer the alternative.

— Reply to this email directly, view it on GitHub https://github.com/osrg/gobgp/issues/2706#issuecomment-1763458578, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAH5T2UJ6CGKRBYYPJDOKD3X7QONRANCNFSM6AAAAAA422KVF4 . You are receiving this because you are subscribed to this thread.Message ID: @.***>

p925qoet commented 11 months ago

i may be extremely confused, but i have some questions about this PR, please bear with me

1) instead of max(current, top - mine_old) why not do max(current - mine_old, top - mine_old) ? 2) is it even possible to adequately test this sort of patch without running a couple of gophers on a testnet?

p925qoet commented 11 months ago

UNSUBSCRIBE