• Beniamino Galvani's avatar
    platform: add bpf filter to ignore routes from routing daemons · e9ca5583
    Beniamino Galvani authored
    Routing daemons can add a large amount of routes to the
    system. Currently NM receives netlink notifications for all those
    routes and exposes them on D-Bus. With many routes, the daemon becomes
    increasingly slow and uses a lot of memory.
    
    The rtm_protocol field of the route indicates the source of the
    route. From /usr/include/linux/rtnetlink.h, the allowed values are:
    
      #define RTPROT_UNSPEC          0
      #define RTPROT_REDIRECT        1        /* Route installed by ICMP redirects;
                                                 not used by current IPv4 */
      #define RTPROT_KERNEL          2        /* Route installed by kernel */
      #define RTPROT_BOOT            3        /* Route installed during boot */
      #define RTPROT_STATIC          4        /* Route installed by administrator */
    
      /* Values of protocol >= RTPROT_STATIC are not interpreted by kernel;
         they are just passed from user and back as is.
         It will be used by hypothetical multiple routing daemons.
         Note that protocol values should be standardized in order to
         avoid conflicts.
       */
    
      #define RTPROT_GATED           8        /* Apparently, GateD */
      #define RTPROT_RA              9        /* RDISC/ND router advertisements */
      #define RTPROT_MRT            10        /* Merit MRT */
      #define RTPROT_ZEBRA          11        /* Zebra */
      #define RTPROT_BIRD           12        /* BIRD */
      #define RTPROT_DNROUTED       13        /* DECnet routing daemon */
      #define RTPROT_XORP           14        /* XORP */
      #define RTPROT_NTK            15        /* Netsukuku */
      #define RTPROT_DHCP           16        /* DHCP client */
      #define RTPROT_MROUTED        17        /* Multicast daemon */
      #define RTPROT_KEEPALIVED     18        /* Keepalived daemon */
      #define RTPROT_BABEL          42        /* Babel daemon */
      #define RTPROT_OPENR          99        /* Open Routing (Open/R) Routes */
      #define RTPROT_BGP           186        /* BGP Routes */
      #define RTPROT_ISIS          187        /* ISIS Routes */
      #define RTPROT_OSPF          188        /* OSPF Routes */
      #define RTPROT_RIP           189        /* RIP Routes */
      #define RTPROT_EIGRP         192        /* EIGRP Routes */
    
    Since NM uses only values <= RTPROT_STATIC, plus RTPROT_RA and
    RTPROT_DHCP, add a BPF filter to the netlink socket to discard
    notifications for other route types.
    
    https://bugzilla.redhat.com/show_bug.cgi?id=1861527
    !1038
    e9ca5583