RFC 1622

Pip Header Processing

๐Ÿ“… published May 1994, from ietf

Part 1 of 4 ๐ŸŽ€

RFC 1622 ๐Ÿ’– is called Pip Header Processing, and it's by P. Francis from NTT ๐Ÿ’…. It's dated May 1994 and filed as Informational ๐Ÿ“„. The title block doesn't list any RFCs that it obsoletes or updates, so there's nothing to track there โœจ.

Status of this Memo ๐Ÿ“œ

Okay bestie, first things first ๐Ÿซถ. This memo is here to give info to the Internet community. It is NOT a standard of any kind, and it's totally fine to share it around, since distribution is unlimited ๐ŸŒˆ.

Preamble ๐Ÿฆ‹

So in 1992 and 1993, a protocol called Pip, which came out of Bellcore, was one of the contenders to replace IP ๐Ÿ‘€. Then in mid 1993 Pip got merged with another contender, the Simple Internet Protocol (SIP), and the result was SIPP (SIP Plus) ๐Ÿค. Pip's big ideas, like keeping identifier and address separate, and using source routing to get really fancy routing, made it into SIPP. But a lot of other Pip ideas did not ๐Ÿ˜ญ. This RFC and its companion, "Pip Near-term Architecture," exist to write down all of Pip's ideas, the good ones and the messy ones ๐Ÿ“.

The rest of this document is copied word for word from the Pip draft memo with the same title, which was around when the Pip project wrapped up ๐ŸŒธ. So if anything says Pip is meant to replace IP, just ignore it, because that part is outdated ๐Ÿ™ˆ.

Abstract โœจ

Pip is an internet protocol that was meant to replace IP version 4 ๐Ÿ’œ. It's general purpose, built to handle every foreseeable internet protocol need ๐ŸŒ. This spec defines how Routers and Hosts process Pip headers ๐Ÿ”ฅ.

Acknowledgements ๐Ÿซถ

Okay, big shoutouts ๐Ÿ“ฃ to Rob Coltun, Steve Deering, Ramesh Govindan, Joel Halpern, John Ioannidis, Chris Petrilli, Bob Smart, and Zheng Wang, who each got an individual thank you ๐Ÿ’–. The author also thanks the many people in the Pip working group who helped build Pip ๐Ÿงš. And last but not least, the SIP protocol, or more accurately the people behind SIP, for some really good ideas ๐Ÿ’….

Conventions ๐ŸŽ€

Everything in this specification is mandatory, no cap ๐Ÿ”ฅ.

1. Introduction ๐ŸŒธ

Pip is an internet protocol that was meant to replace IP version 4 ๐Ÿ‘‘. It's general purpose, designed to handle every foreseeable internet protocol requirement, and this spec defines how Routers and Hosts process the Pip header โœจ.

Pip's design is fundamentally different from earlier internetwork protocols, and it's giving main character energy ๐Ÿ’…. The goal was to be as general as possible without seriously sacrificing performance ๐Ÿš€. Because it's so general, it can handle the routing and addressing needs we can see coming, and the hope is that it can handle most, if not all, of the ones we can't see yet ๐Ÿ”ฎ.

There are tons of detailed parts that make Pip this flexible, and they aren't covered here ๐Ÿ™ˆ. But one big thing is worth mentioning: Pip tries to strip as much "functional semantics" out of the base spec as it can ๐Ÿง . Pip defines a packet header and forwarding rules that can carry lots of different functional semantics, like routing, addressing, and flow paradigms ๐Ÿฆ‹. So you'll probably end up asking yourself "But how do you do foo with Pip?" ๐Ÿ˜ญ The answers to those questions live in companion documents, not in the base spec ๐Ÿ“š.

Think of Pip as a way to trigger actions in hosts and routers, the same way machine language triggers actions in CPUs ๐Ÿ’ป. Machine language has no functional semantics of its own beyond the actions it triggers, like moving a register or writing to a memory location ๐Ÿงš. But it's a super powerful tool that higher-level functional semantics get built on top of. Pip works the same way for routing, addressing, and flow functions ๐Ÿ’œ.

