OpenFlowMPLS Virtual Ports

From OpenFlow Wiki

Jump to: navigation, search

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)



Openflow mpls figure4.jpg



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)



Openflow mpls figure5.jpg



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:

Openflow mpls figure6.jpg



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:

  1. one Allocate a VP (local to the switch) for the MPLS LSP, say VP1
  2. 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))
  1. Download the VP to the switch Port Table (PT)
  2. Install a Matching Entry in the Flow table:
- Flow = LSP FEC
- Actions:
- Outgoing Port = VP1



At Transit: Controller will perform these actions:

  1. Allocate a VP (local to the switch) for the MPLS LSP, say VP1
  2. 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))
  1. Download the VP to the switch Port Table (PT)
  2. Install a Matching Entry in the Flow Table:
  3. EType == MPLS
  4. Top Label == LABEL1
  5. Actions:
- Pop (buffer shim, 4 bytes)
- Outgoing Port = VP1

At Egress: Controller will perform these actions:

  1. 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