Views
OpenFlowMPLS Virtual Ports
From OpenFlow Wiki
This page is no longer maintained. For up to date information on the OpenFlow MPLS Extension, please visit the main page and the pages linked from there: OpenFlowMPLS.
Virtual Ports
Our design philosophy is:
- Have a general scheme independent of a given protocol
- Have a set of actions associated with the virtual port that are within the scope of a lightweight OF switch
- Flexibility, and scalability to handle future needs
Ports
Virtual Ports (VP) fall into the general context of ports on a switch. An OF switch will maintain a Port Table. Each port will be identified with a handle that can be used to index the Port Table (PT).
Each entry on the port will contain:
- the set of actions required to put a packet out on the port
- pointer to port data block (counters etc.)
- parent port (to support a hierarchy of ports)
Port Handle:
A port handle is a 32 bit unsigned number, which indexes the Port Table.
The Port Table is comprised of these regions:
- Port 0 is an invalid port.
- First 64K entries are reserved for physical ports
- The next 1G(minus 64K) entries are the Virtual Ports
- The final 3G entries are the Outgoing Port List (OPL)
The Outgoing Port List (OPL) is used for Multicast, and other applications that require replication, for example VPLS.
Actions:
Examples of actions associated with flows and interfaces include:
- Push (buffer, size, value)
- Push_MPLS_label (buffer, size, value, BoS, CoS, TTL)
- Pop (buffer, size)
- Pop_MPLS_label (buffer, size, value, TTL)2
In the case ofpush_MPLS_label the label pushed is:
Bottom of Stack (BoS)
This bit indicates the bottom of the stack:
If (TA<BoS [1]>) {
BoS = TA<BoS[0]>
} Else if (EType == MPLS) {
BoS = Packet_Label<BoS>
}
Class of Service (CoS)
CoS bits are computed as:
If (TA<CoS [3]>) {
CoS = TA<CoS [2:0]>
} Else if (EType == MPLS) {
CoS = Packet_Label<CoS>
} else if ((TA<CoS [4]>) && (EType == IP)) {
CoS = Packet_IP<ToS>
} else if (EType == 1Q) {
CoS = Packet_1Q<PCP>
}
TTL
The Time To Live (TTL) bits are computed as:
If (TA<TTL[8]>) {
TTL = TA<TTL[7:0]>
} Else if (EType == MPLS) {
TTL = Packet_Label<TTL-1>
} else (EType == IP) {
TTL = Packet_IP<TTL>
}
Use Case: MPLS
At Ingress: Controller will perform these actions:
- one Allocate a VP (local to the switch) for the MPLS LSP, say VP1
- Build the set of actions for the VP. In this case the action is:
- Push_MPLS_Lbl (shim buffer, LABEL1 value, BoS = 01b, CoS (take form IP header), TTL (take from IP header))
- Download the VP to the switch Port Table (PT)
- Install a Matching Entry in the Flow table:
- - Flow = LSP FEC
- - Actions:
- - Outgoing Port = VP1
At Transit: Controller will perform these actions:
- Allocate a VP (local to the switch) for the MPLS LSP, say VP1
- Build the set of actions for the VP. In this case the action is:
- - Push_MPLS_Lbl (shim buffer, LABEL2 value, BoS = 10b, CoS (take form MPLS label), TTL (take from MPLS label-1))
- Download the VP to the switch Port Table (PT)
- Install a Matching Entry in the Flow Table:
- EType == MPLS
- Top Label == LABEL1
- Actions:
- - Pop (buffer shim, 4 bytes)
- - Outgoing Port = VP1
At Egress: Controller will perform these actions:
- Install a Matching Entry in the Flow Table:
- - EType == MPLS
- - Top Label == LABEL2
- - Actions:
- - Pop (buffer shim, 4 bytes)
- - Rewrite IP TTL from MPLS TTL
- - Outgoing Port = As desired for the FEC



