RFC 1570

PPP LCP Extensions

๐Ÿ“… published January 1994, from ietf

PPP LCP Extensions ๐Ÿฆ‹

okay bestie, this is RFC 1570 (part 1 of 3) ๐Ÿ’… It's a Standards Track doc by W. Simpson (Editor) from Daydreamer, dated January 1994 ๐ŸŒธ It updates RFC 1548 โœจ and its title block doesn't list anything it obsoletes. Full main character energy ๐Ÿ‘‘

Status of this Memo ๐Ÿ“œ

This is an Internet standards track protocol for the Internet community, and the authors want your discussion and suggestions for improvements ๐Ÿ’Œ For the standardization state and status, check the current edition of "Internet Official Protocol Standards" (STD 1). Distribution of this memo is unlimited ๐ŸŒˆ

Abstract ๐ŸŒธ

The Point-to-Point Protocol (PPP) [1] gives us a standard way to carry multi-protocol datagrams over point-to-point links ๐Ÿš€ PPP also defines an extensible Link Control Protocol (LCP) for setting up, configuring, and testing the data-link connection. This document adds a few extra LCP features that people have been suggesting over the past few years ๐Ÿงš

This document comes out of the Point-to-Point Protocol Working Group of the Internet Engineering Task Force (IETF). Comments go to the ietf-ppp@ucdavis.edu mailing list ๐Ÿ’œ

Table of Contents ๐Ÿ“

  1.     Additional LCP Packets ................................    1
     1.1       Identification ..................................    1
     1.2       Time-Remaining ..................................    3
  2.     Additional LCP Configuration Options ..................    6
     2.1       FCS-Alternatives ................................    6
        2.1.1  LCP considerations ..............................    7
        2.1.2  Null FCS ........................................    8
     2.2       Self-Describing-Padding .........................    9
     2.3       Callback ........................................   11
     2.4       Compound-Frames .................................   12
        2.4.1  LCP considerations ..............................   14
  APPENDICES ...................................................   15
  A.     Fast Frame Check Sequence (FCS) Implementation ........   15
     A.1       32-bit FCS Computation Method ...................   15
  SECURITY CONSIDERATIONS ......................................   17
  REFERENCES ...................................................   17
  ACKNOWLEDGEMENTS .............................................   18
  CHAIR'S ADDRESS ..............................................   18
  EDITOR'S ADDRESS .............................................   18

1. Additional LCP Packets ๐ŸŽ€

The Packet format and basic facilities are already defined for LCP [1] ๐Ÿ’…

The current values for the LCP Code field live in the newest "Assigned Numbers" RFC [2]. This spec is all about these two:

12      Identification
13      Time-Remaining

1.1. Identification ๐Ÿ’–

Description

This Code lets an implementation introduce itself to its peer ๐Ÿซถ It's super versatile, so people use it for link troubleshooting, license enforcement, and more.

Identification is a Link Maintenance packet. Identification packets MAY be sent at any time, including before LCP has reached the Opened state โœจ

To send one, you transmit an LCP packet with the Code field set to 12 (Identification), set the Identifier field, insert the local Magic-Number (if you have one), and fill the Message field with whatever data you want, as long as it doesn't go past the default MRU minus eight ๐Ÿ“ฆ

Getting an Identification packet triggers the RXR or RUC event. There's no response to it ๐Ÿ™…โ€โ™€๏ธ If you get a Code-Reject for an Identification packet, that SHOULD generate the RXJ+ (permitted) event.

Rationale:

This is defined as part of LCP instead of as its own PPP Protocol so its benefits show up super early, during the Link Establishment phase ๐Ÿงš That way an operator can learn who the peer is even when negotiation isn't converging. Non-LCP packets can't be sent during Link Establishment, so this is the move ๐Ÿ™Œ

It's also a separate LCP Code instead of a Configuration-Option. That means the peer doesn't have to bundle it with other items in configuration packet exchanges or deal with "corrected" values or "rejection". Plus, generating it is both rare and one-directional ๐Ÿ’… The recommendation is to send Identification packets whenever a Configure-Reject is sent or received, as a final message when negotiation fails to converge, and when LCP reaches the Opened state.

Here's a summary of the Identification packet format. The fields go from left to right ๐Ÿ‘€

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Code      |  Identifier   |            Length             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Magic-Number                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    Message ...
+-+-+-+-+-+-+-+-+

