RFC 2516

A Method for Transmitting PPP Over Ethernet (PPPoE)

πŸ“… published February 1999, from ietf

Title Block πŸŽ€

Okay bestie, let's start at the very top πŸ’– This is RFC 2516, and it's called "A Method for Transmitting PPP Over Ethernet (PPPoE)" ✨

It comes from the Network Working Group and is dated February 1999. The category is Informational, which is giving "here's some super useful info" 🧚, not "this is an official Internet standard." The memo says that itself, so no confusion πŸ’…

The authors are L. Mamakos, K. Lidl, and J. Evarts from UUNET Technologies, Inc., plus D. Carrel and D. Simone from RedBack Networks, Inc., and R. Wheeler from RouterWare, Inc. That's a whole squad 🫢

The title block doesn't list anything this RFC obsoletes or updates, so there's no drama there πŸ™ˆ


Status of this Memo

Okay so this section is the official disclaimer πŸ“ It says the memo gives information to the Internet community, and it does not specify an Internet standard of any kind. Distribution of the memo is unlimited, so share it with everyone 🌸

The Internet Society holds the copyright (1999), and all rights are reserved πŸ’œ

Abstract

Okay so the Point-to-Point Protocol (PPP) [1] is the standard way to send multi-protocol datagrams over point-to-point links. Iconic, right? πŸ‘‘

This document explains how to build PPP sessions and wrap PPP packets up inside Ethernet πŸ¦‹

Applicability

So this spec is meant to give you all the PPP goodies, like the Link Control Protocol, the Network-layer Control Protocols, authentication, and more ✨ These features need a point-to-point relationship between the two peers. They aren't built for the multi-point stuff you get on Ethernet and other multi-access setups, so keep that in mind πŸ™ˆ

This spec can be used by multiple hosts on one shared Ethernet to open PPP sessions to many destinations through one or more bridging modems πŸ“ It's meant for broadband remote access tech that gives you a bridged Ethernet topology, especially when access providers want to keep that PPP session abstraction πŸ’…

This document describes the PPP Over Ethernet encapsulation that RedBack Networks, RouterWare, UUNET, and others are deploying πŸ”₯

1. Introduction

Okay so modern access tech has a few goals that kind of clash 😭 You want multiple hosts at a remote site to connect through the same customer premise access device. You also want access control and billing that works like dial-up PPP services. And in lots of access technologies, the cheapest way to hook up multiple hosts to that customer premise device is Ethernet 🌈 On top of that, the device should stay as cheap as possible while needing little or no configuration πŸ’–

PPP over Ethernet (PPPoE) lets a network of hosts connect through a simple bridging access device to a remote Access Concentrator ✨ Each host runs its own PPP stack, so the user gets a familiar interface πŸŽ€ Access control, billing, and type of service can all be handled per-user instead of per-site πŸ‘‘

To make a point-to-point connection over Ethernet, each PPP session has to learn the Ethernet address of the remote peer and set up a unique session identifier. PPPoE has a discovery protocol that handles this part 🧚

2. Conventions

Okay so when these keywords show up in this document, read them the way [2] describes: MUST, MUST NOT, REQUIRED, SHALL, SHALL NOT, SHOULD, SHOULD NOT, RECOMMENDED, MAY, and OPTIONAL 🫢

3. Protocol Overview

Okay bestie, PPPoE has two distinct stages πŸ¦‹ There's a Discovery stage and a PPP Session stage. When a Host wants to start a PPPoE session, it must first run Discovery to find the peer's Ethernet MAC address and set up a PPPoE SESSION_ID πŸ’…

Here's the tea: PPP is a peer-to-peer relationship, but Discovery is basically client-server πŸ™ˆ In Discovery, a Host (the client) finds an Access Concentrator (the server). Depending on the network topology, the Host might be able to talk to more than one Access Concentrator πŸ“ The Discovery stage lets the Host find all of them and then pick one 🌸 Once Discovery finishes successfully, both the Host and the chosen Access Concentrator have what they need to build their point-to-point connection over Ethernet ✨