2. Pip Specification ๐Ÿ’–

Okay so the Pip header has three parts: the Initial Part, the Transit Part, and the Options Part ๐ŸŽ€.

        +===========================+
        |       Initial Part        |
        +===========================+
        |       Transit Part        |
        +===========================+
        |       Options Part        |
        +===========================+
        |                           |
        |         Payload           |
        |                           |

Each part starts on a 32-bit boundary (you can spot those in the double lines above), and the Transit Part starts on a 64 bit boundary ๐Ÿ“โœจ.

Tunneling is literally built into Pip, it's not an add-on ๐ŸŒˆ. Pip does it by wrapping the Transit Part of the Pip header inside another Transit Part ๐ŸŽ. So when you tunnel, you get one Transit Part for each nested tunnel ๐Ÿช†:

        +===========================+
        |       Initial Part        |
        +===========================+
        |       Transit Part        |
        +===========================+
        |       Transit Part        |
        +===========================+
                    .
                    .
                    .
        +===========================+
        |       Transit Part        |
        +===========================+
        |       Options Part        |
        +===========================+

And this is the best part ๐Ÿฅน: each Transit Part only carries what routers need for forwarding and handling, so tunneling stays pretty efficient when it comes to packet size ๐Ÿฆ‹๐Ÿ’….

2.1. Initial Part โœจ

okay so the Initial Part is the first chunk of the Pip header, and it's laid out like this ๐Ÿ’…

                                         length, in bits
           +===========================+
           |    Version Number = 8     |     4
           +---------------------------+
           |       Sub-Version         |     4
           +---------------------------+
           |      Options Offset       |     8
           +---------------------------+
           |     Options Contents      |     8
           +---------------------------+
           |     Options Present       |     8
           +===========================+
           |       Packet SubID        |     16
           +---------------------------+
           |         Protocol          |     16
           +===========================+
           |         Dest ID           |     64
           +===========================+
           |        Source ID          |     64
           +===========================+
           |      Payload Length       |     32
           +===========================+
           |       Host Version        |     8
           +---------------------------+
           |      Payload Offset       |     8
           +---------------------------+
           |        Hop Count          |     16
           +===========================+

Figure 1: Initial Part

An explanation of each field follows. ๐Ÿซถ

2.1.1. Version Numbers ๐ŸŒธ

okay so the first octet is split into two 4-bit fields, the Version and the Sub-Version. The Version field is set to 8, and it's meant to be version 8 of IP. (As of this writing, this is an experimental number assigned for development of Pip.) Which means all encapsulation schemes defined for IP can work for Pip as well ๐Ÿฆ‹