Code

The value is 12 for Identification ๐Ÿ”ข

Identifier

The Identifier field MUST be changed for each Identification sent ๐Ÿ”

Length

The length is >= 8 ๐Ÿ“

Magic-Number

The Magic-Number field is four octets, and it helps detect links that are in the looped-back condition ๐Ÿ” Until the Magic-Number Configuration Option has been successfully negotiated, the Magic-Number MUST be transmitted as zero. Check out the Magic-Number Configuration Option for the full scoop.

Message

The Message field is zero or more octets, and what goes in it is implementation dependent ๐ŸŽ€ It's meant to be human readable, and it MUST NOT affect operation of the protocol. The recommendation is that the message contains displayable ASCII characters 32 through 126 decimal. Extending to other character sets is a topic for future research ๐Ÿ”ฌ The size comes from the Length field.

Implementation Note: The Message usually holds things like the sender's hardware type, PPP software revision level, and PPP product serial number ๐Ÿงพ It can also have MIB info such as link speed and interface name, plus anything else the sender thinks is helpful for debugging. The format will probably differ from implementor to implementor, so folks tracking serial numbers can validate theirs ๐Ÿ•ต๏ธโ€โ™€๏ธ A robust implementation SHOULD treat the Message as displayable text, and SHOULD be able to receive and display a very long Message ๐Ÿ’ช

1.2. Time-Remaining โณ

Description

This Code gives you a way to tell the peer how much time is left in the session โฐ

This info is advisory only ๐Ÿซง Only one side of the connection is expected to send this packet, generally a "network access server". The session actually ends with the Terminate-Request packet, not this one.

Time-Remaining is a Link Maintenance packet. Time-Remaining packets are only allowed to be sent in the LCP Opened state ๐Ÿšช

To send one, transmit an LCP packet with the Code field set to 13 (Time-Remaining), set the Identifier field, insert the local Magic-Number (if you have one), and fill the Message field with whatever data you like, as long as it doesn't go past the peer's established MRU minus twelve ๐Ÿ“ฌ

Getting a Time-Remaining packet triggers the RXR or RUC event. No response is sent back ๐Ÿ™ƒ Getting a Code-Reject for a Time-Remaining packet SHOULD generate the RXJ+ (permitted) event.

Rationale:

This notification is its own LCP Code instead of a Configuration-Option, so changes and warnings can pop up dynamically during the session ๐Ÿ”„ It also means the time info can be figured out after Authentication has happened. Usually this packet gets sent when the link enters the Network-Layer Protocol phase, and then at regular intervals throughout the session, especially near the end ๐ŸŒ…

Here's a summary of the Time-Remaining packet format. Fields go left to right ๐Ÿ‘€

 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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Code      |  Identifier   |            Length             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Magic-Number                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Seconds-Remaining                       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    Message ...
+-+-+-+-+-+-+-+-+

Code

The value is 13 for Time-Remaining ๐Ÿ”ข

Identifier

The Identifier field MUST be changed for each Time-Remaining sent ๐Ÿ”

Length

The length is >= 12 ๐Ÿ“

Magic-Number

The Magic-Number field is four octets, and it helps detect links that are in the looped-back condition ๐Ÿ” Until the Magic-Number Configuration Option has been successfully negotiated, the Magic-Number MUST be transmitted as zero. See the Magic-Number Configuration Option for more.

Seconds-Remaining

The Seconds-Remaining field is four octets and shows the number of whole seconds left in this session โฑ๏ธ It's a 32 bit unsigned value, sent most significant octet first. The value 0xffffffff (all ones) means no timeout, or "forever" โ™พ๏ธ

Message

The Message field is zero or more octets, and what goes in it is implementation dependent ๐ŸŽ€ It's meant to be human readable, and it MUST NOT affect operation of the protocol. The recommendation is that the message contains displayable ASCII characters 32 through 126 decimal. Extending to other character sets is a topic for future research ๐Ÿ”ฌ The size comes from the Length field.

2. Additional LCP Configuration Options โญ

The Configuration Option format and basic options are already defined for LCP [1] ๐Ÿ’ซ

The current values for the LCP Option Type field live in the newest "Assigned Numbers" RFC [2]. This document covers these four:

9       FCS-Alternatives
10      Self-Describing-Padding
13      Callback
15      Compound-Frames

2.1. FCS-Alternatives โœจ

Description

okay so this option is all about the FCS ๐Ÿ’…. It gives an implementation a way to tell its peer "hey, send me a different FCS format," or to negotiate the FCS away completely ๐Ÿฆ‹.

It's negotiated separately in each direction ๐Ÿ”„. You don't have to be able to generate a different FCS on each side of the link at the same time, though (not required, bestie ๐Ÿซถ).

The negotiated FCS values only take effect during the Authentication and Network-Layer Protocol phases โญ. Frames sent during any other phase MUST contain the default FCS ๐Ÿšจ.

A summary of the FCS-Alternatives Configuration Option format is shown below. The fields go from left to right.

    0                   1                   2
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type      |    Length     |    Options    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Type

9

Length

3

Options

This field is one octet, made by "logical or"-ing these values together ๐Ÿงฉ:

    1   Null FCS
    2   CCITT 16-bit FCS
    4   CCITT 32-bit FCS

Implementation Note:

for most PPP HDLC framed links, the default FCS is the CCITT 16-bit FCS ๐Ÿ“. Some framing techniques and high speed links may use another format as the default FCS ๐ŸŽ๏ธ.


2.1.1. LCP considerations

the link can lose its state, and the LCP can re-negotiate at any time ๐ŸŒ€. When the LCP starts renegotiating or terminating, it's recommended that the LCP Configure-Request or Terminate-Request packet go out with the last negotiated FCS, then switch to the default FCS, and a duplicate LCP packet gets sent with the default FCS ๐Ÿ‘ฏ. The Identifier field SHOULD NOT be incremented for each of these duplicate packets ๐Ÿ™ˆ.

when an LCP Configure-Request or Terminate-Request packet comes in, the implementation MUST switch to the default FCS for both transmission and reception ๐Ÿ”. If a Request packet arrives with a duplicate Identifier field, a new reply MUST be generated ๐Ÿ’….

Implementation Notes:

you only need to send two packets once the Alternative-FCS has already been negotiated ๐Ÿง . You don't need to do it during state transitions where there's a natural sign that the default FCS is in effect, like the Down and Up events โฌ‡๏ธโฌ†๏ธ. You DO need two packets in the Ack-Sent and Opened states, because the peer could mistakenly think the link has Opened ๐Ÿ˜ญ.

it's possible to send a single 48-bit FCS that's a combination of the 16-bit and 32-bit FCS ๐Ÿงƒ. This can be sent instead of the two packets described above. We haven't standardized this procedure because of intellectual property concerns โš–๏ธ. If a 48-bit FCS is used, it MUST only be used for LCP packets ๐Ÿ”’.


2.1.2. Null FCS

the Null FCS SHOULD only be used for network-layer and transport protocols that have an end-to-end checksum available, like TCP/IP, or UDP/IP with the checksum enabled โœ…. In other words, the Null FCS option SHOULD be negotiated together with another non-null FCS option in a heterogeneous environment ๐ŸŒˆ.

when a configuration (LCP or NCP) or authentication packet is sent, the FCS MUST be included ๐Ÿ“ฆ. When a configuration (LCP or NCP) or authentication packet is received, the FCS MUST be verified ๐Ÿ”.

there are a few cases to think about ๐ŸŽ€:

Null FCS alone

the sender generates the FCS for the frames that need it before sending the frame ๐Ÿ’Œ. When a frame comes in, you don't need to check the FCS before demultiplexing. Any FCS is treated as padding ๐Ÿซง. Receiving an Authentication or Control packet gets noticed after the frame is passed to the demultiplexer ๐Ÿ‘€. You can easily verify the FCS with one of the software algorithms defined in "PPP in HDLC Framing" [3] (16-bit FCS) and Appendix A (32-bit FCS) ๐Ÿงฎ.

Null FCS with another FCS, using software

this is basically the same as the case above ๐Ÿ‘ฏโ€โ™€๏ธ. The packets that are required to have the FCS (Authentication, Control, or Network-Protocols lacking a checksum) get checked in software after demultiplexing. Packets that fail the FCS test get discarded as usual ๐Ÿ—‘๏ธ.