The Discovery stage stays stateless until a PPP session is established. After that, both the Host and the Access Concentrator MUST allocate the resources for a PPP virtual interface πŸ’–

4. Payloads

Okay so this section defines the packet formats. The payload contents get defined in the Discovery and PPP sections πŸŽ€

An Ethernet frame looks like this πŸ‘‡

                                       1
                   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
                  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                  |       DESTINATION_ADDR        |
                  |          (6 octets)           |
                  |                               |
                  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                  |         SOURCE_ADDR           |
                  |          (6 octets)           |
                  |                               |
                  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                  |    ETHER_TYPE  (2 octets)     |
                  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                  ~                               ~
                  ~           payload             ~
                  ~                               ~
                  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                  |           CHECKSUM            |
                  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Okay so the DESTINATION_ADDR field holds either a unicast Ethernet destination address or the Ethernet broadcast address (0xffffffff) πŸ’… For Discovery packets, it's either unicast or broadcast, as defined in the Discovery section 🧚 For PPP session traffic, this field MUST contain the peer's unicast address, the one you learned during the Discovery stage 🫢

The SOURCE_ADDR field MUST contain the Ethernet MAC address of the source device πŸ“

The ETHER_TYPE is set to either 0x8863 (Discovery Stage) or 0x8864 (PPP Session Stage) ✨

The Ethernet payload for PPPoE looks like this πŸ‘‡

                        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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  VER  | TYPE  |      CODE     |          SESSION_ID           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            LENGTH             |           payload             ~
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

The VER field is four bits and MUST be set to 0x1 for this version of the PPPoE specification πŸ’–

The TYPE field is also four bits and MUST be set to 0x1 for this version of the PPPoE specification πŸŽ€

The CODE field is eight bits, and its values are defined below for the Discovery and PPP Session stages πŸ‘‘

The SESSION_ID field is sixteen bits. It's an unsigned value in network byte order 🧚 Its value is defined below for Discovery packets. The value stays fixed for a given PPP session, and it actually defines a PPP session together with the Ethernet SOURCE_ADDR and DESTINATION_ADDR πŸ¦‹ A value of 0xffff is reserved for future use and MUST NOT be used πŸ™ˆ

The LENGTH field is sixteen bits. Its value, in network byte order, tells you the length of the PPPoE payload 🌸 It does not include the length of the Ethernet or PPPoE headers πŸ’…

5. Discovery Stage

Okay so there are four steps in the Discovery stage πŸ”₯ When it finishes, both peers know the PPPoE SESSION_ID and the peer's Ethernet address. Together, those two things define the PPPoE session uniquely πŸ’œ The steps are: the Host broadcasts an Initiation packet, one or more Access Concentrators send Offer packets, the Host sends a unicast Session Request packet, and the chosen Access Concentrator sends a Confirmation packet ✨ When the Host gets the Confirmation packet, it may proceed to the PPP Session Stage. When the Access Concentrator sends the Confirmation packet, it may proceed to the PPP Session Stage too 🫢

All Discovery Ethernet frames have the ETHER_TYPE field set to 0x8863 πŸŽ€

The PPPoE payload contains zero or more TAGs 🌈 A TAG is a TLV (type-length-value) construct, and it looks like this πŸ‘‡

                        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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |          TAG_TYPE             |        TAG_LENGTH             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |          TAG_VALUE ...                                        ~
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

TAG_TYPE is a sixteen bit field in network byte order. Appendix A has the full list of TAG_TYPEs and their TAG_VALUEs 🧚

TAG_LENGTH is a sixteen bit field. It's an unsigned number in network byte order, and it tells you the length in octets of the TAG_VALUE πŸ“

If a discovery packet comes in with a TAG of unknown TAG_TYPE, the TAG MUST be ignored unless this document says otherwise. That's the backwards compatibility magic for when new TAGs get added! If new mandatory TAGs are ever added, the version number will be incremented πŸ™ˆπŸ’…

