RFC 7887

Hierarchical Join/Prune Attributes

πŸ“… published June 2016, from ietf

Hierarchical Join/Prune Attributes πŸŽ€

okay bestie, this is RFC 7887 and it's giving PIM multicast glow-up πŸ’– It's an IETF Standards Track doc from June 2016 (ISSN 2070-1721), written by S. Venaas, J. Arango (both at Cisco Systems) and I. Kouvelas (at Arista Networks). It updates [RFC5384] and doesn't obsolete anything. The IETF stamped it as consensus-approved after public review, so it's officially legit ✨

Abstract

okay so the abstract is literally the TL;DR πŸ’… This doc defines a hierarchical way to encode Join/Prune attributes. Why does that matter? Because when the same attribute values need to apply to a bunch of sources in one PIM Join/Prune message, you get a much more efficient encoding πŸ™Œ It also updates [RFC5384] by renaming the encoding type registry defined there.

Status of This Memo

this section is the official paperwork energy πŸ“‹ It's an Internet Standards Track document. It's a product of the Internet Engineering Task Force (IETF), it represents the consensus of the IETF community, it's had public review, and the Internet Engineering Steering Group (IESG) approved it for publication. If you want more on Internet Standards, check Section 2 of RFC 7841. For the current status, errata, and how to give feedback, go to http://www.rfc-editor.org/info/rfc7887 πŸ¦‹

the legal bit, but make it cute 🌸 The copyright is Copyright (c) 2016 IETF Trust and the persons identified as the document authors. All rights reserved. This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (http://trustee.ietf.org/license-info) as in effect on the date of publication. Please actually read those, because they spell out your rights and restrictions. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions, and they come without warranty as described in the Simplified BSD License 🫢

Table of Contents

1.  Introduction  . . . . . . . . . . . . . . . . . . . . . . . .   3
2.  Requirements Notation . . . . . . . . . . . . . . . . . . . .   3
3.  Hierarchical Join/Prune Attribute Definition  . . . . . . . .   3
4.  PIM Address Encoding Types  . . . . . . . . . . . . . . . . .   6
5.  Hierarchical Join/Prune Attribute Hello Option  . . . . . . .   6
6.  Security Considerations . . . . . . . . . . . . . . . . . . .   7
7.  IANA Considerations . . . . . . . . . . . . . . . . . . . . .   7
8.  Normative References  . . . . . . . . . . . . . . . . . . . .   7
Authors' Addresses  . . . . . . . . . . . . . . . . . . . . . . .   8

1. Introduction ✨

okay so here's the setup πŸ’… PIM Join attributes as defined in [RFC5384] let you attach a set of attributes to each joined or pruned source in a PIM Join/Prune message. The catch is that attributes have to be specified separately for each individual source. But sometimes the same attributes and values need to apply to some, or even all, of the sources in the message. Right now you have to repeat them for every source where they apply. Ugh, so repetitive πŸ™„

This doc fixes that with a hierarchical way to encode attributes and their values in a Join/Prune message. If the same attribute and value applies to all the sources, you only specify it once in the whole message. And if all the sources in a particular group set share an attribute and value, you only specify it once for that entire group set 🧚

It also extends [RFC5384] by saying the encoding type defined there also applies to the Encoded-Unicast and Encoded-Group formats. It additionally updates [RFC5384] by renaming the "PIM Encoded-Source Address Encoding Type Field" registry to "PIM Address Encoding Types". The content of the registry stays exactly the same, just with a new name πŸŽ€ The encoding type used for Join attributes is still limited to use in Join/Prune messages, though. And since Join attributes also apply to pruned sources in a Join/Prune message, the doc says the "more correct name" "Join/Prune attributes" is used from here on, so that's what you'll see πŸ¦‹

What's new is that this doc lets Join/Prune attributes be specified in the Upstream Neighbor Address field and in the Multicast Group Address field of a Join/Prune message. It defines how that's used to specify the same Join/Prune attribute and value for multiple sources. It also defines a brand-new Hello Option to indicate support for the hierarchical encoding πŸ’œ

2. Requirements Notation ✨

the key-word section, so pay attention bestie πŸ‘€ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC2119]. Those capitalised words are the official BCP 14 vibes, so treat them with respect 🫢

