123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324 |
- //
- // This library is free software, you can redistribute it
- // and/or modify
- // it under the terms of the GNU Lesser General Public License
- // as published by the Free Software Foundation;
- // either version 2 of the License, or any later version.
- // The library is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- // See the GNU Lesser General Public License for more details.
- //
- //
- // @page standards.html, MPLS/RSVP/LDP Model - Implemented Standards
- //
- // The implementation follows those RFCs below:
- // - RFC 2702: Requirements for Traffic Engineering Over MPLS
- // - RFC 2205: Resource ReSerVation Protocol
- // - RFC 3031: Multiprotocol Label Switching Architecture
- // - RFC 3036: LDP Specification
- // - RFC 3209: RSVP-TE Extension to RSVP for LSP tunnels
- // - RFC 2205: RSVP Version 1 - Functional Specification
- // - RFC 2209: RSVP Message processing Version 1
- //
- //#------------------------------------------------------------------------
- // @page mpls-pseudocode.html, MPLS Operation
- //
- // The following algorithm is carried out by the ~MPLS module:
- //
- // <pre>
- // Step 1: - Check which layer the packet is coming from
- // Alternative 1: From layer 3
- // Step 1: Find and check the next hop of this packet
- // Alternative 1: Next hop belongs to this MPLS cloud
- // Step 1: Encapsulate the packet in an MPLS packet with
- // IP_NATIVE_LABEL label
- // Step 2: Send to the next hop
- // Step 3: Return
- // Alternative 2: Next hop does not belong to this MPLS cloud
- // Step 1: Send the packet to the next hop
- // Alternative 2: From layer 2
- // Step 1: Record the packet incoming interface
- // Step 2: - Check if the packet is for this LSR
- // Alternative 1: Yes
- // Step 1: Check if the packet has label
- // Alternative 1: Yes
- // Step 1: Strip off all labels and send the packet to L3
- // Step 2: Return
- // Alternative 2: No
- // Step 1: Send the packet to L3
- // Step 2: Return
- // Alternative 2: No
- // Step 1: Continue to the next step
- // Step 3: Check the packet type
- // Alternative 1: The packet is native IP
- // Step 1: Check the LSR type
- // Alternative 1: The LSR is an Ingress Router
- // Step 1: Look up LIB for outgoing label
- // Alternative 1: Label cannot be found
- // Step 1: Check if the label for this FEC is being requested
- // Alternative 1: Yes
- // Step 1: Return
- // Alternative 2: No
- // Step 1: Store the packet with FEC id
- // Step 2: Do request the signalling component
- // Step 3: Return
- // Alternative 2: Label found
- // Step 1: Carry out the label operation on the packet
- // Step 2: Forward the packet to the outgoing interface found
- // Step 3: Return
- // Alternative 2: The LSR is not an Ingress Router
- // Step 1: Print out the error
- // Step 2: Delete the packet and return
- // Alternative 2: The packet is MPLS
- // Step 1: Check the LSR type
- // Alternative 1: The LSR is an Egress Router
- // Step 1: POP the top label
- // Step 2: Forward the packet to the outgoing interface found
- // Step 3: Return
- // Alternative 2: The LSR is not an Egress Router
- // Step 1: Look up LIB for outgoing label
- // Alternative 1: Label cannot be found
- // Step 1: Check if the label for this FEC is being requested
- // Alternative 1: Yes
- // Step 1: Return
- // Alternative 2: No
- // Step 1: Store the packet with FEC id
- // Step 2: Do request the signalling component
- // Step 3: Return
- // Alternative 2: Label found
- // Step 1: Carry out the label operation on the packet
- // Step 2: Forward the packet to the outgoing interface found
- // Step 3: Return
- // Step 2: Return
- // </pre>
- //
- //
- //#------------------------------------------------------------------------
- // @page ldp-processing.html, LDP Message Processing
- //
- // The simulation follows message processing rules specified in RFC3036
- // (LDP Specification). A summary of the algorithm used in the RFC is
- // presented below.
- //
- // <b>Label Request Message processing</b>
- //
- // An LSR may transmit a Request message under any of the conditions below:
- // - The LSR recognizes a new FEC via the forwarding tale, and the next hop
- // is its LDP peer. The LIB of this LSR does not have a mapping from the
- // next hop for the given FEC.
- // - Network topology changes, the next hop to the FEC is no longer valid
- // and new mapping is not available.
- // - The LSR receives a Label Request for a FEC from an upstream LDP and it
- // does not have label binding information for this FEC. The FEC next hop
- // is an LDP peer.
- //
- // Upon receiving a Label Request message, the following procedures will be
- // performed:
- //
- // <pre>
- // Step 1: Extract the FEC from the message and locate the incoming interface
- // of the message.
- // Step 2: Check whether the FEC is an outstanding FEC.
- // Alternative 1: This FEC is outstanding
- // Step 1: Return
- // Alternative 2: This FEC is not outstanding
- // Step 1: Continue
- // Step 3: Check if there is an exact match of the FEC in the routing table.
- // Alternative 1: There is an exact match
- // Step 1: Continue
- // Alternative 2: There is no match
- // Step 1: Construct a Notification message of No route and
- // send this message back to the sender.
- // Step 4: Make query to local LIB to find out the corresponding label.
- // Alternative 1: The label found
- // Step 1: Construct a Label Mapping message and send over
- // the incoming interface.
- // Alternative 2: The label cannot be found for this FEC
- // Step 1: Construct a new Label Request message and send
- // the message out using L3 routing.
- // Step 2: Construct a Notification message indicating that the
- // label cannot be found.
- // </pre>
- //
- // <b>Label Mapping Message processing</b>
- //
- // Upon receiving a Label Mapping message, the following procedures will be
- // performed:
- //
- // <pre>
- // Step 1: Extract the FEC and the label from the message.
- // Step 2: Check whether this is an outstanding FEC
- // Alternative 1: This FEC is outstanding
- // Step 1: Continue
- // Alternative 2: This FEC is not outstanding
- // Step 1: Send back the server an Notification of Error message.
- // Step 3: Install the new label to the local LIB using the extracted label,
- // FEC and the message incoming interface.
- // </pre>
- //
- //
- //#------------------------------------------------------------------------
- // @page lib-table-file.html, LIB Table File Format
- //
- // The format of a LIB table file is:
- //
- // The beginning of the file should begin with comments. Lines begin with # are treated
- // as comments. An empty line is required after the comments. The "LIB TABLE"
- // syntax must come next with an empty line. The column headers follow. This header
- // must be strictly "In-lbl In-intf Out-lbl Out-intf". Column
- // values are after that with space or tab for field separation.
- // The following is a sample of lib table file.
- //
- // <pre>
- // #lib table for MPLS network simulation test
- // #lib1.table for LSR1 - this is an edge router
- // #no incoming label for traffic from in-intf 0 &1 - LSR1 is ingress router for those traffic
- // #no outgoing label for traffic from in_intf 2 &3 - LSR 1 is egress router for those traffic
- //
- // LIB TABLE:
- //
- // In-lbl In-intf Out-lbl Out-intf
- // 1 193.233.7.90 1 193.231.7.21
- // 2 193.243.2.1 0 193.243.2.3
- // </pre>
- //
- //#------------------------------------------------------------------------
- // @page cspf-algorithm.html, The CSPF Algorithm
- //
- // CSPF stands for Constraint Shortest Path First.
- // This constraint-based routing is executed online by Ingress Router.
- // The CSPF calculates an optimum explicit route (ER), based on
- // specific constraints. CSPF relies on a Traffic Engineering Database (TED)
- // to do those calculations. The resulting route is then used by RSVP-TE.
- //
- // The CSPF in particular and any constraint based routing process requires following
- // inputs:
- // - Attributes of the traffic trunks, e.g., bandwidth, link affinities
- // - Attributes of the links of the network, e.g. bandwidth, delay
- // - Attributes of the LSRs, e.g. types of signaling protocols supported
- // - Other topology state information.
- //
- // There has been no standard for CSPF so far. The implementation of CSPF in
- // the simulation is based on the concept of "induced graph" introduced in RFC
- // 2702. An induced graph is analogous to a virtual topology in an overlay
- // model. It is logically mapped onto the physical network through the
- // selection of LSPs for traffic trunks. CSPF is similar to a normal SPF,
- // except during link examination, it rejects links without capacity or links
- // that do not match color constraints or configured policy. The CSPF
- // algorithm used in the simulation has two phases. In the first phase, all
- // the links that do not satisfy the constraints of bandwidth are excluded
- // from the network topology. The link affinity is also examined in this
- // phase. In the second phase, Dijkstra algorithm is performed.
- //
- // Dijkstra Algorithm:
- //
- // <pre>
- // Dijkstra(G, w, s):
- // Initialize-single-source(G,s);
- // S = empty set;
- // Q = V[G];
- // While Q is not empty {
- // u = Extract-Min(Q);
- // S = S union {u};
- // for each vertex v in Adj[u] {
- // relax(u, v, w);
- // }
- // }
- // </pre>
- //
- // In which:
- // - G: the graph, represented in some way (e.g. adjacency list)
- // - w: the distance (weight) for each edge (u,v)
- // - s (small s): the starting vertex (source)
- // - S (big S): a set of vertices whose final shortest path from s have already been determined
- // - Q: set of remaining vertices, Q union S = V
- //
- //
- //#------------------------------------------------------------------------
- // @page traffic-xml-file.html, The traffic.xml file
- //
- // The traffic.xml file is read by the RSVP-TE module (RSVP).
- // The file must be in the same folder as the executable
- // network simulation file.
- //
- // The XML elements used in the "traffic.xml" file:
- // - <Traffic></Traffic> is the root element. It may contain one or more <Conn>
- // elements.
- // - <Conn></Conn> specifies an RSVP session. It may contain the following elements.
- // - <src></src> specifies sender IP address
- // - <dest></dest> specifies receiver IP address
- // - <setupPri></setupPri> specifies LSP setup priority
- // - <holdingPri></holdingPri> specifies LSP holding priority
- // - <bandwidth></bandwidth> specifies the requested BW.
- // - <delay></delay> specifies the requested delay.
- // - <route></route> specifies the explicit route. This is a comma-separated
- // list of IP address, hop-type pairs (also separated by comma).
- // A hop type has a value of 1 if the hop is a loose hop and 0 otherwise.
- //
- // The following presents an example file:
- //
- // <pre>
- // <?xml version="1.0"?>
- // <!-- Example of traffic control file -->
- // <traffic>
- // <conn>
- // <src>10.0.0.1</src>
- // <dest>10.0.1.2</dest>
- // <setupPri>7</setupPri>
- // <holdingPri>7</holdingPri>
- // <bandwidth>400</bandwidth>
- // <delay>5</delay>
- // </conn>
- // <conn>
- // <src>11.0.0.1</src>
- // <dest>11.0.1.2</dest>
- // <setupPri>7</setupPri>
- // <holdingPri>7</holdingPri>
- // <bandwidth>100</bandwidth>
- // <delay>5</delay>
- // </conn>
- // </traffic>
- // </pre>
- //
- // An example of using RSVP-TE as signaling protocol can be found in
- // ExplicitRouting folder distributed with the simulation. In this
- // example, a network similar to the network in LDP-MPLS example is
- // setup. Instead of using LDP, "signaling" parameter is set to 2 (value
- // of RSVP-TE handler). The following xml file is used for traffic
- // control. Note the explicit routes specified in the second connection.
- // It indicates that the route is a strict one since the values of every
- // hop types are 0. The route defined is 10.0.0.1 -> 1.0.0.1 ->
- // 10.0.0.3 -> 1.0.0.4 -> 10.0.0.5 -> 10.0.1.2.
- //
- // <pre>
- // <?xml version="1.0"?>
- // <!-- Example of traffic control file -->
- // <traffic>
- // <conn>
- // <src>10.0.0.1</src>
- // <dest>10.0.1.2</dest>
- // <setupPri>7</setupPri>
- // <holdingPri>7</holdingPri>
- // <bandwidth>0</bandwidth>
- // <delay>0</delay>
- // <ER>false</ER>
- // </conn>
- // <conn>
- // <src>11.0.0.1</src>
- // <dest>11.0.1.2</dest>
- // <setupPri>7</setupPri>
- // <holdingPri>7</holdingPri>
- // <bandwidth>0</bandwidth>
- // <delay>0</delay>
- // <ER>true</ER>
- // <route>1.0.0.1,0,1.0.0.3,0,1.0.0.4,0,1.0.0.5,0,10.0.1.2,0</route>
- // </conn>
- // </traffic>
- // </pre>
- //
- package inet;
|