Thanks for answer. I tried this filter but the source is RTS_OSPF, not RTS_DEVICE. Also the proto is "ospf1".

Can I somehow "mark" routes learned by OSPF from local kernel and filter on that mark? Or filter out routes without gw? I tried to filter out undefined gw "if !defined(gw)", that didn't work. (gw is defined, the stringified value is "::", but that doesn't match the gw in a condition).

Thanks

ico

On 20. 2. 2023 15:01, Petr Boltík wrote:
Yes, this is the default behavior. You can use RTS_DEVICE filter.

Petr

    |protocol kernel kernel4 { ipv4 { import all; export where source !=
    RTS_DEVICE; }; learn; scan time 300; } protocol kernel kernel6 {
    ipv6 { import all; export where source != RTS_DEVICE; }; learn; scan
    time 300; }|


po 20. 2. 2023 v 14:52 odesílatel ico <i...@petrzalka.net <mailto:i...@petrzalka.net>> napsal:

    Hello all,

    Here at $work we are using bird for OSPF at some 30 linux boxes. Works
    great. But there is a thing that confuses me:

    Let's have some simple linux box:

    # ip addr
    1: lo: ...rest of loopback output
    2: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
    state UP group default qlen 1000
          link/ether 86:37:65:15:fa:d9 brd ff:ff:ff:ff:ff:ff link-netns r2
          inet 10.0.0.1/24 <http://10.0.0.1/24> scope global eth0
             valid_lft forever preferred_lft forever
    # ip route
    10.0.0.0/24 <http://10.0.0.0/24> dev eth0 proto kernel scope link
    src 10.0.0.1

    As you can see, there is single interface with single address, single
    device route automatically generated by kernel. Simple bird config:

    # cat bird.conf
    # BEGIN bird config
    router id 10.0.0.1;
    protocol device {
          scan time 3;
    }
    protocol kernel krnl4 {
          ipv4 {
              table master4;
              import all; export all;
          };
          learn;
    }
    protocol ospf ospf1 {
          ipv4 {
              table master4;
              import all; export all;
          };
          area 0.0.0.0 {
              stub no;
              interface "eth0" {
                  stub yes;
              };
          };
    }
    # END bird config

    When I run bird with this configuration, it inserts another route:

    # ip route
    10.0.0.0/24 <http://10.0.0.0/24> dev eth0 proto kernel scope link
    src 10.0.0.1
    10.0.0.0/24 <http://10.0.0.0/24> dev eth0 proto bird scope link
    metric 32

    Is this expected/correct behaviour? Or should I somehow filter those
    device routes out? I want those device routes to be read by OSPF, of
    course, just not to output them back. What is the best way to get
    rid of
    them?

    Another unrelated question: When I run bird, it logs this:

    bird: KRT: Netlink strict checking failed, will scan all tables at once
    bird: Started

    Should I do something about that failed strict check? Is it
    important or
    only some info message I shouldn't worry about?

    Thank you

    ico

Reply via email to