Internet DRAFT - draft-irtf-sdnrg-pop

draft-irtf-sdnrg-pop



 



INTERNET-DRAFT                                                   Y. Tian
Intended Status: Informational               Univ. Sci. & Tech. of China
Expires: July 6, 2017                                                   
                                                                        
                                                                        
                                                                        
                                                         January 5, 2017



   Programming Model for Protocol Oblivious Forwarding SDN Networks 
                        draft-irtf-sdnrg-pop-00


Abstract

   This document presents POP, a Software-Defined Networking (SDN)
   programming model for the Protocol Oblivious Forwarding (POF)
   network. POF is an SDN forwarding plane technology proposed by
   Huawei. A POF forwarding element (FE) does no need to understand the
   packet format, and can be programmed to support new forwarding
   protocols. POP enables user to define forwarding protocols and
   program the POF SDN network on the centralized control plane with
   algorithmic policies that are expressed with high-level programming
   languages.


Status of this Memo

   This Internet-Draft is submitted to IETF in full conformance with the
   provisions of BCP 78 and BCP 79.

   Internet-Drafts are working documents of the Internet Engineering
   Task Force (IETF), its areas, and its working groups.  Note that
   other groups may also distribute working documents as
   Internet-Drafts.

   Internet-Drafts are draft documents valid for a maximum of six months
   and may be updated, replaced, or obsoleted by other documents at any
   time.  It is inappropriate to use Internet-Drafts as reference
   material or to cite them other than as "work in progress."

   The list of current Internet-Drafts can be accessed at
   http://www.ietf.org/1id-abstracts.html

   The list of Internet-Draft Shadow Directories can be accessed at
   http://www.ietf.org/shadow.html

 


<Author>                 Expires <Expiry Date>                  [Page 1]

INTERNET DRAFT              <Document Title>                <Issue Date>