Some example Discovery packets are shown in Appendix B πŸ¦‹

5.1 The PPPoE Active Discovery Initiation (PADI) packet

Okay so the Host sends the PADI packet with the DESTINATION_ADDR set to the broadcast address πŸ“£ The CODE field is set to 0x09, and the SESSION_ID MUST be set to 0x0000 πŸ’–

The PADI packet MUST contain exactly one TAG of TAG_TYPE Service-Name, which tells the Access Concentrator what service the Host wants πŸŽ€ It can also have any number of other TAG types 🌸 An entire PADI packet (PPPoE header included) MUST NOT exceed 1484 octets. That leaves enough room for a relay agent to add a Relay-Session-Id TAG πŸ‘‘

5.2 The PPPoE Active Discovery Offer (PADO) packet

When the Access Concentrator gets a PADI it can serve, it replies with a PADO packet ✨ The DESTINATION_ADDR is the unicast address of the Host that sent the PADI 🧚 The CODE field is set to 0x07, and the SESSION_ID MUST be set to 0x0000 🫢

The PADO packet MUST contain one AC-Name TAG with the Access Concentrator's name πŸ’œ It also needs a Service-Name TAG that's identical to the one in the PADI, plus any number of other Service-Name TAGs for the other services the Access Concentrator offers 🌈 If the Access Concentrator can not serve the PADI, it MUST NOT respond with a PADO πŸ™ˆ

5.3 The PPPoE Active Discovery Request (PADR) packet

Okay so the PADI got broadcast, which means the Host might get more than one PADO πŸ¦‹ The Host looks through the PADO packets it receives and picks one. It can make that choice based on the AC-Name or the services offered πŸ“ Then the Host sends one PADR packet to the Access Concentrator it chose πŸ’… The DESTINATION_ADDR field is set to the unicast Ethernet address of the Access Concentrator that sent the PADO. The CODE field is set to 0x19, and the SESSION_ID MUST be set to 0x0000 πŸ”₯

The PADR packet MUST contain exactly one TAG of TAG_TYPE Service-Name, which tells the Access Concentrator what service the Host is requesting πŸŽ€ It can also have any number of other TAG types πŸ’–

5.4 The PPPoE Active Discovery Session-confirmation (PADS) packet ✨

okay so once the Access Concentrator gets a PADR, it starts getting ready for a PPP session πŸ’…. It makes a unique SESSION_ID for the PPPoE session and sends a PADS back to the Host. The DESTINATION_ADDR is the unicast Ethernet address of the Host that sent the PADR. CODE is set to 0x65, and SESSION_ID MUST be set to that unique value generated for this PPPoE session.

The PADS packet has exactly one TAG of TAG_TYPE Service-Name, which says which service the Access Concentrator accepted the PPPoE session under. It can also carry any number of other TAG types πŸŽ€.

If the Access Concentrator doesn't like the Service-Name in the PADR, it MUST reply with a PADS containing a TAG of TAG_TYPE Service-Name-Error (and any number of other TAG types). In this case SESSION_ID MUST be set to 0x0000 πŸ™ˆ.

5.5 The PPPoE Active Discovery Terminate (PADT) packet πŸ¦‹

This packet can be sent any time after a session is set up, to say the PPPoE session is over. Either the Host or the Access Concentrator can send it. DESTINATION_ADDR is a unicast Ethernet address, CODE is 0xa7, and SESSION_ID MUST be set to indicate which session is being terminated. No TAGs are required.

When a PADT is received, no more PPP traffic is allowed on that session. Even normal PPP termination packets MUST NOT be sent after sending or receiving a PADT πŸ’€. A PPP peer SHOULD use PPP itself to bring a PPPoE session down, but the PADT MAY be used when PPP can not be used.

6. PPP Session Stage 🧚

Once the PPPoE session starts, PPP data gets sent just like in any other PPP encapsulation. All Ethernet packets are unicast. ETHER_TYPE is set to 0x8864. The PPPoE CODE MUST be set to 0x00. SESSION_ID MUST NOT change for that PPPoE session and MUST be the value assigned in the Discovery stage. The PPPoE payload contains a PPP frame, and the frame begins with the PPP Protocol-ID.

