[Idr] Re: WG LC on changes for draft-ietf-idr-bgp-model-20 (6/26 to 7/10/2026)

Maria Matejka <maria.matejka@nic.cz> Mon, 13 July 2026 13:27 UTC

Return-Path: <maria.matejka@nic.cz>
X-Original-To: idr@mail2.ietf.org
Delivered-To: idr@mail2.ietf.org
Received: from localhost (localhost [127.0.0.1]) by mail2.ietf.org (Postfix) with ESMTP id DABFC115CE84A for <idr@mail2.ietf.org>; Mon, 13 Jul 2026 06:27:46 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ietf.org; s=ietf1; t=1783949266; bh=MO+IsN0Cy3mP1whO7B+JVun7FHGkwK73Axifb2Y4HuA=; h=Date:From:To:Subject:References:In-Reply-To; b=b8/JlMFDADiLld1Ng8P8sD1JqT/KsEemPJFtmHgPUJPwfTxuQxXYt+KtfWKW9ZpUW LzwGz+CyWfk09EOxrCGF6WfBGAGyfUJqEfbGWS3LLiP23g8nnC2yNLWKfNdQewgGcL 0NBz+NmjTG/j7OBSGMx9Z6FYwNsxJBc7T0yvgzjk=
X-Virus-Scanned: amavisd-new at ietf.org
X-Spam-Flag: NO
X-Spam-Score: -7.1
X-Spam-Level:
X-Spam-Status: No, score=-7.1 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_HI=-5, SPF_PASS=-0.001] autolearn=ham autolearn_force=no
Authentication-Results: mail2.ietf.org (amavisd-new); dkim=pass (1024-bit key) header.d=nic.cz
Received: from mail2.ietf.org ([166.84.6.31]) by localhost (mail2.ietf.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id SJbUBF-qQYFN for <idr@mail2.ietf.org>; Mon, 13 Jul 2026 06:27:45 -0700 (PDT)
Received: from mail.nic.cz (mail.nic.cz [IPv6:2001:1488:800:400::400]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-256) server-digest SHA256) (No client certificate requested) by mail2.ietf.org (Postfix) with ESMTPS id 7F5C3115CE839 for <idr@ietf.org>; Mon, 13 Jul 2026 06:27:45 -0700 (PDT)
Received: from struhadlo.private.jmq.cz (dynamic-2a00-1028-838c-9382-abcb-e4bd-7d0e-fb3a.ipv6.o2.cz [IPv6:2a00:1028:838c:9382:abcb:e4bd:7d0e:fb3a]) by mail.nic.cz (Postfix) with ESMTPSA id 62E841C1081 for <idr@ietf.org>; Mon, 13 Jul 2026 15:27:43 +0200 (CEST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nic.cz; s=default; t=1783949263; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=6CmxybA9mou9s16STdVGtAz0be1qoN6Kyl/6hG4rVU4=; b=BOMU2sbTfh4weaZrzbAZH21KNMD+Bm/x6vPABRpYU339s3O3KHQL5DAoD4g96jZa3kXmJJ EpqhLWE2O6x1VffteDFwlnBezoM7FwuQm5Tr7TbcrGngXPXa8V+VwbdVfBzsl2GaUZQj/t SzqkVSUawSWU3SiMxcaq482UmMhl0yA=
Authentication-Results: mail.nic.cz; auth=pass smtp.auth=maria.matejka@nic.cz smtp.mailfrom=maria.matejka@nic.cz
Date: Mon, 13 Jul 2026 15:27:41 +0200
From: Maria Matejka <maria.matejka@nic.cz>
To: idr@ietf.org
Message-ID: <alTnzSCQYggFaxje@struhadlo.private.jmq.cz>
References: <BL3PR08MB7420B15E11B1B19C4A43DB1FB3EA2@BL3PR08MB7420.namprd08.prod.outlook.com>
MIME-Version: 1.0
Content-Type: multipart/alternative; boundary="9Jjl5CFrlRmSyyR/"
Content-Disposition: inline
Content-Transfer-Encoding: 8bit
In-Reply-To: <BL3PR08MB7420B15E11B1B19C4A43DB1FB3EA2@BL3PR08MB7420.namprd08.prod.outlook.com>
X-Rspamd-Action: no action
X-Spamd-Result: default: False [-5.10 / 16.00]; BAYES_HAM(-5.00)[100.00%]; MIME_GOOD(-0.10)[multipart/alternative,text/plain]; FUZZY_RATELIMITED(0.00)[rspamd.com]; ARC_NA(0.00)[]; ASN(0.00)[asn:5610, ipnet:2a00:1028::/32, country:CZ]; MISSING_XM_UA(0.00)[]; RCVD_COUNT_ZERO(0.00)[0]; NEURAL_HAM(-0.00)[-1.000]; FROM_HAS_DN(0.00)[]; DKIM_SIGNED(0.00)[nic.cz:s=default]; FROM_EQ_ENVFROM(0.00)[]; MIME_TRACE(0.00)[0:+,1:+,2:~]; LOCAL_OUTBOUND(0.00)[]; TO_MATCH_ENVRCPT_ALL(0.00)[]; TO_DN_NONE(0.00)[]; RCPT_COUNT_ONE(0.00)[1]
X-Rspamd-Server: mail
X-Rspamd-Queue-Id: 62E841C1081
X-Spamd-Bar: -----
Message-ID-Hash: CBU3YQ6J6PN2EUE66EBC5SU6VKVG34GD
X-Message-ID-Hash: CBU3YQ6J6PN2EUE66EBC5SU6VKVG34GD
X-MailFrom: maria.matejka@nic.cz
X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-idr.ietf.org-0; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header
X-Mailman-Version: 3.3.9rc6
Precedence: list
Subject: [Idr] Re: WG LC on changes for draft-ietf-idr-bgp-model-20 (6/26 to 7/10/2026)
List-Id: Inter-Domain Routing <idr.ietf.org>
Archived-At: <https://mailarchive.ietf.org/arch/msg/idr/h7JMXIdgJevV97hM_oyLo-usbrE>
List-Archive: <https://mailarchive.ietf.org/arch/browse/idr>
List-Help: <mailto:idr-request@ietf.org?subject=help>
List-Owner: <mailto:idr-owner@ietf.org>
List-Post: <mailto:idr@ietf.org>
List-Subscribe: <mailto:idr-join@ietf.org>
List-Unsubscribe: <mailto:idr-leave@ietf.org>

Howdy!

First of all, thanks for fixing the neighbor key.

On Sat, Jun 27, 2026 at 12:37:52AM +0000, Susan Hares wrote:

> This is a WG LC on the post-WG LC changes on draft-ietf-idr-bgp-model-20.txt from 6/26 to 7/10/2026.

I'm confused by this formulation but I was busy anyway with other
things. Also, a WG LC for such a long document would be nicer a little
bit longer than 14 days, so that one could read it once again from top
to bottom.

Was this a WG LC for the whole document?

Generally, to quote Ondřej Zajíček when we discussed the BGP YANG
earlier, it looks like a lot of implementation details is leaking into
the API, but if the community wants this, whatever.

For example, the whole neighbor group concept is implementation
specific (, and it is kinda orthogonal to a templating mechanism expected
by RFC 8342 (NMDA), sec. 5.1.3 and 5.1.4, and actively prepared in
https://datatracker.ietf.org/doc/html/draft-tt-netmod-yang-config-templates
I'm not convinced that all that specification complexity with neighbor
groups is really needed.

Here are some notes for sec. 7.1 to 7.3.3 (incl.), more will follow
later. Notes are below the YANG excerpts.

## Sec. 7.1

    feature damping {
      description
	"Weighted route dampening is supported.";
    }

Could we please use damping or dampening but not both?

    feature route-refresh {
      description
	"Support for the BGP Route Refresh capability.";
      reference
	"RFC 2918: Route Refresh Capability for BGP-4.";
    }

Enhanced (RFC 7313) is an update, ergo not referenced here?

    typedef rr-cluster-id-type {
      ...
	type yang:dotted-quad;
      ...
	 option 2: IP address";
    }

Probably IPv4 address, to be precise.

## Sec. 7.2

The large community type looks gnarly and could have been defined as a
set of three items but whatever, this is gonna be replaced by a standin
in CBOR anyway, and therefore I don't care.

## Sec. 7.3.1

    leaf identifier {
         type yang:dotted-quad;
         0description
           "BGP Identifier of the router - an unsigned 32-bit,
            non-zero integer that should be unique within an AS.
            The value of the BGP Identifier for a BGP speaker is
            determined upon startup and is the same for every local
            interface and BGP peer.";
         reference
           "RFC 6286: AS-Wide Unique BGP ID for BGP-4. Section 2.1";
       }

What about an analogous type to rr-cluster-id-type, as RFC 6286
specifies it as uint32?

    container neighbors {
      description
        "Configuration for BGP neighbors.";

Configuration but then things inside that are config false. That confuses me.

    leaf local-address {
      type inet:ip-address;
      config false;
      description
        "The local IP address of this entry's BGP connection.";
    }

... like here for example. Maybe that should be "Read-only active
configuration for BGP neighbors."?

    leaf local-restarting {
      type boolean;
      config false;
      description
        "This flag indicates whether the local neighbor is
         currently restarting. The flag is cleared after all
         NLRI have been advertised to the peer, and the
         End-of-RIB (EOR) marker has been cleared.";
    }

Does this mean "the local node / session / connection is restarting?"
For me, a neighbor is not the local node. RFC 4724 uses the term Speaker.
Also just several items below, in `leaf session-state`, the term
Neighbor is used for the remote one only.

    action clear {
      if-feature "ibt:clear-statistics";
      description
        "Clear statistics action command.
         Execution of this command should result in all the
         counters to be cleared and set to 0.";

I'm not completely sure but do I interpret correctly that
container queues, which are gauge32, are not counter, and therefore not
cleared? This may deserve a clarification, what exactly is cleared.

    output {
      leaf clear-finished-at {
        type yang:date-and-time;
        description
          "Time when the clear action command completed.";
      }
    }

What is the semantics of action completed? For the clear-neighbors
action with notification, does it mean notification queued, sent, or
also routes from that peer flushed? For operation-soft, that is probably
when the last route was re-sent, and for operation-soft-inbound its when
the request was sent, or when all the routes are received?
(This deserves clarification of the description.)

Also, "soft" and "soft-inbound" is very … non-descriptive and
unsystematic if the action is named "clear". More suitable names may be
e.g. "resend" and "refresh", or at least "soft-outbound" and
"soft-inbound"? Or even "reexport" and "reimport", to match with other
places like "import-policy" and "export-policy". (This is bikeshedding.)

## Sec. 7.3.2

Is this expected to be configuration or status? From the usage of
`bgp-capabilities-common`, it is status only. Or is it intended to be
also imported from elsewhere to allow fine-grained tampering with
capabilities sent?

Also the `derived-from-or-self` construction looks unnecessarily
complicated, but the longer I'm looking at it, the more it seems to me
nicer than the augmenting approach chosen e.g. by the routing base RFC
which is kinda lasagna. I'm quite OK with this approach.

## Sec. 7.3.3

    grouping bgp-neighbor-use-multiple-paths
    grouping global-group-use-multiple-paths

This looks like a specific implementation feature without RFC coverage
and with no reference to an existing document. While BIRD does indeed
implement something resembling that, the overall semantics is unclear.

    container route-flap-damping

This deserves an explicit reference to RFC 2439.

    leaf-list send-community {
      if-feature "ibct:send-communities";
      type identityref {
        base "ibct:send-community-feature";
      }
      description
        "When supported, this tells the router to propagate any
         prefixes that are attached to these community-types.";
    }

This reads incomprehensible to me. How is a prefix attached to
a community type?

    leaf advertise-inactive-routes {
      type boolean;
      default "false";
      description
        "Advertise inactive routes to external peers.  The default
         is to only advertise active routes.";
      reference
        "I-D.ietf-idr-best-external: Advertisement of the best
         external route in BGP.";
    }

This looks weird. Why do we include a feature from a draft last updated
14 years ago? Also, the referenced draft has no definition of an
"active route", and therefore the semantics of this is unknown to me.

    grouping route-selection-options

While I'm quite sure why these are here, it would be nice to have
a reference here, informing the reader / implementor that these are
indeed knobs to violate RFC 4271 sec. 9.1 in a way so common that
actually most implementations do offer these knobs.

    leaf replace-peer-as {
      type boolean;
      default "false";
      description
        "Replace occurrences of the peer's AS in the AS_PATH with
         the local autonomous system number";
    }

This is the only of "AS_PATH manipulation configuration", while
`allow-own-as` is an import validation knob and `disable-peer-as-filter`
is an export validation knob. I'm not convinced that grouping these
three into grouping neighbor-group-as-path-options is semantically
sound.

    choice send {
      description
        "Choice of sending the max. number of paths or to send
         all.";
      case max {
        leaf max {
          type uint8;
          description
            "The maximum number of paths to advertise to neighbors
             for a single NLRI";
        }
      }

What is the semantics of this? When we were requested to implement this
kind of limiting in BIRD, we found a bunch of questions to consider,
most notably what to do when the maximum is hit and then one route gets
withdrawn. Shall we fill in another one? And how to choose which routes
get sent?

I'm not convinced that we should have a standard configuration knob
for a non-standard feature with unclear definition.

Also, eligible-prefix-policy lacks any explanation that this is actually
an additional knob not specified in RFC 7911, and probably a little bit
more explicit semantics.

    container dynamic-peers {
      list dynamic-peer-list {
        key "prefix";

While one may intuitively understand how this works, I would, again,
like to see a more detailed explanation of the semantics of dynamic
peers. I know that it's quite a common feature but it's not specified
formally and there is yet again a risk of semantic confusion between
implementations.




-- 
Maria Matejka (she/her) | BIRD Team Leader | CZ.NIC, z.s.p.o.