ary information between hierarchical regions. In each TE epoch (iteration), they run in a recursive fashion in the hierarchy. We first provide an overview and delve into the details in the later sections. Bottom-up recursion: In SdnTE, each TE epoch starts with smart assignment of flow requests to cNodes to efficiently distribute the 4.7 Summary TE load. This is accompanied by providing some hints to cNodes regarding the physical topology to allow them efficiently participate in the global TE. Starting from the leaf level, recursively upward, each cNode (through AbsApp) collects flow requests from its region. Then, it makes local decision on whether or not offload some of the flows its parent region through the abstract hSwitch. Also, it associates a logical fabric to the abstract hSwitch and sends it to the parent. A fabric is a compact, dynamic representation of performance and resources in the cNode's region. However, it is more than a fixed and lossy graph built from the physical topology (e.g., PNNI [101]). In fact, it is computed based on the cNode's local flows and objective function as well as its parent's behavior in the past. The bottom-up procedure stops when the root cNode learns its flows and fabrics. Top-down recursion: In SdnTE, each TE epoch finishes with com- puting TE results and enforcing them in the physical data plane. Recursively downward, each cNode through AbsApp (except root) receives some flow requests on the abstract hSwitch from its parent when after the TE in the upper-level region. Considering the local hSwitch's fabrics, each cNode's OptApp computes multiple paths for each of its local and parent flows on its abstract topology. Then it allocates bandwidth to them by running a linear program. Finally, each cNode's EnfApp programs its region to split flows based on the TE results into multiple label-based tunnels (e.g., MPLS) between its endpoints. Each cNode locally minimizes the forwarding states that needs to be pushed into its local hSwitchs or child regions. For this purpose, Enf