Null FCS with another FCS, using hardware

a flag gets passed along with the frame, saying whether or not it passed the hardware FCS check ๐Ÿšฉ. The incorrect FCS MUST be passed along with the rest of the data ๐Ÿ“จ. The frame MUST NOT be discarded until after demultiplexing, and only the frames that require the FCS get discarded ๐Ÿ™…โ€โ™€๏ธ.

all three FCS forms (Null, 16 and 32) may be used concurrently on different frames when using software ๐ŸŒŸ. That's probably not possible with most current hardware ๐Ÿ˜ฎโ€๐Ÿ’จ.


2.2. Self-Describing-Padding ๐Ÿงš

Description

this option lets an implementation tell its peer that it understands self-describing pads, for when padding gets added at the end of the PPP Information field ๐ŸŽˆ.

this is most likely to be used when protocols like network-layer or compression protocols are configured, since they need trailing padding detected and removed ๐Ÿ”Ž. These special protocols are identified in their own documents ๐Ÿ“š.

if the option gets Rejected, the peer MUST NOT add any padding to the identified special protocols, but MAY add padding to other protocols ๐Ÿ™ƒ.

if the option gets Ack'd, the peer MUST follow the procedures for adding self-describing pads, but only to the specifically identified protocols ๐Ÿ’–. The peer isn't required to add any padding to other protocols.

Implementation Notes:

this is set up so that the Reject handles both cases where the peer doesn't generate self-describing pads ๐Ÿญ. If the peer never generates padding, it may safely Reject the option. If the peer doesn't understand the option, it also won't successfully configure a special protocol that needs pads removed ๐Ÿฅฒ.

some senders can only add padding to every protocol, or to none at all. By design, the receiver doesn't need to look at the protocols that don't need their padding stripped ๐Ÿ‘€โœจ.

to avoid unnecessary configuration handshakes, an implementation that generates padding, and has a protocol configured that requires the padding to be known, SHOULD include this Option in its Configure-Request ๐Ÿ“. It SHOULD also Configure-Nak with this Option when it isn't present in the peer's Request ๐Ÿ’….

each octet of self-describing pad contains the index of that octet ๐Ÿ”ข. The first pad octet MUST contain the value one (1), which indicates the Padding Protocol to the Compound-Frames option 1๏ธโƒฃ. After the FCS is removed, the final pad octet tells you how many pad octets to remove ๐Ÿ—‘๏ธ. For example, three pad octets would contain the values 1, 2, 3 ๐ŸŽ€.

the Maximum-Pad-Value (MPV) is also negotiated ๐Ÿค. Only the values 1 through MPV get used. When no padding would otherwise be required, but the final octet of the PPP Information field contains a value from 1 through MPV, at least one self-describing pad octet MUST be added to the frame ๐Ÿซ . If the final octet is greater than MPV, no extra padding is needed ๐Ÿ™Œ.

Implementation Notes:

if any of the pad octets have an incorrect index value, the entire frame SHOULD be silently discarded ๐Ÿคซ. This is meant to avoid confusion with the FCS-Alternatives option, though robust implementations might not need it ๐Ÿ’ช.

since this option is meant to support compression protocols, the Maximum-Pad-Value is specified to limit how likely it is that a frame actually gets longer ๐Ÿ“.

A summary of the Self-Describing-Padding Configuration Option format is shown below. The fields go from left to right.

    0                   1                   2
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type      |    Length     |    Maximum    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Type

10

Length

3

Maximum

this field specifies the largest number of padding octets that may be added to the frame ๐Ÿ“. The value can range from 1 to 255, but values of 2, 4, or 8 are the most likely ๐ŸŒธ.


2.3. Callback ๐Ÿ“ž

Description

this option lets an implementation ask a dial-up peer to call it back ๐Ÿ“ฑ. People use it for all sorts of things, like saving on toll charges ๐Ÿ’ธ.

when Callback is successfully negotiated and authentication is complete, the Authentication phase goes straight to the Termination phase, and the link gets disconnected ๐Ÿ‘‹. Then the peer re-establishes the link without negotiating Callback again ๐Ÿ”„.

Implementation Notes:

a peer that agrees to this option SHOULD request the Authentication-Protocol Configuration Option ๐Ÿ”. The user information learned during authentication can be used to figure out where the user is, to limit a user to certain locations, or just to figure out whom to bill for the service ๐Ÿงพ.