An example packet is shown in Appendix B.

7. LCP Considerations 🌸

The Magic Number LCP configuration option is RECOMMENDED, and the Protocol Field Compression (PFC) option is NOT RECOMMENDED. An implementation MUST NOT request any of the following options, and MUST reject a request for such an option:

  • Field Check Sequence (FCS) Alternatives
  • Address-and-Control-Field-Compression (ACFC)
  • Asynchronous-Control-Character-Map (ACCM)

The Maximum-Receive-Unit (MRU) option MUST NOT be negotiated to a larger size than 1492. Ethernet has a maximum payload of 1500 octets, the PPPoE header is 6 octets, and the PPP Protocol ID is 2 octets. So the PPP MTU MUST NOT be greater than 1492 ✨.

It is RECOMMENDED that the Access Concentrator occasionally send Echo-Request packets to the Host to figure out the state of the session. Otherwise, if the Host ends a session without sending a Terminate-Request packet, the Access Concentrator won't be able to tell that the session has gone away πŸ‘€.

When LCP terminates, the Host and Access Concentrator MUST stop using that PPPoE session. If the Host wants to start another PPP session, it MUST return to the PPPoE Discovery stage.

8. Other Considerations πŸ”₯

When a Host doesn't receive a PADO packet within a specified amount of time, it SHOULD resend its PADI packet and double the waiting period. This is repeated as many times as desired. If the Host is waiting to receive a PADS packet, a similar timeout mechanism SHOULD be used, with the Host resending the PADR. After a specified number of retries, the Host SHOULD then resend a PADI packet.

The ETHER_TYPEs used in this document (0x8863 and 0x8864) were assigned by the IEEE for use by PPP Over Ethernet (PPPoE). Using these values together with the PPPoE VER (version) field uniquely identifies this protocol.

UTF-8 [5] is used throughout this document instead of ASCII. UTF-8 supports the entire ASCII character set while also allowing international character sets. See [5] for more details 🌈.

9. Security Considerations πŸ›‘οΈ

To help protect against Denial of Service (DOS) attacks, the Access Concentrator can use the AC-Cookie TAG. The Access Concentrator SHOULD be able to uniquely regenerate the TAG_VALUE based on the PADR SOURCE_ADDR. Using this, the Access Concentrator can make sure the PADI SOURCE_ADDR is actually reachable, and then it can limit concurrent sessions for that address. What algorithm to use is not defined and is left as an implementation detail. An example is HMAC [3] over the Host MAC address, using a key known only to the Access Concentrator. While the AC-Cookie is useful against some DOS attacks, it can not protect against all DOS attacks, and an Access Concentrator MAY employ other means to protect resources.

The original repeats the paragraph above word for word, so I've only kept it once πŸ’€

Many Access Concentrators won't want to offer information about the services they provide to an unauthenticated entity. In that case, the Access Concentrator should employ one of two policies. It SHOULD never refuse a request based on the Service-Name TAG, and always return the TAG_VALUE that was sent to it. Or it SHOULD only accept requests with a Service-Name TAG with a zero TAG_LENGTH (indicating any service). The former solution is RECOMMENDED.

10. Acknowledgments πŸ™

This document is based on concepts discussed in several forums, including the ADSL forum.

Copious amounts of text have been stolen from RFC 1661, RFC 1662 and RFC 2364 😭.

11. References πŸ“š

  • [1] Simpson, W., Editor, "The Point-to-Point Protocol (PPP)", STD 51, RFC 1661, July 1994
  • [2] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997.
  • [3] Krawczyk, H., Bellare, M. and R. Canetti, "HMAC: Keyed-Hashing for Message Authentication", RFC 2104, February 1998.
  • [4] Reynolds, J. and J. Postel, "Assigned Numbers", STD 2, RFC 1700, October 1994. See also: http://www.iana.org/numbers.html
  • [5] Yergeau, F., "UTF-8, a transformation format of ISO 10646", RFC 2279, January 1998.