3. Hierarchical Join/Prune Attribute Definition 🌈

okay, the main event πŸ”₯ First, here's the format of a PIM Join/Prune message, which is defined in [RFC7761]:

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |PIM Ver| Type  |   Reserved    |           Checksum            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |        Upstream Neighbor Address (Encoded-Unicast format)     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Reserved     | Num groups    |          Holdtime             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |         Multicast Group Address 1 (Encoded-Group format)      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   Number of Joined Sources    |   Number of Pruned Sources    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |        Joined Source Address 1 (Encoded-Source format)        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             .                                 |
   |                             .                                 |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |        Joined Source Address n (Encoded-Source format)        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |        Pruned Source Address 1 (Encoded-Source format)        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             .                                 |
   |                             .                                 |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |        Pruned Source Address n (Encoded-Source format)        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           .                                   |
   |                           .                                   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |         Multicast Group Address m (Encoded-Group format)      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   Number of Joined Sources    |   Number of Pruned Sources    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |        Joined Source Address 1 (Encoded-Source format)        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             .                                 |
   |                             .                                 |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |        Joined Source Address n (Encoded-Source format)        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |        Pruned Source Address 1 (Encoded-Source format)        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             .                                 |
   |                             .                                 |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |        Pruned Source Address n (Encoded-Source format)        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

so the message has one Upstream Neighbor Address and one or more group sets 🧁 Each group set holds a Group Address plus two source lists: the Joined Sources and the Pruned Sources. The Upstream Neighbor Address, the group addresses, and the source addresses are encoded in Encoded-Unicast format, Encoded-Group format, and Encoded-Source format, respectively. This doc extends the source address encoding from [RFC5384] so it also applies to the Upstream Neighbor Address and the Group Address fields (see Section 4) πŸ’–

now the hierarchy, which is the whole point ✨ For a Join/Prune message, there are three levels of attributes. The highest level is the least specific, and it applies to every source in the message. Those get encoded in the Upstream Neighbor Address. Next, the middle level applies to every source in a group set, and those get encoded in a Group Address. Finally, there are attributes that apply to a single source, and those are encoded in the source address as defined in [RFC5384] πŸŽ€

the full set of attributes for a given source is built by combining the message-wide attributes, the attributes of the group set that source belongs to, and the source-specific attributes. But if the same attribute shows up at multiple levels, the one at the most specific level wins and overrides the others πŸ‘‘ The set of attributes and their values is formed before the attributes get processed. So a value that's invalid for a given type might override a valid value from a higher level. Yikes, but that's just how it works πŸ™ˆ

here's the example from the doc, and it's a lot, so let's go slow 🧚 Say that for a given source, we have attributes T_1 with value V_1, T_2 with value V_2, and T_3 with value V_3. Also, in the Group Address of that source's group set, we have T_1 with value V_6 and T_4 with value V_4. And in the Upstream Neighbor Address, we've encoded T_1 with value V_7, T_4 with value V_8, and T_5 with value V_5. The attributes that apply to the source end up as T_1 with V_1, T_2 with V_2, T_3 with V_3, T_4 with V_4, and T_5 with V_5. T_1 has a different value at each level, so the source-level value (V_1) wins. T_4 has different values at the group and message levels, so the group-level value (V_4) wins. Also, V_1 might not even be a valid value for T_1, but it still overrides the higher levels, because attributes don't get processed until after the set is formed 🌸

last thing, and it's important πŸ’… Join/Prune attributes still get applied to sources exactly as specified in [RFC5384]. This doc doesn't change what any attribute means. It's just a more compact way to encode an attribute when the same attribute and value applies to multiple sources. Like in the example above, you'd get the exact same meaning if you'd encoded all of T1, ..., T5 with the respective values V1, ..., V5 directly in the source address. Same vibe, way less repeating 🫢


more of this RFC is coming in part 2 πŸ¦‹ keep your eyes peeled, bestie πŸ’œ

4. PIM Address Encoding Types πŸ’–