authentication SHOULD be requested in turn by the implementation when it's called back, if mutual authentication is desired ๐Ÿค.

A summary of the Callback Option format is shown below. The fields go from left to right.

    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     |   Operation   |  Message ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Type

13

Length

>= 3

Operation

the Operation field is one octet, and it tells you what the Message field holds ๐Ÿ—‚๏ธ:

    0       location is determined by user authentication
    1       Dialing string, the format and contents of which assumes
            configuration knowledge of the specific device which is
            making the callback.
    2       Location identifier, which may or may not be human
            readable, to be used together with the authentication
            information for a database lookup to determine the
            callback location.
    3       E.164 number.
    4       Distinguished name.

Message

the Message field is zero or more octets, and what it contains depends on the Operation field ๐Ÿงฉ. The actual format is site or application specific, and a robust implementation SHOULD support the field as undistinguished octets ๐Ÿ’œ. The size comes from the Length field ๐Ÿ“.

only an authorized user is meant to have the correct site-specific info to use the Callback ๐Ÿ”. How the allowed usage of this field gets codified is outside the scope of this specification ๐ŸŒท.

2.4. Compound-Frames โœจ

Description

Okay bestie, Compound-Frames is giving packing the suitcase ๐Ÿงณ. It's a way for one implementation to send several PPP encapsulated packets inside the same frame ๐Ÿ’Œ. The original even namechecks savings on toll charges, which is such a flex ๐Ÿ’….

Only PPP Protocols with determinate lengths or integral length fields may be aggregated into a compound frame ๐ŸŽ€.

Once Compound-Frames is successfully negotiated, the sender MAY add more packets to the same frame ๐Ÿฆ‹. Each packet is immediately followed by another Protocol field, plus its datagram ๐ŸŒธ.

If padding gets tacked onto the end of the Information field, the procedure in Self-Describing-Padding gets used ๐Ÿซถ. That's why this option MUST be negotiated together with the Self-Describing-Padding option ๐Ÿ”ฅ.

If the FCS-Alternatives option has been negotiated, self describing padding MUST always be added ๐Ÿ’€. Like, always. The final packet MUST be followed by a series of octets, and the first of those contains the value one (1) ๐Ÿ‘‘.

On receipt, the first Protocol field gets checked and that packet is handled as usual ๐Ÿ’–. For datagrams with a determinate length, whatever's left of the frame goes back to the demultiplexor ๐Ÿงš. Each following Protocol field is processed as its own separate packet โœจ. Processing wraps up when a packet without a determinate length shows up, when the remainder of the frame is empty, or when the Protocol field has the value one (1) ๐ŸŒˆ.

The PPP Protocol value one (1) is reserved as the Padding Protocol ๐Ÿ“. Any following octets are removed as padding ๐Ÿงน.

A summary of the Compound-Frames Option format is shown below. The fields are transmitted from left to right ๐Ÿ“ฆ.

 0                   1
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Type      |    Length     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • Type: 15
  • Length: 2

2.4.1. LCP considerations

During initial negotiation, Compound-Frames can be used to minimize the negotiation latency by reducing the number of frames exchanged โฑ๏ธ.

The first LCP Configure-Request packet is sent as usual in a single frame, including the Self-Describing-Padding and Compound-Frames options ๐ŸŽ€.

The peer SHOULD respond with a Configure-Ack, followed in a compound frame by its LCP Configure-Request, and any NCP Configure-Requests desired ๐Ÿค.

On receipt, the local implementation SHOULD process the Configure-Ack as usual. Since the peer has agreed to send compound frames, the implementation MUST examine the remainder of the frame for additional packets ๐Ÿ”. If the peer also specified the Self-Describing-Padding and Compound-Frames options in its Configure-Request, the local implementation SHOULD retain its Configure-Ack, and further NCP configuration packets SHOULD be added to the return frame ๐Ÿ’œ.

Together with the peer's final return frame, the minimum number of frames to complete configuration is 4 ๐Ÿ”ขโœจ.


A. Fast Frame Check Sequence (FCS) Implementation ๐Ÿงฎ

A.1. 32-bit FCS Computation Method