Appendix A ✨

TAG_TYPES and TAG_VALUES

0x0000 End-Of-List

This TAG says there are no further TAGs in the list. The TAG_LENGTH of this TAG MUST always be zero. Using this TAG isn't required, but it's kept around for backwards compatibility.

0x0101 Service-Name

This TAG says a service name follows. The TAG_VALUE is a UTF-8 string that is not NULL terminated. When the TAG_LENGTH is zero, this TAG is used to indicate that any service is acceptable. Examples of using the Service-Name TAG are naming an ISP, or a class or quality of service.

0x0102 AC-Name

This TAG says a string follows that uniquely identifies this particular Access Concentrator unit from all others. It can be a combination of trademark, model and serial ID information, or simply a UTF-8 rendition of the MAC address of the box. It is not NULL terminated.

0x0103 Host-Uniq

This TAG is used by a Host to uniquely associate an Access Concentrator response (PADO or PADS) with a particular Host request (PADI or PADR). The TAG_VALUE is binary data of any value and length that the Host chooses. It is not interpreted by the Access Concentrator. The Host MAY include a Host-Uniq TAG in a PADI or PADR. If the Access Concentrator receives this TAG, it MUST include the TAG unmodified in the associated PADO or PADS response.

This TAG is used by the Access Concentrator to help protect against denial of service attacks (see the Security Considerations section for an explanation of how this works). The Access Concentrator MAY include this TAG in a PADO packet. If a Host receives this TAG, it MUST return the TAG unmodified in the following PADR. The TAG_VALUE is binary data of any value and length, and it is not interpreted by the Host.

0x0105 Vendor-Specific

This TAG is used to pass vendor proprietary information. The first four octets of the TAG_VALUE contain the vendor id, and the remainder is unspecified. The high-order octet of the vendor id is 0, and the low-order 3 octets are the SMI Network Management Private Enterprise Code of the Vendor in network byte order, as defined in the Assigned Numbers RFC [4].

Use of this TAG is NOT RECOMMENDED. To ensure inter-operability, an implementation MAY silently ignore a Vendor-Specific TAG.

0x0110 Relay-Session-Id

This TAG MAY be added to any discovery packet by an intermediate agent that is relaying traffic. The TAG_VALUE is opaque to both the Host and the Access Concentrator. If either the Host or Access Concentrator receives this TAG, they MUST include it unmodified in any discovery packet they send as a response. All PADI packets MUST guarantee sufficient room for the addition of a Relay-Session-Id TAG with a TAG_VALUE length of 12 octets.

A Relay-Session-Id TAG MUST NOT be added if the discovery packet already contains one. In that case the intermediate agent SHOULD use the existing Relay-Session-Id TAG. If it can not use the existing TAG, or there is insufficient room to add a Relay-Session-Id TAG, then it SHOULD return a Generic-Error TAG to the sender.

0x0201 Service-Name-Error

This TAG (typically with a zero-length data section) indicates that, for one reason or another, the requested Service-Name request could not be honored.

If there is data, and the first octet of the data is nonzero, then it MUST be a printable UTF-8 string which explains why the request was denied. This string may not be NULL terminated.

0x0202 AC-System-Error

This TAG indicates that the Access Concentrator experienced some error in performing the Host request. (For example, insufficient resources to create a virtual circuit.) It MAY be included in PADS packets.

If there is data, and the first octet of the data is nonzero, then it MUST be a printable UTF-8 string which explains the nature of the error. This string may not be NULL terminated.

0x0203 Generic-Error

This TAG indicates an error. It can be added to PADO, PADR or PADS packets when an unrecoverable error occurs and no other error TAG is appropriate. If there is data, then it MUST be a UTF-8 string which explains the nature of the error. This string MUST NOT be NULL terminated.

Appendix B 🧚

okay so bestie, here are some example packets so you can actually see what these look like on the wire πŸ‘€πŸŽ€