As long as the Version field is 8, the Initial Part and Options Part of the Pip Header is as specified in this standard. (In other words, the Sub-Version field refers only to the Transit Part.) By doing this, we let the Transit Part of the Pip Header change completely without necessarily requiring a host to understand the new Transit Part. ๐Ÿงš If a host receives a Pip header with a Version number of 8 and an unknown Sub-version number, the host does not try to parse the Transit Part at all. Instead it processes only the Initial Part and the Options Part. (By using the Pip Header Protocol to format Pip Headers, a host can be made to formulate the right Transit Part, even though the host doesn't understand the semantics of the Transit Part. This allows radical migration of the Transit Part while potentially not requiring changes to hosts.) it's giving main character energy ๐Ÿ’–

If a host or a router receives a packet with an unknown Version number, the packet is silently discarded. ๐Ÿ’€

The Sub-Version field is set to the value 0 for the version of Pip defined in this specification. As long as the Sub-Version number is 0, the Transit Part is as specified in this standard. Any packet received by a router with a Version number of 8 and an unknown Sub-Version number is silently discarded. โœจ

2.1.2. Options Offset ๐Ÿฆ‹

the Options Offset tells you where the Options Part starts. The unit of measure of the Options Offset is 32-bit words, counting the first word of the Pip Header as word 0. ๐ŸŽ€

2.1.3. Options Contents ๐Ÿงš

this field tells you how to read the Options Present field. Each bit of the Options field shows whether each of up to eight options is present in the Options Part. The Options Contents field indirectly tells you which option each bit of the Options Present field refers to. We say "indirectly" because the mapping that Options Contents refers to is stored locally. So without the extra information (the mapping), you can't look at the Options Contents field and know which option each bit of the Options Present field is talking about. literally a secret decoder ring ๐Ÿ™ˆ

Any of 256 possible Options Contents values can be active at a given time. (Note that the means by which the meaning of the Options Contents values are assigned and conveyed to routers and hosts is outside the scope of this specification.) ๐ŸŒˆ

2.1.4. Options Present ๐Ÿ’œ

this field tells you which of the Options named by the Options Contents field are actually in the Options Part. Each bit of this field refers to a single option type. The mapping of each bit to its option type is determined by the Options Contents field. ๐Ÿ‘‘

For instance, say the Options Contents field indicates that bit 0 of the Options Present field refers to the PDN Address option, that bit 1 refers to the foo option, and that bit 2 refers to the Fragmentation option. (As of this writing, there is only one option. Until there are more than eight options, there is no need to define more than one Options Contents value.) ๐Ÿ“

In this case, a value of 101 in the Options Present field means the PDN Address and Fragmentation options are present in the Options Part, and the foo option is not present. the binary math ate ๐Ÿ”ฅ

Note that an Options Present value of 0 indicates that there are no options present, regardless of the value of the Options Contents field. Note also that no more than 8 options, not including the default first option (the Options Descriptor), can be present in any Options Part. ๐Ÿ’…

The Options Contents/Options Present method of processing options allows for efficient processing of options. First, a router can ignore any options that may be present but that do not impact it. (For instance, a router not attached to a PDN need not consider the PDN Address option.) Second, the desired option can be retrieved super quickly, because the first option, the Options Descriptor option, contains the offset of each of the up to eight options indicated by the Options Present field. โญ

2.1.5. Packet SubID ๐Ÿ”ฅ

this field is used by Pip hosts to correctly associate received PCMP messages with local control blocks. This is necessary because the semantics of the Transit Part can change while a packet is in transit. So a router sending a PCMP message can't necessarily give the Pip host all of the information it needs to correctly identify the context of the received message (that is, which "packet flow" it belongs to). no cap, this is the tricky part ๐Ÿ˜ญ

A PCMP message uses the Protocol, Source ID, Dest ID, and Packet SubID to define the PCMP message's context. It's not enough to use just Protocol, Source ID, and Dest ID, because two hosts running the same protocol between them may have multiple "flows". For instance, a data flow, a video flow, and an audio flow in the case of multi-media. Each flow may have a different Transit Part, and take different paths. So the Packet SubID field is needed to further differentiate. ๐Ÿฆ‹

2.1.6. Protocol ๐ŸŽ€

this field indicates the protocol header found in the payload. The values for this field are the same as those used for IPv4. ๐ŸŒธ

2.1.7. Dest ID ๐Ÿ‘‘

the Dest ID field indicates the Pip ID of the final recipient of the Pip packet. This field is examined by both hosts and routers. ๐Ÿซถ

When a Pip System processes the Routing Directive (RD), it may determine that it needs to examine the Dest ID for further processing. This may happen both when a host or router receives a Pip packet destined for itself, or when a router receives a packet that should be forwarded based on Dest ID (as indicated by the RD). ๐Ÿงš

When a Pip system determines at forwarding time that a packet is destined for itself, it checks the Dest ID to verify that the packet is destined for it. If the complete Dest ID matches one of its own Pip IDs, then the packet is for it, and it's passed to the layer indicated by the Protocol field (in the Host Part). (The Pip system may of course wish to check a security option before passing a packet to an upper layer.) ๐Ÿ”ฅ

If the complete Dest ID field does not match one of its own IDs, then an ID/RD Mismatch PCMP message is sent to the source of the packet, as indicated by the Source ID and potentially source information in the RD. The purpose of this message is to flush the ID to RD binding in the source Pip host. ๐Ÿ’€

2.1.8. Source ID ๐Ÿซถ

this is the Pip ID of the source of the packet. It's passed to upper layers so they can identify the context for the packet. ๐Ÿ’–

2.1.9. Payload Length ๐Ÿ“

the Payload Length gives the length of the Pip packet payload in units of 8 bits. The Payload Length does not include the length of the Pip header. ๐ŸŒˆ

2.1.10. Host Version ๐ŸŒˆ

the Host Version field indicates what "version" of Pip software the sending host has implemented. This lets a host tell a router which ancillary protocols/messages it's able to accept. Over time, new host functions are going to be developed, and different hosts will install them at different times. This field lets routers know what functions the host can and cannot handle. ๐Ÿงš

2.1.11. Payload Offset ๐Ÿ’–

the Payload Offset indicates the position of the Payload Part. The unit of measure of the Payload Offset is 32-bit words, counting the first word of the Pip Header as word 0. โœจ

If a Pip system encapsulates a Transit Part in another Transit Part, then the Payload Offset is increased by the length of the new Transit Part. ๐Ÿฆ‹

2.1.12. Hop Count โญ

the Hop Count is decremented by every router that forwards the Pip packet. If a system receives a Pip header with a Hop Count equal to 0, and isn't the recipient of the packet, then the packet is discarded and a PCMP Destination Unreachable is routed to the system indicated by the Routing Directive. (In other words, a host can legally receive a Transit Part with a Hop Count of 0, and a host doesn't look at the Hop Count field when it receives a packet.) bestie this one's a little plot twist ๐Ÿ‘€