Copyright and License Notice

   Copyright (c) 2016 IETF Trust and the persons identified as the
   document authors. All rights reserved.

   This document is subject to BCP 78 and the IETF Trust's Legal
   Provisions Relating to IETF Documents
   (http://trustee.ietf.org/license-info) in effect on the date of
   publication of this document. Please review these documents
   carefully, as they describe your rights and restrictions with respect
   to this document. Code Components extracted from this document must
   include Simplified BSD License text as described in Section 4.e of
   the Trust Legal Provisions and are provided without warranty as
   described in the Simplified BSD License.



Table of Contents

   1  Introduction  . . . . . . . . . . . . . . . . . . . . . . . . .  3
     1.1  Terminology . . . . . . . . . . . . . . . . . . . . . . . .  4
   2  Programming Model . . . . . . . . . . . . . . . . . . . . . . .  4
   3  Protocol Specification Language . . . . . . . . . . . . . . . .  5
   4  Programming APIs for Protocol Oblivious Networking Algorithm  .  7
     4.1 Packet Operation API . . . . . . . . . . . . . . . . . . . .  7
     4.2 Net Topology Search API  . . . . . . . . . . . . . . . . . . 10
     3.3 Path Planning API  . . . . . . . . . . . . . . . . . . . . . 12
   5  Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
   6  References  . . . . . . . . . . . . . . . . . . . . . . . . . . 15
     6.1  Normative References  . . . . . . . . . . . . . . . . . . . 15
     6.2  Informative References  . . . . . . . . . . . . . . . . . . 15
   Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 15
















 


<Author>                 Expires <Expiry Date>                  [Page 2]

INTERNET DRAFT              <Document Title>                <Issue Date>


1  Introduction

   Software-Defined Networking (SDN)[RFC7149] gives operators
   programmatic control over their networks. In SDN, the control plane
   is physically separate from the forwarding plane, and one control
   plane controls multiple forwarding devices. In SDN, a common, open,
   vendor-agnostic interface between the control plane and the
   forwarding plane, which may contain forwarding devices from different
   hardware and software vendors, is required. OpenFlow is such an
   interface. In OpenFlow, operators express their rules with the
   abstractions that could match packets on a dozen header fields (e.g.,
   MAC addresses, IP addresses, protocol, TCP/UDP port numbers, etc.),
   and specify the corresponding actions (e.g., output, drop,
   encapsulate, etc.). 

   Generally speaking, a packet is composed of multiple protocol headers
   and payload. The protocol headers are parsed and modified by NP
   micro-code or ASIC logic during the forwarding process. The position
   of each protocol field, such as the IPv4 source address, is
   calculated by the code that is preloaded into the devices according
   to protocol format by the device vendor. If one new protocol needs to
   be supported, the code must be modified. This will lead to a long
   deployment cycle for new services based on new protocols.

   The current OpenFlow-based SDN[RFC7426] cannot resolve the
   aforementioned problem. The position of the protocol fields cannot be
   derived from the flow's forwarding instructions. So the position of
   each protocol fields must be calculated by the code, which means the
   code of the devices must be modified for processing new protocol
   headers.

   For this reason, Huawei presents the Protocol Oblivious Forwarding
   (POF) technology. The basic idea is to denote any protocol field, as
   well as the metadata, which is considered as one special protocol
   header that can be configured by the controller, with a triad of
   <type, offset, length>.

   POF also defines a set of protocol oblivious forwarding
   actions/instructions. The actions/instructions can realize the
   functions of all forwarding instructions/actions defined in OpenFlow,
   not only for the existing protocols but also for any new protocols. 

   With the protocol oblivious data plane that are composed of POF
   forwarding devices, a programming model that enable user to program
   such a data plane is required. This memo presents POP, an open, easy-
   to-use, and efficient programming model.

   The memo describes a protocol specification language that enable user
 


<Author>                 Expires <Expiry Date>                  [Page 3]

INTERNET DRAFT              <Document Title>                <Issue Date>


   to specify any network protocol that he intends to program on the POF
   network. Then the programming API that allows user to program the POF
   network is introduced. The memo also contains demonstration
   examples.


1.1  Terminology

   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
   "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
   document are to be interpreted as described in RFC 2119 [RFC2119].


    Software-Defined Networking (SDN) - A programmable networks approach
    that supports the separation of control and forwarding planes via
    standardized interfaces.

    Forwarding Plane (FP) - The collection of resources across all
    network devices responsible for forwarding traffic.

    Control Plane (CP) - The collection of functions responsible for
    controlling one or more network devices.CP instructs network devices
    with respect to how to process and forward packets.  The control
    plane interacts primarily with the forwarding plane and, to a lesser
    extent, with the operational plane.

    Protocol Oblivious Forwarding (POF) - The protocol that is proposed
    by Huawei to provide a new way to develop SDN. 

2  Programming Model

    To program a protocol oblivious data plane,the POP programming model
    use protocol specification language to specify the network protocol
    in the network.Then user can write their own network algorithm to
    program the POF network with the programming API.The run-time system
    in the POP Should transfer the algorithm to the accurate protocol
    oblivious forwarding actions/instructions and send to the POF
    Switches.

    +------------------------------------------------------------+
    | +-----------------+ +-------------------------------+      |
    | |Network algorithm| |Protocol Specification Language| User |
    | +-----------------+ +-------------------------------+      |
    +------------------------------------------------------------+

    +------------------------------------------------------------+
    |                    POP Controller                          |
    +--------+--------------------+----------------------+-------+
 


<Author>                 Expires <Expiry Date>                  [Page 4]

INTERNET DRAFT              <Document Title>                <Issue Date>


             |                    |                      |
             |                    |                      |
    +--------v--------------------v----------------------v-------+

    +------------------------------------------------------------+
    |                    +-------------+                         |
    |                    | POF Switch  |                         |
    |                    +-------------+                         |
    |   +-------------+                        +-------------|   |
    |   | POF Switch  |                        | POF Switch  |   |
    |   +-------------+                        +-------------+   |
    +------------------------------------------------------------+

3  Protocol Specification Language

    Protocol Specification Language is learned from P4. It include a
    number of protocol header definitions and a "start" symbol which
    represent the starting protocol header while parsing. User can
    define the protocol header layer by layer. The BNF normal form of
    Protocol Specification Language is showed as follows.

      Identifier and unsigned number: The "IDENT" represent Identifier.
      "NUMBER" represent unsigned number. "e" represent NULL.
      +------------------------------------------------------------+
      |IDENT ::= [_a-zA-Z][_0-9a|zA-Z]*                            |
      |NUMBER ::= 0[bB][01]+|0[0|7]*|[1-9][0-9]*|0[xX][0-9a-fA-F]+ |
      +------------------------------------------------------------+

      Main program: a number of protocol header definitions and "start"
      symbol.
      +------------------------------------------------------------+
      |program ::= headers start                                   |
      |start ::= "start" IDENT ";"                                 |
      |headers ::= e | header headers | header_decl headers        |
      +------------------------------------------------------------+

      Header definition: Include header name, protocol fields list,
      header length, next-layer selection.
      +------------------------------------------------------------+
      |header ::= "header" IDENT "{" fields length next "}"        |
      |header_decl ::= "header" IDENT ";"                          |
      +------------------------------------------------------------+

      Protocol fields: each field include a binary length. A protocol
      allows at most one field which length is uncertain and mark as
      "*". Meanwhile, it should at the end of the list.
      +------------------------------------------------------------+
      |program ::= headers start                                   |
 


<Author>                 Expires <Expiry Date>                  [Page 5]

INTERNET DRAFT              <Document Title>                <Issue Date>


      |start ::= "start" IDENT ";"                                 |
      |headers ::= e | header headers | header_decl headers        |
      +------------------------------------------------------------+

      Header length: option, is a expression consists of field name and
      constant. When it's implicit, the protocol fields list can
      calculate header length automatically.
      +------------------------------------------------------------+
      |length ::= e | "length" ":" expr ";"                        |
      +------------------------------------------------------------+

      Expression: follow language specification of C. Operator have
      different priority from high to low. Operator which have the same
      priority cannot bond except bracket.
      +------------------------------------------------------------+
      |expr ::= IDENT | NUMBER |                                   |
      |"(" expr ")" | (bracket)                                    |
      |"~" expr | (NOT)                                            |
      |expr "+" expr | expr "-" expr | (Add/Subtract)              |
      |expr "<>" expr | expr "<>" expr | (shift logical left/right)|
      |expr "&" expr | (AND)                                       |
      |expr "^" expr | (XOR)                                       |
      |expr "|" expr (OR)                                          |
      +------------------------------------------------------------+

      Next-layer selection: according to value of one header field. Each
      case include the value and next-layer header name. Next header
      name can be recursive directly or indirectly. But the header name
      should has been defined or are defined.
      +------------------------------------------------------------+
      |next ::= e | "next" "select" "(" IDENT ")" "{" cases "}"    |
      |cases ::= e | "case" NUMBER ":" IDENT ";" cases             |
      +------------------------------------------------------------+















 


<Author>                 Expires <Expiry Date>                  [Page 6]

INTERNET DRAFT              <Document Title>                <Issue Date>


4  Programming APIs for Protocol Oblivious Networking Algorithm Users
      make use of a series of API to define network
      algorithm.Functionly,those APIs include three parts which named
      'Packet Operation','Net Topology Search' and 'Path Planing'.

4.1 Packet Operation API

      POP supports any kinds of protocol message format that the API for
      message operation doesn't rely on any specific protocol.As figure
      2,POP supplies a 'layer-by-layer progressive' method by the
      concept of network protocol stack that the packet is parsed into
      many layers.

      POP supports for the following Packet Operation API:

      read_packet_inport
      +------------------------------------------------------------+
      |int read_packet_inport(struct packet *pkt);                 |
      |function::read the enter port of packet                     |
      |input:                                                      |
      |     pkt                   packet                           |
      |output:                                                     |
      |     current packet enter port number of switch             |
      +------------------------------------------------------------+
      read_packet_inswitch
      +------------------------------------------------------------+
      |struct entity *read_packet_inswitch(struct packet *pkt);    |
      |function::read the enter switch of packet                   |
      |input:                                                      |
      |     pkt                   packet                           |
      |output:                                                     |
      |     current packet's enter switch number                   |
      +------------------------------------------------------------+
      pull_header
      +------------------------------------------------------------+
      | void pull_header(struct packet *pkt);                      |
      |function::move current header point to                      |
      |          the next protocol layer                           |
      |input:                                                      |
      |     pkt                   packet                           |
      |output:                                                     |
      |     none                                                   |
      +------------------------------------------------------------+





 


<Author>                 Expires <Expiry Date>                  [Page 7]

INTERNET DRAFT              <Document Title>                <Issue Date>


      read_header_type
      +------------------------------------------------------------+
      |const char *read_header_type(struct packet *pkt);           |
      |function::read the name of current header                   |
      |input:                                                      |
      |     pkt                   packet                           |
      |output:                                                     |
      |     current header's name                                  |
      +------------------------------------------------------------+
      read_packet
      +------------------------------------------------------------+
      |value_t read_packet(struct packet *pkt,const char *field);  |
      |function::read fields of packet                             |
      |input:                                                      |
      |     pkt                   packet                           |
      |     field_name            field name                       |
      |output                                                      |
      |     value of current field_name                            |
      |                                                            |
      +------------------------------------------------------------+
      test_equal
      +------------------------------------------------------------+
      |bool test_equal(struct packet *pkt,const char *field,       |
      |                value_t value);                             |
      |function::test value of packet fields                       |
      |input:                                                      |
      |     pkt                   packet                           |
      |     field_name            field_name                       |
      |     value                 value waiting for test           |
      |output:                                                     |
      |     if field_name value is equal to value,return true;     |
      |     else return false                                      |
      +------------------------------------------------------------+
      read_payload
      +------------------------------------------------------------+
      |const uint8_t *read_payload(struct packet *pkt,int *length);|
      |function::read payload of packet                            |
      |input:                                                      |
      |     pkt                   packet                           |
      |output:                                                     |
      |     relative to current header payload:len is output value,|
      |     says return ^alue of byte stream length                |
      +------------------------------------------------------------+





 


<Author>                 Expires <Expiry Date>                  [Page 8]

INTERNET DRAFT              <Document Title>                <Issue Date>


      mod_packet
      +------------------------------------------------------------+
      |void mod_packet(struct packet *pkt,const char *field,       |
      |                value_t value);                             |
      |function::modify current header field value to 'value'      |
      |input:                                                      |
      |     pkt                   pakcet                           |
      |     field                 field name                       |
      |     value                 modifying value                  |
      |output:                                                     |
      |     none                                                   |
      +------------------------------------------------------------+
      push_header
      +------------------------------------------------------------+
      |void push_header(struct packet *pkt);                       |
      |function::recover protocol header which is parser           |
      |input:                                                      |
      |     pkt                   packet                           |
      |output:                                                     |
      |     none                                                   |
      +------------------------------------------------------------+
      add_header
      +------------------------------------------------------------+
      |void add_header(struct packet *pk,const char *proto);       |
      |function::add proto field all zero to current packet header |
      |note:after use of add_header,you can use mod_packet to      |
      |     modify field value                                     |
      |input:                                                      |
      |     pkt                   packet                           |
      |     proto                 name of header                   |
      |output:                                                     |
      |     none                                                   |
      +------------------------------------------------------------+
      add_field
      +------------------------------------------------------------+
      |void add_field(struct packet *pkt,int offb,int lenb,        |
      |               value_t value);                              |
      |function::add field from offset is offb as current header,  |
      |          adding field length is lenb,value is              |
      |          value                                             |
      |input:                                                      |
      |     pkt                   pakcet                           |
      |     offb                  offset relative to current head  |
      |     lenb                  length of adding field           |
      |     value                 adding field vlaue               |
      |output:                                                     |
      |     none                                                   |
      +------------------------------------------------------------+
 


<Author>                 Expires <Expiry Date>                  [Page 9]

INTERNET DRAFT              <Document Title>                <Issue Date>


      del_field
      +------------------------------------------------------------+
      |void del_field(struct packet *pkt,int offb,int lenb);       |
      |function::delete length is lenb's field from offset value   |
      |          is offb relative to current header                |
      |input:                                                      |
      |     pkt                   pakcet                           |
      |     offb                  offset relative to current head  |
      |     lenb                  field length                     |
      |output:                                                     |
      |     none                                                   |
      +------------------------------------------------------------+

4.2 Net Topology Search API

      POP uses a figure to show network topology,entity is the node of
      figure and every entity is on behalf of a switch or a host which
      is stored by adjacent list.Users use centralized algorithms in the
      figure to plan possible paths between any two hosts.

      Data structure of entity as follows:
      +------------------------------------------------------------+
      |enum entity_type { ENTITY_TYPE_HOST, ENTITY_TYPE_SWITCH };  |
      |struct entity_adj                                           |
      |{                                                           |
      |int out_port;                                               |
      |int adj_in_port;                                            |
      |struct entity *adj_entity;                                  |
      |};                                                          |
      +------------------------------------------------------------+
      get_entity
      +------------------------------------------------------------+
      |struct entity **get_entity(struct entity *e,int port);      |
      |function::get entity which connects current entity          |
      |input:                                                      |
      |     e                     entity                           |
      |     port                  port number                      |
      |output:                                                     |
      |     entity                                                 |
      +------------------------------------------------------------+








 


<Author>                 Expires <Expiry Date>                 [Page 10]

INTERNET DRAFT              <Document Title>                <Issue Date>


      get_entity_type
      +------------------------------------------------------------+
      |enum entity_type get_entity_type(struct entity *e);         |
      |function::get the type of entity                            |
      |input:                                                      |
      |     e                     entity                           |
      |output                                                      |
      |     type of entity                                         |
      +------------------------------------------------------------+
      get_switch_dpid
      +------------------------------------------------------------+
      |dpid_t get_switch_dpid(struct entity *e);                   |
      |function::get dpid of entity switch                         |
      |input:                                                      |
      |     e                     entity                           |
      |output:                                                     |
      |     dpid                                                   |
      +------------------------------------------------------------+
      get_host_adj_switch
      +------------------------------------------------------------+
      |struct entity *get_host_adj_switch(struct entity *e,        |
      |                                   int *sw_port);           |
      |function::get host connecting switch                        |
      |input:                                                      |
      |     e                     entity                           |
      |output:                                                     |
      |     if e is a host,return its connecting switch            |
      |     sw_port is output ,return port number of switch        |
      +------------------------------------------------------------+
      get_entity_adjs
      +------------------------------------------------------------+
      |const struct entity_adj *get_entity_adjs(struct entity *e,  |
      |                                         int *pnum);        |
      |function::get adjacent list of entity                       |
      |input:                                                      |
      |     e                     entity                           |
      |output:                                                     |
      |     adjacent of entity                                     |
      |     output parameter is pnum,return length of list         |
      +------------------------------------------------------------+
      print_entity
      +------------------------------------------------------------+
      |void print_entity(struct entity *e);                        |
      |function::output related information of entity              |
      |input:                                                      |
      |     e                     entity                           |
      |output:                                                     |
      +------------------------------------------------------------+
 


<Author>                 Expires <Expiry Date>                 [Page 11]

INTERNET DRAFT              <Document Title>                <Issue Date>


      get_switches
      +------------------------------------------------------------+
      |struct entity **getswitches(int *pnum);                     |
      |function::get all lists of switches in net                  |
      |input:                                                      |
      |     none                                                   |
      |output:                                                     |
      |     return all switch lists                                |
      |     output parameter is pnum,return number of switches     |
      +------------------------------------------------------------+
      get_switch
      +------------------------------------------------------------+
      |struct entity *get_switch(dpid_t dpid);                     |
      |function::search the switch according to dpid               |
      |input:                                                      |
      |     dpid                   switch number                   |
      |output:                                                     |
      |     switch entity whose switch number is dpid              |
      +------------------------------------------------------------+
      get_host_by_haddr
      +------------------------------------------------------------+
      |struct entity *get_host_by_haddr(haddr_t addr);             |
      |function::search host according to hardware address         |
      |input:                                                      |
      |     addr                   host hardware address           |
      |output:                                                     |
      |     host entity whose hardware address is addr             |
      +------------------------------------------------------------+
      get_host_by_paddr
      +------------------------------------------------------------+
      |struct entity *get_host_by_paddr(uint32_t addr);            |
      |function::search host according to protocol address         |
      |input:                                                      |
      |     addr                   host protocol address           |
      |output:                                                     |
      |     host entity whose protocol address is addr             |
      +------------------------------------------------------------+

3.3 Path Planning API

      Network algorithm plans forwarding paths according to content of
      packet and topology.Type of route is struct route,which consists
      of some edges connecting source host and destination host.As
      follows:  




 


<Author>                 Expires <Expiry Date>                 [Page 12]

INTERNET DRAFT              <Document Title>                <Issue Date>


      +------------------------------------------------------------+
      |edge_t edge(struct entity *ent1,                            |
      |       int port1,                                           |
      |       struct entity *ent2,                                 |
      |       int port2);                                          |
      +------------------------------------------------------------+
      edge is a quad(ent1,port1,ent2,port2),shows an edge that comes out
      from ent1's port1 and comes into ent2's port2.

      POP supports Path Planning API:

      route
      +------------------------------------------------------------+
      |struct route *route(void);                                  |
      |function::create a new empty route                          |
      |input:                                                      |
      |     none                                                   |
      |output:                                                     |
      |     new route                                              |
      +------------------------------------------------------------+
      route_free
      +------------------------------------------------------------+
      |void route_free(struct route *r);                           |
      |function::free route                                        |
      |input:                                                      |
      |     r                     route waiting for free           |
      |output:                                                     |
      |     none                                                   |
      +------------------------------------------------------------+
      route_add_edge
      +------------------------------------------------------------+
      |void route_add_edge(struct route *r,edge_t e);              |
      |function::add edge into route                               |
      |input:                                                      |
      |     r                     route                            |
      |     e                     edge                             |
      |output:                                                     |
      +------------------------------------------------------------+
      route_union
      +------------------------------------------------------------+
      |void route_union(struct route *r1,struct route *r2);        |
      |function::merge route r1 and r2 into r1                     |
      |input:                                                      |
      |     r1                     route r1                        |
      |     r2                     route r2                        |
      |output:                                                     |
      |     none                                                   |
      +------------------------------------------------------------+
 


<Author>                 Expires <Expiry Date>                 [Page 13]

INTERNET DRAFT              <Document Title>                <Issue Date>


5  Example

      The following is the example for Ethernet IPv4 unicast.
      User need to define the protocol as follow:
      +---------------------------+
      |  header ipv4;             |
      |  header arp;              |
      |  header tcp;              |
      |  header udp;              |
      |                           |
      |  header ethernet {        |
      |  fields {                 |
      |  dl_dst : 48;             |
      |  dl_src : 48;             |
      |  dl_type : 16;            |
      |  }                        |
      |  next select (dl_type) {  |
      |  case 0x0800: ipv4;       |
      |  case 0x0806: arp;        |
      |  }                        |
      |  }                        |
      |  header ipv4 {            |
      |  fields {ver : 4;         |
      |  ihl : 4;                 |
      |  tos : 8;                 |
      |  len : 16;                |
      |  id : 16;                 |
      |  flag : 3;                |
      |  off : 13;                |
      |  ttl : 8;                 |
      |  nw_proto : 8;            |
      |  sum : 16;                |
      |  nw_src : 32;             |
      |  nw_dst : 32;             |
      |  opt : *;                 |
      |  } length :ihl << 2;      |
      |  next select (nw_proto) { |
      |  case 0x06 : tcp;         |
      |  case 0x11 : udp;         |
      |  }                        |
      +---------------------------+

      After specifying the protocol,user can write the network algorithm
      in C language with POP API as follow.
      +--------------------------------------------------------+
      | struct route *f(struct packet *pkt)                    |
      | {                                                      |
      | /* operate packet*/                                    |
 


<Author>                 Expires <Expiry Date>                 [Page 14]

INTERNET DRAFT              <Document Title>                <Issue Date>


      | assert(strcmp(read_header_type(pkt), "ethernet") == 0);|
      | pull_header(pkt);                                      |
      | type = read_header_type(pkt);                          |
      | if (strcmp(type, "ipv4") == 0) {                       |
      | src_ip = read_packet(pkt, "nw_src");                   |
      | dst_ip = read_packet(pkt, "nw_dst");                   |
      | /* query the network topology*/                        |
      | hsrc = get_host_by_paddr(src_ip);                      |
      | hdst = get_host_by_paddr(dst_ip);                      |
      | /* Route generate */                                   |
      | route = calc_path(hsrc, hdst);                         |
      | push_header(pkt);                                      |
      | return route;                                          |
      | }                                                      |
      | }                                                      |
      +--------------------------------------------------------+
      The algorithm get the host nodes according to the source and
      destination IP address in the packet.Then it calls the user-
      defined function calc_path to compute a network path from the
      source node to the destination node. 




6  References

6.1  Normative References

   [RFC7149]  Boucadair, M., "Software-Defined Networking: A Perspective
              from within a Service Provider Environment", RFC 7149,
              March 2014.

   [RFC7426]  E. Haleplidis, Ed., "Software-Defined Networking (SDN):
              Layers and Architecture Terminology", RFC 7426, January
              2015.


6.2  Informative References

   [OF-SPEC]  Open Networking Foundation, "OpenFlow Switch          
              Specification, version 1.5.1", October 2015,          
              <https://www.opennetworking.org>.


Authors' Addresses


              Ye Tian
 


<Author>                 Expires <Expiry Date>                 [Page 15]

INTERNET DRAFT              <Document Title>                <Issue Date>


              University of Science and Technology of China, 
              96 Jinzhai Rd., Hefei, Anhui, 230026, China.

              EMail: yetian@ustc.edu.cn















































<Author>                 Expires <Expiry Date>                 [Page 16]