Re: [pim] Yangdoctors telechat review of draft-ietf-pim-igmp-mld-yang-10

tom petch <> Tue, 12 February 2019 12:20 UTC

Return-Path: <>
Received: from localhost (localhost []) by (Postfix) with ESMTP id 0772712DF71; Tue, 12 Feb 2019 04:20:47 -0800 (PST)
X-Virus-Scanned: amavisd-new at
X-Spam-Flag: NO
X-Spam-Score: 0.246
X-Spam-Status: No, score=0.246 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RATWARE_MS_HASH=2.148, RCVD_IN_DNSWL_NONE=-0.0001, SPF_PASS=-0.001] autolearn=no autolearn_force=no
Authentication-Results: (amavisd-new); dkim=pass (1024-bit key)
Received: from ([]) by localhost ( []) (amavisd-new, port 10024) with ESMTP id 0m_fbTBiIwkI; Tue, 12 Feb 2019 04:20:44 -0800 (PST)
Received: from ( []) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by (Postfix) with ESMTPS id 5786E124C04; Tue, 12 Feb 2019 04:20:44 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;; s=selector1-btconnect-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=cw9QqUgflpGWObCxJdqB9hq1+D2zbHqoKq6GZesfsMI=; b=Dp8QJfuF4mzJw1TqxNS2lIs1wDcc7tRRbAo9aUzUlS2CQJsojS+lw0GcDoGEJN1K4sWpoobJK/rCq5dmuAsiLUdzCic2v+vTLSRBFJEbGQVd3UEjURCBGgGZSR2RJGXBvgFUajxbXI8xEMDxt0QKA715q95ZMbk8IfjCHXcVqg4=
Received: from ( by ( with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1622.15; Tue, 12 Feb 2019 12:20:41 +0000
Received: from ([fe80::1dbd:b660:a8fd:673c]) by ([fe80::1dbd:b660:a8fd:673c%3]) with mapi id 15.20.1622.016; Tue, 12 Feb 2019 12:20:41 +0000
From: tom petch <>
To: Jan Lindblad <>
CC: "" <>, "" <>, "" <>
Thread-Topic: Yangdoctors telechat review of draft-ietf-pim-igmp-mld-yang-10
Thread-Index: AQHUv8hZblbpzYkupkqonoDx7ke5vg==
Date: Tue, 12 Feb 2019 12:20:41 +0000
Message-ID: <050101d4c2cd$2832f760$>
References: <> <00d401d4bfc8$273c1380$> <>
Accept-Language: en-GB, en-US
Content-Language: en-US
x-clientproxiedby: LO2P265CA0012.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:62::24) To (2a01:111:e400:510e::19)
authentication-results: spf=none (sender IP is );
x-ms-exchange-messagesentrepresentingtype: 1
x-mailer: Microsoft Outlook Express 6.00.2800.1106
x-originating-ip: []
x-ms-publictraffictype: Email
x-microsoft-exchange-diagnostics: 1; DB5PR07MB1030; 6:h/5adx7AKIgsVg7ZMckSv6wXp5g2YTez+FG+flymLe389Fy4dmRE8cjTlJeOdQliIXxTDYfjOoTKKBfC4ZflR/11VTEMye/5ukhltZxEx/3mzl7XG88MS+9ahzGNYt+qBBQ3iHvj8Hwln8DdN42T4lrc0paMFByxvQwqZDabIAXbIaxqg3f3Byz00cQN/Ui3ZrIPtZC4oX7bVcb0KvAeLKoemZkswcXX87Xc8MVEfqMSG1DeFVgo9wXUeL2m5FKxzo4vypxVZB/K06QHv0B4sGTRHsIUM7Ol9X655fnrhdnEA3CVvmwHQdhNImzFjnQHerV6HBINU3wgSCKgTieINx6VKVVUEzjv9QTK+0W+ChSnFs9sg7xRWhCiSyAboLJxrxwpYrwemMMD4Aqr37Hg4J7Xi5c8EjyryYcrI18AFVLGnbox3tRyK4QtpefTfr2mrn0Y/DAVjzvk/kLYyZ4WVg==; 5:A4bTUJKeoU0JuU7ofSA33apiNn4pnYUFc89J8pl1XhHNG99KEQPmVilijcEasyjDslWm3A1R2BIOwYapxOGCszel3ktxmdIx9TPhYFSURwAnbIlanb+mLWsQavRQ2Yyw8xrwxvpEo/+NWMXFIGJAJVusXjvJh+2eVWHbwYPIWszeRDUVPL0BvHBFl9zo/iDHmzmJcxPaqs5jW1UQ0ZSl5A==; 7:hO1c1rhRA6lpgtu8zXQDCT2hgCCC75a3Co72tZJzRdo6QYXm/NmWrRl4p7kFKC65Tb0HJsvlbnGHMa+oDRNoNqV8bmjh06qDJET7z/lqw0RcpKJp53uQPX8Ot6+1JaEB/70/Y9cjUZ9jj5/q6iGx9g==
x-ms-office365-filtering-correlation-id: 93938289-2e47-4b17-95ab-08d690e48082
x-microsoft-antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600110)(711020)(4605077)(2017052603328)(7193020); SRVR:DB5PR07MB1030;
x-ms-traffictypediagnostic: DB5PR07MB1030:
x-microsoft-antispam-prvs: <>
x-forefront-prvs: 0946DC87A1
x-forefront-antispam-report: SFV:NSPM; SFS:(10019020)(396003)(376002)(346002)(39860400002)(366004)(136003)(189003)(13464003)(199004)(50084003)(71190400001)(105586002)(8936002)(7736002)(14454004)(6512007)(53936002)(99286004)(186003)(446003)(305945005)(478600001)(84392002)(9686003)(71200400001)(6246003)(33896004)(106356001)(486006)(50226002)(68736007)(52116002)(81816011)(76176011)(97736004)(81166006)(316002)(81686011)(81156014)(102836004)(61296003)(26005)(14444005)(476003)(256004)(2906002)(6436002)(4720700003)(6916009)(6486002)(44736005)(386003)(54906003)(8676002)(6506007)(229853002)(66066001)(86362001)(44716002)(62236002)(86152003)(3846002)(6116002)(1556002)(14496001)(25786009)(4326008)(74416001)(7726001); DIR:OUT; SFP:1102; SCL:1; SRVR:DB5PR07MB1030;; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:0;
received-spf: None ( does not designate permitted sender hosts)
x-ms-exchange-senderadcheck: 1
x-microsoft-antispam-message-info: lC9FlmFFTM9XOTb3WzGNBP3iik8HL7cQpVF326+2Mww5qt92QuE1lqNLGpBESaLkaISgraDhyWVH/6jCkZ7Dqw+gc2dyCnB8dQ5+Wzc8h+eZyPjqQKMlIldhzG9SFL1FjqnGonDdL+pIz62u14yAozciEz9RD1GfWpWFYU45hKt6nwCn7hNyeGxchw9eHOW9n3hc5RCVN+TAjDLS2XS1R1lNBO3/ApbmQxvANvtpfMPDbsRYF+ux3dXs9oJsOHloarUxusLAMxN9E+E5t7HUX/Ohpdh2L7QX2uyVnKg5UxPg94FvAXOzOP/ihAHcFEyNhAm4vEB+5spooAoQA2txcEDzv/fHabGtoEsnHUYeQMoFn+1tNXNtfDOXJQ1IVI+qmuJo9Zq4SoBR86qm2mseb4KbJQUy/brHWUXx4oD0FLE=
Content-Type: text/plain; charset="iso-8859-1"
Content-ID: <>
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
X-MS-Exchange-CrossTenant-Network-Message-Id: 93938289-2e47-4b17-95ab-08d690e48082
X-MS-Exchange-CrossTenant-originalarrivaltime: 12 Feb 2019 12:20:39.8845 (UTC)
X-MS-Exchange-CrossTenant-fromentityheader: Hosted
X-MS-Exchange-CrossTenant-mailboxtype: HOSTED
X-MS-Exchange-CrossTenant-id: cf8853ed-96e5-465b-9185-806bfe185e30
X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB5PR07MB1030
Archived-At: <>
Subject: Re: [pim] Yangdoctors telechat review of draft-ietf-pim-igmp-mld-yang-10
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: Protocol Independent Multicast <>
List-Unsubscribe: <>, <>
List-Archive: <>
List-Post: <>
List-Help: <>
List-Subscribe: <>, <>
X-List-Received-Date: Tue, 12 Feb 2019 12:20:47 -0000