2.2. Transit Part ๐Ÿ’…

the Transit Part is formatted as shown in Figure 2. ๐Ÿ’œ

                                         length, in bits
                   +===========================+
                   |         Reserved          |     16
                   +---------------------------+
                   |    Transit Part Offset    |     8
                   +---------------------------+
                   |        HD Contents        |     8
                   +===========================+
                   |  Handling Directive (HD)  |     32
    ---------------+===========================+
        ^          |        FTIF Offset        |     8
        |          +---------------------------+
        |          |        RC Contents        |     8
        |          +---------------------------+
        |          |   Routing Context (RC)    |     16
     Routing       +===========================+
                   |         FTIF 1            |     16
     Directive     +---------------------------+
        |          |         FTIF 2            |     16
        |          +---------------------------+
        |                       .
        |                       .
        |                       .
        |          +---------------------------+
        |          |         FTIF N            |     16
        |          +---------------------------+
        v          |         Padding           |     Variable
    ---------------+===========================+

Figure 2: Transit Part

An explanation of each field follows. ๐ŸŽ€

2.2.1. Transit Part Offset ๐Ÿฆ‹

this field gives the position of the first word of the next Transit Part. The unit of measure of the Transit Part Offset is 32-bit words, counting the first word of the current Transit Part as word 0. If there is no next Transit Part, then this field is written as all 0's. ๐ŸŒธ

2.2.2. HD Contents โœจ

okay so the HD Contents field tells you how to read the Handling Directive (HD) field ๐Ÿ’…. The HD is split into a bunch of little fields, and each one handles a different job. Each individual one is called an HD Unit (HDU) ๐Ÿงš. The Options Contents field kinda sneakily tells you which HDUs are in the HD and where they live. It's only indirect because the mapping it points to is stored locally ๐Ÿ™ˆ. So without that mapping, you can stare at the HD Contents field all day and still have no clue where the HDUs are. Main character lookup table energy, periodt ๐Ÿ’€.