okay so addresses in PIM messages come with an address family AND an encoding type, bestie πŸŽ€ this applies to Encoded-Unicast, Encoded-Group, and Encoded-Source addresses ✨ the encoding type tells you how the address is packed up, and it does that no matter what kind of address it is (Encoded-Unicast, Encoded-Group, or Encoded-Source) πŸ’… future encoding types might not work for every address type tho, so keep that in mind 🧚

as things stand, 0 means native encoding [RFC7761], and 1 means Join/Prune attributes encoding [RFC5384] πŸ¦‹ and lowkey this is important: as [RFC5384] says, a type 1 Encoded Address MUST contain at least one Join/Prune attribute πŸ”₯

Wait, I need to be precise here. The original says "MUST" in capitals, so I'll keep it exactly as written:

okay so addresses in PIM messages come with an address family AND an encoding type, bestie πŸŽ€ this applies to Encoded-Unicast, Encoded-Group, and Encoded-Source addresses ✨ the encoding type tells you how the address is packed up, no matter what kind of address it is πŸ’… future encoding types might not apply to every address type though 🧚

as things stand, 0 is native encoding [RFC7761], and 1 is Join/Prune attributes encoding [RFC5384] πŸ¦‹ and this part is literally the key: as [RFC5384] specifies, a type 1 Encoded Address MUST contain at least one Join/Prune attribute πŸ”₯

5. Hierarchical Join/Prune Attribute Hello Option 🌸

ok so a PIM router says "hey, I support this mechanism" by including the Hierarchical Join/Prune Attribute Hello Option in its PIM Hello message 🫢 when this new Hello Option shows up, it MUST also include the Join Attribute Hello Option from [RFC5384] ✨ the format looks like this:

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |        OptionType = 36        |       OptionLength = 0        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

so it's OptionType = 36 and OptionLength = 0 πŸ“ no option value gets included, just the header, no cap πŸ™ˆ

now the big rule 😭 a PIM router MUST NOT send a Join/Prune message with Join/Prune attributes encoded in the Upstream Neighbor Address or any of the group addresses out of any interface where there's a PIM neighbor that hasn't included this option in its Hellos πŸ’€ and even a router that is NOT the upstream neighbor still has to be able to parse the message, bc that's how it does Join suppression and Prune override πŸ‘‘


6. Security Considerations πŸ”

okay the security part is lowkey simple but it's giving important πŸ’œ this document is about a more compact encoding of Join/Prune attributes ✨ using this encoding has no impact on security, except for whatever comes from using the encoding in [RFC5384] πŸ¦‹ for example, a forged message with certain attribute values is just as hard to pull off no matter which encoding you use 🧚 if an attribute that applies to the whole message is wrong, that could cause a problem for ALL the sources in the message 😭 but without this encoding you'd have to put that attribute on every single source, and that would ALSO cause a problem for all the sources in the message πŸ’€


7. IANA Considerations πŸŽ€

IANA renamed the "PIM Encoded-Source Address Encoding Type Field" registry to "PIM Address Encoding Types" 🌈

The Hierarchical Join/Prune Attribute (36) got added to the "PIM-Hello Options" registry πŸ’…


8. Normative References πŸ“š

[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997, <http://www.rfc-editor.org/info/rfc2119>.

[RFC5384] Boers, A., Wijnands, I., and E. Rosen, "The Protocol Independent Multicast (PIM) Join Attribute Format", RFC 5384, DOI 10.17487/RFC5384, November 2008, <http://www.rfc-editor.org/info/rfc5384>.

[RFC7761] Fenner, B., Handley, M., Holbrook, H., Kouvelas, I., Parekh, R., Zhang, Z., and L. Zheng, "Protocol Independent Multicast - Sparse Mode (PIM-SM): Protocol Specification (Revised)", STD 83, RFC 7761, DOI 10.17487/RFC7761, March 2016, <http://www.rfc-editor.org/info/rfc7761>.


Authors' Addresses ✨

Stig Venaas
Cisco Systems
Tasman Drive
San Jose, CA  95134
United States

Email: stig@cisco.com


Jesus Arango
Cisco Systems
Tasman Drive
San Jose, CA  95134
United States

Email: jearango@cisco.com


Isidor Kouvelas
Arista Networks
5453 Great America Parkway
Santa Clara, CA  95054
United States

Email: kouvelas@arista.com
πŸ“¦ where this page comes from