Thanks for that.  I see grouping as a necessary evil to be used with
restraint, like subroutines and procedures in code, a restraint that I
would like to be exercised more:-(

So, I now see how the groupings are used under an augment/when which
makes them conditional on either IGMP or MLD and so not ambiguous as I
first thought.

Having sorted that, five more quirks I see for the authors to address.

no mention of NMDA as required by RFC8407

/interfaces/interface/interface-name {
   must "/if:interfaces/if:interface[if:name = current()]/"
                   + "ip:ipv4" {
description  "The interface must have IPv4 enabled.";

looks wrong to me.  If you want IPv4 enabled, then you need
set to true

            "This augmentation is only valid for a control-plane
             protocol instance of IGMP (type 'mld').";

looks odd to me when the augment has
        when "derived-from-or-self(rt:type, 'igmp-mld:mld')" {

      rpc clear-igmp-groups {
              "Name of the IGMP interface.
               If it is not specified, groups from all interfaces are

taken at face value, this clears all MLD groups as well as IGMP groups;
is this intended?  If not, suggest

               If it is not specified, groups from all IGMP interfaces

      rpc clear-mld-groups {

Tom Petch

----- Original Message -----
From: "Jan Lindblad" <>;
Sent: Saturday, February 09, 2019 7:48 AM


> Agree with your comments but I had a more fundamental problem trying
> understand theYANG module, about the repeated use of IGMP and/or MLD
> in

As you know I'm not the author of this YANG, but I can explain how it

>      feature global-admin-enable {
> Is that one or or the other or both? Or
>        leaf enable {
>          type boolean;           default false;
>          description "true to enable IGMP or MLD in the routing
> instance;
> Is that one or the other or both?
> And so on. I am uncertain how the phrases are meant to be interpreted.
> The only way I could make sense of this was to assume that an
> implementation must implement and support both IGMP and MLD; which is
> course blown out of the water by including separate features for IGMP
> and MLD.

No, this construct will not force an implementation to do both igmp and
mld. There are other features to control which protocols to implement
(feature-igmp, feature-mld). Leaf enable is modeled in a grouping (you
can think of it as a macro). This grouping is used once in igmp and once
in mld, so there are two separate enable leafs if both features are

The single global-admin-enable feature does force an implementation that
has both igmp and mld to support the global enable leaf either for both
protocols, or for none of them. It's not possible to support global
enable for one protocol but not the other, when both protocols are

> In  a similar vein, SSM is repeatedly mentioned, never explained,
> referenced and in a sense, this is another protocol to add to IGMP and

I have no idea what SSM is, and the module does little to help on that
front. Good point.


> ----- Original Message -----
> From: "Jan Lindblad" <>;
> Sent: Thursday, February 07, 2019 4:01 PM
>> Reviewer: Jan Lindblad
>> Review result: Ready with Issues
>> This is my YANG-doctor review of draft-ietf-pim-igmp-mld-yang-10. In
> the
>> spring, I did an early review of the -02, and in the early fall a
> call
>> review of the -07 version. The module has progressed significantly
> since then.
>> In particular the two main issues with -07 have been fixed, which is
> great!
>> There are still a few things that should be looked at, however.
>> Since some of the current issues are the same as addressed in earlier
> comments,
>> I will reuse the numbering from the -07 review, and add a few points
> at the end:
>> #3 Top level structures not optional
>> If-feature statements have been introduced so that an implementor can
> choose
>> whether to implement igmp and/or mld separately. This is very good.
> RFC 8349,
>> which the current module augments, recommend that the top level
> containers be
>> presence containers. This is currently not the case, and I see no
> reason why
>> they aren't.
>>   It is also RECOMMENDED that protocol-specific data nodes be
>>   encapsulated in an appropriately named container with presence.
> Such
>>   a container may contain mandatory data nodes that are otherwise
>>   forbidden at the top level of an augment.
>> At this time, there are no mandatory leafs under the top level
> containers,
>> which makes this recommendation less of a concern, but if a mandatory
> leaf is
>> introduced (e.g. see #9 below), making the top level containers
> presence
>> containers will be essential.
>> #4 Unclear meaning of optional leaves
>> While a lot of default values have been introduced (great!), there
> still
>> many optional configuration leafs with no default value, not
> mandatory, not
>> self-evident and no description of what absence signifies. A few
> in the
>> description might be all it takes to fix this.
>> This happens with many leafs, but a couple of examples:
>>     leaf max-entries {
>>       if-feature global-max-entries;
>>       type uint32;
>>       description
>>         "The maximum number of entries in IGMP or MLD.";
>>     }
>> If no max-entries is configured, what is the prescribed behavior?
> all
>> implementations agree that there is no max then? If so, maybe mention
> that in
>> the description?
>>     leaf source-policy {
>>       if-feature intf-source-policy;
>>       type leafref {
>>         path "/acl:acls/acl:acl/acl:name";
>>       }
>>       description
>>         "Name of the access policy used to filter sources.
>>          A device can restrict the length
>>          and value of this name, possibly space and special
>>          characters are not allowed.";
>>     }
>> If no source policy is specified, does that mean there is no policy?
>> There are many more.
>> #8 What policy name?
>> In leaf ssm-map-group-policy, the description begins with "Name of
> policy
>> ....". Does this mean that the policy name can be chosen freely, or
> does the
>> policy name entered here have to match some policy name specified
> somewhere
>> else?
>> If this name can be chosen freely without considering some other
> it's all
>> fine.
>>       leaf ssm-map-group-policy {
>>         type string;
>>         description
>>           "Name of the policy used to define ssm-map rules.
>>            A device can restrict the length
>>            and value of this name, possibly space and special
>>            characters are not allowed. ";
>> #9 Default for version
>> Leaf version is given a default of 2; this sounds excellent. This
> clarifies
>> what protocol version to use even if the operator doesn't specify.
> Note that a
>> default can never be changed, however, so only do this if 2 will feel
> like a
>> good number even 10 years from now.
>> If no suitable default value that withstands time can be selected,
> another
>> option is to make it mandatory for the client to configure. Note that
> in such a
>> case #3 above becomes very important to resolve.
>> The authors should
>>     leaf version {
>>       type uint8 {
>>         range "1..3";
>>       }
>>       default 2;
>> #10 Inaccurate description or expression
>> In the interface-name leaf, there is a must statement and description
> which
>> contradict each other. The must statement requires that the ipv4
> container is
>> configured, while the description says ipv4 should be enabled. It is
> possible
>> to configure the ipv4 container but have ipv4/enabled = 'false', so
> the must
>> expression only cares whether the ipv4 presence container is
> configured, not if
>> it is enabled. Which one reflects the desired behavior?
>>           leaf interface-name {
>>             type if:interface-ref;
>>             must "/if:interfaces/if:interface[if:name = current()]/"
>>                + "ip:ipv4" {
>>               description
>>                 "The interface must have IPv4 enabled.";
>> If ipv4 needs to be enabled, the must expression should be
>>             must "/if:interfaces/if:interface[if:name = current()]/"
>>                + "ip:ipv4/ip:enabled = 'true'" {
>> If ipv4 needs to be configured, the description should say "The
> interface must
>> have IPv4 configured (but not necessarily enabled)."
>> The same logic applies to MLD and ipv6 as well.