Any of 256 possible HD Contents values can be active at a given time ๐ŸŒˆ. (ngl, how the meanings of those values get assigned and passed along to routers and hosts is totally outside the scope of this spec, so that's a different story ๐Ÿซถ.)

2.2.3. Handling Directive (HD) ๐ŸŽ€

The HD is a general purpose field, and its whole job is triggering special packet handling by a Pip system โœจ. The HD doesn't change a Pip router's next hop choice for a Pip packet, and it doesn't change a Pip host's decision about whether the packet is destined for it. So no routing drama here ๐Ÿฆ‹. Examples of special handling would be "low priority queueing", or "high priority discard", etc. ๐Ÿ’–

(Note that the Transit Options also influence "handling", in the sense that handling is essentially defined here to mean "anything that is not routing. The HD field, though, is intended for the most common types of handling--handling that is expected to be in a significant percentage of packets.) ๐Ÿ“

Both hosts and routers use the HD field ๐Ÿ‘‘. (Hosts may make use of the HD field for packet handling for both incoming and outgoing packets.)

There is a complete distinction between the syntax and the semantics of the HD field ๐Ÿ”ฅ. (This can be contrasted with, for instance, IP, which couples the semantics and syntax of the TOS bits. That is, the IP specification itself determines, to a first degree, how the TOS bits are interpreted.) Each Pip system can modify the semantic meaning of the HD, for instance, by increasing or decreasing the queueing priority of a packet. This is called packet tagging ๐Ÿท๏ธ.

From an abstract modeling perspective, the HD is handled as follows:

  1. Extract the semantic meaning(s) (the handling instructions associated with the HDUs) from the HD field. Transmitting Pip hosts determine the semantic meaning by some other means, such as the upper layer protocol. If the receiving system decapsulates multiple Pip headers, then the HD semantics are extracted from the lowest Pip header for which it is not the target (see example on tunneling below).
  2. Handle the Pip packet according to those instructions. In some cases, it is possible that the Pip system does not understand the semantics of one or more HDUs of the HD field. For each HDU whose semantics are not understood, however, the pip system at least knows whether to 1) pass the HDU on untouched, 2) set it to all 0s, 3) set it to all 1s, 4) discard the packet silently, or 5) discard the packet with a PCMP HDU Not Understood packet.
  3. Modify the semantic meaning if necessary. Note also that if the Pip packet is replicated for multicast, each packet has its HD semantics modified individually.

2.2.4. Tunneling ๐Ÿฆ‹

Okay picture this ๐ŸŒธ: two Pip systems, X and Y, with one or more intermediate Pip systems in between. X wants to tunnel a Transit Part to Y, which makes Y the target system of the tunnel. A Transit Part He shows up at X. To forward it to Y, X wraps He up inside another Transit Part, Hy. Y is the target system for Hy. X sets the HD of He to whatever it would have been if Y was directly connected to X (aka, no intermediate Pip systems in the way). And here's the twist: Y is supposed to derive its HD semantics from the HD of He, not from Hy ๐Ÿซฃ.

        ----0-----o-----o-----o-----o-----0----
            X     I     J     K     L     Y

Now check out Pip system L, which is the previous hop system to Y. When L forwards the packet to Y, it has two options. It can decapsulate the packet, since it knows Y is the target for Hy. Or it can leave the packet alone. Either way, L derives its HD semantics from the HD of Hy ๐Ÿ’….

If L doesn't decapsulate the Transit Part, then it's as though I, J, K, and L are a "subnetwork" (albeit a Pip subnetwork), and Y is stripping that "subnetwork" header (Hy) off before processing the true Transit Part (He) ๐Ÿงš. If L does decapsulate it, then from Y's perspective, it's basically like Y was directly connected to X all along โœจ.

2.2.5. Routing Directive (RD) ๐ŸŒธ

The RD is made up of the Routing Context (RC), the RC Contents, the FTIF Offset, and a series of zero or more FTIFs (Forwarding Table Index Fields). That series of FTIFs is called the FTIF Chain ๐Ÿ’–. The one and only job of the RD is figuring out how to forward the Pip packet. The RD does not influence handling in any way, so keep that separate in your brain ๐Ÿง .

