kernel: does not learn routes with RTPROT_KERNEL

Maria Matejka maria.matejka at nic.cz
Thu Aug 24 10:19:23 CEST 2023


Hello!

On first sight, this looks good. Gonna do some checks and tests and let 
you know whether anything more is needed from you.

Thank you for your patch!
Maria

On 8/24/23 01:38, Pavel Šorejs via Bird-users wrote:
> Here is first version - based on master
>
>
> Pavel
>
> ---
>  doc/bird.sgml          | 11 ++++++-----
>  sysdep/linux/netlink.c |  2 +-
>  sysdep/unix/krt.Y      |  7 ++++++-
>  sysdep/unix/krt.c      | 15 +++++++++++----
>  sysdep/unix/krt.h      |  4 ++++
>  5 files changed, 28 insertions(+), 11 deletions(-)
>
> diff --git a/doc/bird.sgml b/doc/bird.sgml
> index 29e12b7a..af87d5dc 100644
> --- a/doc/bird.sgml
> +++ b/doc/bird.sgml
> @@ -3454,9 +3454,8 @@ on the <cf/learn/ switch, such routes are either 
> ignored or accepted to our
>  table).
>
>  <p>Note that routes created by OS kernel itself, namely direct routes
> -representing IP subnets of associated interfaces, are not imported 
> even with
> -<cf/learn/ enabled. You can use <ref id="direct" name="Direct 
> protocol"> to
> -generate these direct routes.
> +representing IP subnets of associated interfaces, are imported only with
> +<cf/learn all/ enabled.
>
>  <p>If your OS supports only a single routing table, you can configure 
> only one
>  instance of the Kernel protocol. If it supports multiple tables (in 
> order to
> @@ -3487,10 +3486,12 @@ channels.
>      Time in seconds between two consecutive scans of the kernel routing
>      table.
>
> -    <tag><label id="krt-learn">learn <m/switch/</tag>
> +    <tag><label id="krt-learn">learn [<m/all/]</tag>
>      Enable learning of routes added to the kernel routing tables by 
> other
>      routing daemons or by the system administrator. This is possible 
> only on
> -    systems which support identification of route authorship.
> +    systems which support identification of route authorship. By 
> default, routes
> +    created by kernel (marked as "proto kernel") are not imported. 
> Use <m/all/
> +    option to import these routes.
>
>      <tag><label id="krt-kernel-table">kernel table <m/number/</tag>
>      Select which kernel table should this particular instance of the 
> Kernel
> diff --git a/sysdep/linux/netlink.c b/sysdep/linux/netlink.c
> index 1af78766..29446cab 100644
> --- a/sysdep/linux/netlink.c
> +++ b/sysdep/linux/netlink.c
> @@ -1598,7 +1598,7 @@ nl_parse_route(struct nl_parse_state *s, struct 
> nlmsghdr *h)
>
>      case RTPROT_KERNEL:
>        krt_src = KRT_SRC_KERNEL;
> -      return;
> +      break;
>
>      case RTPROT_BIRD:
>        if (!s->scan)
> diff --git a/sysdep/unix/krt.Y b/sysdep/unix/krt.Y
> index 95b54d65..f3eb1393 100644
> --- a/sysdep/unix/krt.Y
> +++ b/sysdep/unix/krt.Y
> @@ -32,6 +32,7 @@ CF_DECLS
>  CF_KEYWORDS(KERNEL, PERSIST, SCAN, TIME, LEARN, DEVICE, ROUTES, 
> GRACEFUL, RESTART, KRT_SOURCE, KRT_METRIC, MERGE, PATHS)
>  CF_KEYWORDS(INTERFACE, PREFERRED)
>
> +%type <i> kern_learn
>  %type <i> kern_mp_limit
>
>  CF_GRAMMAR
> @@ -48,6 +49,10 @@ kern_proto_start: proto_start KERNEL {
>  kern_proto: kern_proto_start proto_name '{' ;
>  kern_proto: kern_proto kern_item ';' ;
>
> +kern_learn:
> + bool { $$ = $1 ? KRT_LEARN_SOME : KRT_LEARN_NONE; }
> + | ALL { $$ = KRT_LEARN_ALL; }
> +
>  kern_mp_limit:
>     /* empty */ { $$ = KRT_DEFAULT_ECMP_LIMIT; }
>   | LIMIT expr  { $$ = $2; if (($2 <= 0) || ($2 > 255)) 
> cf_error("Merge paths limit must be in range 1-255"); }
> @@ -61,7 +66,7 @@ kern_item:
>        /* Scan time of 0 means scan on startup only */
>        THIS_KRT->scan_time = $3 S_;
>     }
> - | LEARN bool {
> + | LEARN kern_learn {
>        THIS_KRT->learn = $2;
>  #ifndef KRT_ALLOW_LEARN
>        if ($2)
> diff --git a/sysdep/unix/krt.c b/sysdep/unix/krt.c
> index 9f95247f..3288fd0c 100644
> --- a/sysdep/unix/krt.c
> +++ b/sysdep/unix/krt.c
> @@ -638,13 +638,14 @@ krt_got_route(struct krt_proto *p, rte *e, s8 src)
>
>  #ifdef KRT_ALLOW_LEARN
>    switch (src)
> -    {
> -    case KRT_SRC_KERNEL:
> -      goto ignore;
> -
> +    {
>      case KRT_SRC_REDIRECT:
>        goto delete;
>
> +    case KRT_SRC_KERNEL:
> +      if (KRT_CF->learn != KRT_LEARN_ALL)
> +        goto ignore;
> +      // fall through
>      case  KRT_SRC_ALIEN:
>        if (KRT_CF->learn)
>      krt_learn_scan(p, e);
> @@ -780,6 +781,12 @@ krt_got_route_async(struct krt_proto *p, rte *e, 
> int new, s8 src)
>        break;
>
>  #ifdef KRT_ALLOW_LEARN
> +  case KRT_SRC_KERNEL:
> +      if (KRT_CF->learn == KRT_LEARN_ALL)
> +    {
> +      krt_learn_async(p, e, new);
> +    }
> +  break;
>      case KRT_SRC_ALIEN:
>        if (KRT_CF->learn)
>      {
> diff --git a/sysdep/unix/krt.h b/sysdep/unix/krt.h
> index 18a206e6..694ebd34 100644
> --- a/sysdep/unix/krt.h
> +++ b/sysdep/unix/krt.h
> @@ -27,6 +27,10 @@ struct kif_proto;
>  #define KRT_REF_SEEN    0x1    /* Seen in table */
>  #define KRT_REF_BEST    0x2    /* Best in table */
>
> +#define KRT_LEARN_NONE 0 /* Don't learn */
> +#define KRT_LEARN_SOME 1 /* Learn some routes (excluding 
> RTPROT_KERNEL) */
> +#define KRT_LEARN_ALL 2 /* Learn all routes */
> +
>  /* Whenever we recognize our own routes, we allow learing of foreign 
> routes */
>
>  #ifdef CONFIG_SELF_CONSCIOUS

-- 
Maria Matejka (she/her) | BIRD Team Leader | CZ.NIC, z.s.p.o.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://trubka.network.cz/pipermail/bird-users/attachments/20230824/475840cb/attachment.htm>


More information about the Bird-users mailing list