RFC 7311
The Accumulated IGP Metric Attribute for BGP
Part 1 of 3 ๐
RFC 7311: The Accumulated IGP Metric Attribute for BGP ๐
okay bestie, the title block first โจ This is an IETF doc (Internet Engineering Task Force) and it's RFC 7311. The authors are P. Mohapatra (Sproute Networks), R. Fernando, E. Rosen and J. Uttaro (the last two from Cisco Systems, Inc. and AT&T). It's a Standards Track doc, the ISSN is 2070-1721, and it's dated August 2014 ๐
. The title block doesn't list anything it obsoletes or updates ๐
Abstract
okay so IGPs (the routing protocols that run inside one administrative domain) usually give every link a metric ๐ฅ then pick the path where the total of those metrics is the smallest. BGP is built for lots of separate admin domains (autonomous systems), so it doesn't pick paths with a metric at all ๐ Doing that across the whole internet would be a scaling nightmare and a coordination nightmare, which everybody already knows ๐
BUT some networks are run by one admin across a bunch of contiguous BGP networks. In that case it can be really nice for BGP to pick paths by metric, just like an IGP would. This document is the spec for doing exactly that ๐ฆ
Status of This Memo
this is an Internet Standards Track document ๐ธ
it's a product of the Internet Engineering Task Force (IETF) and it represents the consensus of the IETF community. it got public review and was approved for publication by the Internet Engineering Steering Group (IESG). more info on Internet Standards is in Section 2 of RFC 5741 ๐
for the current status, any errata, and how to give feedback, check http://www.rfc-editor.org/info/rfc7311 ๐ซถ
Copyright Notice
Copyright (c) 2014 IETF Trust and the persons identified as the document authors. All rights reserved. ๐
this doc 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, bestie, they describe your rights and restrictions ๐ Code Components pulled out of this doc 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. Specification of Requirements ...................................4
3. AIGP Attribute ..................................................4
3.1. Applicability Restrictions and Cautions ....................6
3.2. Handling a Malformed AIGP Attribute ........................6
3.3. Restrictions on Sending/Receiving ..........................6
3.4. Creating and Modifying the AIGP Attribute ..................7
3.4.1. Originating the AIGP Attribute ......................7
3.4.2. Modifications by the Originator .....................8
3.4.3. Modifications by a Non-Originator ...................8
4. Decision Process ...............................................10
4.1. When a Route Has an AIGP Attribute ........................11
4.2. When the Route to the Next Hop Has an AIGP Attribute ......11
5. Deployment Considerations ......................................12
6. IANA Considerations ............................................13
7. Security Considerations ........................................13
8. Acknowledgments ................................................13
9. References .....................................................14
9.1. Normative Reference .......................................14
9.2. Informative References ....................................14
1. Introduction โจ
so there are a TON of routing protocols built to run inside one administrative domain. they're called "Interior Gateway Protocols" (IGPs) ๐ง Usually each link gets a "metric" value. The "distance" between two nodes is the sum of the metrics of all the links on that path. An IGP picks the "shortest" path (the minimal distance) between any two nodes ๐ฃ๏ธ That might be limited a bit: if the IGP has multiple "areas", it may prefer the shortest path inside an area over a path that crosses more than one area. And usually the admin's routing policy can be roughly approximated by picking shortest paths like this ๐
BGP is different ๐ It was designed to run over an arbitrarily large number of administrative domains ("autonomous systems" or "ASes") with limited coordination between the admins. BGP does NOT make path decisions based on a metric. There's no such thing as an "inter-AS metric" ๐ There are two big reasons:
- The distance between two nodes in one admin domain can change at any moment because of events in that domain. Those changes don't get broadcast around the internet unless they actually make the domain's border routers pick routes with different BGP attributes for some set of address prefixes. This follows a core scaling principle: changes with only local significance must not have global effects ๐ If local distance changes were always propagated around the internet, that principle would get broken ๐
- A basic rule of inter-domain routing is that each admin domain can have its own policies. Those policies don't have to be revealed to other domains, and other domains definitely don't have to agree to them ๐ค But using an inter-AS metric on the internet would have exactly those effects, so it's a no-go ๐ซ
okay but here's the twist ๐ฆ There ARE deployments where one admin runs a network that's been split into multiple contiguous ASes, each running BGP. (These ASes aren't really autonomous in this case, lol.) There are a few reasons a single admin domain might get chopped up like that: the existing IGPs might not scale well in that environment, a more generalized topology might be wanted than one IGP domain can give, or a more finely grained routing policy might be wanted than an IGP can support ๐ In those deployments, it can be really useful to let BGP make its routing decisions based on the IGP metric. That way BGP picks the shortest path between two nodes, even when those nodes sit in two different ASes inside the same admin domain ๐
some implementations already kind of do this ๐ They use BGP's MULTI_EXIT_DISC (MED) attribute to carry a value based on IGP metrics. BUT that doesn't really give you IGP-like shortest path routing, because the BGP decision process gives priority to other factors, like AS_PATH length ๐ญ Also, the standard procedures for using the MED don't make sure the IGP metric is properly accumulated so that it covers all the links along the path โ
so in THIS document, we define a new optional, non-transitive BGP attribute called the "Accumulated IGP Metric Attribute", or "AIGP attribute", and we specify the procedures for using it ๐
the specified procedures stop the AIGP attribute from "leaking out" past an administrative domain boundary into the Internet ๐งฑ We'll refer to the set of ASes in a common administrative domain as an "AIGP administrative domain" ๐ฐ
the procedures also make sure the value in the AIGP attribute has been accumulated all along the path from the destination. In other words, the AIGP attribute does NOT show up when there are "gaps" along the path where the IGP metric is unknown ๐ต๏ธโโ๏ธ
2. Specification of Requirements ๐
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]. So these words carry the same meaning here as in that reference ๐
3. AIGP Attribute ๐
the AIGP attribute is an optional, non-transitive BGP path attribute ๐ฆ Its attribute type code is 26 โจ
the value field of the AIGP attribute is defined here as a set of elements encoded as "Type/Length/Value" (so, a set of TLVs) ๐ง Each TLV is encoded like this (Figure 1):
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Length | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |
~ ~
| Value |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+..........................
Figure 1: AIGP TLV
quick breakdown of the TLV bits ๐
- Type: a single octet encoding the TLV Type. Only type 1, "AIGP TLV", is defined in this document. Using other TLV types is outside the scope of this doc ๐ โโ๏ธ
- Length: two octets encoding the length in octets of the TLV, including the Type and Length fields. The length is an unsigned binary integer. (Note that the minimum length is 3, meaning no Value field is present.) ๐งฎ
- Value: a field with zero or more octets ๐ซง
this doc defines only ONE TLV, the "AIGP TLV" ๐ It's encoded like this:
- Type:
1 - Length:
11 - Value: Accumulated IGP Metric.
the Value field of the AIGP TLV is always 8 octets long, and it's interpreted as an unsigned 64-bit integer ๐ข IGP metrics are often 4-octet values, so by using an 8-octet field, we make sure the AIGP attribute can hold the sum of an arbitrary number of 4-octet values. That's giving scalability ๐
when an AIGP attribute is created, it SHOULD contain no more than one AIGP TLV ๐ BUT if it has more than one, only the FIRST one gets used (as described in Sections 3.4 and 4). In the rest of this doc, "value of the AIGP TLV" means the value of the first AIGP TLV in the AIGP attribute. Any other AIGP TLVs in the attribute MUST be passed along unchanged whenever the AIGP attribute is passed along ๐ซถ
3.1. Applicability Restrictions and Cautions ๐ง
this doc only considers the AIGP attribute in networks where each router uses some kind of tunneling to deliver a packet to its BGP next hop. Using the AIGP attribute in other scenarios is outside the scope of this doc ๐
and a heads up, bestie โ ๏ธ If a Route Reflector supports the AIGP attribute but some of its clients don't, the routing choices that result may not all reflect the intended routing policy ๐ฌ
that's part 1 done ๐ธ part 2 is coming next, so stay tuned, bestie ๐
3.2. Handling a Malformed AIGP Attribute โจ
Okay bestie, so when a BGP Update message shows up with a malformed AIGP attribute, that attribute MUST be treated exactly as if it were an unrecognized non-transitive attribute. Basically it "MUST be quietly ignored and not passed along to other BGP peers" (see [BGP], Section 5). This is the same thing as the "attribute discard" action in [BGP-ERROR] ๐
Note that an AIGP attribute MUST NOT be considered malformed just because it has more than one TLV of a given type, or because it has TLVs of unknown types. Not me judging ๐
If a BGP path attribute has the AIGP attribute codepoint but ALSO has the transitive bit set, it MUST be considered a malformed AIGP attribute and MUST be discarded as this section describes. ๐ซ
If an AIGP attribute comes in and its first AIGP TLV holds the max value 0xffffffffffffffff, it SHOULD be considered malformed and SHOULD be discarded the way this section lays out. (The TLV value can't go any higher, so it's not useful for metric-based path selection ๐)
3.3. Restrictions on Sending/Receiving ๐ฆ
An implementation that supports the AIGP attribute MUST support a per-session configuration item, AIGP_SESSION, that says whether the attribute is enabled or disabled for use on that session.
- For Internal BGP (IBGP) sessions, and for External BGP (EBGP) sessions between members of the same BGP Confederation [BGP-CONFED], the default value of
AIGP_SESSIONSHOULD be "enabled". - For all other External BGP (EBGP) sessions, the default value of
AIGP_SESSIONMUST be "disabled".
The AIGP attribute MUST NOT be sent on any BGP session where AIGP_SESSION is disabled. ๐
โโ๏ธ
If an AIGP attribute is received on a BGP session where AIGP_SESSION is disabled, it MUST be treated exactly as if it were an unrecognized non-transitive attribute. So again, it "MUST be quietly ignored and not passed along to other BGP peers" (see [BGP], Section 5). However, the fact that it showed up SHOULD be logged (in a rate-limited manner) ๐
3.4. Creating and Modifying the AIGP Attribute ๐ธ
3.4.1. Originating the AIGP Attribute
An implementation that supports the AIGP attribute MUST support a configuration item, AIGP_ORIGINATE, that turns its creation and attachment to routes on or off. The default value of AIGP_ORIGINATE MUST be "disabled". ๐
A BGP speaker MUST NOT add the AIGP attribute to any route whose path leads outside the AIGP administrative domain it belongs to. When the AIGP attribute is in use, changes in IGP routing directly impact BGP routing. Attaching it to customer routes, Internet routes, or other routes whose paths lead outside the infrastructure of a particular AIGP administrative domain could cause BGP scaling and/or thrashing problems. It's giving chaos ngl ๐ญ
The AIGP attribute may be added only to routes that meet one of these conditions:
- The route is a static route, not leading outside the AIGP administrative domain, that is being redistributed into BGP;
- The route is an IGP route that is being redistributed into BGP;
- The route is an IBGP-learned route whose
AS_PATHattribute is empty; or - The route is an EBGP-learned route whose
AS_PATHcontains only ASes that are in the same AIGP administrative domain as the BGP speaker.
A BGP speaker R MUST NOT add the AIGP attribute to any route for which R does not set itself as the next hop. ๐ง
It SHOULD be possible to set AIGP_ORIGINATE to "enabled for the routes of a particular IGP that are redistributed into BGP" (where "a particular IGP" might be OSPF or IS-IS). Other policies that decide when and whether to originate an AIGP attribute are also possible, depending on what a particular deployment scenario needs. โจ
When originating an AIGP attribute for a BGP route to address prefix P, the value of the AIGP TLV is set according to policy. There are a bunch of useful policies, and some of them are in the list below:
- When a BGP speaker R is redistributing an IGP route to address prefix P into BGP, the IGP will have computed a distance from R to P. This distance MAY be assigned as the value of the AIGP TLV.
- A BGP speaker R may be redistributing a static route to address prefix P into BGP, for which a distance from R to P has been configured. This distance MAY be assigned as the value of the AIGP TLV.
- A BGP speaker R may have received and installed a BGP-learned route to prefix P, with next hop N. Or it may be redistributing a static route to P, with next hop N. Then:
- If R has an IGP route to N, the IGP-computed distance from R to N MAY be used as the value of the AIGP TLV of the route to P.
- If R has a BGP route to N, and an AIGP TLV attribute value has been computed for that route (see Section 3.4.3), that value MAY be used as the AIGP TLV value of the route to P.
3.4.2. Modifications by the Originator
If BGP speaker R is the originator of the AIGP attribute of prefix P, and the distance from R to P changes at some point, R SHOULD issue a new BGP update containing the new value of the AIGP TLV of the AIGP attribute. (Here "distance" just means whatever value the originator assigns to the AIGP TLV, however it's computed; see Section 3.4.1.) However, if the difference between the new distance and the distance advertised in the AIGP TLV is less than a configurable threshold, the update MAY be suppressed. ๐
3.4.3. Modifications by a Non-Originator
Picture this: a BGP speaker R1 receives a route with an AIGP attribute whose value is A and whose next hop is R2. Say R1 is about to redistribute that route on a BGP session that is enabled for sending/receiving the attribute. ๐
If R1 does not change the next hop of the route, then R1 MUST NOT change the AIGP attribute value of the route. ๐
In all the computations discussed in this section, the AIGP value MUST be capped at its maximum unsigned value 0xffffffffffffffff. Increasing the AIGP value MUST NOT cause the value to wrap around. No wrapping allowed, periodt ๐
Suppose R1 changes the next hop of the route from R2 to R1. If R1's route to R2 is either (a) an IGP-learned route or (b) a static route that does not require recursive next hop resolution, then R1 MUST increase the value of the AIGP TLV by adding to A the distance from R1 to R2. This distance is either the IGP-computed distance from R1 to R2 or some value determined by policy. However, A MUST be increased by a non-zero amount. โ
It's possible that R1 and R2 above are EBGP neighbors and that there is a direct link between them on which no IGP is running. Then, when R1 changes the next hop of a route from R2 to R1, the AIGP TLV value MUST be increased by a non-zero amount. The amount of the increase SHOULD be such that it is properly comparable to the IGP metrics. For example, if the IGP metric is a function of latency, then the amount of the increase should be a function of the latency from R1 to R2. ๐
Suppose R1 changes the next hop of the route from R2 to R1 and R1's route to R2 is either (a) a BGP-learned route or (b) a static route that requires recursive next-hop resolution. Then, the AIGP TLV value needs to be increased in several steps, following the procedure below. (Note that this procedure is ONLY used when recursive next-hop resolution is needed.) ๐ง
- Let
Xattrbe the new AIGP TLV value. - Initialize
Xattrto A. - Set
XNHto R2. - Find the route to
XNH. - If the route to
XNHdoes not require recursive next-hop resolution, get the distanceDfrom R1 toXNH. (Note that this condition cannot be satisfied the first time through this procedure.) IfDis above a configurable threshold, set the AIGP TLV value toXattr+D. IfDis below a configurable threshold, set the AIGP TLV value toXattr. In either case, exit this procedure. - If the route to
XNHis a BGP-learned route that does NOT have an AIGP attribute, then exit this procedure and do not pass on any AIGP attribute. If the route has an AIGP attribute without an AIGP TLV, then the AIGP attribute MAY be passed along unchanged. - If the route to
XNHis a BGP-learned route that has an AIGP TLV value ofY, then setXattrtoXattr+Yand setXNHto the next hop of this route. (The intention here is thatYis the AIGP TLV value of the route as it was received by R1, without having been modified by R1.) - Go to step 4.
The AIGP TLV value of a given route depends on (a) the AIGP TLV values of all the next hops that are recursively resolved during this procedure, and (b) the IGP distance to any next hop that is not recursively resolved. Any change due to (a) in any of these values MUST trigger a new AIGP computation for that route. Whether a change due to (b) triggers a new AIGP computation depends on whether the change in IGP distance exceeds a configurable threshold. ๐
If the AIGP attribute is carried across several ASes, each with its own IGP domain, it is clear that these procedures are unlikely to give a sensible result if the IGPs are different (e.g., some OSPF and some IS-IS), or if the meaning of the metrics is different in the different IGPs (e.g., if the metric represents bandwidth in some IGP domains but represents latency in others). These procedures also are unlikely to give a sensible result if the metric assigned to inter-AS BGP links (on which no IGP runs) or to static routes is not comparable to the IGP metrics. All such cases are outside the scope of the current document. ๐
4. Decision Process ๐ฅ
Support for the AIGP attribute involves several modifications to the tie-breaking procedures of the BGP "phase 2" decision described in [BGP], Section 9.1.2.2. These modifications are described in Sections 4.1 and 4.2.
In some cases, the BGP decision process may install a route without executing any tie-breaking procedures. This may happen, e.g., if only one route to a given prefix has the highest degree of preference (as defined in [BGP], Section 9.1.1). In this case, the AIGP attribute is not considered. ๐
In other cases, some routes may be eliminated before the tie-breaking procedures are invoked, e.g., routes with AS-PATH attributes indicating a loop or routes with unresolvable next hops. In these cases, the AIGP attributes of the eliminated routes are not considered. ๐๏ธ
4.1. When a Route Has an AIGP Attribute ๐
Assuming that the BGP decision process invokes the tie-breaking procedures, the procedures in this section MUST be executed BEFORE any of the tie-breaking procedures described in [BGP], Section 9.1.2.2 are executed. Order matters, bestie ๐
If any routes have an AIGP attribute containing an AIGP TLV, remove from consideration all routes that do not have an AIGP attribute containing an AIGP TLV. ๐งน
If router R is considering route T, where T has an AIGP attribute with an AIGP TLV:
- then R must compute the value A, defined as follows: set A to the sum of (a) T's AIGP TLV value and (b) the IGP distance from R to T's next hop.
- remove from consideration all routes that are not tied for the lowest value of A.
4.2. When the Route to the Next Hop Has an AIGP Attribute ๐
okay so, say a router R1 is comparing two BGP-learned routes, and either:
- the two routes have equal AIGP TLV values, or else
- neither of the two routes has an AIGP attribute containing an AIGP TLV.
๐ the BGP decision process from [BGP] uses something called "interior cost" in its tie-breaking. here's the definition:
interior cost of a route is determined by calculating the metric
to the NEXT_HOP for the route using the Routing Table.
โจ this doc swaps that "interior cost" tie breaker out for a new one based on the "AIGP-enhanced interior cost". ๐ฆ say route T has a next hop of N. the "AIGP-enhanced interior cost" from R1 to N works like this:
- let R2 be the BGP next hop of the route to N once all the recursive next-hop resolution is done. let m be the IGP distance from R1 to R2 (or, if it's a static route, the configured distance).
- if the installed route to N has an AIGP attribute with an AIGP TLV, set A to its AIGP TLV value, computed using the procedure in Section 3.4.3. ๐
- if the installed route to N does not have an AIGP attribute with an AIGP TLV, set A to 0.
- the "AIGP-enhanced interior cost" of route T is the quantity A+m. ๐ธ
then the "interior cost" tie breaker from [BGP] runs again, just using the "AIGP-enhanced interior cost" instead of the regular "interior cost". it's giving continuity ๐
5. Deployment Considerations ๐ง
okay, deployment talk, bestie ๐ซถ
- using the AIGP attribute to get the routing policy you want works way better if each BGP speaker can use it to pick between multiple routes. so it is highly recommended that the procedures of [BESTEXT] and [ADD-PATH] be used together with the AIGP attribute. main character energy ๐
- if a Route Reflector doesn't pass all paths on to its clients, it'll tend to pass along the paths where the IGP distance from the Route Reflector itself to the next hop is smallest. this can lead to a non-optimal choice by the clients. ๐ญ
- once the procedures of this document are deployed, you have to understand that frequent changes in the IGP distance toward a certain prefix may cause just as frequent transmission of BGP updates about that prefix. ๐ฅ
- in an IGP deployment, there are some situations where a network link gets temporarily assigned a metric equal to the maximum metric value for that IGP (or close to it). this is called "costing out" the link. ๐ a link can be "costed out" to deflect traffic away from it before it's actually brought down, or to discourage traffic from using it until all the necessary state for that link is set up (e.g., [LDP-IGP-SYNC]). this assumes, of course, that a path containing a "costed out" link has a total distance larger than any alternate path within the same IGP area. if that's true, the normal IGP decision process will pick the path that doesn't contain the "costed out" link. โจ
costing out a link has the same effect on BGP routes that carry the AIGP attribute ๐ฆ. the AIGP TLV value will be larger for a route (to a given prefix) that contains a "costed out" link than for a route (to the same prefix) that doesn't. but here's the tea: a route that carries an AIGP attribute will be preferred over a route that doesn't, no matter what the AIGP TLV value is. ๐ it's kind of like an OSPF area, where an intra-area route is preferred over an inter-area or external route, even if the intra-area route's distance is large. iykyk ๐
6. IANA Considerations ๐
IANA has assigned the codepoint 26 in the "BGP Path Attributes" registry to the AIGP attribute. ๐
IANA has also created a registry for "BGP AIGP Attribute Types". the Type field is a single octet, with possible values from 1 to 255. (the value 0 is "Reserved".) the registration procedure for this registry is "Standards Action". Type 1 is defined as "AIGP" and refers to this document. ๐
7. Security Considerations ๐
โ ๏ธ okay this section is serious, bestie, so read it closely ๐ญ
the spurious introduction of an AIGP attribute, whether by error or by malfeasance, could result in the selection of paths other than the ones you actually want. ๐
improper configuration on both ends of an EBGP connection could result in an AIGP attribute being passed from one service provider to another. this would likely result in an unsound selection of paths. ๐
8. Acknowledgments ๐ซถ
the authors would like to thank Waqas Alam, Rajiv Asati, Alia Atlas, Ron Bonica, Bruno Decraene, Brian Dickson, Clarence Filsfils, Sue Hares, Anoop Kapoor, Pratima Kini, Thomas Mangin, Robert Raszuk, Yakov Rekhter, Eric Rosenberg, Samir Saad, John Scudder, Shyam Sethuram, and Ilya Varlashkin for their input. ๐ the whole squad is iconic ๐
9. References ๐
9.1. Normative Reference
[BGP] Rekhter, Y., Ed., Li, T., Ed., and S. Hares, Ed., "A
Border Gateway Protocol 4 (BGP-4)", RFC 4271, January
2006.
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
Requirement Levels", BCP 14, RFC 2119, March 1997.
9.2. Informative References
[ADD-PATH] Walton, D., Retana, A., Chen, E., and J. Scudder,
"Advertisement of Multiple Paths in BGP", Work in
Progress, October 2013.
[BESTEXT] Marques, P., Fernando, R., Mohapatra, P., and H.
Gredler, "Advertisement of the best external route in
BGP", Work in Progress, January 2012.
[BGP-CONFED] Traina, P., McPherson, D., and J. Scudder, "Autonomous
System Confederations for BGP", RFC 5065, August 2007.
[BGP-ERROR] Chen, E., Scudder, J., Mohapatra, P., and K. Patel,
"Revised Error Handling for BGP UPDATE Messages", Work
in Progress, June 2014.
[LDP-IGP-SYNC] Jork, M., Atlas, A., and L. Fang, "LDP IGP
Synchronization", RFC 5443, March 2009.
Authors' Addresses ๐
Pradosh Mohapatra
Sproute Networks
EMail: mpradosh@yahoo.com
Rex Fernando
Cisco Systems, Inc.
170 Tasman Drive
San Jose, CA 95134
US
EMail: rex@cisco.com
Eric C. Rosen
Cisco Systems, Inc.
1414 Massachusetts Avenue
Boxborough, MA, 01719
US
EMail: erosen@cisco.com
James Uttaro
AT&T
200 S. Laurel Avenue
Middletown, NJ 07748
US
EMail: uttaro@att.com
๐ฆ where this page comes from
- ietf: rfc7311 2014-08
- ๐ girlified by claude-haiku-5-5 on : a language model's rewrite of the original, under its terms