Figure 3 shows the decision process for forwarding the Pip packet ๐Ÿ‘€.

                 +---------+(next level RC)
    (decapsulate)|         |
                 |         v
                 |<--------RC----------------->FIB
                 |        /              |       |    IF Offset)
                 |       |     |
                 |       |     v
                 |<------|---FTIF------------->FIB
                 |       |  /  :
                 |       |<-   :(repeatedly...)
                 |       |     :
                 |       |     v
                 |<------|---FTIF------------->FIB
                         |  /  |
                         |<-   |
                         v     v
                          DestID-------------->FIB

                       Figure 3:  Forwarding Process

So how do you read Figure 3? The FIB is the Forwarding Information Block ๐ŸŽ€. It holds everything needed to forward a packet, and it might list multiple next hops (for multicast). That info includes 1) the outgoing interface, 2) how to encapsulate the packet, including the lower-layer address(es) (those address(es) plus the outgoing interface determine the next hop Pip system), 3) whether and how to tunnel, and 4) how to modify the semantics of the HD and RC, plus how to modify the FTIF Offset. The goal of the forwarding algorithm is to reach the right FIB ๐Ÿ.

The directed lines in Figure 3 start at the RC and, through various possible paths, end up at a FIB. These lines show all the info that can influence which FIB gets picked. There's no way to reach a FIB without checking the RC first ๐Ÿ™ƒ. It is possible to land on a FIB using only the RC, though (that's the line going straight right from the RC). Based on the RC, you might also find that the Transit Part has to be decapsulated, and then 1) the RC of the next Transit Part gets processed (the line going straight left), 2) the FTIF indicated by the FTIF Offset gets processed (the line going down and right), or 3) the Dest ID gets processed (the line going down and lest) ๐ŸŒˆ.

Likewise, once you look at the value of an FTIF (on top of everything you already checked), the result might be that 1) a FIB is identified, 2) the Transit Part is decapsulated, 3) the subsequent FTIF is processed, or 4) the Dest ID is processed ๐Ÿ’œ.

The RC is handled kinda like the HD ๐Ÿ’…. The RC Contents field tells you how the RC should be interpreted. The RC is built like the HD in that it's made of multiple fields, but for forwarding a Pip packet, the RC can be treated as one flat field, whereas the HD can't ๐Ÿงš.

So, mechanically speaking, the RC Contents can be seen as an index into a table that returns a pointer to another table (an rcTable), which is indexed by the RC itself. (Or, the combined RC Contents/RC can be seen as one big index into a single table, etc.) ๐Ÿฆ‹

The FTIF Offset field tells you which FTIF is active ๐ŸŽฏ. The active FTIF is the one used to index the forwarding table pointed to by the RC Contents/RC. An FTIF Offset value of 0 means the first FTIF is active, a value of 1 means the second FTIF is active, and so on. If there are no FTIFs, then the FTIF Offset has no meaning and can be any value. In that case, the RC field itself tells you how to forward the packet ๐Ÿ’–.

The FTIF Chain gets padded out to a 32-bit boundary ๐Ÿ“. There can be more than 16 bits of padding (for example, if you want to pad out to a 64-bit boundary). The padding is ignored when received, and it can be sent as any value. It doesn't have to follow any specific pattern of 0's or 1's ๐Ÿซถ.

One more thing ๐Ÿ‘€: a single "number" in the FTIF chain might actually be more than 16 bits long. When that happens, the number can be encoded as multiple FTIFs with no loss of generality. The only real requirement is that a multiple FTIF number must be distinguishable from a single FTIF number โœจ.

2.2.6. Router RD Forwarding Algorithm ๐Ÿ‘‘