A PADI packet: 🌸

                        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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         0xffffffff                            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           0xffff              |        Host_mac_addr          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Host_mac_addr (cont)                       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |    ETHER_TYPE = 0x8863        | v = 1 | t = 1 |  CODE = 0x09  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     SESSION_ID = 0x0000       |      LENGTH = 0x0004          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |      TAG_TYPE = 0x0101        |    TAG_LENGTH = 0x0000        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

A PADO packet: πŸ¦‹

                        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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         Host_mac_addr                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |      Host_mac_addr (cont)     | Access_Concentrator_mac_addr  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |             Access_Concentrator_mac_addr (cont)               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |    ETHER_TYPE = 0x8863        | v = 1 | t = 1 |  CODE = 0x07  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     SESSION_ID = 0x0000       |      LENGTH = 0x0020          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |      TAG_TYPE = 0x0101        |    TAG_LENGTH = 0x0000        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |      TAG_TYPE = 0x0102        |    TAG_LENGTH = 0x0018        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     0x47      |     0x6f      |     0x20      |     0x52      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     0x65      |     0x64      |     0x42      |     0x61      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     0x63      |     0x6b      |     0x20      |     0x2d      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     0x20      |     0x65      |     0x73      |     0x68      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     0x73      |     0x68      |     0x65      |     0x73      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     0x68      |     0x6f      |     0x6f      |     0x74      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

A PPP LCP packet: πŸ™ˆ the PPP protocol value is shown (0xc021) but the PPP payload is left to the reader, so you get to fill that part in yourself πŸ’… this one goes from the Host to the Access Concentrator ✨

                        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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                  Access_Concentrator_mac_addr                 |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Access_Concentrator_mac_addr(c)|        Host_mac_addr          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                     Host_mac_addr (cont)                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |    ETHER_TYPE = 0x8864        | v = 1 | t = 1 |  CODE = 0x00  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     SESSION_ID = 0x1234       |      LENGTH = 0x????          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |    PPP PROTOCOL = 0xc021      |        PPP payload            ~
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Authors' Addresses πŸ¦‹

these are the gorgeous humans who wrote this spec, so here are their contact details πŸ’–

Louis Mamakos
UUNET Technologies, Inc.
3060 Williams Drive
Fairfax, VA  22031-4648
United States of America

EMail: louie@uu.net


Kurt Lidl
UUNET Technologies, Inc.
3060 Williams Drive
Fairfax, VA  22031-4648
United States of America

EMail: lidl@uu.net


Jeff Evarts
UUNET Technologies, Inc.
3060 Williams Drive
Fairfax, VA  22031-4648
United States of America

EMail: jde@uu.net

David Carrel
RedBack Networks, Inc.
1389 Moffett Park Drive
Sunnyvale, CA  94089-1134
United States of America

EMail: carrel@RedBack.net


Dan Simone
RedBack Networks, Inc.
1389 Moffett Park Drive
Sunnyvale, CA  94089-1134
United States of America

EMail:dan@RedBack.net


Ross Wheeler
RouterWare, Inc.
3961 MacArthur Blvd., Suite 212
Newport Beach, CA  92660
United States of America

EMail: ross@routerware.com

the legal bit, kept complete and word for word so nothing gets lost 🫢

Copyright (C) The Internet Society (1999). All Rights Reserved.

This document and translations of it may be copied and furnished to others, and derivative works that comment on or otherwise explain it or assist in its implementation may be prepared, copied, published and distributed, in whole or in part, without restriction of any kind, provided that the above copyright notice and this paragraph are included on all such copies and derivative works. However, this document itself may not be modified in any way, such as by removing the copyright notice or references to the Internet Society or other Internet organizations, except as needed for the purpose of developing Internet standards in which case the procedures for copyrights defined in the Internet Standards process must be followed, or as required to translate it into languages other than English.

The limited permissions granted above are perpetual and will not be revoked by the Internet Society or its successors or assigns.

This document and the information contained herein is provided on an "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

πŸ“¦ where this page comes from