The following code provides a table lookup computation for calculating the 32-bit Frame Check Sequence as data arrives at the interface. It's giving lookup table energy ๐Ÿ’Ž.

/*
 * u32 represents an unsigned 32-bit number.  Adjust the typedef for
 * your hardware.
 */
typedef unsigned long u32;

static u32 fcstab_32[256] =
   {
   0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
   0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
   0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
   0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
   0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
   0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
   0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
   0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
   0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
   0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
   0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
   0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
   0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
   0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
   0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
   0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
   0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
   0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
   0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
   0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
   0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
   0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
   0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
   0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
   0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
   0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
   0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
   0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
   0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
   0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
   0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
   0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
   0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
   0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
   0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
   0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
   0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
   0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
   0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
   0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
   0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
   0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
   0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
   0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
   0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
   0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
   0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
   0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
   0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
   0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
   0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
   0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
   0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
   0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
   0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
   0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
   0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
   0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
   0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
   0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
   0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
   0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
   0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
   0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
   };

#define PPPINITFCS32  0xffffffff   /* Initial FCS value */
#define PPPGOODFCS32  0xdebb20e3   /* Good final FCS value */

/*
 * Calculate a new FCS given the current FCS and the new data.
 */
u32 pppfcs32(fcs, cp, len)
    register u32 fcs;
    register unsigned char *cp;
    register int len;
    {
    ASSERT(sizeof (u32) == 4);
    ASSERT(((u32) -1) > 0);
    while (len--)

        fcs = (((fcs) >> 8) ^ fcstab_32[((fcs) ^ (*cp++)) & 0xff]);

    return (fcs);
    }

/*
 * How to use the fcs
 */
tryfcs32(cp, len)
    register unsigned char *cp;
    register int len;
{
    u32 trialfcs;

    /* add on output */
    trialfcs = pppfcs32( PPPINITFCS32, cp, len );
    trialfcs ^= 0xffffffff;             /* complement */
    cp[len] = (trialfcs & 0x00ff);      /* Least significant byte first */
    cp[len+1] = ((trialfcs >>= 8) & 0x00ff);
    cp[len+2] = ((trialfcs >>= 8) & 0x00ff);
    cp[len+3] = ((trialfcs >> 8) & 0x00ff);

    /* check on input */
    trialfcs = pppfcs32( PPPINITFCS32, cp, len + 4 );
    if ( trialfcs == PPPGOODFCS32 )
        printf("Good FCS\n");
}

Security Considerations ๐Ÿ”

Security issues are briefly discussed in sections concerning the Callback Configuration Option. Go check those out, they're important ๐Ÿšจ.


References ๐Ÿ“š

[1] Simpson, W., Editor, "The Point-to-Point Protocol (PPP)", RFC 1548, Daydreamer, December 1993.

[2] Reynolds, J., and J. Postel, "Assigned Numbers", STD 2, RFC 1340, USC/Information Sciences Institute, July 1992.

[3] Simpson, W., Editor, "PPP in HDLC Framing", RFC 1549, Daydreamer, December 1993.


Acknowledgments ๐Ÿซถ

The Identification feature was suggested by Bob Sutterfield (Morning Star Technologies).

The Time-Remaining feature was suggested by Brad Parker (FCR).

Some of the original text for FCS-Alternatives was provided by Arthur Harvey (then of DEC). The Null FCS was requested by Peter Honeyman (UMich). The 32-bit FCS example code was provided by Karl Fox (Morning Star Technologies).

Self-Describing-Padding was suggested and named by Fred Baker (ACC).

Compound-Frames was suggested by Keith Sklower (Berkeley).

Special thanks to Morning Star Technologies for providing computing resources and network access support for writing this specification ๐Ÿ’–.


Chair's Address ๐ŸŽ€

The working group can be contacted via the current chair:

Fred Baker
Advanced Computer Communications
315 Bollay Drive
Santa Barbara, California  93117

EMail: fbaker@acc.com

Editor's Address ๐ŸŒธ

Questions about this memo can also be directed to:

William Allen Simpson
Daydreamer
Computer Systems Consulting Services
1384 Fontaine
Madison Heights, Michigan  48071

EMail: Bill.Simpson@um.cc.umich.edu
       bsimpson@MorningStar.com
๐Ÿ“ฆ where this page comes from