This section describes the forwarding algorithm for a Pip router ๐Ÿ”ฅ.

  1. Using the value of the RC field as an index, retrieve one of the following instructions (steps 2 - 5) from the rcTable determined by the RC Contents.
  2. If the instruction is decapsulate, then decapsulate the Transit Part and re-execute step 1 using the next Transit Part.
  3. If the instruction is forward, then retrieve the associated Forwarding Information Block (FIB), and go to step 12.
  4. If the instruction is to examine the Dest ID, then retrieve the FIB associated with the Dest ID, and go to step 12.
  5. If the instruction is to examine the FTIF Chain, then retrieve the forwardingTable indicated by the rcTable entry, and continue on to step 6.
  6. Using the value of the currently active FTIF (this is the FTIF indicated by the FTIF Offset if this is the first FTIF examined) as an index, retrieve one or more of the following instructions (steps 7 - 10) from the forwardingTable identified in step 5 or step 10.
  7. If the instruction is decapsulate, then decapsulate the Pip header and re-execute step 1 using the new header (this is the same as step 2).
  8. If the instruction is forward, then (possibly additionally) retrieve the associated FIB, and go to step 12 (this is the same as step 3).
  9. If the instruction is to examine the Dest ID, then retrieve the FIB associated with the Dest ID and go to step 12 (this is the same as step 4).
  10. If the instruction is to examine the next FTIF, then, according to the information in the current forwardingTable entry, modify the current FTIF and choose a new forwardingTable.
  11. Make the next FTIF the current FTIF and go to step 6.
  12. okay so the FIB has a list of possible recipients for the Pip packet ๐Ÿ’…. That's next hop Pip systems (both directly connected ones AND ones at the end of Pip tunnels) plus the upper layer of the local system. Then you prune that list using 1) the incoming interface, 2) the previous hop Pip system if known (figured out from the lower-layer source address and incoming interface), and 3) potentially other local info, like congestion on outgoing queues. Pruning might not happen at all, or it might prune every single next hop ๐Ÿ™ˆ
  13. for each next hop that's left, format a Pip header by modifying a) the RC, b) the current FTIF, c) the FTIF Offset (to point to 1) the FTIF pointed to in the received RD, 2) the current FTIF, 3) the Nth FTIF counting from the 0th FTIF, or 4) the Nth FTIF counting forwards or backwards from the current FTIF) and d) any Pip header encapsulations, all based on what the FIB says. Then transmit the packet to the recipient, which is either a next hop or the upper layer ๐Ÿฆ‹

2.3 Options Part โœจ

The Options Part is formatted like this, bestie ๐ŸŽ€

           +===========================+
           |    Options Descriptor     |     64
           +===========================+
           |        Option 2           |     Variable
           +===========================+
           |        Option 3           |     Variable
           +===========================+
                       .
                       .
                       .
           +===========================+
           |        Option N           |     Variable
           +===========================+


                          Figure 4: Options Part

okay so every Option is at least one 32-bit word long and ends on a 32-bit word boundary ๐Ÿงš Because the type of each option is already known from the Options Contents field, you don't need to list the option type inside the options field itself. That means there's no common format across options. Each option has its own format, lowkey iconic in its own way ๐Ÿ’œ. The individual options are defined in another specification.

2.3.1 Options Descriptor ๐ŸŒธ

The Options Descriptor option gives the offset of each option in the Options Part. It's made of eight eight-bit Option Position fields, and each one gives the position of up to eight options (there can be no more than 8 Options Part). Each Option Position field lines up with one of the bits in the Options Present field. The unit of measure for each Option Position is 32-bit words, and the first word of the Options Part counts as word 0. The high order Option Position field matches up with the high order bit in the Options Present field ๐Ÿ‘‘

Security Considerations ๐Ÿ”’

๐Ÿ˜ญ the RFC is very serious here: Security issues are not discussed in this memo.

Author's Address ๐ŸŽ€

   Paul Francis
   NTT Software Lab
   3-9-11 Midori-cho Musashino-shi
   Tokyo 180 Japan

   Phone: +81-422-59-3843
   Fax +81-422-59-3765
   EMail: francis@cactus.ntt.jp
๐Ÿ“ฆ where this page comes from