Protocol Stack Design Pattern

Intent

We have already seen that Protocol Layer and
Protocol Packet provide a
standardized interface between different layers of a protocol. The Protocol
Stack design pattern takes advantage of the layer decoupling and provides a
mechanism for dynamic insertion and removal of protocol layers from a stack.

Also Known As

Protocol Layer Manager

Protocol Layer Collection

Motivation

Protocol stacks tend to be rigid in design and protocol layers cannot be
dynamically added or removed from a protocol stack. This limits the use of
protocol stacks in the even changing world of protocol standards. There are
several scenarios where the layers in a protocol stack need to be changed on the
fly. A few examples are:

An application detects the failure of the physical layer and decides to
use a different medium to transport data. The application decides to change
the lower layers of the protocol while keeping the upper layers intact.

The user has enabled encryption and this requires the sandwiching of the
encryption layer between the network layer and the data-link layer.

The protocol stack designer needs to debug the interactions between the
network layer and transport layer. This can be accomplished by sandwiching a
pass-through logging layer that stores all the messages that get exchanged
between the layers.

The Protocol Stack design pattern addresses this issue and introduces a
flexible architecture for dynamic addition and removal of protocol layers.

Applicability

The Protocol Stack Design pattern can be used to implement any type of
layered protocol. It can be also used when different operations on an entity
need to be performed in a pipeline fashion. Each stage of the pipeline could be
modeled as a layer. This pattern is particularly useful in applications
involving dynamic layer manipulation. A few applications are:

Changing the physical layer when the application detects failure of the
physical layer.

Participants

Protocol Layer:
This is the base class for all protocol layers. The individual layers
interface with each other via pointers to this class. The actual type of the
upper layer and lower layer classes is not known to the implementers of a
certain layer.

Collaboration

The following diagram shows the relationship and collaboration between
various classes needed for the Datalink layer example.

Consequences

The Protocol Stack design pattern breaks down the rigid protocol layer
structure and provides a very flexible solution where layers can be dynamically
added and removed from the stack.

The figure below shows the flexibility of the pattern in supporting different
layer organizations. The examples in the figure demonstrate:

A debug pass-through layer that displays the messages being exchanged
between the datalink layer and the physical layer.

A loopback layer that facilitates the testing of the datalink and network
layers by just looping back all transmitted messages back for receive.

An echo-back layer allows the protocol stack to emulate a node by just
echoing back all higher layer messages back for transmission.

An encryption layer sandwiched between the datalink and physical layers.
This layers encrypts and decrypts data that is passed between these layers.

Implementation

The Protocol Stack is implemented as a single class. The class maintains a
doubly linked list of Protocol Layers. Important methods of the class are:

Handle_Transmit: This handler is
invoked by the application to transmit messages using the protocol stack.

Handle_Receive: This handler is
invoked by the device to pass received messages to the protocol stack.

Add_Layer: Add a protocol layer
at a specific position in the protocol stack.

Remove_Layer: Remove a layer from
the protocol stack.

Sample Code and Usage

The code for the Protocol Stack class is
presented below:

Protocol Stack Header File

Protocol Stack Source File

Known Uses

The Protocol Stack design pattern can be used where ever a layered but
decoupled organization is required.