summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2011-12-09 15:56:05 +0900
committerFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>2011-12-09 15:56:05 +0900
commitaa5051a162c496c3beaef0cef24c720f78305eea (patch)
tree91242f799b1c166d3e9e765475b9a6e36c3608ac
initial commit
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
-rw-r--r--.gitignore10
-rw-r--r--COPYING674
-rw-r--r--LICENSE1
-rw-r--r--MANIFEST.in10
-rw-r--r--README.rst75
-rwxr-xr-xbin/ryu-client55
-rwxr-xr-xbin/ryu-manager69
-rw-r--r--doc/Makefile130
-rw-r--r--doc/source/_static/.placeholder0
-rw-r--r--doc/source/_templates/.placeholder0
-rw-r--r--doc/source/conf.py216
-rw-r--r--doc/source/getting_started.rst43
-rw-r--r--doc/source/how_l2_segregation_works.rst66
-rw-r--r--doc/source/images/assoc-ovs-port.pngbin0 -> 75044 bytes
-rw-r--r--doc/source/images/assoc-ovs-port.svg572
-rw-r--r--doc/source/images/compute-node.pngbin0 -> 72923 bytes
-rw-r--r--doc/source/images/compute-node.svg722
-rw-r--r--doc/source/images/filtering-broadcast.pngbin0 -> 78515 bytes
-rw-r--r--doc/source/images/filtering-broadcast.svg882
-rw-r--r--doc/source/images/filtering-incoming.pngbin0 -> 81100 bytes
-rw-r--r--doc/source/images/filtering-incoming.svg958
-rw-r--r--doc/source/images/filtering-outgoing.pngbin0 -> 83163 bytes
-rw-r--r--doc/source/images/filtering-outgoing.svg960
-rw-r--r--doc/source/images/logical-view.pngbin0 -> 64712 bytes
-rw-r--r--doc/source/images/logical-view.svg623
-rw-r--r--doc/source/images/mac-learning.pngbin0 -> 95849 bytes
-rw-r--r--doc/source/images/mac-learning.svg764
-rw-r--r--doc/source/images/minimul-setup.pngbin0 -> 123002 bytes
-rw-r--r--doc/source/images/minimul-setup.svg903
-rw-r--r--doc/source/images/network-creation.pngbin0 -> 44004 bytes
-rw-r--r--doc/source/images/network-creation.svg484
-rw-r--r--doc/source/images/network-id.svg1434
-rw-r--r--doc/source/images/physical-view.pngbin0 -> 187664 bytes
-rw-r--r--doc/source/images/physical-view.svg1434
-rw-r--r--doc/source/images/trace-route.pngbin0 -> 132098 bytes
-rw-r--r--doc/source/images/trace-route.svg1000
-rw-r--r--doc/source/index.rst26
-rw-r--r--doc/source/overview.rst1
-rw-r--r--doc/source/using_with_openstack.rst251
-rw-r--r--etc/ryu/ryu.conf7
-rw-r--r--ryu/__init__.py0
-rw-r--r--ryu/app/__init__.py0
-rw-r--r--ryu/app/client.py74
-rw-r--r--ryu/app/rest.py210
-rw-r--r--ryu/app/rest_nw_id.py21
-rw-r--r--ryu/app/simple_isolation.py242
-rw-r--r--ryu/app/simple_switch.py93
-rw-r--r--ryu/app/wsapi.py578
-rw-r--r--ryu/base/__init__.py0
-rw-r--r--ryu/base/app_manager.py45
-rw-r--r--ryu/controller/__init__.py14
-rw-r--r--ryu/controller/controller.py201
-rw-r--r--ryu/controller/dispatcher.py108
-rw-r--r--ryu/controller/event.py76
-rw-r--r--ryu/controller/handler.py219
-rw-r--r--ryu/controller/mac_to_network.py56
-rw-r--r--ryu/controller/mac_to_port.py48
-rw-r--r--ryu/controller/network.py155
-rw-r--r--ryu/exception.py63
-rw-r--r--ryu/flags.py24
-rw-r--r--ryu/lib/__init__.py0
-rw-r--r--ryu/lib/mac.py23
-rw-r--r--ryu/log.py82
-rw-r--r--ryu/ofproto/__init__.py16
-rw-r--r--ryu/ofproto/ofproto_parser.py49
-rw-r--r--ryu/ofproto/ofproto_v1_0.py437
-rw-r--r--ryu/ofproto/ofproto_v1_0_parser.py542
-rw-r--r--ryu/utils.py62
-rw-r--r--setup.cfg1
-rw-r--r--setup.py38
70 files changed, 15847 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..e5eaa749
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+*.py[co]
+*~
+*.egg-info/
+build/
+dist/
+
+GTAGS
+GRTAGS
+GPATH
+GSYMS
diff --git a/COPYING b/COPYING
new file mode 100644
index 00000000..94a9ed02
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 00000000..e96a659d
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1 @@
+GPL v3 only
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 00000000..168d8dcd
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,10 @@
+include COPYING LICENSE
+include README.rst
+include MANIFEST.in
+graft contrib
+graft doc
+graft etc
+recursive-exclude doc/build/*/ *
+global-exclude *~
+global-exclude *.pyc
+global-exclude .gitignore
diff --git a/README.rst b/README.rst
new file mode 100644
index 00000000..44d0c202
--- /dev/null
+++ b/README.rst
@@ -0,0 +1,75 @@
+****************************
+Ryu Network Operating System
+****************************
+
+For details, please see the documentation under doc/ directory and
+make html (or make <format you prefer>). If you have any
+questions, suggestions, and patches, the mailing list is available at
+`ryu-devel ML
+<https://lists.sourceforge.net/lists/listinfo/ryu-devel>`_.
+
+Ryu Official site is `<http://www.osrg.net/ryu/>`_.
+
+
+Overview
+========
+Ryu is an open-sourced Network Operating System (NOS) licensed under
+GPL v3. It's fully written in Python.
+
+Ryu aims to provide a logically centralized control and well defined
+API that make it easy for operators to create new network management
+and control applications. Currently, Ryu supports OpenFlow protocol to
+modify the behavior of network devices.
+
+We aim at the de facto OSS NOS implementation and NOS API.
+
+Currently, Ryu is shipped with one control application for `OpenStack
+<http://openstack.org/.>`_ network management L2 segregation of
+tenants without using VLAN. The application includes changes to
+OpenStack (nova, quantum ovs plugin, etc).
+
+The project goal is to develop an OSS Network Operating System that
+has high quality enough for use in large production environment in
+code quality/functionality/usability.
+
+
+TODO
+====
+* OpenFlow Protocol version 1.2 (right after the spec release)
+* The better API for control applications
+* Cluster support
+* ...too many for here.
+
+
+Quick Start
+===========
+Get source code::
+
+ % git clone git://github.com/osrg/ryu.git
+
+Then just type::
+
+ % cd ryu; python ./setup.py install
+
+and run ryu-manager command which is installed.
+Then set up your openflow switch (hardware switch or OVS) to connect the ip
+address and port to which ryu-manager is listening.
+If you want to use it with Openstack (nova and quantum with ovs plugin),
+please refer detailed documents under doc/ directory.
+
+
+Requirement
+===========
+* python-setuptools
+* python-gevent >= 0.13
+* python-gflags
+* python-sphinx
+
+
+Project Members
+===============
+* OHMURA Kei <ohmura.kei at lab.ntt.co.jp>
+* MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
+* Isaku Yamahata <yamahata at valinux co jp>
+* FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
+
diff --git a/bin/ryu-client b/bin/ryu-client
new file mode 100755
index 00000000..e91ed739
--- /dev/null
+++ b/bin/ryu-client
@@ -0,0 +1,55 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import sys
+from optparse import OptionParser
+
+from ryu.app.client import OFPClient
+
+
+def client_test():
+ parser = OptionParser(usage="Usage: %prog [OPTIONS] <command> [args]")
+ parser.add_option("-H", "--host", dest="host", type="string",
+ default="127.0.0.1", help="ip address rest api service")
+ parser.add_option("-p", "--port", dest="port", type="int", default="8080")
+
+ options, args = parser.parse_args()
+ if len(args) == 0:
+ parser.print_help()
+ sys.exit(1)
+
+ client = OFPClient(options.host + ':' + str(options.port))
+ commands = {
+ 'list_nets': lambda a: sys.stdout.write(client.get_networks()),
+ 'create_net': lambda a: client.create_network(a[1]),
+ 'update_net': lambda a: client.update_network(a[1]),
+ 'delete_net': lambda a: client.delete_network(a[1]),
+ 'list_ports': lambda a: sys.stdout.write(client.get_ports(a[1])),
+ 'create_port': lambda a: client.create_port(a[1], a[2], a[3]),
+ 'update_port': lambda a: client.update_port(a[1], a[2], a[3]),
+ 'delete_port': lambda a: client.delete_port(a[1], a[2], a[3])
+ }
+
+ # allow '-', instead of '_'
+ commands.update(dict([(k.replace('_', '-'), v)
+ for (k, v) in commands.items()]))
+
+ cmd = args[0]
+ commands[cmd](args)
+
+if __name__ == "__main__":
+ client_test()
diff --git a/bin/ryu-manager b/bin/ryu-manager
new file mode 100755
index 00000000..e8350fe9
--- /dev/null
+++ b/bin/ryu-manager
@@ -0,0 +1,69 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import gevent
+import gflags
+import logging
+import sys
+
+from gevent import monkey
+monkey.patch_all()
+
+from ryu import log
+log.earlyInitLog(logging.DEBUG)
+
+from ryu import flags
+from ryu import utils
+from ryu.base.app_manager import AppManager
+from ryu.controller import controller
+from ryu.app import wsapi
+from ryu.app import rest
+from ryu.controller import network
+
+
+FLAGS = gflags.FLAGS
+gflags.DEFINE_multistring('app_lists',
+ ['ryu.app.simple_isolation.SimpleIsolation',
+ 'ryu.app.rest.restapi'],
+ 'application module name to run')
+
+
+def main():
+ utils.find_flagfile()
+ args = FLAGS(sys.argv)
+ log.initLog()
+
+ nw = network.network()
+
+ app_mgr = AppManager()
+ app_mgr.load_apps(FLAGS.app_lists, network=nw)
+
+ services = []
+
+ ctlr = controller.OpenFlowController()
+ thr = gevent.spawn_later(0, ctlr)
+ services.append(thr)
+
+ # NOX webservice API
+ ws = wsapi.wsapi()
+ thr = gevent.spawn_later(0, ws)
+ services.append(thr)
+
+ gevent.joinall(services)
+
+if __name__ == "__main__":
+ main()
diff --git a/doc/Makefile b/doc/Makefile
new file mode 100644
index 00000000..2fe1f88f
--- /dev/null
+++ b/doc/Makefile
@@ -0,0 +1,130 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS =
+SPHINXBUILD = sphinx-build
+PAPER =
+BUILDDIR = build
+
+# Internal variables.
+PAPEROPT_a4 = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
+
+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
+
+help:
+ @echo "Please use \`make <target>' where <target> is one of"
+ @echo " html to make standalone HTML files"
+ @echo " dirhtml to make HTML files named index.html in directories"
+ @echo " singlehtml to make a single large HTML file"
+ @echo " pickle to make pickle files"
+ @echo " json to make JSON files"
+ @echo " htmlhelp to make HTML files and a HTML help project"
+ @echo " qthelp to make HTML files and a qthelp project"
+ @echo " devhelp to make HTML files and a Devhelp project"
+ @echo " epub to make an epub"
+ @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+ @echo " latexpdf to make LaTeX files and run them through pdflatex"
+ @echo " text to make text files"
+ @echo " man to make manual pages"
+ @echo " changes to make an overview of all changed/added/deprecated items"
+ @echo " linkcheck to check all external links for integrity"
+ @echo " doctest to run all doctests embedded in the documentation (if enabled)"
+
+clean:
+ -rm -rf $(BUILDDIR)/*
+
+html:
+ $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+ @echo
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+dirhtml:
+ $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
+ @echo
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+
+singlehtml:
+ $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
+ @echo
+ @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+
+pickle:
+ $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
+ @echo
+ @echo "Build finished; now you can process the pickle files."
+
+json:
+ $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
+ @echo
+ @echo "Build finished; now you can process the JSON files."
+
+htmlhelp:
+ $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
+ @echo
+ @echo "Build finished; now you can run HTML Help Workshop with the" \
+ ".hhp project file in $(BUILDDIR)/htmlhelp."
+
+qthelp:
+ $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
+ @echo
+ @echo "Build finished; now you can run "qcollectiongenerator" with the" \
+ ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
+ @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/ryu.qhcp"
+ @echo "To view the help file:"
+ @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/ryu.qhc"
+
+devhelp:
+ $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
+ @echo
+ @echo "Build finished."
+ @echo "To view the help file:"
+ @echo "# mkdir -p $$HOME/.local/share/devhelp/ryu"
+ @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/ryu"
+ @echo "# devhelp"
+
+epub:
+ $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
+ @echo
+ @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+
+latex:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo
+ @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+ @echo "Run \`make' in that directory to run these through (pdf)latex" \
+ "(use \`make latexpdf' here to do that automatically)."
+
+latexpdf:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo "Running LaTeX files through pdflatex..."
+ $(MAKE) -C $(BUILDDIR)/latex all-pdf
+ @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
+text:
+ $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
+ @echo
+ @echo "Build finished. The text files are in $(BUILDDIR)/text."
+
+man:
+ $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
+ @echo
+ @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+
+changes:
+ $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
+ @echo
+ @echo "The overview file is in $(BUILDDIR)/changes."
+
+linkcheck:
+ $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+ @echo
+ @echo "Link check complete; look for any errors in the above output " \
+ "or in $(BUILDDIR)/linkcheck/output.txt."
+
+doctest:
+ $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+ @echo "Testing of doctests in the sources finished, look at the " \
+ "results in $(BUILDDIR)/doctest/output.txt."
diff --git a/doc/source/_static/.placeholder b/doc/source/_static/.placeholder
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/doc/source/_static/.placeholder
diff --git a/doc/source/_templates/.placeholder b/doc/source/_templates/.placeholder
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/doc/source/_templates/.placeholder
diff --git a/doc/source/conf.py b/doc/source/conf.py
new file mode 100644
index 00000000..ed247019
--- /dev/null
+++ b/doc/source/conf.py
@@ -0,0 +1,216 @@
+# -*- coding: utf-8 -*-
+#
+# ryu documentation build configuration file, created by
+# sphinx-quickstart on Mon Dec 5 15:38:48 2011.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys, os
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#sys.path.insert(0, os.path.abspath('.'))
+
+# -- General configuration -----------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = []
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'ryu'
+copyright = u'2011, ryu development team'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = '0.1'
+# The full version, including alpha/beta/rc tags.
+release = '0.1'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = []
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+
+# -- Options for HTML output ---------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages. See the documentation for
+# a list of builtin themes.
+html_theme = 'default'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further. For a list of options available for each theme, see the
+# documentation.
+#html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+#html_theme_path = []
+
+# The name for this set of Sphinx documents. If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar. Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it. The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'ryudoc'
+
+
+# -- Options for LaTeX output --------------------------------------------------
+
+# The paper size ('letter' or 'a4').
+#latex_paper_size = 'letter'
+
+# The font size ('10pt', '11pt' or '12pt').
+#latex_font_size = '10pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass [howto/manual]).
+latex_documents = [
+ ('index', 'ryu.tex', u'ryu Documentation',
+ u'ryu development team', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# If true, show page references after internal links.
+#latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+#latex_show_urls = False
+
+# Additional stuff for the LaTeX preamble.
+#latex_preamble = ''
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_domain_indices = True
+
+
+# -- Options for manual page output --------------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+ ('index', 'ryu', u'ryu Documentation',
+ [u'ryu development team'], 1)
+]
diff --git a/doc/source/getting_started.rst b/doc/source/getting_started.rst
new file mode 100644
index 00000000..bfc108ec
--- /dev/null
+++ b/doc/source/getting_started.rst
@@ -0,0 +1,43 @@
+.. _getting_started:
+
+***************
+Getting Started
+***************
+
+Overview/What's Ryu the Network OS
+==================================
+Ryu is an open-sourced Network OS which is licensed under GPL v3.
+It supports openflow protocol.
+
+If you are not familiar with Software Defined Network(SDN) and
+OpenFlow/openflow controller,
+please refer to `openflow org <http://www.openflow.org/>`_ .
+
+The mailing list is available at
+`ryu-devel ML <https://lists.sourceforge.net/lists/listinfo/ryu-devel>`_
+
+
+Installing Ryu Network OS
+=========================
+Extract source code and just type::
+
+ % python ./setup.py install
+
+Then, run ryu-manager.
+It listens to ip address 0.0.0.0 and port 6633 by default.
+Then have your openflow switch (hardware or openvswitch OVS) to connect to
+ryu-manager.
+
+For OVS case, you can done it by
+
+ % ovs-vsctl set-controller <your bridge> tcp:<ip addr>[:<port: default 6633>]
+
+At the moment, ryu-manager supports only tcp method.
+If you want to use it with openstack nova and quantum OVS plugin,
+Please refer to :ref:`using_with_openstack`.
+
+Configuration
+=============
+It can be configured by passing configuration file like::
+
+ ryu-manager [--flagfile <path to configuration file>]
diff --git a/doc/source/how_l2_segregation_works.rst b/doc/source/how_l2_segregation_works.rst
new file mode 100644
index 00000000..4b0d2b9d
--- /dev/null
+++ b/doc/source/how_l2_segregation_works.rst
@@ -0,0 +1,66 @@
+.. _how_it_works:
+
+****************************
+How Ryu L2 segregation works
+****************************
+This section describes how Ryu L2 segregation works.
+
+tenant/network id creation
+==========================
+When tenant(= network id) is created, Quantum server tells it to Ryu.
+Ryu remembers the network id.
+
+ .. image:: /images/network-creation.png
+
+
+association OVS port to network id
+==================================
+#. When VM instance is created, the network port is created in OVS and
+ it is associated to network id that VM belongs to.
+
+#. quantum OVS agent tells the associated (network id, ovs port) to Ryu.
+ Ryu remembers (network id, ovs port) relationship.
+
+#. quantum OVS agent also tells to Ryu which OVS port is not managed by
+ nova/quantum, but is connected to external ether cable.
+ We call it external OVS port or that the port is external.
+
+
+ .. image:: /images/assoc-ovs-port.png
+
+
+mac learing
+===========
+When VM sends packets, Ryu determins network id from OVS port and then
+associates src mac address to network id.
+
+ .. image:: /images/mac-learning.png
+
+
+packet filtering(L2 unicast case)
+=================================
+* When VM sending L2-unicast packet, Ryu checks if the destination mac
+ address belongs to the same netowrk id of the source mac address which
+ is same to the network id that the OVS port is associated to.
+* If no, the packet is dropped.
+* If yes, send the packet is sent to ports which belongs to the same
+ network id and external port.
+
+ .. image:: /images/filtering-outgoing.png
+ .. image:: /images/filtering-incoming.png
+
+
+packet filtering(L2 broadcast case)
+===================================
+* When VM sending L2-broadcast/multicaset packet, Ryu checks if the source
+ mac address.
+* send the packet to all external ports and all OVS ports that belongs
+ to the same network id of the source mac address.
+* When receiving broacast/multicast packet from the external ports,
+ Ryu checks if the source mac address belongs to known network id.
+
+ * If yes, send the packet to the external ports except incoming one
+ and the all OVS ports that belongs to the network id
+ * if no, drop the packet.
+
+ .. image:: /images/filtering-broadcast.png
diff --git a/doc/source/images/assoc-ovs-port.png b/doc/source/images/assoc-ovs-port.png
new file mode 100644
index 00000000..16e0386a
--- /dev/null
+++ b/doc/source/images/assoc-ovs-port.png
Binary files differ
diff --git a/doc/source/images/assoc-ovs-port.svg b/doc/source/images/assoc-ovs-port.svg
new file mode 100644
index 00000000..2aa8656e
--- /dev/null
+++ b/doc/source/images/assoc-ovs-port.svg
@@ -0,0 +1,572 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1052.3622"
+ height="744.09448"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="assoc-ovs-port.svg"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/assoc-ovs-port.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.8162589"
+ inkscape:cx="526.18109"
+ inkscape:cy="372.04724"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1345"
+ inkscape:window-height="1004"
+ inkscape:window-x="50"
+ inkscape:window-y="3"
+ inkscape:window-maximized="0"
+ inkscape:snap-grids="true"
+ inkscape:snap-to-guides="false"
+ inkscape:snap-bbox="false"
+ inkscape:snap-page="false"
+ showguides="true"
+ inkscape:guide-bbox="true" />
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow2Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lstart"
+ style="overflow:visible">
+ <path
+ id="path5113"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) translate(1,0)" />
+ </marker>
+ <linearGradient
+ id="linearGradient6493"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop6495" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5313"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#5555ff;stop-opacity:1;"
+ offset="0"
+ id="stop5315" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mend"
+ style="overflow:visible;">
+ <path
+ id="path5567"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mstart"
+ style="overflow:visible">
+ <path
+ id="path5564"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.4) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;">
+ <path
+ id="path5579"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;">
+ <path
+ id="path5561"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path5558"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <inkscape:path-effect
+ effect="skeletal"
+ id="path-effect5339"
+ is_visible="true"
+ pattern="M 0,0 0,10 10,5 z"
+ copytype="single_stretched"
+ prop_scale="1"
+ scale_y_rel="false"
+ spacing="0"
+ normal_offset="0"
+ tang_offset="0"
+ prop_units="false"
+ vertical_pattern="false"
+ fuse_tolerance="0" />
+ <linearGradient
+ id="linearGradient5242"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#7fff2a;stop-opacity:1;"
+ offset="0"
+ id="stop5244" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 372.04724 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="1052.3622 : 372.04724 : 1"
+ inkscape:persp3d-origin="526.18109 : 248.03149 : 1"
+ id="perspective3009" />
+ <marker
+ inkscape:stockid="Arrow1LendM"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1LendM"
+ style="overflow:visible;">
+ <path
+ id="path4159"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1LendF"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1LendF"
+ style="overflow:visible;">
+ <path
+ id="path4585"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend6"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mend6"
+ style="overflow:visible;">
+ <path
+ id="path5404"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1MendN"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1MendN"
+ style="overflow:visible;">
+ <path
+ id="path5645"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5343-7"
+ id="linearGradient5349-6"
+ x1="-532.43896"
+ y1="622.73621"
+ x2="-318.84055"
+ y2="622.73621"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.83990127,0,0,1.846462,-201.58875,-629.6685)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5343-7">
+ <stop
+ style="stop-color:#aaccff;stop-opacity:1;"
+ offset="0"
+ id="stop5345-4" />
+ <stop
+ style="stop-color:#aaccff;stop-opacity:0;"
+ offset="1"
+ id="stop5347-4" />
+ </linearGradient>
+ <linearGradient
+ y2="622.73621"
+ x2="-318.84055"
+ y1="622.73621"
+ x1="-532.43896"
+ gradientTransform="matrix(1.2042654,0,0,2.6602952,-344.10309,-1384.9447)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient6079-9"
+ xlink:href="#linearGradient5343-7-4"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5343-7-4">
+ <stop
+ style="stop-color:#aaccff;stop-opacity:1;"
+ offset="0"
+ id="stop5345-4-1" />
+ <stop
+ style="stop-color:#aaccff;stop-opacity:0;"
+ offset="1"
+ id="stop5347-4-6" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow1Lenda"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lenda"
+ style="overflow:visible;">
+ <path
+ id="path5800"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#05ff00;stroke-width:1.0pt;fill:#05ff00;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lendan"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lendan"
+ style="overflow:visible;">
+ <path
+ id="path5943"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;marker-start:none;stroke:#059500;stroke-width:1.0pt;fill:#059500"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5343-7"
+ id="linearGradient6508"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3132307,0,0,2.7180446,-75.36157,-1462.7849)"
+ x1="-532.43896"
+ y1="622.73621"
+ x2="-318.84055"
+ y2="622.73621" />
+ </defs>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-308.2677)">
+ <path
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 123.73525,580.64067 0,-137.21137"
+ id="path6078"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="opacity:0.5;fill:url(#linearGradient6508);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.11107063;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3065-4"
+ width="279.1908"
+ height="382.82706"
+ x="-773.92023"
+ y="38.426575"
+ transform="matrix(0,-1,1,0,0,0)" />
+ <a
+ id="a4003"
+ transform="matrix(1,0,0,0.81896683,-0.728701,296.31497)"
+ style="fill:#ff2ad4;fill-opacity:1" />
+ <path
+ style="opacity:0.275;fill:#dd6de5;fill-opacity:0.46666667;fill-rule:nonzero;stroke:#ff0000;stroke-width:4.27355194;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.13677602, 2.13677602;stroke-dashoffset:0"
+ d=""
+ id="path4088"
+ inkscape:connector-curvature="0"
+ transform="translate(0,308.2677)" />
+ <g
+ id="g6423"
+ transform="translate(447.14019,-66.6113)"
+ style="opacity:0.6125;fill:#3866a9;fill-opacity:0.46666667">
+ <rect
+ style="fill:#b1c76d;fill-opacity:0.46666667;fill-rule:evenodd;stroke:#ff1300;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect6358-7"
+ width="267.63913"
+ height="28.903856"
+ x="80.828072"
+ y="594.69769" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text6360-0"
+ y="615.96716"
+ x="86.097534"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#3866a9;fill-opacity:0.46666667;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="615.96716"
+ x="86.097534"
+ id="tspan6362-5"
+ sodipodi:role="line"
+ style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-opacity:1">ryu-openflow-controller</tspan></text>
+ </g>
+ <rect
+ y="573.76764"
+ x="74.293457"
+ height="168.16565"
+ width="337.21384"
+ id="rect5351-5"
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.17921257px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5353-2"
+ y="732.48846"
+ x="126.48773"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="732.48846"
+ x="126.48773"
+ id="tspan5355-6"
+ sodipodi:role="line">nova-compute</tspan></text>
+ <path
+ transform="matrix(0.69506452,0,0,0.47991755,33.246065,405.64778)"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.5626709"
+ sodipodi:arg1="1.0390722"
+ sodipodi:r2="23.694832"
+ sodipodi:r1="69.884941"
+ sodipodi:cy="572.24408"
+ sodipodi:cx="136.41731"
+ sodipodi:sides="6"
+ id="path5250"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5274"
+ y="671.74854"
+ x="129.07115"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="671.74854"
+ x="129.07115"
+ id="tspan5276"
+ sodipodi:role="line">VM</tspan><tspan
+ id="tspan3167"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="694.24854"
+ x="129.07115"
+ sodipodi:role="line">tenant-X</tspan></text>
+ <path
+ transform="matrix(1.0086434,0,0,0.68923037,-136.00519,426.12072)"
+ d="m 289.53315,248.36246 -14.42324,24.98178 -28.84647,0 -14.42324,-24.98178 14.42324,-24.98178 28.84647,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="0.52359878"
+ sodipodi:arg1="0"
+ sodipodi:r2="24.981781"
+ sodipodi:r1="28.846476"
+ sodipodi:cy="248.36246"
+ sodipodi:cx="260.68668"
+ sodipodi:sides="6"
+ id="path5523-9"
+ style="opacity:0.5;fill:#2ad4ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5525-6"
+ y="604.38098"
+ x="106.25084"
+ style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="604.38098"
+ x="106.25084"
+ id="tspan5527-5"
+ sodipodi:role="line">OVS</tspan></text>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6228"
+ d="m 125.69215,649.44811 0.20564,-35.3061"
+ style="fill:none;stroke:#05ff00;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="272.5264"
+ y="768.13312"
+ id="text3193"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3195"
+ x="272.5264"
+ y="768.13312">physical host</tspan></text>
+ <path
+ style="fill:none;stroke:#059500;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:10, 5;stroke-dashoffset:0;marker-end:url(#Arrow1Lendan)"
+ d="m 133.53606,634.54513 c 324.65191,31.85264 390.25092,-12.63222 485.1402,-57.57977"
+ id="path4298"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ id="g5754"
+ transform="translate(67.380584,-198.52388)">
+ <path
+ transform="matrix(1.1689088,0,0,0.56811324,22.97702,634.03964)"
+ d="m 269.78156,191.14935 c 0,17.44202 -37.62559,31.58157 -84.0391,31.58157 -46.41351,0 -84.03909,-14.13955 -84.03909,-31.58157 0,-17.44202 37.62558,-31.58157 84.03909,-31.58157 46.41351,0 84.0391,14.13955 84.0391,31.58157 z"
+ sodipodi:ry="31.581572"
+ sodipodi:rx="84.039093"
+ sodipodi:cy="191.14935"
+ sodipodi:cx="185.74246"
+ id="path6269"
+ style="opacity:0.4125;fill:#3866a9;fill-opacity:0.46666667;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text6271"
+ y="746.23999"
+ x="149.63055"
+ style="font-size:18px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="746.23999"
+ x="149.63055"
+ id="tspan6273"
+ sodipodi:role="line">quantum_ovs_agent</tspan></text>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="49.00404"
+ y="820.76062"
+ id="text6045"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="49.00404"
+ y="820.76062"
+ id="tspan6049">associates OVS port to network id</tspan></text>
+ <g
+ id="g6280"
+ transform="translate(-137.65551,-234.28264)">
+ <g
+ transform="matrix(1,0,0,0.71409652,-474.38063,289.09459)"
+ id="g5864-4">
+ <rect
+ style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.79479539px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5858-6"
+ width="26.969246"
+ height="59.086094"
+ x="722.52655"
+ y="601.5531" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="611.76575"
+ y="-729.16479"
+ id="text5860-69"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,1,-1,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan5862-8"
+ x="611.76575"
+ y="-729.16479">eth</tspan></text>
+ </g>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#05ff00;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="459.41306"
+ y="697.02533"
+ id="text6080"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6082"
+ x="459.41306"
+ y="697.02533">network_id</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:10, 5;stroke-dashoffset:0;marker-end:url(#Arrow1Lend)"
+ d="M 128.63566,546.33782 C 275.64784,379.72402 611.32565,513.26008 611.32565,513.26008"
+ id="path6084"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="286.67377"
+ y="374.82364"
+ id="text6494"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6496"
+ x="286.67377"
+ y="374.82364">external port</tspan></text>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot6500"
+ style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Bitstream Vera Sans;font-style:normal;font-weight:normal;font-size:40px;line-height:125%;letter-spacing:0px;word-spacing:0px"><flowRegion
+ id="flowRegion6502"><rect
+ id="rect6504"
+ width="978.85608"
+ height="519.44305"
+ x="-91.882614"
+ y="261.40448" /></flowRegion><flowPara
+ id="flowPara6506"></flowPara></flowRoot> </g>
+</svg>
diff --git a/doc/source/images/compute-node.png b/doc/source/images/compute-node.png
new file mode 100644
index 00000000..50efa04f
--- /dev/null
+++ b/doc/source/images/compute-node.png
Binary files differ
diff --git a/doc/source/images/compute-node.svg b/doc/source/images/compute-node.svg
new file mode 100644
index 00000000..01b6389f
--- /dev/null
+++ b/doc/source/images/compute-node.svg
@@ -0,0 +1,722 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1052.3622"
+ height="744.09448"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="compute-node.svg"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/compute-node.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.81601008"
+ inkscape:cx="538.22825"
+ inkscape:cy="378.53655"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1314"
+ inkscape:window-height="980"
+ inkscape:window-x="110"
+ inkscape:window-y="42"
+ inkscape:window-maximized="0"
+ inkscape:snap-grids="true"
+ inkscape:snap-to-guides="false"
+ inkscape:snap-bbox="false"
+ inkscape:snap-page="false" />
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient6493"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop6495" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5313"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#5555ff;stop-opacity:1;"
+ offset="0"
+ id="stop5315" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mend"
+ style="overflow:visible;">
+ <path
+ id="path5567"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mstart"
+ style="overflow:visible">
+ <path
+ id="path5564"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.4) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;">
+ <path
+ id="path5579"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;">
+ <path
+ id="path5561"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path5558"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <inkscape:path-effect
+ effect="skeletal"
+ id="path-effect5339"
+ is_visible="true"
+ pattern="M 0,0 0,10 10,5 z"
+ copytype="single_stretched"
+ prop_scale="1"
+ scale_y_rel="false"
+ spacing="0"
+ normal_offset="0"
+ tang_offset="0"
+ prop_units="false"
+ vertical_pattern="false"
+ fuse_tolerance="0" />
+ <linearGradient
+ id="linearGradient5242"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#7fff2a;stop-opacity:1;"
+ offset="0"
+ id="stop5244" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 372.04724 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="1052.3622 : 372.04724 : 1"
+ inkscape:persp3d-origin="526.18109 : 248.03149 : 1"
+ id="perspective3009" />
+ <marker
+ inkscape:stockid="Arrow1LendM"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1LendM"
+ style="overflow:visible;">
+ <path
+ id="path4159"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1LendF"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1LendF"
+ style="overflow:visible;">
+ <path
+ id="path4585"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend6"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mend6"
+ style="overflow:visible;">
+ <path
+ id="path5404"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1MendN"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1MendN"
+ style="overflow:visible;">
+ <path
+ id="path5645"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5343-7"
+ id="linearGradient5349-6"
+ x1="-532.43896"
+ y1="622.73621"
+ x2="-318.84055"
+ y2="622.73621"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.83990127,0,0,1.846462,-201.58875,-629.6685)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5343-7">
+ <stop
+ style="stop-color:#aaccff;stop-opacity:1;"
+ offset="0"
+ id="stop5345-4" />
+ <stop
+ style="stop-color:#aaccff;stop-opacity:0;"
+ offset="1"
+ id="stop5347-4" />
+ </linearGradient>
+ <linearGradient
+ y2="622.73621"
+ x2="-318.84055"
+ y1="622.73621"
+ x1="-532.43896"
+ gradientTransform="matrix(1.2042654,0,0,2.6602952,-344.10309,-1384.9447)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient6079-9"
+ xlink:href="#linearGradient5343-7-4"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5343-7-4">
+ <stop
+ style="stop-color:#aaccff;stop-opacity:1;"
+ offset="0"
+ id="stop5345-4-1" />
+ <stop
+ style="stop-color:#aaccff;stop-opacity:0;"
+ offset="1"
+ id="stop5347-4-6" />
+ </linearGradient>
+ <linearGradient
+ y2="622.73621"
+ x2="-318.84055"
+ y1="622.73621"
+ x1="-532.43896"
+ gradientTransform="matrix(1.6454892,0,0,2.6579041,-106.61003,-1414.0767)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient6079-6"
+ xlink:href="#linearGradient5343-7-43"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5343-7-43">
+ <stop
+ style="stop-color:#aaccff;stop-opacity:1;"
+ offset="0"
+ id="stop5345-4-0" />
+ <stop
+ style="stop-color:#aaccff;stop-opacity:0;"
+ offset="1"
+ id="stop5347-4-3" />
+ </linearGradient>
+ <linearGradient
+ y2="622.73621"
+ x2="-318.84055"
+ y1="622.73621"
+ x1="-532.43896"
+ gradientTransform="matrix(1.2041922,0,0,2.7019977,-347.48146,-932.31394)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient8058"
+ xlink:href="#linearGradient5343-7-4-5"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5343-7-4-5">
+ <stop
+ style="stop-color:#aaccff;stop-opacity:1;"
+ offset="0"
+ id="stop5345-4-1-6" />
+ <stop
+ style="stop-color:#aaccff;stop-opacity:0;"
+ offset="1"
+ id="stop5347-4-6-1" />
+ </linearGradient>
+ </defs>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-308.2677)">
+ <path
+ style="fill:#000000;fill-opacity:0;stroke:#1afc00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 237.11002,689.51457 1.86077,-123.1146"
+ id="path6488-0-2"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path5485-6"
+ d="m 246.19071,689.24143 0.82837,-123.63888"
+ style="fill:none;stroke:#000000;stroke-width:5.2421937;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ sodipodi:nodetypes="cc" />
+ <rect
+ style="opacity:0.5;fill:url(#linearGradient6079-6);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.33679771;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3065-4-9"
+ width="349.8284"
+ height="374.35648"
+ x="-981.90985"
+ y="53.918316"
+ transform="matrix(0,-1,1,0,0,0)" />
+ <a
+ id="a4003"
+ transform="matrix(1,0,0,0.81896683,-0.728701,296.31497)"
+ style="fill:#ff2ad4;fill-opacity:1" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="14.34453"
+ y="1039.1901"
+ id="text5549"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/compute-node.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ sodipodi:role="line"
+ id="tspan5551"
+ x="14.34453"
+ y="1039.1901">compute node: single NIC</tspan></text>
+ <path
+ style="opacity:0.275;fill:#dd6de5;fill-opacity:0.46666667;fill-rule:nonzero;stroke:#ff0000;stroke-width:4.27355194;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.13677602, 2.13677602;stroke-dashoffset:0"
+ d=""
+ id="path4088"
+ inkscape:connector-curvature="0"
+ transform="translate(0,308.2677)" />
+ <g
+ id="g6423"
+ transform="translate(-60,2)"
+ style="opacity:0.6125;fill:#3866a9;fill-opacity:0.46666667" />
+ <path
+ style="fill:#000000;fill-opacity:0;stroke:#1afc00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 347.28719,818.50031 -235.12212,0 -1.13388,-109.57905 95.01236,-0.15491"
+ id="path6473-0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path5485-5"
+ d="m 369.67935,811.39255 -0.65638,-99.51593 -85.07583,-0.79742"
+ style="fill:none;stroke:#000000;stroke-width:5.2421937;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ sodipodi:nodetypes="ccc" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.4125;fill:#3866a9;fill-opacity:0.46666667;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path6269-5"
+ sodipodi:cx="185.74246"
+ sodipodi:cy="191.14935"
+ sodipodi:rx="84.039093"
+ sodipodi:ry="31.581572"
+ d="m 269.78156,191.14935 a 84.039093,31.581572 0 1 1 -168.07819,0 84.039093,31.581572 0 1 1 168.07819,0 z"
+ transform="matrix(1.1689088,0,0,0.56811324,34.35592,665.4191)" />
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="159.9389"
+ y="777.61945"
+ id="text6271-1"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6273-1"
+ x="159.9389"
+ y="777.61945">quantum_ovs_agent</tspan></text>
+ <path
+ style="fill:#000000;fill-opacity:0;stroke:#1afc00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 157.93794,773.53672 -45.24394,0"
+ id="path6488-0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ id="g5864-4-8-5"
+ transform="matrix(1,0,0,0.71409652,-491.78016,176.92621)">
+ <rect
+ y="601.5531"
+ x="722.52655"
+ height="59.086094"
+ width="26.969246"
+ id="rect5858-6-0-0"
+ style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.79479539px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ transform="matrix(0,1,-1,0,0,0)"
+ sodipodi:linespacing="125%"
+ id="text5860-69-9-6"
+ y="-729.16479"
+ x="603.36359"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="-729.16479"
+ x="603.36359"
+ id="tspan5862-8-6-4"
+ sodipodi:role="line">peth</tspan></text>
+ </g>
+ <path
+ sodipodi:type="star"
+ style="opacity:0.275;fill:#b1c76d;fill-opacity:0.46666667;fill-rule:nonzero;stroke:#ff1300;stroke-width:4;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path3488"
+ sodipodi:sides="6"
+ sodipodi:cx="703.35907"
+ sodipodi:cy="240.93047"
+ sodipodi:r1="24.436026"
+ sodipodi:r2="21.162218"
+ sodipodi:arg1="2.0736395"
+ sodipodi:arg2="2.5972383"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 691.58289,262.3417 -12.65458,-20.90409 11.77618,-21.41123 24.43076,-0.50715 12.65458,20.90409 -11.77618,21.41123 z"
+ transform="matrix(1.57683,0,0,0.88317766,-864.61882,496.27264)" />
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="216.08893"
+ y="715.48041"
+ id="text3490"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3492"
+ x="216.08893"
+ y="715.48041">bridge</tspan></text>
+ <rect
+ style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.67163575px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5858-6-1"
+ width="26.969246"
+ height="42.193172"
+ x="98.511742"
+ y="691.39148" />
+ <text
+ xml:space="preserve"
+ style="font-size:20.2810154px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="819.70374"
+ y="-87.1661"
+ id="text5860-69-2"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,0.84504232,-1.1833727,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan5862-8-0"
+ x="819.70374"
+ y="-87.1661">veth</tspan></text>
+ <rect
+ style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.67163575px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5858-6-1-4"
+ width="26.969246"
+ height="42.193172"
+ x="356.81827"
+ y="689.26471" />
+ <text
+ xml:space="preserve"
+ style="font-size:20.2810154px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="819.55377"
+ y="-307.13614"
+ id="text5860-69-2-6"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,0.84504232,-1.1833727,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan5862-8-0-2"
+ x="819.55377"
+ y="-307.13614">veth</tspan></text>
+ <g
+ transform="translate(189.61855,-3.63579)"
+ id="g4188-6">
+ <rect
+ y="807.76764"
+ x="120.29346"
+ height="168.16565"
+ width="337.21384"
+ id="rect5351-5-2-9"
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.17921257px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ transform="translate(-228.13313,-0.39285583)" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5353-2-6"
+ y="966.48846"
+ x="172.48773"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ transform="translate(-228.13313,-0.39285583)"><tspan
+ y="966.48846"
+ x="172.48773"
+ id="tspan5355-6-5"
+ sodipodi:role="line">nova-compute</tspan></text>
+ <g
+ id="g4099-6"
+ transform="translate(-228.13313,-0.39285583)">
+ <path
+ sodipodi:type="star"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5250-6"
+ sodipodi:sides="6"
+ sodipodi:cx="136.41731"
+ sodipodi:cy="572.24408"
+ sodipodi:r1="69.884941"
+ sodipodi:r2="23.694832"
+ sodipodi:arg1="1.0390722"
+ sodipodi:arg2="1.5626709"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ transform="matrix(0.69506452,0,0,0.47991755,79.246065,639.64778)" />
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="175.07115"
+ y="905.74854"
+ id="text5274-3"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5276-4"
+ x="175.07115"
+ y="905.74854"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans">VM</tspan><tspan
+ sodipodi:role="line"
+ x="175.07115"
+ y="928.24854"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ id="tspan3167-1">tenant-X</tspan></text>
+ </g>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5329-7-8"
+ y="913.58319"
+ x="311.78284"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ transform="translate(-228.13313,-0.39285583)"><tspan
+ id="tspan5333-1"
+ y="913.58319"
+ x="311.78284"
+ sodipodi:role="line">...</tspan></text>
+ <g
+ id="g6174-1-3-4"
+ transform="translate(-334.01622,209.06446)">
+ <path
+ sodipodi:type="star"
+ style="opacity:0.5;fill:#2ad4ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5523-9-0"
+ sodipodi:sides="6"
+ sodipodi:cx="260.68668"
+ sodipodi:cy="248.36246"
+ sodipodi:r1="28.846476"
+ sodipodi:r2="24.981781"
+ sodipodi:arg1="0"
+ sodipodi:arg2="0.52359878"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 289.53315,248.36246 -14.42324,24.98178 -28.84647,0 -14.42324,-24.98178 14.42324,-24.98178 28.84647,0 z"
+ transform="matrix(1.0086434,0,0,0.68923037,243.74678,449.4383)" />
+ <text
+ xml:space="preserve"
+ style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="486.00281"
+ y="627.69855"
+ id="text5525-6-8-8"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5527-5-2"
+ x="486.00281"
+ y="627.69855">OVS</tspan></text>
+ </g>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6228-9"
+ d="M 180.26786,884.67321 374.03954,832.21569"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="translate(-228.13313,-0.39285583)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6230-0"
+ d="m 293.74741,898.5905 88.85662,-53.52808"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="translate(-228.13313,-0.39285583)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6232-1"
+ d="m 395.45077,882.53208 18.19954,-34.25796"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="translate(-228.13313,-0.39285583)" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text7945-1-8-0"
+ y="855.57654"
+ x="90.787804"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#193edc;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ transform="translate(-228.13313,-0.39285583)"><tspan
+ style="fill:#31562b;fill-opacity:1;stroke:none"
+ y="855.57654"
+ x="90.787804"
+ id="tspan7947-2-1-8"
+ sodipodi:role="line">openflow</tspan></text>
+ <path
+ transform="matrix(0.69506452,0,0,0.47991755,-44.98222,640.35447)"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.5626709"
+ sodipodi:arg1="1.0390722"
+ sodipodi:r2="23.694832"
+ sodipodi:r1="69.884941"
+ sodipodi:cy="572.24408"
+ sodipodi:cx="136.41731"
+ sodipodi:sides="6"
+ id="path5250-8-1"
+ style="fill:#00fffc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5274-5-6"
+ y="906.84808"
+ x="278.97601"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ transform="translate(-228.13313,-0.39285583)"><tspan
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="906.84808"
+ x="278.97601"
+ id="tspan5276-33-7"
+ sodipodi:role="line">VM</tspan><tspan
+ id="tspan3167-8-8"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="929.34808"
+ x="278.97601"
+ sodipodi:role="line">tenant-Y</tspan></text>
+ <path
+ sodipodi:type="star"
+ style="fill:#ccff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5250-7-8"
+ sodipodi:sides="6"
+ sodipodi:cx="136.41731"
+ sodipodi:cy="572.24408"
+ sodipodi:r1="69.884941"
+ sodipodi:r2="23.694832"
+ sodipodi:arg1="1.0390722"
+ sodipodi:arg2="1.5626709"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ transform="matrix(0.69506452,0,0,0.47991755,79.246065,639.64778)" />
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="175.07115"
+ y="905.74854"
+ id="text5274-7-2"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5276-1-1"
+ x="175.07115"
+ y="905.74854"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans">VM</tspan><tspan
+ sodipodi:role="line"
+ x="175.07115"
+ y="928.24854"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ id="tspan3167-2-3">tenant-...</tspan></text>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="29.411377"
+ y="589.0155"
+ id="text3348"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3350"
+ x="29.411377"
+ y="589.0155">peth: physical NIC</tspan><tspan
+ sodipodi:role="line"
+ x="29.411377"
+ y="614.0155"
+ id="tspan3352">veth: virtual NIC</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ x="64.95018"
+ y="656.40637"
+ id="text3354"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="64.95018"
+ y="656.40637"
+ id="tspan3358">physical host</tspan></text>
+ </g>
+</svg>
diff --git a/doc/source/images/filtering-broadcast.png b/doc/source/images/filtering-broadcast.png
new file mode 100644
index 00000000..08dd7b1c
--- /dev/null
+++ b/doc/source/images/filtering-broadcast.png
Binary files differ
diff --git a/doc/source/images/filtering-broadcast.svg b/doc/source/images/filtering-broadcast.svg
new file mode 100644
index 00000000..2b2bb3e4
--- /dev/null
+++ b/doc/source/images/filtering-broadcast.svg
@@ -0,0 +1,882 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1052.3622"
+ height="744.09448"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="filtering-broadcast.svg"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/filtering-broadcast.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.8162589"
+ inkscape:cx="378.08468"
+ inkscape:cy="372.04724"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1345"
+ inkscape:window-height="1004"
+ inkscape:window-x="153"
+ inkscape:window-y="155"
+ inkscape:window-maximized="0"
+ inkscape:snap-grids="true"
+ inkscape:snap-to-guides="false"
+ inkscape:snap-bbox="false"
+ inkscape:snap-page="false"
+ showguides="true"
+ inkscape:guide-bbox="true" />
+ <defs
+ id="defs4">
+ <marker
+ style="overflow:visible;"
+ id="Arrow1Send"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="scale(0.2) rotate(180) translate(6,0)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path4154" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Mend"
+ style="overflow:visible;">
+ <path
+ id="path4166"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(0.6) rotate(180) translate(0,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lstart"
+ style="overflow:visible">
+ <path
+ id="path5113"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) translate(1,0)" />
+ </marker>
+ <linearGradient
+ id="linearGradient6493"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop6495" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5313"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#5555ff;stop-opacity:1;"
+ offset="0"
+ id="stop5315" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mend"
+ style="overflow:visible;">
+ <path
+ id="path5567"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mstart"
+ style="overflow:visible">
+ <path
+ id="path5564"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.4) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;">
+ <path
+ id="path5579"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;">
+ <path
+ id="path5561"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path5558"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <inkscape:path-effect
+ effect="skeletal"
+ id="path-effect5339"
+ is_visible="true"
+ pattern="M 0,0 0,10 10,5 z"
+ copytype="single_stretched"
+ prop_scale="1"
+ scale_y_rel="false"
+ spacing="0"
+ normal_offset="0"
+ tang_offset="0"
+ prop_units="false"
+ vertical_pattern="false"
+ fuse_tolerance="0" />
+ <linearGradient
+ id="linearGradient5242"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#7fff2a;stop-opacity:1;"
+ offset="0"
+ id="stop5244" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 372.04724 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="1052.3622 : 372.04724 : 1"
+ inkscape:persp3d-origin="526.18109 : 248.03149 : 1"
+ id="perspective3009" />
+ <marker
+ inkscape:stockid="Arrow1LendM"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1LendM"
+ style="overflow:visible;">
+ <path
+ id="path4159"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1LendF"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1LendF"
+ style="overflow:visible;">
+ <path
+ id="path4585"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend6"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mend6"
+ style="overflow:visible;">
+ <path
+ id="path5404"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1MendN"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1MendN"
+ style="overflow:visible;">
+ <path
+ id="path5645"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5343-7"
+ id="linearGradient5349-6"
+ x1="-532.43896"
+ y1="622.73621"
+ x2="-318.84055"
+ y2="622.73621"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.83990127,0,0,1.846462,-201.58875,-629.6685)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5343-7">
+ <stop
+ style="stop-color:#aaccff;stop-opacity:1;"
+ offset="0"
+ id="stop5345-4" />
+ <stop
+ style="stop-color:#aaccff;stop-opacity:0;"
+ offset="1"
+ id="stop5347-4" />
+ </linearGradient>
+ <linearGradient
+ y2="622.73621"
+ x2="-318.84055"
+ y1="622.73621"
+ x1="-532.43896"
+ gradientTransform="matrix(1.2042654,0,0,2.6602952,-344.10309,-1384.9447)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient6079-9"
+ xlink:href="#linearGradient5343-7-4"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5343-7-4">
+ <stop
+ style="stop-color:#aaccff;stop-opacity:1;"
+ offset="0"
+ id="stop5345-4-1" />
+ <stop
+ style="stop-color:#aaccff;stop-opacity:0;"
+ offset="1"
+ id="stop5347-4-6" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow1Lenda"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lenda"
+ style="overflow:visible;">
+ <path
+ id="path5800"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#05ff00;stroke-width:1.0pt;fill:#05ff00;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lendan"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lendan"
+ style="overflow:visible;">
+ <path
+ id="path5943"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;marker-start:none;stroke:#059500;stroke-width:1.0pt;fill:#059500"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5343-7"
+ id="linearGradient6508"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.1604673,0,0,4.0490813,171.38161,-2201.4268)"
+ x1="-532.43896"
+ y1="622.73621"
+ x2="-318.84055"
+ y2="622.73621" />
+ <marker
+ inkscape:stockid="Arrow2MendC"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2MendC"
+ style="overflow:visible;">
+ <path
+ id="path4651"
+ style="stroke-linejoin:round;font-size:12.0;fill-rule:evenodd;stroke:#05ff00;stroke-width:0.62500000;fill:#05ff00"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(0.6) rotate(180) translate(0,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend4"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend4"
+ style="overflow:visible;">
+ <path
+ id="path6229"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#0000ff;stroke-width:1.0pt;fill:#0000ff;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2MendC"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2MendC-8"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4651-7"
+ style="font-size:12px;fill:#05ff00;fill-rule:evenodd;stroke:#05ff00;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(-0.6,-0.6)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2MendC"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2MendC-9"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4651-2"
+ style="font-size:12px;fill:#05ff00;fill-rule:evenodd;stroke:#05ff00;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(-0.6,-0.6)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2MendC"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2MendC-1"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4651-75"
+ style="font-size:12px;fill:#05ff00;fill-rule:evenodd;stroke:#05ff00;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(-0.6,-0.6)" />
+ </marker>
+ </defs>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-308.2677)">
+ <path
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 299.73525,592.64067 0,-137.21137"
+ id="path6078"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="opacity:0.5;fill:url(#linearGradient6508);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.30488253;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3065-4"
+ width="459.31204"
+ height="570.29883"
+ x="-977.85541"
+ y="34.933594"
+ transform="matrix(0,-1,1,0,0,0)" />
+ <a
+ id="a4003"
+ transform="matrix(1,0,0,0.81896683,-0.728701,296.31497)"
+ style="fill:#ff2ad4;fill-opacity:1" />
+ <path
+ style="opacity:0.275;fill:#dd6de5;fill-opacity:0.46666667;fill-rule:nonzero;stroke:#ff0000;stroke-width:4.27355194;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.13677602, 2.13677602;stroke-dashoffset:0"
+ d=""
+ id="path4088"
+ inkscape:connector-curvature="0"
+ transform="translate(0,308.2677)" />
+ <rect
+ y="559.10913"
+ x="60.505432"
+ height="367.65173"
+ width="519.54852"
+ id="rect5351-5"
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:5.83484936px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5353-2"
+ y="906.9986"
+ x="259.60919"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="906.9986"
+ x="259.60919"
+ id="tspan5355-6"
+ sodipodi:role="line">nova-compute</tspan></text>
+ <path
+ transform="matrix(0.69506452,0,0,0.47991755,209.24607,569.64778)"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.5626709"
+ sodipodi:arg1="1.0390722"
+ sodipodi:r2="23.694832"
+ sodipodi:r1="69.884941"
+ sodipodi:cy="572.24408"
+ sodipodi:cx="136.41731"
+ sodipodi:sides="6"
+ id="path5250"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5274"
+ y="835.74854"
+ x="305.07117"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="835.74854"
+ x="305.07117"
+ id="tspan5276"
+ sodipodi:role="line">VM</tspan><tspan
+ id="tspan3167"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="858.24854"
+ x="305.07117"
+ sodipodi:role="line">tenant-X</tspan></text>
+ <path
+ transform="matrix(1.0086434,0,0,0.68923037,39.99481,438.12072)"
+ d="m 289.53315,248.36246 -14.42324,24.98178 -28.84647,0 -14.42324,-24.98178 14.42324,-24.98178 28.84647,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="0.52359878"
+ sodipodi:arg1="0"
+ sodipodi:r2="24.981781"
+ sodipodi:r1="28.846476"
+ sodipodi:cy="248.36246"
+ sodipodi:cx="260.68668"
+ sodipodi:sides="6"
+ id="path5523-9"
+ style="opacity:0.5;fill:#2ad4ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5525-6"
+ y="616.38098"
+ x="282.25085"
+ style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="616.38098"
+ x="282.25085"
+ id="tspan5527-5"
+ sodipodi:role="line">OVS</tspan></text>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6228"
+ d="m 301.69654,637.7282 0.16768,162.95949"
+ style="fill:none;stroke:#05ff00;stroke-width:9.474823;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2MendC)" />
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="234.13361"
+ y="961.9939"
+ id="text3193"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3195"
+ x="234.13361"
+ y="961.9939">physical host</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="31.2332"
+ y="1021.6772"
+ id="text6045"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="31.2332"
+ y="1021.6772"
+ id="tspan3090">broadcast filtering</tspan></text>
+ <g
+ id="g6280"
+ transform="translate(38.34449,-222.28264)">
+ <g
+ transform="matrix(1,0,0,0.71409652,-474.38063,289.09459)"
+ id="g5864-4">
+ <rect
+ style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.79479539px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5858-6"
+ width="26.969246"
+ height="59.086094"
+ x="722.52655"
+ y="601.5531" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="611.76575"
+ y="-729.16479"
+ id="text5860-69"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,1,-1,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan5862-8"
+ x="611.76575"
+ y="-729.16479">eth</tspan></text>
+ </g>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#05ff00;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="459.41306"
+ y="697.02533"
+ id="text6080"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6082"
+ x="459.41306"
+ y="697.02533" /></text>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot6500"
+ style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Bitstream Vera Sans;font-style:normal;font-weight:normal;font-size:40px;line-height:125%;letter-spacing:0px;word-spacing:0px"><flowRegion
+ id="flowRegion6502"><rect
+ id="rect6504"
+ width="978.85608"
+ height="519.44305"
+ x="-91.882614"
+ y="261.40448" /></flowRegion><flowPara
+ id="flowPara6506" /></flowRoot> <rect
+ y="391.50186"
+ x="539.10345"
+ height="41.623135"
+ width="183.73491"
+ id="rect5364-7"
+ style="fill:#00fffc;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.03031623px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5366-8"
+ y="423.66403"
+ x="546.43896"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="423.66403"
+ x="546.43896"
+ id="tspan5368-6"
+ sodipodi:role="line">tenant-Y</tspan></text>
+ <rect
+ y="451.30692"
+ x="543.70288"
+ height="24.921518"
+ width="96.129616"
+ id="rect5234-2-4-7-9"
+ style="fill:#00fffc;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.67940903px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ transform="scale(1.0611323,0.94238956)"
+ sodipodi:linespacing="125%"
+ id="text5236-9-8-1-8"
+ y="496.10165"
+ x="517.40717"
+ style="font-size:17.24429703px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="496.10165"
+ x="517.40717"
+ id="tspan5238-6-0-7-5"
+ sodipodi:role="line">mac addr</tspan></text>
+ <g
+ id="g6423"
+ transform="translate(252.26686,-258.61948)"
+ style="opacity:0.6125;fill:#3866a9;fill-opacity:0.46666667">
+ <rect
+ style="fill:#b1c76d;fill-opacity:0.46666667;fill-rule:evenodd;stroke:#ff1300;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect6358-7"
+ width="267.63913"
+ height="28.903856"
+ x="80.828072"
+ y="594.69769" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text6360-0"
+ y="615.96716"
+ x="86.097534"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#3866a9;fill-opacity:0.46666667;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="615.96716"
+ x="86.097534"
+ id="tspan6362-5"
+ sodipodi:role="line"
+ style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-opacity:1">ryu-openflow-controller</tspan></text>
+ </g>
+ <rect
+ y="392.70511"
+ x="336.8739"
+ height="41.623135"
+ width="183.73491"
+ id="rect5364"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.03031623px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5366"
+ y="424.86722"
+ x="344.20935"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="424.86722"
+ x="344.20935"
+ id="tspan5368"
+ sodipodi:role="line">tenant-X</tspan></text>
+ <rect
+ y="448.73129"
+ x="330.94141"
+ height="24.921518"
+ width="96.129616"
+ id="rect5234-2-4-7"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.67940903px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ transform="scale(1.0611323,0.94238956)"
+ sodipodi:linespacing="125%"
+ id="text5236-9-8-1"
+ y="493.36758"
+ x="316.90228"
+ style="font-size:17.24429703px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="493.36758"
+ x="316.90228"
+ id="tspan5238-6-0-7"
+ sodipodi:role="line">mac addr</tspan></text>
+ <path
+ transform="matrix(0.69506452,0,0,0.47991755,36.24517,333.72159)"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.5626709"
+ sodipodi:arg1="1.0390722"
+ sodipodi:r2="23.694832"
+ sodipodi:r1="69.884941"
+ sodipodi:cy="572.24408"
+ sodipodi:cx="136.41731"
+ sodipodi:sides="6"
+ id="path5250-9"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5274-7"
+ y="599.82227"
+ x="132.07027"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="599.82227"
+ x="132.07027"
+ id="tspan5276-5"
+ sodipodi:role="line">VM</tspan><tspan
+ id="tspan3167-3"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="622.32227"
+ x="132.07027"
+ sodipodi:role="line">tenant-X</tspan></text>
+ <path
+ transform="matrix(0.69506452,0,0,0.47991755,418.47684,336.17178)"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.5626709"
+ sodipodi:arg1="1.0390722"
+ sodipodi:r2="23.694832"
+ sodipodi:r1="69.884941"
+ sodipodi:cy="572.24408"
+ sodipodi:cx="136.41731"
+ sodipodi:sides="6"
+ id="path5250-8"
+ style="fill:#00fffc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5274-8"
+ y="602.27258"
+ x="514.30194"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="602.27258"
+ x="514.30194"
+ id="tspan5276-3"
+ sodipodi:role="line">VM</tspan><tspan
+ id="tspan3167-1"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="624.77258"
+ x="514.30194"
+ sodipodi:role="line">tenant-Y</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="383.86325"
+ y="639.50299"
+ id="text3315"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3317"
+ x="383.86325"
+ y="639.50299"
+ style="font-size:22px;fill:#ff0000">X:block</tspan></text>
+ <rect
+ y="382.81296"
+ x="147.81929"
+ height="97.126534"
+ width="101.95992"
+ id="rect5232-3-7"
+ style="fill:#f2f2f2;stroke:#000000;stroke-width:0.68900102px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <rect
+ y="383.77469"
+ x="148.8909"
+ height="47.919254"
+ width="99.525726"
+ id="rect5234-1-0"
+ style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.95860159000000000px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5236-0-4"
+ y="428.19177"
+ x="142.9001"
+ style="font-size:17.24429703px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ transform="scale(1.0611323,0.94238956)"><tspan
+ y="428.19177"
+ x="142.9001"
+ id="tspan5238-7-8"
+ sodipodi:role="line">broadcast/</tspan><tspan
+ y="449.74713"
+ x="142.9001"
+ sodipodi:role="line"
+ id="tspan3123">multicast</tspan></text>
+ <rect
+ y="432.63403"
+ x="148.29062"
+ height="24.908871"
+ width="99.792274"
+ id="rect5234-2-4-0"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.69205552px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5236-9-8-4"
+ y="477.57947"
+ x="145.92354"
+ style="font-size:17.24429703px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ transform="scale(1.0611323,0.94238956)"><tspan
+ y="477.57947"
+ x="145.92354"
+ id="tspan5238-6-0-2"
+ sodipodi:role="line">src addr</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5280-1-9"
+ y="504.86719"
+ x="163.08846"
+ style="font-size:15.80727291px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ transform="scale(1.0611323,0.94238956)"><tspan
+ y="504.86719"
+ x="163.08846"
+ id="tspan5282-8-6"
+ sodipodi:role="line">data</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 272.57822,610.10054 -95.55792,-1.2251"
+ id="path6078-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 464.91915,612.55074 -132.31096,-1.2251"
+ id="path6078-9"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6228-0"
+ d="m 270.11538,448.07067 0.1713,126.73982"
+ style="fill:none;stroke:#05ff00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2MendC)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6228-8"
+ d="m 270.11603,628.79147 -77.01907,-1.48458"
+ style="fill:none;stroke:#05ff00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2MendC)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6228-8-7"
+ d="m 337.67593,631.84027 35.90109,1.00644"
+ style="fill:none;stroke:#05ff00;stroke-width:4.11323547;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2MendC)" />
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="172.32462"
+ y="658.73059"
+ id="text4337-4"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4339-5"
+ x="172.32462"
+ y="658.73059">forward</tspan></text>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot4029"
+ style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Bitstream Vera Sans;font-style:normal;font-weight:normal;font-size:40px;line-height:125%;letter-spacing:0px;word-spacing:0px"><flowRegion
+ id="flowRegion4031"><rect
+ id="rect4033"
+ width="580.69812"
+ height="236.4446"
+ x="526.79364"
+ y="-33.844967" /></flowRegion><flowPara
+ id="flowPara4035"></flowPara></flowRoot> </g>
+</svg>
diff --git a/doc/source/images/filtering-incoming.png b/doc/source/images/filtering-incoming.png
new file mode 100644
index 00000000..5151b540
--- /dev/null
+++ b/doc/source/images/filtering-incoming.png
Binary files differ
diff --git a/doc/source/images/filtering-incoming.svg b/doc/source/images/filtering-incoming.svg
new file mode 100644
index 00000000..fad8faa7
--- /dev/null
+++ b/doc/source/images/filtering-incoming.svg
@@ -0,0 +1,958 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1052.3622"
+ height="744.09448"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="filtering-incoming.svg"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/filtering-incoming.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.8162589"
+ inkscape:cx="452.97333"
+ inkscape:cy="372.04724"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1345"
+ inkscape:window-height="1004"
+ inkscape:window-x="118"
+ inkscape:window-y="72"
+ inkscape:window-maximized="0"
+ inkscape:snap-grids="true"
+ inkscape:snap-to-guides="false"
+ inkscape:snap-bbox="false"
+ inkscape:snap-page="false"
+ showguides="true"
+ inkscape:guide-bbox="true" />
+ <defs
+ id="defs4">
+ <marker
+ style="overflow:visible;"
+ id="Arrow1Send"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="scale(0.2) rotate(180) translate(6,0)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path4154" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Mend"
+ style="overflow:visible;">
+ <path
+ id="path4166"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(0.6) rotate(180) translate(0,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lstart"
+ style="overflow:visible">
+ <path
+ id="path5113"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) translate(1,0)" />
+ </marker>
+ <linearGradient
+ id="linearGradient6493"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop6495" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5313"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#5555ff;stop-opacity:1;"
+ offset="0"
+ id="stop5315" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mend"
+ style="overflow:visible;">
+ <path
+ id="path5567"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mstart"
+ style="overflow:visible">
+ <path
+ id="path5564"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.4) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;">
+ <path
+ id="path5579"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;">
+ <path
+ id="path5561"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path5558"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <inkscape:path-effect
+ effect="skeletal"
+ id="path-effect5339"
+ is_visible="true"
+ pattern="M 0,0 0,10 10,5 z"
+ copytype="single_stretched"
+ prop_scale="1"
+ scale_y_rel="false"
+ spacing="0"
+ normal_offset="0"
+ tang_offset="0"
+ prop_units="false"
+ vertical_pattern="false"
+ fuse_tolerance="0" />
+ <linearGradient
+ id="linearGradient5242"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#7fff2a;stop-opacity:1;"
+ offset="0"
+ id="stop5244" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 372.04724 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="1052.3622 : 372.04724 : 1"
+ inkscape:persp3d-origin="526.18109 : 248.03149 : 1"
+ id="perspective3009" />
+ <marker
+ inkscape:stockid="Arrow1LendM"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1LendM"
+ style="overflow:visible;">
+ <path
+ id="path4159"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1LendF"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1LendF"
+ style="overflow:visible;">
+ <path
+ id="path4585"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend6"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mend6"
+ style="overflow:visible;">
+ <path
+ id="path5404"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1MendN"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1MendN"
+ style="overflow:visible;">
+ <path
+ id="path5645"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5343-7"
+ id="linearGradient5349-6"
+ x1="-532.43896"
+ y1="622.73621"
+ x2="-318.84055"
+ y2="622.73621"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.83990127,0,0,1.846462,-201.58875,-629.6685)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5343-7">
+ <stop
+ style="stop-color:#aaccff;stop-opacity:1;"
+ offset="0"
+ id="stop5345-4" />
+ <stop
+ style="stop-color:#aaccff;stop-opacity:0;"
+ offset="1"
+ id="stop5347-4" />
+ </linearGradient>
+ <linearGradient
+ y2="622.73621"
+ x2="-318.84055"
+ y1="622.73621"
+ x1="-532.43896"
+ gradientTransform="matrix(1.2042654,0,0,2.6602952,-344.10309,-1384.9447)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient6079-9"
+ xlink:href="#linearGradient5343-7-4"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5343-7-4">
+ <stop
+ style="stop-color:#aaccff;stop-opacity:1;"
+ offset="0"
+ id="stop5345-4-1" />
+ <stop
+ style="stop-color:#aaccff;stop-opacity:0;"
+ offset="1"
+ id="stop5347-4-6" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow1Lenda"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lenda"
+ style="overflow:visible;">
+ <path
+ id="path5800"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#05ff00;stroke-width:1.0pt;fill:#05ff00;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lendan"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lendan"
+ style="overflow:visible;">
+ <path
+ id="path5943"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;marker-start:none;stroke:#059500;stroke-width:1.0pt;fill:#059500"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5343-7"
+ id="linearGradient6508"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.1604673,0,0,4.0490813,171.38161,-2201.4268)"
+ x1="-532.43896"
+ y1="622.73621"
+ x2="-318.84055"
+ y2="622.73621" />
+ <marker
+ inkscape:stockid="Arrow2MendC"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2MendC"
+ style="overflow:visible;">
+ <path
+ id="path4651"
+ style="stroke-linejoin:round;font-size:12.0;fill-rule:evenodd;stroke:#05ff00;stroke-width:0.62500000;fill:#05ff00"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(0.6) rotate(180) translate(0,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend4"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend4"
+ style="overflow:visible;">
+ <path
+ id="path6229"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#0000ff;stroke-width:1.0pt;fill:#0000ff;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2MendC"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2MendC-8"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4651-7"
+ style="font-size:12px;fill:#05ff00;fill-rule:evenodd;stroke:#05ff00;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(-0.6,-0.6)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2MendC"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2MendC-9"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4651-2"
+ style="font-size:12px;fill:#05ff00;fill-rule:evenodd;stroke:#05ff00;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(-0.6,-0.6)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2MendC"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2MendC-1"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4651-75"
+ style="font-size:12px;fill:#05ff00;fill-rule:evenodd;stroke:#05ff00;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(-0.6,-0.6)" />
+ </marker>
+ </defs>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-308.2677)">
+ <path
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 299.73525,592.64067 0,-137.21137"
+ id="path6078"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="opacity:0.5;fill:url(#linearGradient6508);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.30488253;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3065-4"
+ width="459.31204"
+ height="570.29883"
+ x="-977.85541"
+ y="34.933594"
+ transform="matrix(0,-1,1,0,0,0)" />
+ <a
+ id="a4003"
+ transform="matrix(1,0,0,0.81896683,-0.728701,296.31497)"
+ style="fill:#ff2ad4;fill-opacity:1" />
+ <path
+ style="opacity:0.275;fill:#dd6de5;fill-opacity:0.46666667;fill-rule:nonzero;stroke:#ff0000;stroke-width:4.27355194;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.13677602, 2.13677602;stroke-dashoffset:0"
+ d=""
+ id="path4088"
+ inkscape:connector-curvature="0"
+ transform="translate(0,308.2677)" />
+ <rect
+ y="559.10913"
+ x="60.505432"
+ height="367.65173"
+ width="519.54852"
+ id="rect5351-5"
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:5.83484936px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5353-2"
+ y="906.9986"
+ x="259.60919"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="906.9986"
+ x="259.60919"
+ id="tspan5355-6"
+ sodipodi:role="line">nova-compute</tspan></text>
+ <path
+ transform="matrix(0.69506452,0,0,0.47991755,209.24607,569.64778)"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.5626709"
+ sodipodi:arg1="1.0390722"
+ sodipodi:r2="23.694832"
+ sodipodi:r1="69.884941"
+ sodipodi:cy="572.24408"
+ sodipodi:cx="136.41731"
+ sodipodi:sides="6"
+ id="path5250"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5274"
+ y="835.74854"
+ x="305.07117"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="835.74854"
+ x="305.07117"
+ id="tspan5276"
+ sodipodi:role="line">VM</tspan><tspan
+ id="tspan3167"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="858.24854"
+ x="305.07117"
+ sodipodi:role="line">tenant-X</tspan></text>
+ <path
+ transform="matrix(1.0086434,0,0,0.68923037,39.99481,438.12072)"
+ d="m 289.53315,248.36246 -14.42324,24.98178 -28.84647,0 -14.42324,-24.98178 14.42324,-24.98178 28.84647,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="0.52359878"
+ sodipodi:arg1="0"
+ sodipodi:r2="24.981781"
+ sodipodi:r1="28.846476"
+ sodipodi:cy="248.36246"
+ sodipodi:cx="260.68668"
+ sodipodi:sides="6"
+ id="path5523-9"
+ style="opacity:0.5;fill:#2ad4ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5525-6"
+ y="616.38098"
+ x="282.25085"
+ style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="616.38098"
+ x="282.25085"
+ id="tspan5527-5"
+ sodipodi:role="line">OVS</tspan></text>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6228"
+ d="m 301.69654,637.7282 0.16768,162.95949"
+ style="fill:none;stroke:#05ff00;stroke-width:9.474823;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2MendC)" />
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="234.13361"
+ y="961.9939"
+ id="text3193"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3195"
+ x="234.13361"
+ y="961.9939">physical host</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="31.2332"
+ y="1021.6772"
+ id="text6045"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="31.2332"
+ y="1021.6772"
+ id="tspan3090">incoming filtering</tspan></text>
+ <g
+ id="g6280"
+ transform="translate(38.34449,-222.28264)">
+ <g
+ transform="matrix(1,0,0,0.71409652,-474.38063,289.09459)"
+ id="g5864-4">
+ <rect
+ style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.79479539px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5858-6"
+ width="26.969246"
+ height="59.086094"
+ x="722.52655"
+ y="601.5531" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="611.76575"
+ y="-729.16479"
+ id="text5860-69"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,1,-1,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan5862-8"
+ x="611.76575"
+ y="-729.16479">eth</tspan></text>
+ </g>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#05ff00;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="459.41306"
+ y="697.02533"
+ id="text6080"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6082"
+ x="459.41306"
+ y="697.02533" /></text>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot6500"
+ style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Bitstream Vera Sans;font-style:normal;font-weight:normal;font-size:40px;line-height:125%;letter-spacing:0px;word-spacing:0px"><flowRegion
+ id="flowRegion6502"><rect
+ id="rect6504"
+ width="978.85608"
+ height="519.44305"
+ x="-91.882614"
+ y="261.40448" /></flowRegion><flowPara
+ id="flowPara6506" /></flowRoot> <g
+ id="g5284-2"
+ transform="matrix(0.7624367,0,0,0.67711861,-166.08141,112.88421)">
+ <rect
+ style="fill:#f2f2f2;stroke:#000000;stroke-width:0.78552711px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5232-3"
+ width="117.8242"
+ height="109.24851"
+ x="628.36981"
+ y="431.12851" />
+ <rect
+ style="fill:#00fffc;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.90931469px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5234-1"
+ width="116.47533"
+ height="36.843727"
+ x="629.65686"
+ y="432.41547" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="638.27789"
+ y="458.18796"
+ id="text5236-0"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5238-7"
+ x="638.27789"
+ y="458.18796">dst addr</tspan></text>
+ <rect
+ style="fill:#05ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.90931469px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5234-2-4"
+ width="116.47533"
+ height="36.843727"
+ x="629.04431"
+ y="470.39359" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="637.66534"
+ y="496.16611"
+ id="text5236-9-8"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5238-6-0"
+ x="637.66534"
+ y="496.16611">src addr</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="661.55481"
+ y="534.14423"
+ id="text5280-1"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5282-8"
+ x="661.55481"
+ y="534.14423">data</tspan></text>
+ </g>
+ <rect
+ y="396.40228"
+ x="656.7132"
+ height="41.623135"
+ width="183.73491"
+ id="rect5364-7"
+ style="fill:#00fffc;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.03031623px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5366-8"
+ y="428.56445"
+ x="664.04871"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="428.56445"
+ x="664.04871"
+ id="tspan5368-6"
+ sodipodi:role="line">tenant-Y</tspan></text>
+ <rect
+ y="456.20734"
+ x="661.31262"
+ height="24.921518"
+ width="96.129616"
+ id="rect5234-2-4-7-9"
+ style="fill:#00fffc;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.67940903px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ transform="scale(1.0611323,0.94238956)"
+ sodipodi:linespacing="125%"
+ id="text5236-9-8-1-8"
+ y="501.30164"
+ x="628.24133"
+ style="font-size:17.24429703px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="501.30164"
+ x="628.24133"
+ id="tspan5238-6-0-7-5"
+ sodipodi:role="line">mac addr</tspan></text>
+ <g
+ id="g6423"
+ transform="translate(369.87661,-253.71907)"
+ style="opacity:0.6125;fill:#3866a9;fill-opacity:0.46666667">
+ <rect
+ style="fill:#b1c76d;fill-opacity:0.46666667;fill-rule:evenodd;stroke:#ff1300;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect6358-7"
+ width="267.63913"
+ height="28.903856"
+ x="80.828072"
+ y="594.69769" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text6360-0"
+ y="615.96716"
+ x="86.097534"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#3866a9;fill-opacity:0.46666667;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="615.96716"
+ x="86.097534"
+ id="tspan6362-5"
+ sodipodi:role="line"
+ style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-opacity:1">ryu-openflow-controller</tspan></text>
+ </g>
+ <rect
+ y="397.60553"
+ x="454.48364"
+ height="41.623135"
+ width="183.73491"
+ id="rect5364"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.03031623px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5366"
+ y="429.76764"
+ x="461.81909"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="429.76764"
+ x="461.81909"
+ id="tspan5368"
+ sodipodi:role="line">tenant-X</tspan></text>
+ <rect
+ y="453.63171"
+ x="448.55115"
+ height="24.921518"
+ width="96.129616"
+ id="rect5234-2-4-7"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.67940903px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ transform="scale(1.0611323,0.94238956)"
+ sodipodi:linespacing="125%"
+ id="text5236-9-8-1"
+ y="498.56757"
+ x="427.73648"
+ style="font-size:17.24429703px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="498.56757"
+ x="427.73648"
+ id="tspan5238-6-0-7"
+ sodipodi:role="line">mac addr</tspan></text>
+ <path
+ transform="matrix(0.69506452,0,0,0.47991755,36.24517,333.72159)"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.5626709"
+ sodipodi:arg1="1.0390722"
+ sodipodi:r2="23.694832"
+ sodipodi:r1="69.884941"
+ sodipodi:cy="572.24408"
+ sodipodi:cx="136.41731"
+ sodipodi:sides="6"
+ id="path5250-9"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5274-7"
+ y="599.82227"
+ x="132.07027"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="599.82227"
+ x="132.07027"
+ id="tspan5276-5"
+ sodipodi:role="line">VM</tspan><tspan
+ id="tspan3167-3"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="622.32227"
+ x="132.07027"
+ sodipodi:role="line">tenant-X</tspan></text>
+ <path
+ transform="matrix(0.69506452,0,0,0.47991755,418.47684,336.17178)"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.5626709"
+ sodipodi:arg1="1.0390722"
+ sodipodi:r2="23.694832"
+ sodipodi:r1="69.884941"
+ sodipodi:cy="572.24408"
+ sodipodi:cx="136.41731"
+ sodipodi:sides="6"
+ id="path5250-8"
+ style="fill:#00fffc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5274-8"
+ y="602.27258"
+ x="514.30194"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="602.27258"
+ x="514.30194"
+ id="tspan5276-3"
+ sodipodi:role="line">VM</tspan><tspan
+ id="tspan3167-1"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="624.77258"
+ x="514.30194"
+ sodipodi:role="line">tenant-Y</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="328.93289"
+ y="394.23975"
+ id="text3311"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3313"
+ x="328.93289"
+ y="394.23975">drop</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="383.86325"
+ y="639.50299"
+ id="text3315"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3317"
+ x="383.86325"
+ y="639.50299"
+ style="font-size:22px;fill:#ff0000">X:block</tspan></text>
+ <rect
+ y="406.02759"
+ x="173.75699"
+ height="73.974197"
+ width="89.833496"
+ id="rect5232-3-7"
+ style="fill:#f2f2f2;stroke:#000000;stroke-width:0.56441098px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <rect
+ y="406.89899"
+ x="174.73828"
+ height="24.947573"
+ width="88.805061"
+ id="rect5234-1-0"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.65335387px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5236-0-4"
+ y="450.29169"
+ x="170.86581"
+ style="font-size:17.24429703px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ transform="scale(1.0611323,0.94238956)"><tspan
+ y="450.29169"
+ x="170.86581"
+ id="tspan5238-7-8"
+ sodipodi:role="line">dst addr</tspan></text>
+ <rect
+ y="432.61469"
+ x="174.27127"
+ height="24.947573"
+ width="88.805061"
+ id="rect5234-2-4-0"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.65335387px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5236-9-8-4"
+ y="477.57947"
+ x="170.42569"
+ style="font-size:17.24429703px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ transform="scale(1.0611323,0.94238956)"><tspan
+ y="477.57947"
+ x="170.42569"
+ id="tspan5238-6-0-2"
+ sodipodi:role="line">src addr</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5280-1-9"
+ y="504.86719"
+ x="187.59061"
+ style="font-size:15.80727291px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ transform="scale(1.0611323,0.94238956)"><tspan
+ y="504.86719"
+ x="187.59061"
+ id="tspan5282-8-6"
+ sodipodi:role="line">data</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="189.2713"
+ y="395.23572"
+ id="text3373"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3375"
+ x="189.2713"
+ y="395.23572">pass</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 272.57822,610.10054 -95.55792,-1.2251"
+ id="path6078-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 464.91915,612.55074 -132.31096,-1.2251"
+ id="path6078-9"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6228-0"
+ d="m 270.11538,448.07067 0.1713,126.73982"
+ style="fill:none;stroke:#05ff00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2MendC)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6228-8"
+ d="m 270.11603,628.79147 -77.01907,-1.48458"
+ style="fill:none;stroke:#05ff00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2MendC)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6228-8-7"
+ d="m 337.67593,631.84027 35.90109,1.00644"
+ style="fill:none;stroke:#05ff00;stroke-width:4.11323547;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2MendC)" />
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="172.32462"
+ y="658.73059"
+ id="text4337-4"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4339-5"
+ x="172.32462"
+ y="658.73059">forward</tspan></text>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot3137"
+ style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Bitstream Vera Sans;font-style:normal;font-weight:normal;font-size:40px;line-height:125%;letter-spacing:0px;word-spacing:0px"><flowRegion
+ id="flowRegion3139"><rect
+ id="rect3141"
+ width="584.37341"
+ height="270.74744"
+ x="469.21387"
+ y="-63.247402" /></flowRegion><flowPara
+ id="flowPara3143"></flowPara></flowRoot> </g>
+</svg>
diff --git a/doc/source/images/filtering-outgoing.png b/doc/source/images/filtering-outgoing.png
new file mode 100644
index 00000000..c7495929
--- /dev/null
+++ b/doc/source/images/filtering-outgoing.png
Binary files differ
diff --git a/doc/source/images/filtering-outgoing.svg b/doc/source/images/filtering-outgoing.svg
new file mode 100644
index 00000000..6314fd1d
--- /dev/null
+++ b/doc/source/images/filtering-outgoing.svg
@@ -0,0 +1,960 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1052.3622"
+ height="744.09448"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="filtering-outgoing.svg"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/filtering-outgoing.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.8162589"
+ inkscape:cx="440.44106"
+ inkscape:cy="372.04724"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1345"
+ inkscape:window-height="1004"
+ inkscape:window-x="94"
+ inkscape:window-y="41"
+ inkscape:window-maximized="0"
+ inkscape:snap-grids="true"
+ inkscape:snap-to-guides="false"
+ inkscape:snap-bbox="false"
+ inkscape:snap-page="false"
+ showguides="true"
+ inkscape:guide-bbox="true" />
+ <defs
+ id="defs4">
+ <marker
+ style="overflow:visible;"
+ id="Arrow1Send"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="scale(0.2) rotate(180) translate(6,0)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path4154" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Mend"
+ style="overflow:visible;">
+ <path
+ id="path4166"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(0.6) rotate(180) translate(0,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lstart"
+ style="overflow:visible">
+ <path
+ id="path5113"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) translate(1,0)" />
+ </marker>
+ <linearGradient
+ id="linearGradient6493"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop6495" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5313"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#5555ff;stop-opacity:1;"
+ offset="0"
+ id="stop5315" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mend"
+ style="overflow:visible;">
+ <path
+ id="path5567"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mstart"
+ style="overflow:visible">
+ <path
+ id="path5564"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.4) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;">
+ <path
+ id="path5579"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;">
+ <path
+ id="path5561"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path5558"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <inkscape:path-effect
+ effect="skeletal"
+ id="path-effect5339"
+ is_visible="true"
+ pattern="M 0,0 0,10 10,5 z"
+ copytype="single_stretched"
+ prop_scale="1"
+ scale_y_rel="false"
+ spacing="0"
+ normal_offset="0"
+ tang_offset="0"
+ prop_units="false"
+ vertical_pattern="false"
+ fuse_tolerance="0" />
+ <linearGradient
+ id="linearGradient5242"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#7fff2a;stop-opacity:1;"
+ offset="0"
+ id="stop5244" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 372.04724 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="1052.3622 : 372.04724 : 1"
+ inkscape:persp3d-origin="526.18109 : 248.03149 : 1"
+ id="perspective3009" />
+ <marker
+ inkscape:stockid="Arrow1LendM"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1LendM"
+ style="overflow:visible;">
+ <path
+ id="path4159"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1LendF"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1LendF"
+ style="overflow:visible;">
+ <path
+ id="path4585"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend6"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mend6"
+ style="overflow:visible;">
+ <path
+ id="path5404"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1MendN"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1MendN"
+ style="overflow:visible;">
+ <path
+ id="path5645"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5343-7"
+ id="linearGradient5349-6"
+ x1="-532.43896"
+ y1="622.73621"
+ x2="-318.84055"
+ y2="622.73621"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.83990127,0,0,1.846462,-201.58875,-629.6685)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5343-7">
+ <stop
+ style="stop-color:#aaccff;stop-opacity:1;"
+ offset="0"
+ id="stop5345-4" />
+ <stop
+ style="stop-color:#aaccff;stop-opacity:0;"
+ offset="1"
+ id="stop5347-4" />
+ </linearGradient>
+ <linearGradient
+ y2="622.73621"
+ x2="-318.84055"
+ y1="622.73621"
+ x1="-532.43896"
+ gradientTransform="matrix(1.2042654,0,0,2.6602952,-344.10309,-1384.9447)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient6079-9"
+ xlink:href="#linearGradient5343-7-4"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5343-7-4">
+ <stop
+ style="stop-color:#aaccff;stop-opacity:1;"
+ offset="0"
+ id="stop5345-4-1" />
+ <stop
+ style="stop-color:#aaccff;stop-opacity:0;"
+ offset="1"
+ id="stop5347-4-6" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow1Lenda"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lenda"
+ style="overflow:visible;">
+ <path
+ id="path5800"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#05ff00;stroke-width:1.0pt;fill:#05ff00;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lendan"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lendan"
+ style="overflow:visible;">
+ <path
+ id="path5943"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;marker-start:none;stroke:#059500;stroke-width:1.0pt;fill:#059500"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5343-7"
+ id="linearGradient6508"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.1604673,0,0,4.0490813,171.38161,-2201.4268)"
+ x1="-532.43896"
+ y1="622.73621"
+ x2="-318.84055"
+ y2="622.73621" />
+ <marker
+ inkscape:stockid="Arrow2MendC"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2MendC"
+ style="overflow:visible;">
+ <path
+ id="path4651"
+ style="stroke-linejoin:round;font-size:12.0;fill-rule:evenodd;stroke:#05ff00;stroke-width:0.62500000;fill:#05ff00"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(0.6) rotate(180) translate(0,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend4"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend4"
+ style="overflow:visible;">
+ <path
+ id="path6229"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#0000ff;stroke-width:1.0pt;fill:#0000ff;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2MendC"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2MendC-8"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4651-7"
+ style="font-size:12px;fill:#05ff00;fill-rule:evenodd;stroke:#05ff00;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(-0.6,-0.6)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2MendC"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2MendC-9"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4651-2"
+ style="font-size:12px;fill:#05ff00;fill-rule:evenodd;stroke:#05ff00;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(-0.6,-0.6)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2MendC"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2MendC-1"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4651-75"
+ style="font-size:12px;fill:#05ff00;fill-rule:evenodd;stroke:#05ff00;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(-0.6,-0.6)" />
+ </marker>
+ </defs>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-308.2677)">
+ <path
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 299.73525,592.64067 0,-137.21137"
+ id="path6078"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="opacity:0.5;fill:url(#linearGradient6508);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.30488253;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3065-4"
+ width="459.31204"
+ height="570.29883"
+ x="-977.85541"
+ y="34.933594"
+ transform="matrix(0,-1,1,0,0,0)" />
+ <a
+ id="a4003"
+ transform="matrix(1,0,0,0.81896683,-0.728701,296.31497)"
+ style="fill:#ff2ad4;fill-opacity:1" />
+ <path
+ style="opacity:0.275;fill:#dd6de5;fill-opacity:0.46666667;fill-rule:nonzero;stroke:#ff0000;stroke-width:4.27355194;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.13677602, 2.13677602;stroke-dashoffset:0"
+ d=""
+ id="path4088"
+ inkscape:connector-curvature="0"
+ transform="translate(0,308.2677)" />
+ <rect
+ y="559.10913"
+ x="60.505432"
+ height="367.65173"
+ width="519.54852"
+ id="rect5351-5"
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:5.83484936px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5353-2"
+ y="906.9986"
+ x="259.60919"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="906.9986"
+ x="259.60919"
+ id="tspan5355-6"
+ sodipodi:role="line">nova-compute</tspan></text>
+ <path
+ transform="matrix(0.69506452,0,0,0.47991755,209.24607,569.64778)"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.5626709"
+ sodipodi:arg1="1.0390722"
+ sodipodi:r2="23.694832"
+ sodipodi:r1="69.884941"
+ sodipodi:cy="572.24408"
+ sodipodi:cx="136.41731"
+ sodipodi:sides="6"
+ id="path5250"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5274"
+ y="835.74854"
+ x="305.07117"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="835.74854"
+ x="305.07117"
+ id="tspan5276"
+ sodipodi:role="line">VM</tspan><tspan
+ id="tspan3167"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="858.24854"
+ x="305.07117"
+ sodipodi:role="line">tenant-X</tspan></text>
+ <path
+ transform="matrix(1.0086434,0,0,0.68923037,39.99481,438.12072)"
+ d="m 289.53315,248.36246 -14.42324,24.98178 -28.84647,0 -14.42324,-24.98178 14.42324,-24.98178 28.84647,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="0.52359878"
+ sodipodi:arg1="0"
+ sodipodi:r2="24.981781"
+ sodipodi:r1="28.846476"
+ sodipodi:cy="248.36246"
+ sodipodi:cx="260.68668"
+ sodipodi:sides="6"
+ id="path5523-9"
+ style="opacity:0.5;fill:#2ad4ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5525-6"
+ y="616.38098"
+ x="282.25085"
+ style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="616.38098"
+ x="282.25085"
+ id="tspan5527-5"
+ sodipodi:role="line">OVS</tspan></text>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6228"
+ d="m 301.69654,810.2751 0.16768,-162.95949"
+ style="fill:none;stroke:#05ff00;stroke-width:9.474823;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2MendC)" />
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="234.13361"
+ y="961.9939"
+ id="text3193"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3195"
+ x="234.13361"
+ y="961.9939">physical host</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="31.2332"
+ y="1021.6772"
+ id="text6045"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="31.2332"
+ y="1021.6772"
+ id="tspan3090">unicast filtering</tspan></text>
+ <g
+ id="g6280"
+ transform="translate(38.34449,-222.28264)">
+ <g
+ transform="matrix(1,0,0,0.71409652,-474.38063,289.09459)"
+ id="g5864-4">
+ <rect
+ style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.79479539px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5858-6"
+ width="26.969246"
+ height="59.086094"
+ x="722.52655"
+ y="601.5531" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="611.76575"
+ y="-729.16479"
+ id="text5860-69"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,1,-1,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan5862-8"
+ x="611.76575"
+ y="-729.16479">eth</tspan></text>
+ </g>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#05ff00;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="459.41306"
+ y="697.02533"
+ id="text6080"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6082"
+ x="459.41306"
+ y="697.02533" /></text>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot6500"
+ style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Bitstream Vera Sans;font-style:normal;font-weight:normal;font-size:40px;line-height:125%;letter-spacing:0px;word-spacing:0px"><flowRegion
+ id="flowRegion6502"><rect
+ id="rect6504"
+ width="978.85608"
+ height="519.44305"
+ x="-91.882614"
+ y="261.40448" /></flowRegion><flowPara
+ id="flowPara6506" /></flowRoot> <g
+ id="g5284-2"
+ transform="matrix(0.7624367,0,0,0.67711861,-148.92999,421.60979)">
+ <rect
+ style="fill:#f2f2f2;stroke:#000000;stroke-width:0.78552711px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5232-3"
+ width="117.8242"
+ height="109.24851"
+ x="628.36981"
+ y="431.12851" />
+ <rect
+ style="fill:#00fffc;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.90931469px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5234-1"
+ width="116.47533"
+ height="36.843727"
+ x="629.65686"
+ y="432.41547" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="638.27789"
+ y="458.18796"
+ id="text5236-0"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5238-7"
+ x="638.27789"
+ y="458.18796">dst addr</tspan></text>
+ <rect
+ style="fill:#05ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.90931469px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5234-2-4"
+ width="116.47533"
+ height="36.843727"
+ x="629.04431"
+ y="470.39359" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="637.66534"
+ y="496.16611"
+ id="text5236-9-8"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5238-6-0"
+ x="637.66534"
+ y="496.16611">src addr</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="661.55481"
+ y="534.14423"
+ id="text5280-1"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5282-8"
+ x="661.55481"
+ y="534.14423">data</tspan></text>
+ </g>
+ <rect
+ y="378.02576"
+ x="536.65326"
+ height="41.623135"
+ width="183.73491"
+ id="rect5364-7"
+ style="fill:#00fffc;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.03031623px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5366-8"
+ y="410.18793"
+ x="543.98877"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="410.18793"
+ x="543.98877"
+ id="tspan5368-6"
+ sodipodi:role="line">tenant-Y</tspan></text>
+ <rect
+ y="437.83081"
+ x="541.25269"
+ height="24.921518"
+ width="96.129616"
+ id="rect5234-2-4-7-9"
+ style="fill:#00fffc;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.67940903px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ transform="scale(1.0611323,0.94238956)"
+ sodipodi:linespacing="125%"
+ id="text5236-9-8-1-8"
+ y="481.8017"
+ x="515.09814"
+ style="font-size:17.24429703px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="481.8017"
+ x="515.09814"
+ id="tspan5238-6-0-7-5"
+ sodipodi:role="line">mac addr</tspan></text>
+ <g
+ id="g6423"
+ transform="translate(249.81666,-272.0956)"
+ style="opacity:0.6125;fill:#3866a9;fill-opacity:0.46666667">
+ <rect
+ style="fill:#b1c76d;fill-opacity:0.46666667;fill-rule:evenodd;stroke:#ff1300;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect6358-7"
+ width="267.63913"
+ height="28.903856"
+ x="80.828072"
+ y="594.69769" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text6360-0"
+ y="615.96716"
+ x="86.097534"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#3866a9;fill-opacity:0.46666667;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="615.96716"
+ x="86.097534"
+ id="tspan6362-5"
+ sodipodi:role="line"
+ style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-opacity:1">ryu-openflow-controller</tspan></text>
+ </g>
+ <rect
+ y="379.229"
+ x="334.42374"
+ height="41.623135"
+ width="183.73491"
+ id="rect5364"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.03031623px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5366"
+ y="411.39111"
+ x="341.75919"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="411.39111"
+ x="341.75919"
+ id="tspan5368"
+ sodipodi:role="line">tenant-X</tspan></text>
+ <rect
+ y="435.25519"
+ x="328.49124"
+ height="24.921518"
+ width="96.129616"
+ id="rect5234-2-4-7"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.67940903px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ transform="scale(1.0611323,0.94238956)"
+ sodipodi:linespacing="125%"
+ id="text5236-9-8-1"
+ y="479.06763"
+ x="314.59326"
+ style="font-size:17.24429703px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="479.06763"
+ x="314.59326"
+ id="tspan5238-6-0-7"
+ sodipodi:role="line">mac addr</tspan></text>
+ <path
+ transform="matrix(0.69506452,0,0,0.47991755,36.24517,333.72159)"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.5626709"
+ sodipodi:arg1="1.0390722"
+ sodipodi:r2="23.694832"
+ sodipodi:r1="69.884941"
+ sodipodi:cy="572.24408"
+ sodipodi:cx="136.41731"
+ sodipodi:sides="6"
+ id="path5250-9"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5274-7"
+ y="599.82227"
+ x="132.07027"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="599.82227"
+ x="132.07027"
+ id="tspan5276-5"
+ sodipodi:role="line">VM</tspan><tspan
+ id="tspan3167-3"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="622.32227"
+ x="132.07027"
+ sodipodi:role="line">tenant-X</tspan></text>
+ <path
+ transform="matrix(0.69506452,0,0,0.47991755,418.47684,336.17178)"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.5626709"
+ sodipodi:arg1="1.0390722"
+ sodipodi:r2="23.694832"
+ sodipodi:r1="69.884941"
+ sodipodi:cy="572.24408"
+ sodipodi:cx="136.41731"
+ sodipodi:sides="6"
+ id="path5250-8"
+ style="fill:#00fffc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5274-8"
+ y="602.27258"
+ x="514.30194"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="602.27258"
+ x="514.30194"
+ id="tspan5276-3"
+ sodipodi:role="line">VM</tspan><tspan
+ id="tspan3167-1"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="624.77258"
+ x="514.30194"
+ sodipodi:role="line">tenant-Y</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="346.08432"
+ y="702.96533"
+ id="text3311"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3313"
+ x="346.08432"
+ y="702.96533">drop</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="383.86325"
+ y="639.50299"
+ id="text3315"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3317"
+ x="383.86325"
+ y="639.50299"
+ style="font-size:22px;fill:#ff0000">X:block</tspan></text>
+ <rect
+ y="714.75317"
+ x="190.90842"
+ height="73.974197"
+ width="89.833496"
+ id="rect5232-3-7"
+ style="fill:#f2f2f2;stroke:#000000;stroke-width:0.56441098px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <rect
+ y="715.62457"
+ x="191.88971"
+ height="24.947573"
+ width="88.805061"
+ id="rect5234-1-0"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.65335387px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5236-0-4"
+ y="777.89038"
+ x="187.02913"
+ style="font-size:17.24429703px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ transform="scale(1.0611323,0.94238956)"><tspan
+ y="777.89038"
+ x="187.02913"
+ id="tspan5238-7-8"
+ sodipodi:role="line">dst addr</tspan></text>
+ <rect
+ y="741.34027"
+ x="191.4227"
+ height="24.947573"
+ width="88.805061"
+ id="rect5234-2-4-0"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.65335387px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5236-9-8-4"
+ y="805.17816"
+ x="186.589"
+ style="font-size:17.24429703px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ transform="scale(1.0611323,0.94238956)"><tspan
+ y="805.17816"
+ x="186.589"
+ id="tspan5238-6-0-2"
+ sodipodi:role="line">src addr</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5280-1-9"
+ y="832.46588"
+ x="203.75392"
+ style="font-size:15.80727291px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ transform="scale(1.0611323,0.94238956)"><tspan
+ y="832.46588"
+ x="203.75392"
+ id="tspan5282-8-6"
+ sodipodi:role="line">data</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="206.42273"
+ y="703.9613"
+ id="text3373"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3375"
+ x="206.42273"
+ y="703.9613">pass</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 272.57822,610.10054 -95.55792,-1.2251"
+ id="path6078-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 464.91915,612.55074 -132.31096,-1.2251"
+ id="path6078-9"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6228-0"
+ d="m 270.11538,579.86992 0.1713,-126.73982"
+ style="fill:none;stroke:#05ff00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2MendC)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6228-8"
+ d="m 270.11603,628.79147 -77.01907,-1.48458"
+ style="fill:none;stroke:#05ff00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2MendC)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6228-8-7"
+ d="m 337.67593,631.84027 35.90109,1.00644"
+ style="fill:none;stroke:#05ff00;stroke-width:4.11323547;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2MendC)" />
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-536.76379"
+ y="249.9476"
+ id="text4337"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,-1,1,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan4339"
+ x="-536.76379"
+ y="249.9476">forward</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="172.32462"
+ y="658.73059"
+ id="text4337-4"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4339-5"
+ x="172.32462"
+ y="658.73059">forward</tspan></text>
+ </g>
+</svg>
diff --git a/doc/source/images/logical-view.png b/doc/source/images/logical-view.png
new file mode 100644
index 00000000..f3a87bbf
--- /dev/null
+++ b/doc/source/images/logical-view.png
Binary files differ
diff --git a/doc/source/images/logical-view.svg b/doc/source/images/logical-view.svg
new file mode 100644
index 00000000..6a6a97a2
--- /dev/null
+++ b/doc/source/images/logical-view.svg
@@ -0,0 +1,623 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1052.3622"
+ height="744.09448"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="logical-view.svg"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/logical-view.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs4">
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mend"
+ style="overflow:visible;">
+ <path
+ id="path5567"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mstart"
+ style="overflow:visible">
+ <path
+ id="path5564"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.4) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;">
+ <path
+ id="path5579"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;">
+ <path
+ id="path5561"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path5558"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <inkscape:path-effect
+ effect="skeletal"
+ id="path-effect5339"
+ is_visible="true"
+ pattern="M 0,0 0,10 10,5 z"
+ copytype="single_stretched"
+ prop_scale="1"
+ scale_y_rel="false"
+ spacing="0"
+ normal_offset="0"
+ tang_offset="0"
+ prop_units="false"
+ vertical_pattern="false"
+ fuse_tolerance="0" />
+ <linearGradient
+ id="linearGradient5242"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#7fff2a;stop-opacity:1;"
+ offset="0"
+ id="stop5244" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 372.04724 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="1052.3622 : 372.04724 : 1"
+ inkscape:persp3d-origin="526.18109 : 248.03149 : 1"
+ id="perspective3009" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.1517355"
+ inkscape:cx="527.91764"
+ inkscape:cy="392.97266"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1375"
+ inkscape:window-height="1083"
+ inkscape:window-x="18"
+ inkscape:window-y="2"
+ inkscape:window-maximized="0"
+ inkscape:snap-grids="true"
+ inkscape:snap-to-guides="false" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-308.2677)">
+ <rect
+ style="opacity:0.325;fill:#aade87;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.69828618px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5357-9"
+ width="325.40015"
+ height="193.2157"
+ x="634.08337"
+ y="652.44501" />
+ <rect
+ style="opacity:0.325;fill:#aade87;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.70321101px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5357"
+ width="325.3952"
+ height="195.95367"
+ x="24.654757"
+ y="649.00568" />
+ <rect
+ style="fill:#5555ff;fill-rule:evenodd;stroke:#000000;stroke-width:0.33128864px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect3772"
+ width="111.84713"
+ height="36.141087"
+ x="334.73782"
+ y="438.67487" />
+ <path
+ sodipodi:type="star"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5250"
+ sodipodi:sides="6"
+ sodipodi:cx="136.41731"
+ sodipodi:cy="572.24408"
+ sodipodi:r1="69.884941"
+ sodipodi:r2="23.694832"
+ sodipodi:arg1="1.0390722"
+ sodipodi:arg2="1.5626709"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ transform="matrix(0.54468914,0,0,0.43300157,8.893779,516.39652)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="60.610229"
+ y="772.59448"
+ id="text5274"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5276"
+ x="60.610229"
+ y="772.59448"
+ style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans">VM</tspan></text>
+ <path
+ sodipodi:type="star"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5250-9"
+ sodipodi:sides="6"
+ sodipodi:cx="136.41731"
+ sodipodi:cy="572.24408"
+ sodipodi:r1="69.884941"
+ sodipodi:r2="23.694832"
+ sodipodi:arg1="1.0390722"
+ sodipodi:arg2="1.5626709"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ transform="matrix(0.54468914,0,0,0.43300157,224.04537,515.72527)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="274.87598"
+ y="774.58069"
+ id="text5274-8"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5276-3"
+ x="274.87598"
+ y="774.58069"
+ style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans">VM</tspan></text>
+ <path
+ sodipodi:type="star"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5250-3"
+ sodipodi:sides="6"
+ sodipodi:cx="136.41731"
+ sodipodi:cy="572.24408"
+ sodipodi:r1="69.884941"
+ sodipodi:r2="23.694832"
+ sodipodi:arg1="1.0390722"
+ sodipodi:arg2="1.5626709"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ transform="matrix(0.54468914,0,0,0.43300157,93.490245,515.06779)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1.0;stroke:none;font-family:Bitstream Vera Sans"
+ x="144.32086"
+ y="773.92322"
+ id="text5274-9"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5276-1"
+ x="144.32086"
+ y="773.92322"
+ style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1.0;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans">VM</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="215.02756"
+ y="766.42914"
+ id="text5329"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="215.02756"
+ y="766.42914"
+ id="tspan5333">...</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 168.30708,671.18896 0,66.437"
+ id="path5353"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 78.83869,737.62585 0,-38.97615 227.75678,0 0,38.97615"
+ id="path5355"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="34.547245"
+ y="835.06689"
+ id="text5359"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5361"
+ x="34.547245"
+ y="835.06689">Tenant-X</tspan></text>
+ <path
+ sodipodi:type="star"
+ style="fill:#00fffc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5250-31"
+ sodipodi:sides="6"
+ sodipodi:cx="136.41731"
+ sodipodi:cy="572.24408"
+ sodipodi:r1="69.884941"
+ sodipodi:r2="23.694832"
+ sodipodi:arg1="1.0390722"
+ sodipodi:arg2="1.5626709"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ transform="matrix(0.54468914,0,0,0.43300157,618.32488,517.09536)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="670.04132"
+ y="773.29333"
+ id="text5274-96"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5276-7"
+ x="670.04132"
+ y="773.29333"
+ style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans">VM</tspan></text>
+ <path
+ sodipodi:type="star"
+ style="fill:#00fffc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5250-9-5"
+ sodipodi:sides="6"
+ sodipodi:cx="136.41731"
+ sodipodi:cy="572.24408"
+ sodipodi:r1="69.884941"
+ sodipodi:r2="23.694832"
+ sodipodi:arg1="1.0390722"
+ sodipodi:arg2="1.5626709"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ transform="matrix(0.54468914,0,0,0.43300157,833.47647,516.42411)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="884.30707"
+ y="775.27954"
+ id="text5274-8-2"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5276-3-9"
+ x="884.30707"
+ y="775.27954"
+ style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans">VM</tspan></text>
+ <path
+ sodipodi:type="star"
+ style="fill:#00fffc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5250-3-1"
+ sodipodi:sides="6"
+ sodipodi:cx="136.41731"
+ sodipodi:cy="572.24408"
+ sodipodi:r1="69.884941"
+ sodipodi:r2="23.694832"
+ sodipodi:arg1="1.0390722"
+ sodipodi:arg2="1.5626709"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ transform="matrix(0.54468914,0,0,0.43300157,702.92135,515.76663)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="753.75195"
+ y="774.62207"
+ id="text5274-9-2"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5276-1-4"
+ x="753.75195"
+ y="774.62207"
+ style="font-size:32px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans">VM</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="824.45868"
+ y="767.12799"
+ id="text5329-8"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="824.45868"
+ y="767.12799"
+ id="tspan5333-7">...</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 777.73818,671.8878 0,66.437"
+ id="path5353-5"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 688.26979,738.32469 0,-38.97615 227.75678,0 0,38.97615"
+ id="path5355-0"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="643.97833"
+ y="835.76575"
+ id="text5359-5"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5361-5"
+ x="643.97833"
+ y="835.76575">Tenant-Y</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5479"
+ y="728.68225"
+ x="471.24713"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="728.68225"
+ x="471.24713"
+ id="tspan5481"
+ sodipodi:role="line">...</tspan></text>
+ <path
+ inkscape:connector-curvature="0"
+ id="path5485"
+ d="m 164.66453,628.43991 0,-75.7058 612.28244,0 0,78.3467"
+ style="fill:none;stroke:#000000;stroke-width:3.49188328;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 389.76378,472.76376 0,77.95276 2.65748,0"
+ id="path5512"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="339.0433"
+ y="463.04724"
+ id="text5514"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5516"
+ x="339.0433"
+ y="463.04724">gateway</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 388.87795,387.72439 0,49.6063 0,0"
+ id="path5518"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:type="star"
+ style="opacity:0.325;fill:#5555ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5543"
+ sodipodi:sides="6"
+ sodipodi:cx="349.90158"
+ sodipodi:cy="64.665352"
+ sodipodi:r1="34.501789"
+ sodipodi:r2="28.966175"
+ sodipodi:arg1="-1.0612041"
+ sodipodi:arg2="-0.62241192"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 366.73229,34.547239 17.6677,29.634878 -16.83071,30.118112 -34.49841,0.483235 -17.66769,-29.634877 16.8307,-30.118112 z"
+ transform="translate(39.862204,292.0551)" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="303.83856"
+ y="355.83463"
+ id="text5545"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5547"
+ x="303.83856"
+ y="355.83463">public internet</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="22.857574"
+ y="1011.2186"
+ id="text5549"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5551"
+ x="22.857574"
+ y="1011.2186">Logical network view</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:8.48272705;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker-start:url(#Arrow1Mstart);marker-end:url(#Arrow1Mend)"
+ d="m 361.69128,800.92899 254.92112,0"
+ id="path8990"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="380.34985"
+ y="560.3197"
+ id="text9936"
+ sodipodi:linespacing="125%"
+ transform="translate(0,308.2677)"><tspan
+ sodipodi:role="line"
+ id="tspan9938"
+ x="380.34985"
+ y="560.3197">L2-level</tspan><tspan
+ sodipodi:role="line"
+ x="380.34985"
+ y="610.3197"
+ id="tspan9940">segregation</tspan></text>
+ <a
+ style="fill:#ff2ad4;fill-opacity:1"
+ transform="matrix(1.7591674,0,0,1.2473597,-134.20474,-124.3429)"
+ id="a4003">
+ <rect
+ style="fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.48250109px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect2985"
+ width="124.30867"
+ height="49.962151"
+ x="140.79437"
+ y="588.12579" />
+ </a>
+ <text
+ sodipodi:linespacing="125%"
+ id="text4006"
+ y="656.40906"
+ x="132.9359"
+ style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="656.40906"
+ x="132.9359"
+ id="tspan4008"
+ sodipodi:role="line">gateway</tspan></text>
+ <rect
+ style="fill:#ffcc00;fill-rule:evenodd;stroke:#000000;stroke-width:0.72736639px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect3065"
+ width="89.108681"
+ height="17.268652"
+ x="231.68684"
+ y="641.18787" />
+ <text
+ xml:space="preserve"
+ style="font-size:14px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="233.42279"
+ y="654.40955"
+ id="text3067"
+ sodipodi:linespacing="125%"><tspan
+ style="fill:#000000;fill-opacity:1"
+ sodipodi:role="line"
+ x="233.42279"
+ y="654.40955"
+ id="tspan3071">dhcp server</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text3070"
+ y="665.98871"
+ x="296.07492"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="665.98871"
+ x="296.07492"
+ id="tspan3072"
+ sodipodi:role="line" /></text>
+ <a
+ style="fill:#ff2ad4;fill-opacity:1"
+ transform="matrix(1.7591674,0,0,1.1959526,459.74622,-92.580367)"
+ id="a4003-7">
+ <rect
+ style="fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.48250109px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect2985-4"
+ width="124.30867"
+ height="49.962151"
+ x="140.79437"
+ y="588.12579" />
+ </a>
+ <text
+ sodipodi:linespacing="125%"
+ id="text4006-1"
+ y="655.35114"
+ x="726.88684"
+ style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="655.35114"
+ x="726.88684"
+ id="tspan4008-1"
+ sodipodi:role="line">gateway</tspan></text>
+ <rect
+ style="fill:#ffcc00;fill-rule:evenodd;stroke:#000000;stroke-width:0.72736639px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect3065-4"
+ width="89.108681"
+ height="17.268652"
+ x="824.59692"
+ y="642.11475" />
+ <text
+ xml:space="preserve"
+ style="font-size:14px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffcc00;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="826.33289"
+ y="655.33643"
+ id="text3067-1"
+ sodipodi:linespacing="125%"><tspan
+ style="fill:#000000;fill-opacity:1"
+ sodipodi:role="line"
+ x="826.33289"
+ y="655.33643"
+ id="tspan3071-7">dhcp server</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="143.30341"
+ y="633.5274"
+ id="text5487"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5489"
+ x="143.30341"
+ y="633.5274">NAT</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="754.6554"
+ y="635.15948"
+ id="text5487-3"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5489-6"
+ x="754.6554"
+ y="635.15948">NAT</tspan></text>
+ </g>
+</svg>
diff --git a/doc/source/images/mac-learning.png b/doc/source/images/mac-learning.png
new file mode 100644
index 00000000..cdd0f7b3
--- /dev/null
+++ b/doc/source/images/mac-learning.png
Binary files differ
diff --git a/doc/source/images/mac-learning.svg b/doc/source/images/mac-learning.svg
new file mode 100644
index 00000000..43d806c5
--- /dev/null
+++ b/doc/source/images/mac-learning.svg
@@ -0,0 +1,764 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1052.3622"
+ height="744.09448"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="mac-learning.svg"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/mac-learning.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.8162589"
+ inkscape:cx="374.1874"
+ inkscape:cy="324.99839"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1345"
+ inkscape:window-height="1004"
+ inkscape:window-x="54"
+ inkscape:window-y="32"
+ inkscape:window-maximized="0"
+ inkscape:snap-grids="true"
+ inkscape:snap-to-guides="false"
+ inkscape:snap-bbox="false"
+ inkscape:snap-page="false"
+ showguides="true"
+ inkscape:guide-bbox="true" />
+ <defs
+ id="defs4">
+ <marker
+ style="overflow:visible;"
+ id="Arrow1Send"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1Send">
+ <path
+ transform="scale(0.2) rotate(180) translate(6,0)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path4154" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Mend"
+ style="overflow:visible;">
+ <path
+ id="path4166"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(0.6) rotate(180) translate(0,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lstart"
+ style="overflow:visible">
+ <path
+ id="path5113"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) translate(1,0)" />
+ </marker>
+ <linearGradient
+ id="linearGradient6493"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop6495" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5313"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#5555ff;stop-opacity:1;"
+ offset="0"
+ id="stop5315" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mend"
+ style="overflow:visible;">
+ <path
+ id="path5567"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mstart"
+ style="overflow:visible">
+ <path
+ id="path5564"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.4) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;">
+ <path
+ id="path5579"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;">
+ <path
+ id="path5561"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path5558"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <inkscape:path-effect
+ effect="skeletal"
+ id="path-effect5339"
+ is_visible="true"
+ pattern="M 0,0 0,10 10,5 z"
+ copytype="single_stretched"
+ prop_scale="1"
+ scale_y_rel="false"
+ spacing="0"
+ normal_offset="0"
+ tang_offset="0"
+ prop_units="false"
+ vertical_pattern="false"
+ fuse_tolerance="0" />
+ <linearGradient
+ id="linearGradient5242"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#7fff2a;stop-opacity:1;"
+ offset="0"
+ id="stop5244" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 372.04724 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="1052.3622 : 372.04724 : 1"
+ inkscape:persp3d-origin="526.18109 : 248.03149 : 1"
+ id="perspective3009" />
+ <marker
+ inkscape:stockid="Arrow1LendM"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1LendM"
+ style="overflow:visible;">
+ <path
+ id="path4159"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1LendF"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1LendF"
+ style="overflow:visible;">
+ <path
+ id="path4585"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend6"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mend6"
+ style="overflow:visible;">
+ <path
+ id="path5404"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1MendN"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1MendN"
+ style="overflow:visible;">
+ <path
+ id="path5645"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5343-7"
+ id="linearGradient5349-6"
+ x1="-532.43896"
+ y1="622.73621"
+ x2="-318.84055"
+ y2="622.73621"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.83990127,0,0,1.846462,-201.58875,-629.6685)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5343-7">
+ <stop
+ style="stop-color:#aaccff;stop-opacity:1;"
+ offset="0"
+ id="stop5345-4" />
+ <stop
+ style="stop-color:#aaccff;stop-opacity:0;"
+ offset="1"
+ id="stop5347-4" />
+ </linearGradient>
+ <linearGradient
+ y2="622.73621"
+ x2="-318.84055"
+ y1="622.73621"
+ x1="-532.43896"
+ gradientTransform="matrix(1.2042654,0,0,2.6602952,-344.10309,-1384.9447)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient6079-9"
+ xlink:href="#linearGradient5343-7-4"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5343-7-4">
+ <stop
+ style="stop-color:#aaccff;stop-opacity:1;"
+ offset="0"
+ id="stop5345-4-1" />
+ <stop
+ style="stop-color:#aaccff;stop-opacity:0;"
+ offset="1"
+ id="stop5347-4-6" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow1Lenda"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lenda"
+ style="overflow:visible;">
+ <path
+ id="path5800"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#05ff00;stroke-width:1.0pt;fill:#05ff00;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lendan"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lendan"
+ style="overflow:visible;">
+ <path
+ id="path5943"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;marker-start:none;stroke:#059500;stroke-width:1.0pt;fill:#059500"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5343-7"
+ id="linearGradient6508"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.963808,0,0,2.0387048,132.33185,-1087.5143)"
+ x1="-532.43896"
+ y1="622.73621"
+ x2="-318.84055"
+ y2="622.73621" />
+ <marker
+ inkscape:stockid="Arrow2MendC"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2MendC"
+ style="overflow:visible;">
+ <path
+ id="path4651"
+ style="stroke-linejoin:round;font-size:12.0;fill-rule:evenodd;stroke:#05ff00;stroke-width:0.62500000;fill:#05ff00"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(0.6) rotate(180) translate(0,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend4"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend4"
+ style="overflow:visible;">
+ <path
+ id="path6229"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#0000ff;stroke-width:1.0pt;fill:#0000ff;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ </defs>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-308.2677)">
+ <path
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 123.73525,606.64067 0,-137.21137"
+ id="path6078"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="opacity:0.5;fill:url(#linearGradient6508);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.23578811;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3065-4"
+ width="417.50256"
+ height="287.14444"
+ x="-912.29431"
+ y="38.488934"
+ transform="matrix(0,-1,1,0,0,0)" />
+ <a
+ id="a4003"
+ transform="matrix(1,0,0,0.81896683,-0.728701,296.31497)"
+ style="fill:#ff2ad4;fill-opacity:1" />
+ <path
+ style="opacity:0.275;fill:#dd6de5;fill-opacity:0.46666667;fill-rule:nonzero;stroke:#ff0000;stroke-width:4.27355194;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.13677602, 2.13677602;stroke-dashoffset:0"
+ d=""
+ id="path4088"
+ inkscape:connector-curvature="0"
+ transform="translate(0,308.2677)" />
+ <g
+ id="g6423"
+ transform="translate(423.13207,13.647835)"
+ style="opacity:0.6125;fill:#3866a9;fill-opacity:0.46666667">
+ <rect
+ style="fill:#b1c76d;fill-opacity:0.46666667;fill-rule:evenodd;stroke:#ff1300;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect6358-7"
+ width="267.63913"
+ height="28.903856"
+ x="80.828072"
+ y="594.69769" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text6360-0"
+ y="615.96716"
+ x="86.097534"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#3866a9;fill-opacity:0.46666667;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="615.96716"
+ x="86.097534"
+ id="tspan6362-5"
+ sodipodi:role="line"
+ style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-opacity:1">ryu-openflow-controller</tspan></text>
+ </g>
+ <rect
+ y="573.9325"
+ x="74.458321"
+ height="295.24646"
+ width="233.97559"
+ id="rect5351-5"
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.5089395px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5353-2"
+ y="854.9986"
+ x="83.609177"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="854.9986"
+ x="83.609177"
+ id="tspan5355-6"
+ sodipodi:role="line">nova-compute</tspan></text>
+ <path
+ transform="matrix(0.69506452,0,0,0.47991755,33.246065,517.64778)"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.5626709"
+ sodipodi:arg1="1.0390722"
+ sodipodi:r2="23.694832"
+ sodipodi:r1="69.884941"
+ sodipodi:cy="572.24408"
+ sodipodi:cx="136.41731"
+ sodipodi:sides="6"
+ id="path5250"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5274"
+ y="783.74854"
+ x="129.07115"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="783.74854"
+ x="129.07115"
+ id="tspan5276"
+ sodipodi:role="line">VM</tspan><tspan
+ id="tspan3167"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="806.24854"
+ x="129.07115"
+ sodipodi:role="line">tenant-X</tspan></text>
+ <path
+ transform="matrix(1.0086434,0,0,0.68923037,-136.00519,452.12072)"
+ d="m 289.53315,248.36246 -14.42324,24.98178 -28.84647,0 -14.42324,-24.98178 14.42324,-24.98178 28.84647,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="0.52359878"
+ sodipodi:arg1="0"
+ sodipodi:r2="24.981781"
+ sodipodi:r1="28.846476"
+ sodipodi:cy="248.36246"
+ sodipodi:cx="260.68668"
+ sodipodi:sides="6"
+ id="path5523-9"
+ style="opacity:0.5;fill:#2ad4ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5525-6"
+ y="630.38098"
+ x="106.25084"
+ style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="630.38098"
+ x="106.25084"
+ id="tspan5527-5"
+ sodipodi:role="line">OVS</tspan></text>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6228"
+ d="m 125.69434,759.67428 0.17857,-108.00709"
+ style="fill:none;stroke:#05ff00;stroke-width:8.14929199;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2MendC)" />
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="58.133625"
+ y="897.9939"
+ id="text3193"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3195"
+ x="58.133625"
+ y="897.9939">physical host</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="33.077721"
+ y="977.57361"
+ id="text6045"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="33.077721"
+ y="977.57361"
+ id="tspan6049">associates mac address</tspan><tspan
+ sodipodi:role="line"
+ x="33.077721"
+ y="1027.5736"
+ id="tspan3090">to network id of OVS port</tspan></text>
+ <g
+ id="g6280"
+ transform="translate(-137.65551,-208.28264)">
+ <g
+ transform="matrix(1,0,0,0.71409652,-474.38063,289.09459)"
+ id="g5864-4">
+ <rect
+ style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.79479539px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5858-6"
+ width="26.969246"
+ height="59.086094"
+ x="722.52655"
+ y="601.5531" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="611.76575"
+ y="-729.16479"
+ id="text5860-69"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,1,-1,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan5862-8"
+ x="611.76575"
+ y="-729.16479">eth</tspan></text>
+ </g>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#05ff00;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="459.41306"
+ y="697.02533"
+ id="text6080"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6082"
+ x="459.41306"
+ y="697.02533" /></text>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot6500"
+ style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Bitstream Vera Sans;font-style:normal;font-weight:normal;font-size:40px;line-height:125%;letter-spacing:0px;word-spacing:0px"><flowRegion
+ id="flowRegion6502"><rect
+ id="rect6504"
+ width="978.85608"
+ height="519.44305"
+ x="-91.882614"
+ y="261.40448" /></flowRegion><flowPara
+ id="flowPara6506" /></flowRoot> <text
+ sodipodi:linespacing="125%"
+ id="text4810"
+ y="754.66254"
+ x="144.56197"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="754.66254"
+ x="144.56197"
+ id="tspan4812"
+ sodipodi:role="line">send packet</tspan></text>
+ <path
+ inkscape:connector-curvature="0"
+ id="path4814"
+ d="m 153.13769,623.1046 335.67781,0"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2Lend)" />
+ <g
+ id="g5284-2"
+ transform="matrix(0.7624367,0,0,0.67711861,-318.80448,357.75715)">
+ <rect
+ style="fill:#f2f2f2;stroke:#000000;stroke-width:0.78552711px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5232-3"
+ width="117.8242"
+ height="109.24851"
+ x="628.36981"
+ y="431.12851" />
+ <rect
+ style="fill:#b3b3b3;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.90931469px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5234-1"
+ width="116.47533"
+ height="36.843727"
+ x="629.65686"
+ y="432.41547" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="638.27789"
+ y="458.18796"
+ id="text5236-0"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5238-7"
+ x="638.27789"
+ y="458.18796">dst addr</tspan></text>
+ <rect
+ style="fill:#05ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.90931469px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5234-2-4"
+ width="116.47533"
+ height="36.843727"
+ x="629.04431"
+ y="470.39359" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="637.66534"
+ y="496.16611"
+ id="text5236-9-8"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5238-6-0"
+ x="637.66534"
+ y="496.16611">src addr</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="661.55481"
+ y="534.14423"
+ id="text5280-1"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5282-8"
+ x="661.55481"
+ y="534.14423">data</tspan></text>
+ </g>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5340"
+ y="589.2738"
+ x="145.78708"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="589.2738"
+ x="145.78708"
+ id="tspan5342"
+ sodipodi:role="line">packet in event</tspan></text>
+ <rect
+ y="664.97241"
+ x="507.73914"
+ height="41.623135"
+ width="183.73491"
+ id="rect5364"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.03031623px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5366"
+ y="697.13458"
+ x="515.07465"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="697.13458"
+ x="515.07465"
+ id="tspan5368"
+ sodipodi:role="line">tenant-X</tspan></text>
+ <rect
+ y="720.99866"
+ x="511.80664"
+ height="24.921518"
+ width="96.129616"
+ id="rect5234-2-4-7"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.67940903px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ transform="scale(1.0611323,0.94238956)"
+ sodipodi:linespacing="125%"
+ id="text5236-9-8-1"
+ y="782.27899"
+ x="487.34879"
+ style="font-size:17.24429703px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="782.27899"
+ x="487.34879"
+ id="tspan5238-6-0-7"
+ sodipodi:role="line">mac addr</tspan></text>
+ <rect
+ y="664.02014"
+ x="720.37482"
+ height="41.623135"
+ width="183.73491"
+ id="rect5364-7"
+ style="fill:#00fffc;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.03031622999999994px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5366-8"
+ y="696.18231"
+ x="727.71033"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="696.18231"
+ x="727.71033"
+ id="tspan5368-6"
+ sodipodi:role="line">tenant-Y</tspan></text>
+ <rect
+ y="723.8252"
+ x="724.97424"
+ height="24.921518"
+ width="96.129616"
+ id="rect5234-2-4-7-9"
+ style="fill:#00fffc;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.67940902999999997px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ transform="scale(1.0611323,0.94238956)"
+ sodipodi:linespacing="125%"
+ id="text5236-9-8-1-8"
+ y="785.27838"
+ x="688.23566"
+ style="font-size:17.24429703px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="785.27838"
+ x="688.23566"
+ id="tspan5238-6-0-7-5"
+ sodipodi:role="line">mac addr</tspan></text>
+ <path
+ transform="translate(0,308.2677)"
+ inkscape:connector-curvature="0"
+ id="path5536"
+ d="M 245.0203,381.46444 C 396.93288,431.6936 504.74182,428.0183 504.74182,428.0183"
+ style="stroke-linejoin:miter;marker-end:url(#Arrow1Lend4);stroke-opacity:1;marker-start:none;stroke-dashoffset:0;stroke:#0000ff;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:15, 5;stroke-width:5;fill:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text6170"
+ y="791.41553"
+ x="344.25351"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#0000ff;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="791.41553"
+ x="344.25351"
+ id="tspan6172"
+ sodipodi:role="line">associate</tspan><tspan
+ id="tspan6174"
+ y="841.41553"
+ x="344.25351"
+ sodipodi:role="line">mac address to</tspan><tspan
+ id="tspan6176"
+ y="891.41553"
+ x="344.25351"
+ sodipodi:role="line">network id</tspan></text>
+ </g>
+</svg>
diff --git a/doc/source/images/minimul-setup.png b/doc/source/images/minimul-setup.png
new file mode 100644
index 00000000..67f52f78
--- /dev/null
+++ b/doc/source/images/minimul-setup.png
Binary files differ
diff --git a/doc/source/images/minimul-setup.svg b/doc/source/images/minimul-setup.svg
new file mode 100644
index 00000000..21319546
--- /dev/null
+++ b/doc/source/images/minimul-setup.svg
@@ -0,0 +1,903 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1052.3622"
+ height="744.09448"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="minimul-setup.svg"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/minimul-setup.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.81601008"
+ inkscape:cx="326.8338"
+ inkscape:cy="349.33466"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1314"
+ inkscape:window-height="980"
+ inkscape:window-x="30"
+ inkscape:window-y="141"
+ inkscape:window-maximized="0"
+ inkscape:snap-grids="true"
+ inkscape:snap-to-guides="false"
+ inkscape:snap-bbox="false"
+ inkscape:snap-page="false" />
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient6493"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop6495" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5313"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#5555ff;stop-opacity:1;"
+ offset="0"
+ id="stop5315" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mend"
+ style="overflow:visible;">
+ <path
+ id="path5567"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mstart"
+ style="overflow:visible">
+ <path
+ id="path5564"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.4) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;">
+ <path
+ id="path5579"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;">
+ <path
+ id="path5561"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path5558"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <inkscape:path-effect
+ effect="skeletal"
+ id="path-effect5339"
+ is_visible="true"
+ pattern="M 0,0 0,10 10,5 z"
+ copytype="single_stretched"
+ prop_scale="1"
+ scale_y_rel="false"
+ spacing="0"
+ normal_offset="0"
+ tang_offset="0"
+ prop_units="false"
+ vertical_pattern="false"
+ fuse_tolerance="0" />
+ <linearGradient
+ id="linearGradient5242"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#7fff2a;stop-opacity:1;"
+ offset="0"
+ id="stop5244" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 372.04724 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="1052.3622 : 372.04724 : 1"
+ inkscape:persp3d-origin="526.18109 : 248.03149 : 1"
+ id="perspective3009" />
+ <marker
+ inkscape:stockid="Arrow1LendM"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1LendM"
+ style="overflow:visible;">
+ <path
+ id="path4159"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1LendF"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1LendF"
+ style="overflow:visible;">
+ <path
+ id="path4585"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend6"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mend6"
+ style="overflow:visible;">
+ <path
+ id="path5404"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1MendN"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1MendN"
+ style="overflow:visible;">
+ <path
+ id="path5645"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5343-7"
+ id="linearGradient5349-6"
+ x1="-532.43896"
+ y1="622.73621"
+ x2="-318.84055"
+ y2="622.73621"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.83990127,0,0,1.846462,-201.58875,-629.6685)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5343-7">
+ <stop
+ style="stop-color:#aaccff;stop-opacity:1;"
+ offset="0"
+ id="stop5345-4" />
+ <stop
+ style="stop-color:#aaccff;stop-opacity:0;"
+ offset="1"
+ id="stop5347-4" />
+ </linearGradient>
+ <linearGradient
+ y2="622.73621"
+ x2="-318.84055"
+ y1="622.73621"
+ x1="-532.43896"
+ gradientTransform="matrix(2.2778076,0,0,6.0730972,231.64447,-3322.8016)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient6079"
+ xlink:href="#linearGradient5343-7"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="622.73621"
+ x2="-318.84055"
+ y1="622.73621"
+ x1="-532.43896"
+ gradientTransform="matrix(1.2042654,0,0,2.6602952,-344.10309,-1384.9447)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient6079-9"
+ xlink:href="#linearGradient5343-7-4"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5343-7-4">
+ <stop
+ style="stop-color:#aaccff;stop-opacity:1;"
+ offset="0"
+ id="stop5345-4-1" />
+ <stop
+ style="stop-color:#aaccff;stop-opacity:0;"
+ offset="1"
+ id="stop5347-4-6" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow1Mend6"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mend6-0"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5404-3"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill:#ff0000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.4,0,0,-0.4,-4,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1MendN"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1MendN-9"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5645-1"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill:#ff0000;fill-rule:evenodd;stroke:#ff0000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.4,0,0,-0.4,-4,0)" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5343"
+ id="linearGradient5349"
+ x1="-532.43896"
+ y1="622.73621"
+ x2="-318.84055"
+ y2="622.73621"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.83990127,0,0,1.846462,-190.51819,-497.6685)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5343">
+ <stop
+ style="stop-color:#aaccff;stop-opacity:1;"
+ offset="0"
+ id="stop5345" />
+ <stop
+ style="stop-color:#aaccff;stop-opacity:0;"
+ offset="1"
+ id="stop5347" />
+ </linearGradient>
+ </defs>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-308.2677)">
+ <rect
+ style="opacity:0.5;fill:url(#linearGradient6079);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:4.15592432;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3065-4"
+ width="484.2583"
+ height="855.37451"
+ x="-980.01013"
+ y="31.449005"
+ transform="matrix(0,-1,1,0,0,0)" />
+ <path
+ style="fill:#000000;fill-opacity:0;stroke:#1afc00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 543.11341,673.45817 -320.85591,-1.38039 1.07056,39.84316"
+ id="path6473"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <rect
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.71000719px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5351-5"
+ width="336.37537"
+ height="122.49554"
+ x="417.9646"
+ y="700.86536" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="458.61511"
+ y="812.50928"
+ id="text5353-2"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5355-6"
+ x="458.61511"
+ y="812.50928">nova-compute</tspan></text>
+ <a
+ id="a4003"
+ transform="matrix(1,0,0,0.81896683,-0.728701,296.31497)"
+ style="fill:#ff2ad4;fill-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path5485"
+ d="m 575.81554,518.47262 -0.0744,-131.08463"
+ style="fill:none;stroke:#000000;stroke-width:5.05247164;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="32.64756"
+ y="1027.5137"
+ id="text5549"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/compute-node.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ sodipodi:role="line"
+ id="tspan5551"
+ x="32.64756"
+ y="1027.5137">All-in-One setup</tspan></text>
+ <path
+ style="opacity:0.275;fill:#dd6de5;fill-opacity:0.46666667;fill-rule:nonzero;stroke:#ff0000;stroke-width:4.27355194;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.13677602, 2.13677602;stroke-dashoffset:0"
+ d=""
+ id="path4088"
+ inkscape:connector-curvature="0"
+ transform="translate(0,308.2677)" />
+ <g
+ id="g6280"
+ transform="translate(312.16089,-235.21169)">
+ <g
+ transform="matrix(1,0,0,0.71409652,-474.38063,289.09459)"
+ id="g5864-4">
+ <rect
+ style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.79479539px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5858-6"
+ width="26.969246"
+ height="59.086094"
+ x="722.52655"
+ y="601.5531" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="611.76575"
+ y="-729.16479"
+ id="text5860-69"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,1,-1,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan5862-8"
+ x="611.76575"
+ y="-729.16479">eth</tspan></text>
+ </g>
+ </g>
+ <g
+ transform="translate(65.5766,51.261127)"
+ id="g6174-1">
+ <path
+ transform="matrix(1.0086434,0,0,0.68923037,243.74678,449.4383)"
+ d="m 289.53315,248.36246 -14.42324,24.98178 -28.84647,0 -14.42324,-24.98178 14.42324,-24.98178 28.84647,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="0.52359878"
+ sodipodi:arg1="0"
+ sodipodi:r2="24.981781"
+ sodipodi:r1="28.846476"
+ sodipodi:cy="248.36246"
+ sodipodi:cx="260.68668"
+ sodipodi:sides="6"
+ id="path5523-9"
+ style="opacity:0.5;fill:#2ad4ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5525-6"
+ y="627.69855"
+ x="486.00281"
+ style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="627.69855"
+ x="486.00281"
+ id="tspan5527-5"
+ sodipodi:role="line">OVS</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 467.62072,731.43747 83.47892,-52.45752"
+ id="path6228"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="M 692.60743,728.07086 596.83779,684.0091"
+ id="path6232"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.4125;fill:#3866a9;fill-opacity:0.46666667;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path6269"
+ sodipodi:cx="185.74246"
+ sodipodi:cy="191.14935"
+ sodipodi:rx="84.039093"
+ sodipodi:ry="31.581572"
+ d="m 269.78156,191.14935 c 0,17.44202 -37.62559,31.58157 -84.0391,31.58157 -46.41351,0 -84.03909,-14.13955 -84.03909,-31.58157 0,-17.44202 37.62558,-31.58157 84.03909,-31.58157 46.41351,0 84.0391,14.13955 84.0391,31.58157 z"
+ transform="matrix(1.1689088,0,0,0.56811324,10.97702,488.03964)" />
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="137.63055"
+ y="600.23999"
+ id="text6271"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6273"
+ x="137.63055"
+ y="600.23999">quantum_ovs_agent</tspan></text>
+ <g
+ id="g6423"
+ transform="translate(-60,2)"
+ style="opacity:0.6125;fill:#3866a9;fill-opacity:0.46666667" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#193edc;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="289.90646"
+ y="697.4389"
+ id="text7945-1-8"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan7947-2-1"
+ x="289.90646"
+ y="697.4389"
+ style="fill:#31562b;fill-opacity:1;stroke:none">openflow</tspan></text>
+ <rect
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.7666558px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5351-8"
+ width="112.94334"
+ height="29.197376"
+ x="505.20587"
+ y="843.80408" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="506.81201"
+ y="865.17035"
+ id="text5353-29"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5355-2"
+ x="506.81201"
+ y="865.17035">nova-api</tspan></text>
+ <rect
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99003595px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5351-8-4"
+ width="189.8004"
+ height="28.973995"
+ x="485.51215"
+ y="894.55353" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="487.00659"
+ y="915.80811"
+ id="text5353-29-6"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5355-2-3"
+ x="487.00659"
+ y="915.80811">nova-scheduler</tspan></text>
+ <g
+ id="g6388"
+ transform="translate(37.098036,274.46221)">
+ <rect
+ style="fill:#4975b6;fill-opacity:0.23137255;fill-rule:evenodd;stroke:#000000;stroke-width:0.84044451px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect6358"
+ width="187.50786"
+ height="29.064722"
+ x="85.200211"
+ y="530.91882" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text6360"
+ y="552.26874"
+ x="90.55011"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="552.26874"
+ x="90.55011"
+ id="tspan6362"
+ sodipodi:role="line">quantum-server</tspan></text>
+ </g>
+ <rect
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.89793426px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5351-8-4-8"
+ width="155.63452"
+ height="29.066097"
+ x="493.65576"
+ y="940.33221" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="497.19629"
+ y="961.63287"
+ id="text5353-29-6-8"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5355-2-3-5"
+ x="497.19629"
+ y="961.63287">nova-...</tspan></text>
+ <g
+ id="g6234"
+ transform="translate(65.43986,27.776)">
+ <rect
+ y="515.01691"
+ x="415.87427"
+ height="80.739517"
+ width="196.60234"
+ id="rect5351"
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.68203735px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5353"
+ y="541.27826"
+ x="435.22226"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="541.27826"
+ x="435.22226"
+ id="tspan5355"
+ sodipodi:role="line">nova-network</tspan></text>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="692.86469"
+ y="559.70044"
+ id="text5487-3"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5489-6"
+ x="692.86469"
+ y="559.70044"
+ style="fill:#ff0000">SNAT</tspan></text>
+ <path
+ style="fill:none;stroke:#ff0000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2, 2;stroke-dashoffset:0;marker-start:none;marker-end:url(#Arrow1MendN)"
+ d="m 498.15874,603.65235 c -53.4194,-45.94069 -7.50046,-82.28109 -7.50046,-82.28109 l 57.69296,-4.27355"
+ id="path6239"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:none;stroke:#ff0000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2, 2;stroke-dashoffset:0;marker-start:none;marker-end:url(#Arrow1Mend6)"
+ d="m 650.54421,602.47083 c 53.4194,-45.94069 10.71214,-81.21053 10.71214,-81.21053 l -57.69296,-4.27355"
+ id="path6239-4"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <rect
+ style="opacity:0.41249999999999998;fill:#05ff00;fill-rule:evenodd;stroke:#000000;stroke-width:0.71524047999999996px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+ id="rect5947"
+ width="62.431255"
+ height="24.849373"
+ x="584.12842"
+ y="-524.00653"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <text
+ xml:space="preserve"
+ style="font-size:16.64327431px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="636.57861"
+ y="-468.99884"
+ id="text5949"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,0.92462636,-1.0815179,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan5951"
+ x="636.57861"
+ y="-468.99884">gw-xxx</tspan></text>
+ <rect
+ style="opacity:0.41249999999999998;fill:#00fffc;fill-rule:evenodd;stroke:#000000;stroke-width:0.70914637999999997px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+ id="rect5947-4"
+ width="61.371914"
+ height="24.849373"
+ x="581.86981"
+ y="-651.82678"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <text
+ xml:space="preserve"
+ style="font-size:16.50146866px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="639.50269"
+ y="-582.18176"
+ id="text5949-7"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,0.91674822,-1.0908121,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan5951-3"
+ x="639.50269"
+ y="-582.18176">gw-yyy</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="M 576.43361,730.03267 574.12928,689.8299"
+ id="path6228-0"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 596.04122,664.31823 41.81277,-21.30086"
+ id="path6228-3"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="M 549.47316,662.38705 514.081,646.69379"
+ id="path6228-06"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#6b7393;stroke-width:5.03195906;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 416.33269,761.13247 -45.30653,0.15491 -0.64494,57.28036 -61.39088,0.0557"
+ id="path7949"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="fill:#5555ff;fill-rule:evenodd;stroke:#000000;stroke-width:0.33128864px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect3772"
+ width="111.84713"
+ height="36.141087"
+ x="514.22339"
+ y="412.79633" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="518.52893"
+ y="437.1687"
+ id="text5514"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5516"
+ x="518.52893"
+ y="437.1687">gateway</tspan></text>
+ <path
+ sodipodi:type="star"
+ style="opacity:0.325;fill:#5555ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5543"
+ sodipodi:sides="6"
+ sodipodi:cx="349.90158"
+ sodipodi:cy="64.665352"
+ sodipodi:r1="34.501789"
+ sodipodi:r2="28.966175"
+ sodipodi:arg1="-1.0612041"
+ sodipodi:arg2="-0.62241192"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 366.73229,34.547239 17.6677,29.634878 -16.83071,30.118112 -34.49841,0.483235 -17.66769,-29.634877 16.8307,-30.118112 z"
+ transform="translate(223.34776,292.17655)" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="487.32413"
+ y="355.95609"
+ id="text5545"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5547"
+ x="487.32413"
+ y="355.95609">public internet</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="53.920906"
+ y="948.19678"
+ id="text3555"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3557"
+ x="53.920906"
+ y="948.19678">physical host</tspan></text>
+ <path
+ sodipodi:type="star"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5250-6"
+ sodipodi:sides="6"
+ sodipodi:cx="136.41731"
+ sodipodi:cy="572.24408"
+ sodipodi:r1="69.884941"
+ sodipodi:r2="23.694832"
+ sodipodi:arg1="1.0390722"
+ sodipodi:arg2="1.5626709"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ transform="matrix(0.69506452,0,0,0.47991755,376.19731,483.38087)" />
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="472.0224"
+ y="749.48163"
+ id="text5274-3"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5276-4"
+ x="472.0224"
+ y="749.48163"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans">VM</tspan><tspan
+ sodipodi:role="line"
+ x="472.0224"
+ y="771.98163"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ id="tspan3167-1">tenant-X</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="608.73407"
+ y="757.31628"
+ id="text5329-7"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="608.73407"
+ y="757.31628"
+ id="tspan5333-1">...</tspan></text>
+ <path
+ sodipodi:type="star"
+ style="fill:#00fffc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5250-8-1"
+ sodipodi:sides="6"
+ sodipodi:cx="136.41731"
+ sodipodi:cy="572.24408"
+ sodipodi:r1="69.884941"
+ sodipodi:r2="23.694832"
+ sodipodi:arg1="1.0390722"
+ sodipodi:arg2="1.5626709"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ transform="matrix(0.69506452,0,0,0.47991755,480.10215,484.48042)" />
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="575.92719"
+ y="750.58118"
+ id="text5274-5-6"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5276-33-7"
+ x="575.92719"
+ y="750.58118"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans">VM</tspan><tspan
+ sodipodi:role="line"
+ x="575.92719"
+ y="773.08118"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ id="tspan3167-8-8">tenant-Y</tspan></text>
+ <path
+ transform="matrix(0.69506452,0,0,0.47991755,604.3304,483.77373)"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.5626709"
+ sodipodi:arg1="1.0390722"
+ sodipodi:r2="23.694832"
+ sodipodi:r1="69.884941"
+ sodipodi:cy="572.24408"
+ sodipodi:cx="136.41731"
+ sodipodi:sides="6"
+ id="path5250-7-8"
+ style="fill:#ccff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5274-7-2"
+ y="749.87451"
+ x="700.15552"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="749.87451"
+ x="700.15552"
+ id="tspan5276-1-1"
+ sodipodi:role="line">VM</tspan><tspan
+ id="tspan3167-2-3"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="772.37451"
+ x="700.15552"
+ sodipodi:role="line">tenant-...</tspan></text>
+ <path
+ style="fill:#000000;fill-opacity:0;stroke:#1afc00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 172.06998,743.00719 -1.00693,59.89335"
+ id="path6473-7-9"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <g
+ id="g6423-3"
+ transform="translate(-3.945028,138.1109)"
+ style="opacity:0.6125;fill:#3866a9;fill-opacity:0.46666667">
+ <rect
+ style="fill:#b1c76d;fill-opacity:0.46666667;fill-rule:evenodd;stroke:#ff1300;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect6358-7"
+ width="267.63913"
+ height="28.903856"
+ x="86.955444"
+ y="577.54102" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text6360-0"
+ y="598.81049"
+ x="92.224907"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#3866a9;fill-opacity:0.46666667;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="598.81049"
+ x="92.224907"
+ id="tspan6362-5"
+ sodipodi:role="line"
+ style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-opacity:1">ryu-openflow-controller</tspan></text>
+ </g>
+ <path
+ style="fill:#000000;fill-opacity:0;stroke:#1afc00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 172.06997,610.65589 -1.00693,105.23593"
+ id="path6473-7-9-2"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="401.80255"
+ y="550.07538"
+ id="text5487-3-7"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5489-6-7"
+ x="401.80255"
+ y="550.07538"
+ style="fill:#ff0000">SNAT</tspan></text>
+ </g>
+</svg>
diff --git a/doc/source/images/network-creation.png b/doc/source/images/network-creation.png
new file mode 100644
index 00000000..d2fe033f
--- /dev/null
+++ b/doc/source/images/network-creation.png
Binary files differ
diff --git a/doc/source/images/network-creation.svg b/doc/source/images/network-creation.svg
new file mode 100644
index 00000000..3d6d1e5f
--- /dev/null
+++ b/doc/source/images/network-creation.svg
@@ -0,0 +1,484 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1052.3622"
+ height="744.09448"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="network-creation.svg"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/network-creation.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.8162589"
+ inkscape:cx="319.62556"
+ inkscape:cy="372.04724"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1345"
+ inkscape:window-height="1004"
+ inkscape:window-x="52"
+ inkscape:window-y="100"
+ inkscape:window-maximized="0"
+ inkscape:snap-grids="true"
+ inkscape:snap-to-guides="false"
+ inkscape:snap-bbox="false"
+ inkscape:snap-page="false"
+ showguides="true"
+ inkscape:guide-bbox="true" />
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient6493"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop6495" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5313"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#5555ff;stop-opacity:1;"
+ offset="0"
+ id="stop5315" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mend"
+ style="overflow:visible;">
+ <path
+ id="path5567"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mstart"
+ style="overflow:visible">
+ <path
+ id="path5564"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.4) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;">
+ <path
+ id="path5579"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;">
+ <path
+ id="path5561"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path5558"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <inkscape:path-effect
+ effect="skeletal"
+ id="path-effect5339"
+ is_visible="true"
+ pattern="M 0,0 0,10 10,5 z"
+ copytype="single_stretched"
+ prop_scale="1"
+ scale_y_rel="false"
+ spacing="0"
+ normal_offset="0"
+ tang_offset="0"
+ prop_units="false"
+ vertical_pattern="false"
+ fuse_tolerance="0" />
+ <linearGradient
+ id="linearGradient5242"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#7fff2a;stop-opacity:1;"
+ offset="0"
+ id="stop5244" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 372.04724 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="1052.3622 : 372.04724 : 1"
+ inkscape:persp3d-origin="526.18109 : 248.03149 : 1"
+ id="perspective3009" />
+ <marker
+ inkscape:stockid="Arrow1LendM"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1LendM"
+ style="overflow:visible;">
+ <path
+ id="path4159"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1LendF"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1LendF"
+ style="overflow:visible;">
+ <path
+ id="path4585"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend6"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mend6"
+ style="overflow:visible;">
+ <path
+ id="path5404"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1MendN"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1MendN"
+ style="overflow:visible;">
+ <path
+ id="path5645"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5343-7"
+ id="linearGradient5349-6"
+ x1="-532.43896"
+ y1="622.73621"
+ x2="-318.84055"
+ y2="622.73621"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.83990127,0,0,1.846462,-201.58875,-629.6685)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5343-7">
+ <stop
+ style="stop-color:#aaccff;stop-opacity:1;"
+ offset="0"
+ id="stop5345-4" />
+ <stop
+ style="stop-color:#aaccff;stop-opacity:0;"
+ offset="1"
+ id="stop5347-4" />
+ </linearGradient>
+ <linearGradient
+ y2="622.73621"
+ x2="-318.84055"
+ y1="622.73621"
+ x1="-532.43896"
+ gradientTransform="matrix(1.2042654,0,0,2.6602952,-344.10309,-1384.9447)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient6079-9"
+ xlink:href="#linearGradient5343-7-4"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5343-7-4">
+ <stop
+ style="stop-color:#aaccff;stop-opacity:1;"
+ offset="0"
+ id="stop5345-4-1" />
+ <stop
+ style="stop-color:#aaccff;stop-opacity:0;"
+ offset="1"
+ id="stop5347-4-6" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mend-0"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5567-3"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.4,0,0,-0.4,-4,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mend-3"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path5567-6"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.4,0,0,-0.4,-4,0)" />
+ </marker>
+ </defs>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-308.2677)">
+ <a
+ id="a4003"
+ transform="matrix(1,0,0,0.81896683,-0.728701,296.31497)"
+ style="fill:#ff2ad4;fill-opacity:1" />
+ <path
+ style="opacity:0.275;fill:#dd6de5;fill-opacity:0.46666667;fill-rule:nonzero;stroke:#ff0000;stroke-width:4.27355194;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.13677602, 2.13677602;stroke-dashoffset:0"
+ d=""
+ id="path4088"
+ inkscape:connector-curvature="0"
+ transform="translate(0,308.2677)" />
+ <g
+ id="g6388"
+ transform="translate(6.78831,-4)">
+ <rect
+ style="fill:#4975b6;fill-opacity:0.23137255;fill-rule:evenodd;stroke:#000000;stroke-width:0.84044451px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect6358"
+ width="187.50786"
+ height="29.064722"
+ x="85.200211"
+ y="530.91882" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text6360"
+ y="552.26874"
+ x="90.55011"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="552.26874"
+ x="90.55011"
+ id="tspan6362"
+ sodipodi:role="line">quantum-server</tspan></text>
+ </g>
+ <g
+ id="g6423"
+ transform="translate(-54,-12)"
+ style="opacity:0.6125;fill:#3866a9;fill-opacity:0.46666667">
+ <rect
+ style="fill:#b1c76d;fill-opacity:0.46666667;fill-rule:evenodd;stroke:#ff1300;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect6358-7"
+ width="267.63913"
+ height="28.903856"
+ x="104.82807"
+ y="644.69769" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text6360-0"
+ y="664.05432"
+ x="110.9668"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#3866a9;fill-opacity:0.46666667;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="664.05432"
+ x="110.9668"
+ id="tspan6362-5"
+ sodipodi:role="line"
+ style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-opacity:1">ryu-openflow-controller</tspan></text>
+ </g>
+ <g
+ id="g5185"
+ transform="translate(433.62298,-530.03116)">
+ <path
+ sodipodi:type="star"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5250"
+ sodipodi:sides="4"
+ sodipodi:cx="136.41731"
+ sodipodi:cy="572.24408"
+ sodipodi:r1="71.642792"
+ sodipodi:r2="23.694832"
+ sodipodi:arg1="0.77972212"
+ sodipodi:arg2="1.5651204"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="M 187.36314,622.61483 86.046567,623.18991 85.471483,521.87333 186.78806,521.29825 z"
+ transform="matrix(1.1467071,0,0,0.47597907,23.850931,641.90155)" />
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="178.89684"
+ y="899.05359"
+ id="text5274"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5276"
+ x="178.89684"
+ y="899.05359"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans" /><tspan
+ sodipodi:role="line"
+ x="178.89684"
+ y="921.55359"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ id="tspan3167">tenant-X</tspan></text>
+ </g>
+ <rect
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.93824238px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5351-8-5"
+ width="170.15692"
+ height="29.025789"
+ x="98.554108"
+ y="427.91269" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="100.07444"
+ y="449.19312"
+ id="text5353-29-7"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5355-2-4"
+ x="100.07444"
+ y="449.19312">nova-network</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="129.29095"
+ y="352.08868"
+ id="text3547"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3549"
+ x="129.29095"
+ y="352.08868">User</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-start:none;marker-end:url(#Arrow1Mend)"
+ d="m 175.98121,52.60308 0,62.16728"
+ id="path3551"
+ inkscape:connector-curvature="0"
+ transform="translate(0,308.2677)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="190.32751"
+ y="397.21472"
+ id="text5167"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5169"
+ x="190.32751"
+ y="397.21472">tenant creation</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-end:url(#Arrow1Mend)"
+ d="m 172.75392,457.01705 0,62.16728"
+ id="path3551-0"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="184.589"
+ y="501.46448"
+ id="text5215"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5217"
+ x="184.589"
+ y="501.46448">network creation</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="285.96948"
+ y="556.84967"
+ id="text5219"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5221"
+ x="285.96948"
+ y="556.84967">allocate network id</tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-end:url(#Arrow1Mend)"
+ d="m 173.06401,556.31518 0,62.16728"
+ id="path3551-0-2"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="196.01624"
+ y="612.55072"
+ id="text5247"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5249"
+ x="196.01624"
+ y="612.55072">tell network id</tspan></text>
+ </g>
+</svg>
diff --git a/doc/source/images/network-id.svg b/doc/source/images/network-id.svg
new file mode 100644
index 00000000..ad41e97d
--- /dev/null
+++ b/doc/source/images/network-id.svg
@@ -0,0 +1,1434 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1052.3622"
+ height="744.09448"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="physical-view.svg"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/physical-view.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.8162589"
+ inkscape:cx="314.85108"
+ inkscape:cy="372.04724"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1345"
+ inkscape:window-height="1004"
+ inkscape:window-x="10"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0"
+ inkscape:snap-grids="true"
+ inkscape:snap-to-guides="false"
+ inkscape:snap-bbox="false"
+ inkscape:snap-page="false"
+ showguides="true"
+ inkscape:guide-bbox="true" />
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient6493"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop6495" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5343">
+ <stop
+ style="stop-color:#aaccff;stop-opacity:1;"
+ offset="0"
+ id="stop5345" />
+ <stop
+ style="stop-color:#aaccff;stop-opacity:0;"
+ offset="1"
+ id="stop5347" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5313"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#5555ff;stop-opacity:1;"
+ offset="0"
+ id="stop5315" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mend"
+ style="overflow:visible;">
+ <path
+ id="path5567"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mstart"
+ style="overflow:visible">
+ <path
+ id="path5564"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.4) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;">
+ <path
+ id="path5579"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;">
+ <path
+ id="path5561"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path5558"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <inkscape:path-effect
+ effect="skeletal"
+ id="path-effect5339"
+ is_visible="true"
+ pattern="M 0,0 0,10 10,5 z"
+ copytype="single_stretched"
+ prop_scale="1"
+ scale_y_rel="false"
+ spacing="0"
+ normal_offset="0"
+ tang_offset="0"
+ prop_units="false"
+ vertical_pattern="false"
+ fuse_tolerance="0" />
+ <linearGradient
+ id="linearGradient5242"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#7fff2a;stop-opacity:1;"
+ offset="0"
+ id="stop5244" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 372.04724 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="1052.3622 : 372.04724 : 1"
+ inkscape:persp3d-origin="526.18109 : 248.03149 : 1"
+ id="perspective3009" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5343"
+ id="linearGradient5349"
+ x1="-532.43896"
+ y1="622.73621"
+ x2="-318.84055"
+ y2="622.73621"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.83714276,0,0,4.0082028,-191.69232,-1878.6092)" />
+ <marker
+ inkscape:stockid="Arrow1LendM"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1LendM"
+ style="overflow:visible;">
+ <path
+ id="path4159"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1LendF"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1LendF"
+ style="overflow:visible;">
+ <path
+ id="path4585"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend6"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mend6"
+ style="overflow:visible;">
+ <path
+ id="path5404"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1MendN"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1MendN"
+ style="overflow:visible;">
+ <path
+ id="path5645"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5343-7"
+ id="linearGradient5349-6"
+ x1="-532.43896"
+ y1="622.73621"
+ x2="-318.84055"
+ y2="622.73621"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.83990127,0,0,1.846462,-201.58875,-629.6685)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5343-7">
+ <stop
+ style="stop-color:#aaccff;stop-opacity:1;"
+ offset="0"
+ id="stop5345-4" />
+ <stop
+ style="stop-color:#aaccff;stop-opacity:0;"
+ offset="1"
+ id="stop5347-4" />
+ </linearGradient>
+ <linearGradient
+ y2="622.73621"
+ x2="-318.84055"
+ y1="622.73621"
+ x1="-532.43896"
+ gradientTransform="matrix(1.3132307,0,0,2.7180446,-309.36157,-1416.7849)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient6079"
+ xlink:href="#linearGradient5343-7"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="622.73621"
+ x2="-318.84055"
+ y1="622.73621"
+ x1="-532.43896"
+ gradientTransform="matrix(1.2042654,0,0,2.6602952,-344.10309,-1384.9447)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient6079-9"
+ xlink:href="#linearGradient5343-7-4"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5343-7-4">
+ <stop
+ style="stop-color:#aaccff;stop-opacity:1;"
+ offset="0"
+ id="stop5345-4-1" />
+ <stop
+ style="stop-color:#aaccff;stop-opacity:0;"
+ offset="1"
+ id="stop5347-4-6" />
+ </linearGradient>
+ <linearGradient
+ y2="622.73621"
+ x2="-318.84055"
+ y1="622.73621"
+ x1="-532.43896"
+ gradientTransform="matrix(1.284557,0,0,2.7015292,-321.8507,-932.02217)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient8058"
+ xlink:href="#linearGradient5343-7-4"
+ inkscape:collect="always" />
+ </defs>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-308.2677)">
+ <path
+ style="fill:none;stroke:#000000;stroke-width:6.68103218;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 640.87795,371.0081 0,68.48025 0,0"
+ id="path5518"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="opacity:0.5;fill:url(#linearGradient6079);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.11107063;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3065-4"
+ width="279.1908"
+ height="382.82706"
+ x="-1007.9202"
+ y="84.426575"
+ transform="matrix(0,-1,1,0,0,0)" />
+ <path
+ style="fill:#000000;fill-opacity:0;stroke:#1afc00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 378.97885,514.99427 -230.17076,1.07056 1.07056,-199.12447"
+ id="path6473"
+ inkscape:connector-curvature="0"
+ transform="translate(0,308.2677)"
+ sodipodi:nodetypes="ccc" />
+ <rect
+ style="fill:#5555ff;fill-rule:evenodd;stroke:#000000;stroke-width:0.33128864px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect3772"
+ width="111.84713"
+ height="36.141087"
+ x="584.73779"
+ y="385.60431" />
+ <a
+ id="a4003"
+ transform="matrix(1,0,0,0.81896683,-0.728701,296.31497)"
+ style="fill:#ff2ad4;fill-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path5485"
+ d="m 400.17935,814.13419 1.07057,-129.23388 476.32109,1.07056 1.07056,130.80422"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ sodipodi:nodetypes="cccc" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="589.04333"
+ y="409.97668"
+ id="text5514"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5516"
+ x="589.04333"
+ y="409.97668">gateway</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="557.83856"
+ y="344.76407"
+ id="text5545"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5547"
+ x="557.83856"
+ y="344.76407">public internet</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="14.34453"
+ y="1043.1901"
+ id="text5549"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5551"
+ x="14.34453"
+ y="1043.1901">Physical view</tspan></text>
+ <rect
+ style="opacity:0.5;fill:url(#linearGradient5349);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.83178568px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect3065"
+ width="177.97522"
+ height="564.5412"
+ x="-637.00116"
+ y="335.17349"
+ transform="matrix(0,-1,1,0,0,0)" />
+ <rect
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.44236326px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5351"
+ width="418.45337"
+ height="79.979195"
+ x="430.47061"
+ y="504.32654" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="567.22229"
+ y="530.2077"
+ id="text5353"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5355"
+ x="567.22229"
+ y="530.2077">nova-network</tspan></text>
+ <g
+ id="g6174"
+ transform="translate(132,-11.070562)">
+ <path
+ transform="matrix(1.0086434,0,0,0.68923037,243.74678,449.4383)"
+ d="m 289.53315,248.36246 -14.42324,24.98178 -28.84647,0 -14.42324,-24.98178 14.42324,-24.98178 28.84647,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="0.52359878"
+ sodipodi:arg1="0"
+ sodipodi:r2="24.981781"
+ sodipodi:r1="28.846476"
+ sodipodi:cy="248.36246"
+ sodipodi:cx="260.68668"
+ sodipodi:sides="6"
+ id="path5523"
+ style="opacity:0.5;fill:#2ad4ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5525"
+ y="627.69855"
+ x="486.00281"
+ style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="627.69855"
+ x="486.00281"
+ id="tspan5527"
+ sodipodi:role="line">OVS</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 590.33845,574.40607 24.57293,27.77808"
+ id="path5559"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 692.9037,577.61123 -29.91486,24.57292"
+ id="path5562"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 660.32448,620.45186 25.7313,4.9237"
+ id="path5565"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:4.86634588;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 703.4367,638.93865 -1.20422,46.14683"
+ id="path5568"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="752.07385"
+ y="529.42548"
+ id="text5487-3"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5489-6"
+ x="752.07385"
+ y="529.42548"
+ style="fill:#ff0000">SNAT</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="471.28848"
+ y="530.17157"
+ id="text5487"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5489"
+ x="471.28848"
+ y="530.17157"
+ style="fill:#ff0000">SNAT</tspan></text>
+ <path
+ style="fill:none;stroke:#ff0000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2, 2;stroke-dashoffset:0;marker-start:none;marker-end:url(#Arrow1MendN)"
+ d="m 563.54104,553.02741 c -53.4194,-45.94069 -6.32262,-70.50271 -6.32262,-70.50271 l 57.69296,-4.27355"
+ id="path6239"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:none;stroke:#ff0000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2, 2;stroke-dashoffset:0;marker-start:none;marker-end:url(#Arrow1Mend6)"
+ d="m 718.28219,553.02373 c 53.4194,-45.94069 9.5343,-70.60999 9.5343,-70.60999 l -57.69296,-4.27355"
+ id="path6239-4"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="opacity:0.275;fill:#dd6de5;fill-opacity:0.46666667;fill-rule:nonzero;stroke:#ff0000;stroke-width:4.27355194;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.13677602, 2.13677602;stroke-dashoffset:0"
+ d=""
+ id="path4088"
+ inkscape:connector-curvature="0"
+ transform="translate(0,308.2677)" />
+ <g
+ id="g5864"
+ transform="matrix(1,0,0,0.71409652,-33.55774,187.84382)">
+ <rect
+ y="601.5531"
+ x="722.52655"
+ height="59.086094"
+ width="26.969246"
+ id="rect5858"
+ style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.79479539px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ transform="matrix(0,1,-1,0,0,0)"
+ sodipodi:linespacing="125%"
+ id="text5860"
+ y="-729.16479"
+ x="611.76575"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="-729.16479"
+ x="611.76575"
+ id="tspan5862"
+ sodipodi:role="line">eth</tspan></text>
+ </g>
+ <rect
+ style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.69692892px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5858-2"
+ width="27.067112"
+ height="45.266659"
+ x="624.84216"
+ y="438.44305" />
+ <text
+ xml:space="preserve"
+ style="font-size:21.04477882px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="510.78113"
+ y="-551.74139"
+ id="text5860-6"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,0.87369536,-1.1445637,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan5862-4"
+ x="510.78113"
+ y="-551.74139">eth</tspan></text>
+ <rect
+ style="opacity:0.41249999999999998;fill:#05ff00;fill-rule:evenodd;stroke:#000000;stroke-width:0.71524047999999996px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+ id="rect5947"
+ width="62.431255"
+ height="24.849373"
+ x="545.28186"
+ y="-590.56665"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <text
+ xml:space="preserve"
+ style="font-size:16.64327431px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="594.56537"
+ y="-530.54211"
+ id="text5949"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,0.92462636,-1.0815179,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan5951"
+ x="594.56537"
+ y="-530.54211">gw-xxx</tspan></text>
+ <rect
+ style="opacity:0.41249999999999998;fill:#00fffc;fill-rule:evenodd;stroke:#000000;stroke-width:0.70914637999999997px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+ id="rect5947-4"
+ width="61.371914"
+ height="24.849373"
+ x="543.02319"
+ y="-718.3869"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <text
+ xml:space="preserve"
+ style="font-size:16.50146866px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="597.12836"
+ y="-643.20062"
+ id="text5949-7"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,0.91674822,-1.0908121,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan5951-3"
+ x="597.12836"
+ y="-643.20062">gw-yyy</tspan></text>
+ <g
+ id="g6280"
+ transform="translate(140.16089,-3.2116852)">
+ <g
+ transform="matrix(1,0,0,0.71409652,-474.38063,289.09459)"
+ id="g5864-4">
+ <rect
+ style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.79479539px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5858-6"
+ width="26.969246"
+ height="59.086094"
+ x="722.52655"
+ y="601.5531" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="611.76575"
+ y="-729.16479"
+ id="text5860-69"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,1,-1,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan5862-8"
+ x="611.76575"
+ y="-729.16479">eth</tspan></text>
+ </g>
+ </g>
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.4125;fill:#3866a9;fill-opacity:0.46666667;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path6269"
+ sodipodi:cx="185.74246"
+ sodipodi:cy="191.14935"
+ sodipodi:rx="84.039093"
+ sodipodi:ry="31.581572"
+ d="m 269.78156,191.14935 c 0,17.44202 -37.62559,31.58157 -84.0391,31.58157 -46.41351,0 -84.03909,-14.13955 -84.03909,-31.58157 0,-17.44202 37.62558,-31.58157 84.03909,-31.58157 46.41351,0 84.0391,14.13955 84.0391,31.58157 z"
+ transform="matrix(1.1689088,0,0,0.56811324,64.97702,668.03964)" />
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="191.63055"
+ y="780.23999"
+ id="text6271"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6273"
+ x="191.63055"
+ y="780.23999">quantum_ovs_agent</tspan></text>
+ <rect
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.7666558px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5351-8"
+ width="112.94334"
+ height="29.197376"
+ x="87.635742"
+ y="381.15903" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="89.241867"
+ y="402.52527"
+ id="text5353-29"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5355-2"
+ x="89.241867"
+ y="402.52527">nova-api</tspan></text>
+ <rect
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99003595px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5351-8-4"
+ width="189.8004"
+ height="28.973995"
+ x="67.942032"
+ y="431.90845" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="69.43647"
+ y="453.16302"
+ id="text5353-29-6"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5355-2-3"
+ x="69.43647"
+ y="453.16302">nova-scheduler</tspan></text>
+ <path
+ style="fill:#000000;stroke:#1afc00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;fill-opacity:0"
+ d="m 188.55904,776.15726 -38.82057,0"
+ id="path6488"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g6280-9"
+ transform="translate(-112.82247,-2.1411197)">
+ <g
+ transform="matrix(1,0,0,0.71409652,-474.38063,289.09459)"
+ id="g5864-4-8">
+ <rect
+ style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.79479539px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5858-6-0"
+ width="26.969246"
+ height="59.086094"
+ x="722.52655"
+ y="601.5531" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="611.76575"
+ y="-729.16479"
+ id="text5860-69-9"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,1,-1,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan5862-8-6"
+ x="611.76575"
+ y="-729.16479">eth</tspan></text>
+ </g>
+ </g>
+ <g
+ id="g6388"
+ transform="translate(-31.21169,6)">
+ <rect
+ style="fill:#4975b6;fill-opacity:0.23137255;fill-rule:evenodd;stroke:#000000;stroke-width:0.84044451px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect6358"
+ width="187.50786"
+ height="29.064722"
+ x="85.200211"
+ y="530.91882" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text6360"
+ y="552.26874"
+ x="90.55011"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="552.26874"
+ x="90.55011"
+ id="tspan6362"
+ sodipodi:role="line">quantum-server</tspan></text>
+ </g>
+ <g
+ id="g6423"
+ transform="translate(-60,2)"
+ style="opacity:0.6125;fill:#3866a9;fill-opacity:0.46666667">
+ <rect
+ style="fill:#b1c76d;fill-opacity:0.46666667000000001;fill-rule:evenodd;stroke:#ff1300;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+ id="rect6358-7"
+ width="267.63913"
+ height="28.903856"
+ x="80.828072"
+ y="594.69769" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text6360-0"
+ y="615.96716"
+ x="86.097534"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#3866a9;fill-opacity:0.46666667;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="615.96716"
+ x="86.097534"
+ id="tspan6362-5"
+ sodipodi:role="line"
+ style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-opacity:1">ryu-openflow-controller</tspan></text>
+ </g>
+ <path
+ style="fill:#000000;fill-opacity:0;stroke:#18ff00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 625.19207,465.67837 -314.52994,1.28512 0.48525,83.11061 -70.25502,1.28118"
+ id="path7949"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="opacity:0.5;fill:url(#linearGradient8058);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.08154368;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3065-4-6"
+ width="273.09479"
+ height="380.50092"
+ x="-1005.1567"
+ y="560.06763"
+ transform="matrix(0,-1,1,0,0,0)"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/physical-view.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <g
+ id="g6280-0"
+ transform="translate(615.81666,0.135544)"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/physical-view.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <g
+ transform="matrix(1,0,0,0.71409652,-474.38063,289.09459)"
+ id="g5864-4-3">
+ <rect
+ style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.79479539px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5858-6-7"
+ width="26.969246"
+ height="59.086094"
+ x="722.52655"
+ y="601.5531" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="611.76575"
+ y="-729.16479"
+ id="text5860-69-4"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,1,-1,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan5862-8-9"
+ x="611.76575"
+ y="-729.16479">eth</tspan></text>
+ </g>
+ </g>
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.4125;fill:#3866a9;fill-opacity:0.46666667;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path6269-2"
+ sodipodi:cx="185.74246"
+ sodipodi:cy="191.14935"
+ sodipodi:rx="84.039093"
+ sodipodi:ry="31.581572"
+ d="m 269.78156,191.14935 c 0,17.44202 -37.62559,31.58157 -84.0391,31.58157 -46.41351,0 -84.03909,-14.13955 -84.03909,-31.58157 0,-17.44202 37.62558,-31.58157 84.03909,-31.58157 46.41351,0 84.0391,14.13955 84.0391,31.58157 z"
+ transform="matrix(1.1689088,0,0,0.56811324,540.63279,671.38687)"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/physical-view.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="667.28632"
+ y="783.58722"
+ id="text6271-9"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/physical-view.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ sodipodi:role="line"
+ id="tspan6273-3"
+ x="667.28632"
+ y="783.58722">quantum_ovs_agent</tspan></text>
+ <path
+ style="fill:#000000;fill-opacity:0;stroke:#1afc00;stroke-width:5.29658604000000022;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 663.90943,779.50449 -43.56262,0"
+ id="path6488-0"
+ inkscape:connector-curvature="0"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/physical-view.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ style="stroke:#1afc00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1;fill:none;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 851.09658,517.1354 -231.24134,0 0,-122.04404 -472.11772,0"
+ id="path8151"
+ inkscape:connector-curvature="0"
+ transform="translate(0,308.2677)" />
+ <g
+ id="g6280-9-5"
+ transform="translate(362.8333,1.206114)"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/physical-view.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <g
+ transform="matrix(1,0,0,0.71409652,-474.38063,289.09459)"
+ id="g5864-4-8-4">
+ <rect
+ style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.79479539px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5858-6-0-9"
+ width="26.969246"
+ height="59.086094"
+ x="722.52655"
+ y="601.5531" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="611.76575"
+ y="-729.16479"
+ id="text5860-69-9-6"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,1,-1,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan5862-8-6-8"
+ x="611.76575"
+ y="-729.16479">eth</tspan></text>
+ </g>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="488.4584"
+ y="869.01385"
+ id="text8153"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan8155"
+ x="488.4584"
+ y="869.01385">...</tspan></text>
+ <rect
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.89793426px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5351-8-4-8"
+ width="155.63452"
+ height="29.066097"
+ x="76.085648"
+ y="477.68716" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="79.626144"
+ y="498.98779"
+ id="text5353-29-6-8"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5355-2-3-5"
+ x="79.626144"
+ y="498.98779">nova-...</tspan></text>
+ <rect
+ y="807.76764"
+ x="120.29346"
+ height="168.16565"
+ width="337.21384"
+ id="rect5351-5"
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.17921257px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5353-2"
+ y="966.48846"
+ x="172.48773"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="966.48846"
+ x="172.48773"
+ id="tspan5355-6"
+ sodipodi:role="line">nova-compute</tspan></text>
+ <path
+ transform="matrix(0.69506452,0,0,0.47991755,79.246065,639.64778)"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.5626709"
+ sodipodi:arg1="1.0390722"
+ sodipodi:r2="23.694832"
+ sodipodi:r1="69.884941"
+ sodipodi:cy="572.24408"
+ sodipodi:cx="136.41731"
+ sodipodi:sides="6"
+ id="path5250"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5274"
+ y="905.74854"
+ x="175.07115"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="905.74854"
+ x="175.07115"
+ id="tspan5276"
+ sodipodi:role="line">VM</tspan><tspan
+ id="tspan3167"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="928.24854"
+ x="175.07115"
+ sodipodi:role="line">tenant-X</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5329"
+ y="913.58319"
+ x="311.78284"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ id="tspan5333"
+ y="913.58319"
+ x="311.78284"
+ sodipodi:role="line">...</tspan></text>
+ <path
+ transform="matrix(1.0086434,0,0,0.68923037,137.86369,658.89562)"
+ d="m 289.53315,248.36246 -14.42324,24.98178 -28.84647,0 -14.42324,-24.98178 14.42324,-24.98178 28.84647,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="0.52359878"
+ sodipodi:arg1="0"
+ sodipodi:r2="24.981781"
+ sodipodi:r1="28.846476"
+ sodipodi:cy="248.36246"
+ sodipodi:cx="260.68668"
+ sodipodi:sides="6"
+ id="path5523-9"
+ style="opacity:0.5;fill:#2ad4ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5525-6"
+ y="837.15588"
+ x="380.11972"
+ style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="837.15588"
+ x="380.11972"
+ id="tspan5527-5"
+ sodipodi:role="line">OVS</tspan></text>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6228"
+ d="M 180.26786,884.67321 374.03954,832.21569"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6230"
+ d="m 293.74741,898.5905 88.85662,-53.52808"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6232"
+ d="m 395.45077,882.53208 18.19954,-34.25796"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text7945-1-8"
+ y="855.57654"
+ x="90.787804"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#193edc;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="fill:#31562b;fill-opacity:1;stroke:none"
+ y="855.57654"
+ x="90.787804"
+ id="tspan7947-2-1"
+ sodipodi:role="line">openflow</tspan></text>
+ <path
+ transform="matrix(0.69506452,0,0,0.47991755,183.15091,640.74733)"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.5626709"
+ sodipodi:arg1="1.0390722"
+ sodipodi:r2="23.694832"
+ sodipodi:r1="69.884941"
+ sodipodi:cy="572.24408"
+ sodipodi:cx="136.41731"
+ sodipodi:sides="6"
+ id="path5250-8"
+ style="fill:#00fffc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5274-5"
+ y="906.84808"
+ x="278.97601"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="906.84808"
+ x="278.97601"
+ id="tspan5276-33"
+ sodipodi:role="line">VM</tspan><tspan
+ id="tspan3167-8"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="929.34808"
+ x="278.97601"
+ sodipodi:role="line">tenant-Y</tspan></text>
+ <path
+ sodipodi:type="star"
+ style="fill:#ccff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5250-7"
+ sodipodi:sides="6"
+ sodipodi:cx="136.41731"
+ sodipodi:cy="572.24408"
+ sodipodi:r1="69.884941"
+ sodipodi:r2="23.694832"
+ sodipodi:arg1="1.0390722"
+ sodipodi:arg2="1.5626709"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ transform="matrix(0.69506452,0,0,0.47991755,307.37919,640.04064)" />
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="403.20428"
+ y="906.14142"
+ id="text5274-7"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5276-1"
+ x="403.20428"
+ y="906.14142"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans">VM</tspan><tspan
+ sodipodi:role="line"
+ x="403.20428"
+ y="928.64142"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ id="tspan3167-2">tenant-...</tspan></text>
+ <g
+ transform="translate(701.63358,-1.05275)"
+ id="g4188-6"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/physical-view.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <rect
+ y="807.76764"
+ x="120.29346"
+ height="168.16565"
+ width="337.21384"
+ id="rect5351-5-2"
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.17921257px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ transform="translate(-228.13313,-0.39285583)" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5353-2-6"
+ y="966.48846"
+ x="172.48773"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ transform="translate(-228.13313,-0.39285583)"><tspan
+ y="966.48846"
+ x="172.48773"
+ id="tspan5355-6-5"
+ sodipodi:role="line">nova-compute</tspan></text>
+ <g
+ id="g4099-6"
+ transform="translate(-228.13313,-0.39285583)">
+ <path
+ sodipodi:type="star"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5250-6"
+ sodipodi:sides="6"
+ sodipodi:cx="136.41731"
+ sodipodi:cy="572.24408"
+ sodipodi:r1="69.884941"
+ sodipodi:r2="23.694832"
+ sodipodi:arg1="1.0390722"
+ sodipodi:arg2="1.5626709"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ transform="matrix(0.69506452,0,0,0.47991755,79.246065,639.64778)" />
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="175.07115"
+ y="905.74854"
+ id="text5274-3"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5276-4"
+ x="175.07115"
+ y="905.74854"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans">VM</tspan><tspan
+ sodipodi:role="line"
+ x="175.07115"
+ y="928.24854"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ id="tspan3167-1">tenant-X</tspan></text>
+ </g>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5329-7"
+ y="913.58319"
+ x="311.78284"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ transform="translate(-228.13313,-0.39285583)"><tspan
+ id="tspan5333-1"
+ y="913.58319"
+ x="311.78284"
+ sodipodi:role="line">...</tspan></text>
+ <g
+ id="g6174-1-3"
+ transform="translate(-334.01622,209.06446)">
+ <path
+ sodipodi:type="star"
+ style="opacity:0.5;fill:#2ad4ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5523-9-0"
+ sodipodi:sides="6"
+ sodipodi:cx="260.68668"
+ sodipodi:cy="248.36246"
+ sodipodi:r1="28.846476"
+ sodipodi:r2="24.981781"
+ sodipodi:arg1="0"
+ sodipodi:arg2="0.52359878"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 289.53315,248.36246 -14.42324,24.98178 -28.84647,0 -14.42324,-24.98178 14.42324,-24.98178 28.84647,0 z"
+ transform="matrix(1.0086434,0,0,0.68923037,243.74678,449.4383)" />
+ <text
+ xml:space="preserve"
+ style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="486.00281"
+ y="627.69855"
+ id="text5525-6-8"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5527-5-2"
+ x="486.00281"
+ y="627.69855">OVS</tspan></text>
+ </g>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6228-9"
+ d="M 180.26786,884.67321 374.03954,832.21569"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="translate(-228.13313,-0.39285583)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6230-0"
+ d="m 293.74741,898.5905 88.85662,-53.52808"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="translate(-228.13313,-0.39285583)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6232-1"
+ d="m 395.45077,882.53208 18.19954,-34.25796"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="translate(-228.13313,-0.39285583)" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text7945-1-8-0"
+ y="855.57654"
+ x="90.787804"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#193edc;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ transform="translate(-228.13313,-0.39285583)"><tspan
+ style="fill:#31562b;fill-opacity:1;stroke:none"
+ y="855.57654"
+ x="90.787804"
+ id="tspan7947-2-1-8"
+ sodipodi:role="line">openflow</tspan></text>
+ <path
+ transform="matrix(0.69506452,0,0,0.47991755,-44.98222,640.35447)"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.5626709"
+ sodipodi:arg1="1.0390722"
+ sodipodi:r2="23.694832"
+ sodipodi:r1="69.884941"
+ sodipodi:cy="572.24408"
+ sodipodi:cx="136.41731"
+ sodipodi:sides="6"
+ id="path5250-8-1"
+ style="fill:#00fffc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5274-5-6"
+ y="906.84808"
+ x="278.97601"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ transform="translate(-228.13313,-0.39285583)"><tspan
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="906.84808"
+ x="278.97601"
+ id="tspan5276-33-7"
+ sodipodi:role="line">VM</tspan><tspan
+ id="tspan3167-8-8"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="929.34808"
+ x="278.97601"
+ sodipodi:role="line">tenant-Y</tspan></text>
+ <path
+ sodipodi:type="star"
+ style="fill:#ccff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5250-7-8"
+ sodipodi:sides="6"
+ sodipodi:cx="136.41731"
+ sodipodi:cy="572.24408"
+ sodipodi:r1="69.884941"
+ sodipodi:r2="23.694832"
+ sodipodi:arg1="1.0390722"
+ sodipodi:arg2="1.5626709"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ transform="matrix(0.69506452,0,0,0.47991755,79.246065,639.64778)" />
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="175.07115"
+ y="905.74854"
+ id="text5274-7-2"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5276-1-1"
+ x="175.07115"
+ y="905.74854"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans">VM</tspan><tspan
+ sodipodi:role="line"
+ x="175.07115"
+ y="928.24854"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ id="tspan3167-2-3">tenant-...</tspan></text>
+ </g>
+ <path
+ style="fill:#000000;fill-opacity:1;stroke:#1afc00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 310.8384,549.42539 0,153.11893"
+ id="path4349"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g3342"
+ transform="translate(447.16205,229.09398)">
+ <g
+ id="g3310">
+ <rect
+ y="322.21494"
+ x="302.1904"
+ height="26.009777"
+ width="88.812088"
+ id="use3891"
+ style="fill:#ffcc00;fill-rule:evenodd;stroke:#000000;stroke-width:0.891186px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3238"
+ y="339.35312"
+ x="305.05029"
+ style="font-size:18px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="339.35312"
+ x="305.05029"
+ id="tspan3240"
+ sodipodi:role="line">dnsmasq</tspan></text>
+ </g>
+ </g>
+ <path
+ sodipodi:type="star"
+ style="opacity:0.325;fill:#5555ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5543"
+ sodipodi:sides="6"
+ sodipodi:cx="349.90158"
+ sodipodi:cy="64.665352"
+ sodipodi:r1="34.501789"
+ sodipodi:r2="28.966175"
+ sodipodi:arg1="-1.0612041"
+ sodipodi:arg2="-0.62241192"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 366.73229,34.547239 17.6677,29.634878 -16.83071,30.118112 -34.49841,0.483235 -17.66769,-29.634877 16.8307,-30.118112 z"
+ transform="translate(293.8622,280.98454)" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 534.23032,569.69365 30.46212,0.68781"
+ id="path5559-8"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 718.8409,570.5096 30.46212,0.68781"
+ id="path5559-8-1"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#1afc00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 617.18706,623.62918 -233.80082,0 0.58892,-157.83027"
+ id="path4349-8"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="318.5264"
+ y="1002.1331"
+ id="text3193"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3195"
+ x="318.5264"
+ y="1002.1331">physical host</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="780.78442"
+ y="999.62671"
+ id="text3193-6"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3195-3"
+ x="780.78442"
+ y="999.62671">physical host</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="746.48157"
+ y="624.74554"
+ id="text3193-1"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3195-7"
+ x="746.48157"
+ y="624.74554">physical host</tspan></text>
+ <g
+ id="g3348"
+ transform="translate(8.5757105,28.177334)">
+ <g
+ id="g3310-0"
+ transform="translate(132.41824,200.14953)">
+ <rect
+ y="322.21494"
+ x="302.1904"
+ height="26.009777"
+ width="88.812088"
+ id="use3891-3"
+ style="fill:#ffcc00;fill-rule:evenodd;stroke:#000000;stroke-width:0.891186px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3238-4"
+ y="339.35312"
+ x="305.05029"
+ style="font-size:18px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="339.35312"
+ x="305.05029"
+ id="tspan3240-0"
+ sodipodi:role="line">dnsmasq</tspan></text>
+ </g>
+ </g>
+ <path
+ style="fill:#000000;fill-opacity:0;stroke:#1afc00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 306.08403,494.941 -74.34851,0"
+ id="path6488-8"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:#000000;fill-opacity:0;stroke:#1afc00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 308.53424,443.48674 -49.84648,0"
+ id="path6488-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#1afc00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="M 311.69155,466.04721 310.66001,396.21642 199.7647,395.19914"
+ id="path4349-8-8"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ </g>
+</svg>
diff --git a/doc/source/images/physical-view.png b/doc/source/images/physical-view.png
new file mode 100644
index 00000000..33354379
--- /dev/null
+++ b/doc/source/images/physical-view.png
Binary files differ
diff --git a/doc/source/images/physical-view.svg b/doc/source/images/physical-view.svg
new file mode 100644
index 00000000..ad41e97d
--- /dev/null
+++ b/doc/source/images/physical-view.svg
@@ -0,0 +1,1434 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1052.3622"
+ height="744.09448"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="physical-view.svg"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/physical-view.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.8162589"
+ inkscape:cx="314.85108"
+ inkscape:cy="372.04724"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1345"
+ inkscape:window-height="1004"
+ inkscape:window-x="10"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0"
+ inkscape:snap-grids="true"
+ inkscape:snap-to-guides="false"
+ inkscape:snap-bbox="false"
+ inkscape:snap-page="false"
+ showguides="true"
+ inkscape:guide-bbox="true" />
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient6493"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop6495" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5343">
+ <stop
+ style="stop-color:#aaccff;stop-opacity:1;"
+ offset="0"
+ id="stop5345" />
+ <stop
+ style="stop-color:#aaccff;stop-opacity:0;"
+ offset="1"
+ id="stop5347" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5313"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#5555ff;stop-opacity:1;"
+ offset="0"
+ id="stop5315" />
+ </linearGradient>
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mend"
+ style="overflow:visible;">
+ <path
+ id="path5567"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mstart"
+ style="overflow:visible">
+ <path
+ id="path5564"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.4) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lend"
+ style="overflow:visible;">
+ <path
+ id="path5579"
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) rotate(180) translate(1,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;">
+ <path
+ id="path5561"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path5558"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <inkscape:path-effect
+ effect="skeletal"
+ id="path-effect5339"
+ is_visible="true"
+ pattern="M 0,0 0,10 10,5 z"
+ copytype="single_stretched"
+ prop_scale="1"
+ scale_y_rel="false"
+ spacing="0"
+ normal_offset="0"
+ tang_offset="0"
+ prop_units="false"
+ vertical_pattern="false"
+ fuse_tolerance="0" />
+ <linearGradient
+ id="linearGradient5242"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#7fff2a;stop-opacity:1;"
+ offset="0"
+ id="stop5244" />
+ </linearGradient>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 372.04724 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="1052.3622 : 372.04724 : 1"
+ inkscape:persp3d-origin="526.18109 : 248.03149 : 1"
+ id="perspective3009" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5343"
+ id="linearGradient5349"
+ x1="-532.43896"
+ y1="622.73621"
+ x2="-318.84055"
+ y2="622.73621"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.83714276,0,0,4.0082028,-191.69232,-1878.6092)" />
+ <marker
+ inkscape:stockid="Arrow1LendM"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1LendM"
+ style="overflow:visible;">
+ <path
+ id="path4159"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1LendF"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1LendF"
+ style="overflow:visible;">
+ <path
+ id="path4585"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mend6"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mend6"
+ style="overflow:visible;">
+ <path
+ id="path5404"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1MendN"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1MendN"
+ style="overflow:visible;">
+ <path
+ id="path5645"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5343-7"
+ id="linearGradient5349-6"
+ x1="-532.43896"
+ y1="622.73621"
+ x2="-318.84055"
+ y2="622.73621"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.83990127,0,0,1.846462,-201.58875,-629.6685)" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5343-7">
+ <stop
+ style="stop-color:#aaccff;stop-opacity:1;"
+ offset="0"
+ id="stop5345-4" />
+ <stop
+ style="stop-color:#aaccff;stop-opacity:0;"
+ offset="1"
+ id="stop5347-4" />
+ </linearGradient>
+ <linearGradient
+ y2="622.73621"
+ x2="-318.84055"
+ y1="622.73621"
+ x1="-532.43896"
+ gradientTransform="matrix(1.3132307,0,0,2.7180446,-309.36157,-1416.7849)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient6079"
+ xlink:href="#linearGradient5343-7"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="622.73621"
+ x2="-318.84055"
+ y1="622.73621"
+ x1="-532.43896"
+ gradientTransform="matrix(1.2042654,0,0,2.6602952,-344.10309,-1384.9447)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient6079-9"
+ xlink:href="#linearGradient5343-7-4"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ id="linearGradient5343-7-4">
+ <stop
+ style="stop-color:#aaccff;stop-opacity:1;"
+ offset="0"
+ id="stop5345-4-1" />
+ <stop
+ style="stop-color:#aaccff;stop-opacity:0;"
+ offset="1"
+ id="stop5347-4-6" />
+ </linearGradient>
+ <linearGradient
+ y2="622.73621"
+ x2="-318.84055"
+ y1="622.73621"
+ x1="-532.43896"
+ gradientTransform="matrix(1.284557,0,0,2.7015292,-321.8507,-932.02217)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient8058"
+ xlink:href="#linearGradient5343-7-4"
+ inkscape:collect="always" />
+ </defs>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-308.2677)">
+ <path
+ style="fill:none;stroke:#000000;stroke-width:6.68103218;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 640.87795,371.0081 0,68.48025 0,0"
+ id="path5518"
+ inkscape:connector-curvature="0" />
+ <rect
+ style="opacity:0.5;fill:url(#linearGradient6079);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.11107063;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3065-4"
+ width="279.1908"
+ height="382.82706"
+ x="-1007.9202"
+ y="84.426575"
+ transform="matrix(0,-1,1,0,0,0)" />
+ <path
+ style="fill:#000000;fill-opacity:0;stroke:#1afc00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 378.97885,514.99427 -230.17076,1.07056 1.07056,-199.12447"
+ id="path6473"
+ inkscape:connector-curvature="0"
+ transform="translate(0,308.2677)"
+ sodipodi:nodetypes="ccc" />
+ <rect
+ style="fill:#5555ff;fill-rule:evenodd;stroke:#000000;stroke-width:0.33128864px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect3772"
+ width="111.84713"
+ height="36.141087"
+ x="584.73779"
+ y="385.60431" />
+ <a
+ id="a4003"
+ transform="matrix(1,0,0,0.81896683,-0.728701,296.31497)"
+ style="fill:#ff2ad4;fill-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path5485"
+ d="m 400.17935,814.13419 1.07057,-129.23388 476.32109,1.07056 1.07056,130.80422"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ sodipodi:nodetypes="cccc" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="589.04333"
+ y="409.97668"
+ id="text5514"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5516"
+ x="589.04333"
+ y="409.97668">gateway</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="557.83856"
+ y="344.76407"
+ id="text5545"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5547"
+ x="557.83856"
+ y="344.76407">public internet</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="14.34453"
+ y="1043.1901"
+ id="text5549"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5551"
+ x="14.34453"
+ y="1043.1901">Physical view</tspan></text>
+ <rect
+ style="opacity:0.5;fill:url(#linearGradient5349);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.83178568px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect3065"
+ width="177.97522"
+ height="564.5412"
+ x="-637.00116"
+ y="335.17349"
+ transform="matrix(0,-1,1,0,0,0)" />
+ <rect
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.44236326px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5351"
+ width="418.45337"
+ height="79.979195"
+ x="430.47061"
+ y="504.32654" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="567.22229"
+ y="530.2077"
+ id="text5353"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5355"
+ x="567.22229"
+ y="530.2077">nova-network</tspan></text>
+ <g
+ id="g6174"
+ transform="translate(132,-11.070562)">
+ <path
+ transform="matrix(1.0086434,0,0,0.68923037,243.74678,449.4383)"
+ d="m 289.53315,248.36246 -14.42324,24.98178 -28.84647,0 -14.42324,-24.98178 14.42324,-24.98178 28.84647,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="0.52359878"
+ sodipodi:arg1="0"
+ sodipodi:r2="24.981781"
+ sodipodi:r1="28.846476"
+ sodipodi:cy="248.36246"
+ sodipodi:cx="260.68668"
+ sodipodi:sides="6"
+ id="path5523"
+ style="opacity:0.5;fill:#2ad4ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5525"
+ y="627.69855"
+ x="486.00281"
+ style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="627.69855"
+ x="486.00281"
+ id="tspan5527"
+ sodipodi:role="line">OVS</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 590.33845,574.40607 24.57293,27.77808"
+ id="path5559"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 692.9037,577.61123 -29.91486,24.57292"
+ id="path5562"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 660.32448,620.45186 25.7313,4.9237"
+ id="path5565"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:4.86634588;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 703.4367,638.93865 -1.20422,46.14683"
+ id="path5568"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="752.07385"
+ y="529.42548"
+ id="text5487-3"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5489-6"
+ x="752.07385"
+ y="529.42548"
+ style="fill:#ff0000">SNAT</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="471.28848"
+ y="530.17157"
+ id="text5487"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5489"
+ x="471.28848"
+ y="530.17157"
+ style="fill:#ff0000">SNAT</tspan></text>
+ <path
+ style="fill:none;stroke:#ff0000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2, 2;stroke-dashoffset:0;marker-start:none;marker-end:url(#Arrow1MendN)"
+ d="m 563.54104,553.02741 c -53.4194,-45.94069 -6.32262,-70.50271 -6.32262,-70.50271 l 57.69296,-4.27355"
+ id="path6239"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:none;stroke:#ff0000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2, 2;stroke-dashoffset:0;marker-start:none;marker-end:url(#Arrow1Mend6)"
+ d="m 718.28219,553.02373 c 53.4194,-45.94069 9.5343,-70.60999 9.5343,-70.60999 l -57.69296,-4.27355"
+ id="path6239-4"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="opacity:0.275;fill:#dd6de5;fill-opacity:0.46666667;fill-rule:nonzero;stroke:#ff0000;stroke-width:4.27355194;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.13677602, 2.13677602;stroke-dashoffset:0"
+ d=""
+ id="path4088"
+ inkscape:connector-curvature="0"
+ transform="translate(0,308.2677)" />
+ <g
+ id="g5864"
+ transform="matrix(1,0,0,0.71409652,-33.55774,187.84382)">
+ <rect
+ y="601.5531"
+ x="722.52655"
+ height="59.086094"
+ width="26.969246"
+ id="rect5858"
+ style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.79479539px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ transform="matrix(0,1,-1,0,0,0)"
+ sodipodi:linespacing="125%"
+ id="text5860"
+ y="-729.16479"
+ x="611.76575"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="-729.16479"
+ x="611.76575"
+ id="tspan5862"
+ sodipodi:role="line">eth</tspan></text>
+ </g>
+ <rect
+ style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.69692892px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5858-2"
+ width="27.067112"
+ height="45.266659"
+ x="624.84216"
+ y="438.44305" />
+ <text
+ xml:space="preserve"
+ style="font-size:21.04477882px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="510.78113"
+ y="-551.74139"
+ id="text5860-6"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,0.87369536,-1.1445637,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan5862-4"
+ x="510.78113"
+ y="-551.74139">eth</tspan></text>
+ <rect
+ style="opacity:0.41249999999999998;fill:#05ff00;fill-rule:evenodd;stroke:#000000;stroke-width:0.71524047999999996px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+ id="rect5947"
+ width="62.431255"
+ height="24.849373"
+ x="545.28186"
+ y="-590.56665"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <text
+ xml:space="preserve"
+ style="font-size:16.64327431px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="594.56537"
+ y="-530.54211"
+ id="text5949"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,0.92462636,-1.0815179,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan5951"
+ x="594.56537"
+ y="-530.54211">gw-xxx</tspan></text>
+ <rect
+ style="opacity:0.41249999999999998;fill:#00fffc;fill-rule:evenodd;stroke:#000000;stroke-width:0.70914637999999997px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+ id="rect5947-4"
+ width="61.371914"
+ height="24.849373"
+ x="543.02319"
+ y="-718.3869"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <text
+ xml:space="preserve"
+ style="font-size:16.50146866px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="597.12836"
+ y="-643.20062"
+ id="text5949-7"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,0.91674822,-1.0908121,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan5951-3"
+ x="597.12836"
+ y="-643.20062">gw-yyy</tspan></text>
+ <g
+ id="g6280"
+ transform="translate(140.16089,-3.2116852)">
+ <g
+ transform="matrix(1,0,0,0.71409652,-474.38063,289.09459)"
+ id="g5864-4">
+ <rect
+ style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.79479539px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5858-6"
+ width="26.969246"
+ height="59.086094"
+ x="722.52655"
+ y="601.5531" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="611.76575"
+ y="-729.16479"
+ id="text5860-69"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,1,-1,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan5862-8"
+ x="611.76575"
+ y="-729.16479">eth</tspan></text>
+ </g>
+ </g>
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.4125;fill:#3866a9;fill-opacity:0.46666667;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path6269"
+ sodipodi:cx="185.74246"
+ sodipodi:cy="191.14935"
+ sodipodi:rx="84.039093"
+ sodipodi:ry="31.581572"
+ d="m 269.78156,191.14935 c 0,17.44202 -37.62559,31.58157 -84.0391,31.58157 -46.41351,0 -84.03909,-14.13955 -84.03909,-31.58157 0,-17.44202 37.62558,-31.58157 84.03909,-31.58157 46.41351,0 84.0391,14.13955 84.0391,31.58157 z"
+ transform="matrix(1.1689088,0,0,0.56811324,64.97702,668.03964)" />
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="191.63055"
+ y="780.23999"
+ id="text6271"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6273"
+ x="191.63055"
+ y="780.23999">quantum_ovs_agent</tspan></text>
+ <rect
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.7666558px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5351-8"
+ width="112.94334"
+ height="29.197376"
+ x="87.635742"
+ y="381.15903" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="89.241867"
+ y="402.52527"
+ id="text5353-29"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5355-2"
+ x="89.241867"
+ y="402.52527">nova-api</tspan></text>
+ <rect
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.99003595px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5351-8-4"
+ width="189.8004"
+ height="28.973995"
+ x="67.942032"
+ y="431.90845" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="69.43647"
+ y="453.16302"
+ id="text5353-29-6"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5355-2-3"
+ x="69.43647"
+ y="453.16302">nova-scheduler</tspan></text>
+ <path
+ style="fill:#000000;stroke:#1afc00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;fill-opacity:0"
+ d="m 188.55904,776.15726 -38.82057,0"
+ id="path6488"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g6280-9"
+ transform="translate(-112.82247,-2.1411197)">
+ <g
+ transform="matrix(1,0,0,0.71409652,-474.38063,289.09459)"
+ id="g5864-4-8">
+ <rect
+ style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.79479539px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5858-6-0"
+ width="26.969246"
+ height="59.086094"
+ x="722.52655"
+ y="601.5531" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="611.76575"
+ y="-729.16479"
+ id="text5860-69-9"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,1,-1,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan5862-8-6"
+ x="611.76575"
+ y="-729.16479">eth</tspan></text>
+ </g>
+ </g>
+ <g
+ id="g6388"
+ transform="translate(-31.21169,6)">
+ <rect
+ style="fill:#4975b6;fill-opacity:0.23137255;fill-rule:evenodd;stroke:#000000;stroke-width:0.84044451px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect6358"
+ width="187.50786"
+ height="29.064722"
+ x="85.200211"
+ y="530.91882" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text6360"
+ y="552.26874"
+ x="90.55011"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="552.26874"
+ x="90.55011"
+ id="tspan6362"
+ sodipodi:role="line">quantum-server</tspan></text>
+ </g>
+ <g
+ id="g6423"
+ transform="translate(-60,2)"
+ style="opacity:0.6125;fill:#3866a9;fill-opacity:0.46666667">
+ <rect
+ style="fill:#b1c76d;fill-opacity:0.46666667000000001;fill-rule:evenodd;stroke:#ff1300;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+ id="rect6358-7"
+ width="267.63913"
+ height="28.903856"
+ x="80.828072"
+ y="594.69769" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text6360-0"
+ y="615.96716"
+ x="86.097534"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#3866a9;fill-opacity:0.46666667;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="615.96716"
+ x="86.097534"
+ id="tspan6362-5"
+ sodipodi:role="line"
+ style="fill:#ff0000;fill-opacity:1;stroke:#000000;stroke-opacity:1">ryu-openflow-controller</tspan></text>
+ </g>
+ <path
+ style="fill:#000000;fill-opacity:0;stroke:#18ff00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 625.19207,465.67837 -314.52994,1.28512 0.48525,83.11061 -70.25502,1.28118"
+ id="path7949"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <rect
+ style="opacity:0.5;fill:url(#linearGradient8058);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.08154368;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3065-4-6"
+ width="273.09479"
+ height="380.50092"
+ x="-1005.1567"
+ y="560.06763"
+ transform="matrix(0,-1,1,0,0,0)"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/physical-view.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <g
+ id="g6280-0"
+ transform="translate(615.81666,0.135544)"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/physical-view.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <g
+ transform="matrix(1,0,0,0.71409652,-474.38063,289.09459)"
+ id="g5864-4-3">
+ <rect
+ style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.79479539px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5858-6-7"
+ width="26.969246"
+ height="59.086094"
+ x="722.52655"
+ y="601.5531" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="611.76575"
+ y="-729.16479"
+ id="text5860-69-4"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,1,-1,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan5862-8-9"
+ x="611.76575"
+ y="-729.16479">eth</tspan></text>
+ </g>
+ </g>
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.4125;fill:#3866a9;fill-opacity:0.46666667;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path6269-2"
+ sodipodi:cx="185.74246"
+ sodipodi:cy="191.14935"
+ sodipodi:rx="84.039093"
+ sodipodi:ry="31.581572"
+ d="m 269.78156,191.14935 c 0,17.44202 -37.62559,31.58157 -84.0391,31.58157 -46.41351,0 -84.03909,-14.13955 -84.03909,-31.58157 0,-17.44202 37.62558,-31.58157 84.03909,-31.58157 46.41351,0 84.0391,14.13955 84.0391,31.58157 z"
+ transform="matrix(1.1689088,0,0,0.56811324,540.63279,671.38687)"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/physical-view.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#000000;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ x="667.28632"
+ y="783.58722"
+ id="text6271-9"
+ sodipodi:linespacing="125%"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/physical-view.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"><tspan
+ sodipodi:role="line"
+ id="tspan6273-3"
+ x="667.28632"
+ y="783.58722">quantum_ovs_agent</tspan></text>
+ <path
+ style="fill:#000000;fill-opacity:0;stroke:#1afc00;stroke-width:5.29658604000000022;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 663.90943,779.50449 -43.56262,0"
+ id="path6488-0"
+ inkscape:connector-curvature="0"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/physical-view.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ style="stroke:#1afc00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1;fill:none;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 851.09658,517.1354 -231.24134,0 0,-122.04404 -472.11772,0"
+ id="path8151"
+ inkscape:connector-curvature="0"
+ transform="translate(0,308.2677)" />
+ <g
+ id="g6280-9-5"
+ transform="translate(362.8333,1.206114)"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/physical-view.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <g
+ transform="matrix(1,0,0,0.71409652,-474.38063,289.09459)"
+ id="g5864-4-8-4">
+ <rect
+ style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.79479539px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5858-6-0-9"
+ width="26.969246"
+ height="59.086094"
+ x="722.52655"
+ y="601.5531" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="611.76575"
+ y="-729.16479"
+ id="text5860-69-9-6"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,1,-1,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan5862-8-6-8"
+ x="611.76575"
+ y="-729.16479">eth</tspan></text>
+ </g>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="488.4584"
+ y="869.01385"
+ id="text8153"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan8155"
+ x="488.4584"
+ y="869.01385">...</tspan></text>
+ <rect
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.89793426px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5351-8-4-8"
+ width="155.63452"
+ height="29.066097"
+ x="76.085648"
+ y="477.68716" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="79.626144"
+ y="498.98779"
+ id="text5353-29-6-8"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5355-2-3-5"
+ x="79.626144"
+ y="498.98779">nova-...</tspan></text>
+ <rect
+ y="807.76764"
+ x="120.29346"
+ height="168.16565"
+ width="337.21384"
+ id="rect5351-5"
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.17921257px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5353-2"
+ y="966.48846"
+ x="172.48773"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="966.48846"
+ x="172.48773"
+ id="tspan5355-6"
+ sodipodi:role="line">nova-compute</tspan></text>
+ <path
+ transform="matrix(0.69506452,0,0,0.47991755,79.246065,639.64778)"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.5626709"
+ sodipodi:arg1="1.0390722"
+ sodipodi:r2="23.694832"
+ sodipodi:r1="69.884941"
+ sodipodi:cy="572.24408"
+ sodipodi:cx="136.41731"
+ sodipodi:sides="6"
+ id="path5250"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5274"
+ y="905.74854"
+ x="175.07115"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="905.74854"
+ x="175.07115"
+ id="tspan5276"
+ sodipodi:role="line">VM</tspan><tspan
+ id="tspan3167"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="928.24854"
+ x="175.07115"
+ sodipodi:role="line">tenant-X</tspan></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5329"
+ y="913.58319"
+ x="311.78284"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ id="tspan5333"
+ y="913.58319"
+ x="311.78284"
+ sodipodi:role="line">...</tspan></text>
+ <path
+ transform="matrix(1.0086434,0,0,0.68923037,137.86369,658.89562)"
+ d="m 289.53315,248.36246 -14.42324,24.98178 -28.84647,0 -14.42324,-24.98178 14.42324,-24.98178 28.84647,0 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="0.52359878"
+ sodipodi:arg1="0"
+ sodipodi:r2="24.981781"
+ sodipodi:r1="28.846476"
+ sodipodi:cy="248.36246"
+ sodipodi:cx="260.68668"
+ sodipodi:sides="6"
+ id="path5523-9"
+ style="opacity:0.5;fill:#2ad4ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5525-6"
+ y="837.15588"
+ x="380.11972"
+ style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="837.15588"
+ x="380.11972"
+ id="tspan5527-5"
+ sodipodi:role="line">OVS</tspan></text>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6228"
+ d="M 180.26786,884.67321 374.03954,832.21569"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6230"
+ d="m 293.74741,898.5905 88.85662,-53.52808"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6232"
+ d="m 395.45077,882.53208 18.19954,-34.25796"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text7945-1-8"
+ y="855.57654"
+ x="90.787804"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#193edc;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="fill:#31562b;fill-opacity:1;stroke:none"
+ y="855.57654"
+ x="90.787804"
+ id="tspan7947-2-1"
+ sodipodi:role="line">openflow</tspan></text>
+ <path
+ transform="matrix(0.69506452,0,0,0.47991755,183.15091,640.74733)"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.5626709"
+ sodipodi:arg1="1.0390722"
+ sodipodi:r2="23.694832"
+ sodipodi:r1="69.884941"
+ sodipodi:cy="572.24408"
+ sodipodi:cx="136.41731"
+ sodipodi:sides="6"
+ id="path5250-8"
+ style="fill:#00fffc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5274-5"
+ y="906.84808"
+ x="278.97601"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="906.84808"
+ x="278.97601"
+ id="tspan5276-33"
+ sodipodi:role="line">VM</tspan><tspan
+ id="tspan3167-8"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="929.34808"
+ x="278.97601"
+ sodipodi:role="line">tenant-Y</tspan></text>
+ <path
+ sodipodi:type="star"
+ style="fill:#ccff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5250-7"
+ sodipodi:sides="6"
+ sodipodi:cx="136.41731"
+ sodipodi:cy="572.24408"
+ sodipodi:r1="69.884941"
+ sodipodi:r2="23.694832"
+ sodipodi:arg1="1.0390722"
+ sodipodi:arg2="1.5626709"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ transform="matrix(0.69506452,0,0,0.47991755,307.37919,640.04064)" />
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="403.20428"
+ y="906.14142"
+ id="text5274-7"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5276-1"
+ x="403.20428"
+ y="906.14142"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans">VM</tspan><tspan
+ sodipodi:role="line"
+ x="403.20428"
+ y="928.64142"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ id="tspan3167-2">tenant-...</tspan></text>
+ <g
+ transform="translate(701.63358,-1.05275)"
+ id="g4188-6"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/physical-view.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <rect
+ y="807.76764"
+ x="120.29346"
+ height="168.16565"
+ width="337.21384"
+ id="rect5351-5-2"
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.17921257px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ transform="translate(-228.13313,-0.39285583)" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5353-2-6"
+ y="966.48846"
+ x="172.48773"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ transform="translate(-228.13313,-0.39285583)"><tspan
+ y="966.48846"
+ x="172.48773"
+ id="tspan5355-6-5"
+ sodipodi:role="line">nova-compute</tspan></text>
+ <g
+ id="g4099-6"
+ transform="translate(-228.13313,-0.39285583)">
+ <path
+ sodipodi:type="star"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5250-6"
+ sodipodi:sides="6"
+ sodipodi:cx="136.41731"
+ sodipodi:cy="572.24408"
+ sodipodi:r1="69.884941"
+ sodipodi:r2="23.694832"
+ sodipodi:arg1="1.0390722"
+ sodipodi:arg2="1.5626709"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ transform="matrix(0.69506452,0,0,0.47991755,79.246065,639.64778)" />
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="175.07115"
+ y="905.74854"
+ id="text5274-3"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5276-4"
+ x="175.07115"
+ y="905.74854"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans">VM</tspan><tspan
+ sodipodi:role="line"
+ x="175.07115"
+ y="928.24854"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ id="tspan3167-1">tenant-X</tspan></text>
+ </g>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5329-7"
+ y="913.58319"
+ x="311.78284"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ transform="translate(-228.13313,-0.39285583)"><tspan
+ id="tspan5333-1"
+ y="913.58319"
+ x="311.78284"
+ sodipodi:role="line">...</tspan></text>
+ <g
+ id="g6174-1-3"
+ transform="translate(-334.01622,209.06446)">
+ <path
+ sodipodi:type="star"
+ style="opacity:0.5;fill:#2ad4ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5523-9-0"
+ sodipodi:sides="6"
+ sodipodi:cx="260.68668"
+ sodipodi:cy="248.36246"
+ sodipodi:r1="28.846476"
+ sodipodi:r2="24.981781"
+ sodipodi:arg1="0"
+ sodipodi:arg2="0.52359878"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 289.53315,248.36246 -14.42324,24.98178 -28.84647,0 -14.42324,-24.98178 14.42324,-24.98178 28.84647,0 z"
+ transform="matrix(1.0086434,0,0,0.68923037,243.74678,449.4383)" />
+ <text
+ xml:space="preserve"
+ style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="486.00281"
+ y="627.69855"
+ id="text5525-6-8"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5527-5-2"
+ x="486.00281"
+ y="627.69855">OVS</tspan></text>
+ </g>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6228-9"
+ d="M 180.26786,884.67321 374.03954,832.21569"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="translate(-228.13313,-0.39285583)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6230-0"
+ d="m 293.74741,898.5905 88.85662,-53.52808"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="translate(-228.13313,-0.39285583)" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6232-1"
+ d="m 395.45077,882.53208 18.19954,-34.25796"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="translate(-228.13313,-0.39285583)" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text7945-1-8-0"
+ y="855.57654"
+ x="90.787804"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#193edc;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ transform="translate(-228.13313,-0.39285583)"><tspan
+ style="fill:#31562b;fill-opacity:1;stroke:none"
+ y="855.57654"
+ x="90.787804"
+ id="tspan7947-2-1-8"
+ sodipodi:role="line">openflow</tspan></text>
+ <path
+ transform="matrix(0.69506452,0,0,0.47991755,-44.98222,640.35447)"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.5626709"
+ sodipodi:arg1="1.0390722"
+ sodipodi:r2="23.694832"
+ sodipodi:r1="69.884941"
+ sodipodi:cy="572.24408"
+ sodipodi:cx="136.41731"
+ sodipodi:sides="6"
+ id="path5250-8-1"
+ style="fill:#00fffc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5274-5-6"
+ y="906.84808"
+ x="278.97601"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"
+ transform="translate(-228.13313,-0.39285583)"><tspan
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="906.84808"
+ x="278.97601"
+ id="tspan5276-33-7"
+ sodipodi:role="line">VM</tspan><tspan
+ id="tspan3167-8-8"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="929.34808"
+ x="278.97601"
+ sodipodi:role="line">tenant-Y</tspan></text>
+ <path
+ sodipodi:type="star"
+ style="fill:#ccff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5250-7-8"
+ sodipodi:sides="6"
+ sodipodi:cx="136.41731"
+ sodipodi:cy="572.24408"
+ sodipodi:r1="69.884941"
+ sodipodi:r2="23.694832"
+ sodipodi:arg1="1.0390722"
+ sodipodi:arg2="1.5626709"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ transform="matrix(0.69506452,0,0,0.47991755,79.246065,639.64778)" />
+ <text
+ xml:space="preserve"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="175.07115"
+ y="905.74854"
+ id="text5274-7-2"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5276-1-1"
+ x="175.07115"
+ y="905.74854"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans">VM</tspan><tspan
+ sodipodi:role="line"
+ x="175.07115"
+ y="928.24854"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ id="tspan3167-2-3">tenant-...</tspan></text>
+ </g>
+ <path
+ style="fill:#000000;fill-opacity:1;stroke:#1afc00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 310.8384,549.42539 0,153.11893"
+ id="path4349"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g3342"
+ transform="translate(447.16205,229.09398)">
+ <g
+ id="g3310">
+ <rect
+ y="322.21494"
+ x="302.1904"
+ height="26.009777"
+ width="88.812088"
+ id="use3891"
+ style="fill:#ffcc00;fill-rule:evenodd;stroke:#000000;stroke-width:0.891186px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3238"
+ y="339.35312"
+ x="305.05029"
+ style="font-size:18px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="339.35312"
+ x="305.05029"
+ id="tspan3240"
+ sodipodi:role="line">dnsmasq</tspan></text>
+ </g>
+ </g>
+ <path
+ sodipodi:type="star"
+ style="opacity:0.325;fill:#5555ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5543"
+ sodipodi:sides="6"
+ sodipodi:cx="349.90158"
+ sodipodi:cy="64.665352"
+ sodipodi:r1="34.501789"
+ sodipodi:r2="28.966175"
+ sodipodi:arg1="-1.0612041"
+ sodipodi:arg2="-0.62241192"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 366.73229,34.547239 17.6677,29.634878 -16.83071,30.118112 -34.49841,0.483235 -17.66769,-29.634877 16.8307,-30.118112 z"
+ transform="translate(293.8622,280.98454)" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 534.23032,569.69365 30.46212,0.68781"
+ id="path5559-8"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 718.8409,570.5096 30.46212,0.68781"
+ id="path5559-8-1"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#1afc00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 617.18706,623.62918 -233.80082,0 0.58892,-157.83027"
+ id="path4349-8"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="318.5264"
+ y="1002.1331"
+ id="text3193"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3195"
+ x="318.5264"
+ y="1002.1331">physical host</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="780.78442"
+ y="999.62671"
+ id="text3193-6"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3195-3"
+ x="780.78442"
+ y="999.62671">physical host</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="746.48157"
+ y="624.74554"
+ id="text3193-1"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3195-7"
+ x="746.48157"
+ y="624.74554">physical host</tspan></text>
+ <g
+ id="g3348"
+ transform="translate(8.5757105,28.177334)">
+ <g
+ id="g3310-0"
+ transform="translate(132.41824,200.14953)">
+ <rect
+ y="322.21494"
+ x="302.1904"
+ height="26.009777"
+ width="88.812088"
+ id="use3891-3"
+ style="fill:#ffcc00;fill-rule:evenodd;stroke:#000000;stroke-width:0.891186px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3238-4"
+ y="339.35312"
+ x="305.05029"
+ style="font-size:18px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="339.35312"
+ x="305.05029"
+ id="tspan3240-0"
+ sodipodi:role="line">dnsmasq</tspan></text>
+ </g>
+ </g>
+ <path
+ style="fill:#000000;fill-opacity:0;stroke:#1afc00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 306.08403,494.941 -74.34851,0"
+ id="path6488-8"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:#000000;fill-opacity:0;stroke:#1afc00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 308.53424,443.48674 -49.84648,0"
+ id="path6488-6"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#1afc00;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="M 311.69155,466.04721 310.66001,396.21642 199.7647,395.19914"
+ id="path4349-8-8"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccc" />
+ </g>
+</svg>
diff --git a/doc/source/images/trace-route.png b/doc/source/images/trace-route.png
new file mode 100644
index 00000000..694cf1c9
--- /dev/null
+++ b/doc/source/images/trace-route.png
Binary files differ
diff --git a/doc/source/images/trace-route.svg b/doc/source/images/trace-route.svg
new file mode 100644
index 00000000..a6ab9696
--- /dev/null
+++ b/doc/source/images/trace-route.svg
@@ -0,0 +1,1000 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1052.3622"
+ height="744.09448"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.1 r9760"
+ sodipodi:docname="trace-route.svg"
+ inkscape:export-filename="/home/yamahata/openvswitch/sp-lab/scarab/scarab-2/doc/source/images/trace-route.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.93408906"
+ inkscape:cx="182.3719"
+ inkscape:cy="372.04724"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1471"
+ inkscape:window-height="1092"
+ inkscape:window-x="135"
+ inkscape:window-y="116"
+ inkscape:window-maximized="0"
+ inkscape:snap-grids="true"
+ inkscape:snap-to-guides="false"
+ inkscape:snap-bbox="false"
+ inkscape:snap-page="false" />
+ <defs
+ id="defs4">
+ <inkscape:path-effect
+ is_visible="true"
+ id="path-effect3771"
+ effect="spiro" />
+ <linearGradient
+ osb:paint="solid"
+ id="linearGradient6493">
+ <stop
+ id="stop6495"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5343"
+ inkscape:collect="always">
+ <stop
+ id="stop5345"
+ offset="0"
+ style="stop-color:#aaccff;stop-opacity:1;" />
+ <stop
+ id="stop5347"
+ offset="1"
+ style="stop-color:#aaccff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ osb:paint="solid"
+ id="linearGradient5313">
+ <stop
+ id="stop5315"
+ offset="0"
+ style="stop-color:#5555ff;stop-opacity:1;" />
+ </linearGradient>
+ <marker
+ style="overflow:visible;"
+ id="Arrow1Mend"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1Mend">
+ <path
+ transform="scale(0.4) rotate(180) translate(10,0)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path5567" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow1Mstart"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1Mstart">
+ <path
+ transform="scale(0.4) translate(10,0)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path5564" />
+ </marker>
+ <marker
+ style="overflow:visible;"
+ id="Arrow2Lend"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow2Lend">
+ <path
+ transform="scale(1.1) rotate(180) translate(1,0)"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
+ style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ id="path5579" />
+ </marker>
+ <marker
+ style="overflow:visible;"
+ id="Arrow1Lend"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lend">
+ <path
+ transform="scale(0.8) rotate(180) translate(12.5,0)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path5561" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="Arrow1Lstart"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lstart">
+ <path
+ transform="scale(0.8) translate(12.5,0)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path5558" />
+ </marker>
+ <inkscape:path-effect
+ fuse_tolerance="0"
+ vertical_pattern="false"
+ prop_units="false"
+ tang_offset="0"
+ normal_offset="0"
+ spacing="0"
+ scale_y_rel="false"
+ prop_scale="1"
+ copytype="single_stretched"
+ pattern="M 0,0 0,10 10,5 z"
+ is_visible="true"
+ id="path-effect5339"
+ effect="skeletal" />
+ <linearGradient
+ osb:paint="solid"
+ id="linearGradient5242">
+ <stop
+ id="stop5244"
+ offset="0"
+ style="stop-color:#7fff2a;stop-opacity:1;" />
+ </linearGradient>
+ <inkscape:perspective
+ id="perspective3009"
+ inkscape:persp3d-origin="526.18109 : 248.03149 : 1"
+ inkscape:vp_z="1052.3622 : 372.04724 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 372.04724 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <linearGradient
+ gradientTransform="matrix(1.4524057,0,0,1.8436855,141.45819,-791.93947)"
+ gradientUnits="userSpaceOnUse"
+ y2="622.73621"
+ x2="-318.84055"
+ y1="622.73621"
+ x1="-532.43896"
+ id="linearGradient5349"
+ xlink:href="#linearGradient5343"
+ inkscape:collect="always" />
+ <marker
+ style="overflow:visible;"
+ id="Arrow1LendM"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1LendM">
+ <path
+ transform="scale(0.8) rotate(180) translate(12.5,0)"
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path4159" />
+ </marker>
+ <marker
+ style="overflow:visible;"
+ id="Arrow1LendF"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1LendF">
+ <path
+ transform="scale(0.8) rotate(180) translate(12.5,0)"
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path4585" />
+ </marker>
+ <marker
+ style="overflow:visible;"
+ id="Arrow1Mend6"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1Mend6">
+ <path
+ transform="scale(0.4) rotate(180) translate(10,0)"
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path5404" />
+ </marker>
+ <marker
+ style="overflow:visible;"
+ id="Arrow1MendN"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1MendN">
+ <path
+ transform="scale(0.4) rotate(180) translate(10,0)"
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path5645" />
+ </marker>
+ <linearGradient
+ gradientTransform="matrix(0.83990127,0,0,1.846462,-201.58875,-629.6685)"
+ gradientUnits="userSpaceOnUse"
+ y2="622.73621"
+ x2="-318.84055"
+ y1="622.73621"
+ x1="-532.43896"
+ id="linearGradient5349-6"
+ xlink:href="#linearGradient5343-7"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient5343-7"
+ inkscape:collect="always">
+ <stop
+ id="stop5345-4"
+ offset="0"
+ style="stop-color:#aaccff;stop-opacity:1;" />
+ <stop
+ id="stop5347-4"
+ offset="1"
+ style="stop-color:#aaccff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5343-7-4"
+ id="linearGradient6079-9"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2042654,0,0,2.6602952,-344.10309,-1384.9447)"
+ x1="-532.43896"
+ y1="622.73621"
+ x2="-318.84055"
+ y2="622.73621" />
+ <linearGradient
+ id="linearGradient5343-7-4"
+ inkscape:collect="always">
+ <stop
+ id="stop5345-4-1"
+ offset="0"
+ style="stop-color:#aaccff;stop-opacity:1;" />
+ <stop
+ id="stop5347-4-6"
+ offset="1"
+ style="stop-color:#aaccff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5343-7-4-5"
+ id="linearGradient8058-2"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2059698,0,0,1.7811621,-346.7249,-253.72822)"
+ x1="-532.43896"
+ y1="622.73621"
+ x2="-318.84055"
+ y2="622.73621" />
+ <linearGradient
+ id="linearGradient5343-7-4-5"
+ inkscape:collect="always">
+ <stop
+ id="stop5345-4-1-4"
+ offset="0"
+ style="stop-color:#aaccff;stop-opacity:1;" />
+ <stop
+ id="stop5347-4-6-4"
+ offset="1"
+ style="stop-color:#aaccff;stop-opacity:0;" />
+ </linearGradient>
+ <marker
+ style="overflow:visible;"
+ id="Arrow1Lend9"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1Lend9">
+ <path
+ transform="scale(0.8) rotate(180) translate(12.5,0)"
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path5862" />
+ </marker>
+ <marker
+ style="overflow:visible;"
+ id="Arrow1MendNb"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1MendNb">
+ <path
+ transform="scale(0.4) rotate(180) translate(10,0)"
+ style="marker-start:none;stroke:#ff0000;stroke-width:1.0pt;fill:#ff0000;fill-rule:evenodd"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path6752" />
+ </marker>
+ <marker
+ style="overflow:visible;"
+ id="Arrow1MendNbS"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1MendNbS">
+ <path
+ transform="scale(0.4) rotate(180) translate(10,0)"
+ style="fill-rule:evenodd;marker-start:none;stroke:#094efb;stroke-width:1.0pt;fill:#094efb"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path7413" />
+ </marker>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5343-7-4"
+ id="linearGradient7629"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2913081,0,0,1.7807591,-319.92466,-539.27771)"
+ x1="-532.43896"
+ y1="622.73621"
+ x2="-318.84055"
+ y2="622.73621" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5343-7-4-5"
+ id="linearGradient7631"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.3365771,0,0,1.742677,-292.03834,-950.8628)"
+ x1="-532.43896"
+ y1="622.73621"
+ x2="-318.84055"
+ y2="622.73621" />
+ </defs>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(0,-308.2677)"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <path
+ sodipodi:nodetypes="cccc"
+ style="fill:none;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 158.17935,808.13419 1.07057,-129.23388 411.01682,1.07056 1.07056,128.6631"
+ id="path5485"
+ inkscape:connector-curvature="0" />
+ <a
+ style="fill:#ff2ad4;fill-opacity:1"
+ transform="matrix(1,0,0,0.81896683,-0.728701,296.31497)"
+ id="a4003" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5549"
+ y="1039.1901"
+ x="14.34453"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="1039.1901"
+ x="14.34453"
+ id="tspan5551"
+ sodipodi:role="line">packet traverse between different tenants</tspan></text>
+ <rect
+ transform="matrix(0,-1,1,0,0,0)"
+ y="226.35202"
+ x="-631.13312"
+ height="259.67657"
+ width="308.77914"
+ id="rect3065"
+ style="opacity:0.5;fill:url(#linearGradient5349);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.63639235px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <rect
+ y="446.62057"
+ x="251.90131"
+ height="86.038254"
+ width="196.54826"
+ id="rect5351"
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.73611546px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <g
+ transform="translate(-164,-63.070562)"
+ id="g6174">
+ <path
+ sodipodi:type="star"
+ style="opacity:0.5;fill:#2ad4ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5523"
+ sodipodi:sides="6"
+ sodipodi:cx="260.68668"
+ sodipodi:cy="248.36246"
+ sodipodi:r1="28.846476"
+ sodipodi:r2="24.981781"
+ sodipodi:arg1="0"
+ sodipodi:arg2="0.52359878"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 289.53315,248.36246 -14.42324,24.98178 -28.84647,0 -14.42324,-24.98178 14.42324,-24.98178 28.84647,0 z"
+ transform="matrix(1.0086434,0,0,0.68923037,243.74678,449.4383)" />
+ <text
+ xml:space="preserve"
+ style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="486.00281"
+ y="627.69855"
+ id="text5525"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5527"
+ x="486.00281"
+ y="627.69855">OVS</tspan></text>
+ </g>
+ <path
+ inkscape:connector-curvature="0"
+ id="path5559"
+ d="m 294.33845,522.40607 24.57293,27.77808"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path5562"
+ d="m 396.9037,525.61123 -29.91486,24.57292"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path5565"
+ d="m 343.44082,575.83851 -1.14881,34.25797"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path5568"
+ d="m 342.47507,631.76081 -1.20422,44.96899"
+ style="fill:none;stroke:#000000;stroke-width:4.86634588;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ transform="translate(0,308.2677)"
+ inkscape:connector-curvature="0"
+ id="path4088"
+ d=""
+ style="opacity:0.275;fill:#dd6de5;fill-opacity:0.46666667;fill-rule:nonzero;stroke:#ff0000;stroke-width:4.27355194;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:2.13677602, 2.13677602;stroke-dashoffset:0" />
+ <g
+ transform="matrix(1,0,0,0.71409652,-395.55774,181.84382)"
+ id="g5864">
+ <rect
+ style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.79479539px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5858"
+ width="26.969246"
+ height="59.086094"
+ x="722.52655"
+ y="601.5531" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="611.76575"
+ y="-729.16479"
+ id="text5860"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,1,-1,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan5862"
+ x="611.76575"
+ y="-729.16479">eth</tspan></text>
+ </g>
+ <rect
+ transform="matrix(0,-1,1,0,0,0)"
+ y="444.25876"
+ x="-1006.8217"
+ height="250.81369"
+ width="274.53006"
+ id="rect3065-4-6"
+ style="opacity:0.5;fill:url(#linearGradient7629);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.69442165;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <rect
+ y="804.84454"
+ x="457.61816"
+ height="172.02316"
+ width="227.05319"
+ id="rect5351-5-3"
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.63848996px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5353-2-9"
+ y="964.26257"
+ x="473.68146"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="964.26257"
+ x="473.68146"
+ id="tspan5355-6-9"
+ sodipodi:role="line">nova-compute</tspan></text>
+ <g
+ transform="translate(311.81666,-5.864456)"
+ id="g6280-0">
+ <g
+ id="g5864-4-3"
+ transform="matrix(1,0,0,0.71409652,-474.38063,289.09459)">
+ <rect
+ y="601.5531"
+ x="722.52655"
+ height="59.086094"
+ width="26.969246"
+ id="rect5858-6-7"
+ style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.79479539px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ transform="matrix(0,1,-1,0,0,0)"
+ sodipodi:linespacing="125%"
+ id="text5860-69-4"
+ y="-729.16479"
+ x="611.76575"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="-729.16479"
+ x="611.76575"
+ id="tspan5862-8-9"
+ sodipodi:role="line">eth</tspan></text>
+ </g>
+ </g>
+ <g
+ id="g6174-1-6"
+ transform="translate(65.77268,206.80455)">
+ <path
+ sodipodi:type="star"
+ style="opacity:0.5;fill:#2ad4ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5523-9-6"
+ sodipodi:sides="6"
+ sodipodi:cx="260.68668"
+ sodipodi:cy="248.36246"
+ sodipodi:r1="28.846476"
+ sodipodi:r2="24.981781"
+ sodipodi:arg1="0"
+ sodipodi:arg2="0.52359878"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 289.53315,248.36246 -14.42324,24.98178 -28.84647,0 -14.42324,-24.98178 14.42324,-24.98178 28.84647,0 z"
+ transform="matrix(1.0086434,0,0,0.68923037,243.74678,449.4383)" />
+ <text
+ xml:space="preserve"
+ style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="486.00281"
+ y="627.69855"
+ id="text5525-6-4"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5527-5-3"
+ x="486.00281"
+ y="627.69855">OVS</tspan></text>
+ </g>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6232-4"
+ d="M 620.65527,881.99979 592.77936,837.0775"
+ style="fill:none;stroke:#000000;stroke-width:3.04127908;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <rect
+ transform="matrix(0,-1,1,0,0,0)"
+ y="11.640405"
+ x="-1003.0159"
+ height="245.44997"
+ width="284.15417"
+ id="rect3065-4-6-9"
+ style="opacity:0.5;fill:url(#linearGradient7631);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.70533395;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <rect
+ y="797.75653"
+ x="43.118031"
+ height="172.1749"
+ width="201.51144"
+ id="rect5351-5-3-9"
+ style="opacity:0.275;fill:#ff2ad4;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:2.48675466px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5353-2-9-3"
+ y="957.25049"
+ x="59.257202"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="957.25049"
+ x="59.257202"
+ id="tspan5355-6-9-6"
+ sodipodi:role="line">nova-compute</tspan></text>
+ <g
+ transform="translate(-102.6076,-12.876583)"
+ id="g6280-0-9">
+ <g
+ id="g5864-4-3-4"
+ transform="matrix(1,0,0,0.71409652,-474.38063,289.09459)">
+ <rect
+ y="601.5531"
+ x="722.52655"
+ height="59.086094"
+ width="26.969246"
+ id="rect5858-6-7-3"
+ style="fill:#00ffff;fill-rule:evenodd;stroke:#000000;stroke-width:0.79479539px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
+ <text
+ transform="matrix(0,1,-1,0,0,0)"
+ sodipodi:linespacing="125%"
+ id="text5860-69-4-5"
+ y="-729.16479"
+ x="611.76575"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="-729.16479"
+ x="611.76575"
+ id="tspan5862-8-9-1"
+ sodipodi:role="line">eth</tspan></text>
+ </g>
+ </g>
+ <g
+ id="g6174-1-6-7"
+ transform="translate(-348.65158,199.79243)">
+ <path
+ sodipodi:type="star"
+ style="opacity:0.5;fill:#2ad4ff;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path5523-9-6-4"
+ sodipodi:sides="6"
+ sodipodi:cx="260.68668"
+ sodipodi:cy="248.36246"
+ sodipodi:r1="28.846476"
+ sodipodi:r2="24.981781"
+ sodipodi:arg1="0"
+ sodipodi:arg2="0.52359878"
+ inkscape:flatsided="true"
+ inkscape:rounded="0"
+ inkscape:randomized="0"
+ d="m 289.53315,248.36246 -14.42324,24.98178 -28.84647,0 -14.42324,-24.98178 14.42324,-24.98178 28.84647,0 z"
+ transform="matrix(1.0086434,0,0,0.68923037,243.74678,449.4383)" />
+ <text
+ xml:space="preserve"
+ style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="486.00281"
+ y="627.69855"
+ id="text5525-6-4-3"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan5527-5-3-1"
+ x="486.00281"
+ y="627.69855">OVS</tspan></text>
+ </g>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6232-4-4"
+ d="M 190.17258,872.84655 175.14342,831.13594"
+ style="fill:none;stroke:#000000;stroke-width:3.04127908;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ y="-294.56668"
+ x="493.28183"
+ height="24.849373"
+ width="62.431255"
+ id="rect5947"
+ style="opacity:0.41249999999999998;fill:#05ff00;fill-rule:evenodd;stroke:#000000;stroke-width:0.71524047999999996px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1" />
+ <text
+ transform="matrix(0,0.92462639,-1.0815179,0,0,0)"
+ sodipodi:linespacing="125%"
+ id="text5949"
+ y="-256.85269"
+ x="538.32648"
+ style="font-size:16.64327431px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="-256.85269"
+ x="538.32648"
+ id="tspan5951"
+ sodipodi:role="line">gw-xxx</tspan></text>
+ <g
+ id="g4527"
+ transform="translate(-175.431,2.2822469)">
+ <rect
+ style="opacity:0.4125;fill:#00fffc;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.70914638px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ id="rect5947-4"
+ width="61.371914"
+ height="24.849373"
+ x="491.02322"
+ y="-596.3869"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <text
+ xml:space="preserve"
+ style="font-size:16.50146866px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="539.23834"
+ y="-531.35742"
+ id="text5949-7"
+ sodipodi:linespacing="125%"
+ transform="matrix(0,0.91674818,-1.0908121,0,0,0)"><tspan
+ sodipodi:role="line"
+ id="tspan5951-3"
+ x="539.23834"
+ y="-531.35742">gw-yyy</tspan></text>
+ </g>
+ <text
+ sodipodi:linespacing="125%"
+ id="text5353"
+ y="486.77222"
+ x="261.58722"
+ style="font-size:24px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="486.77222"
+ x="261.58722"
+ id="tspan5355"
+ sodipodi:role="line">nova-network</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:20px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="261.21707"
+ y="728.6048"
+ id="text7619"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ x="261.21707"
+ y="728.6048"
+ id="tspan7623"
+ style="fill:#0000ff;stroke:none">This path is blocked</tspan><tspan
+ sodipodi:role="line"
+ x="261.21707"
+ y="753.6048"
+ id="tspan7627"
+ style="fill:#0000ff;stroke:none">by ryu and OVS</tspan></text>
+ <path
+ transform="matrix(0.69506452,0,0,0.47991755,431.33208,636.4912)"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.5626709"
+ sodipodi:arg1="1.0390722"
+ sodipodi:r2="23.694832"
+ sodipodi:r1="69.884941"
+ sodipodi:cy="572.24408"
+ sodipodi:cx="136.41731"
+ sodipodi:sides="6"
+ id="path5250"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5274"
+ y="902.59198"
+ x="527.15717"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="902.59198"
+ x="527.15717"
+ id="tspan5276"
+ sodipodi:role="line">VM</tspan><tspan
+ id="tspan3167"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="925.09198"
+ x="527.15717"
+ sodipodi:role="line">tenant-X</tspan></text>
+ <path
+ transform="matrix(0.69506452,0,0,0.47991755,535.23693,637.59075)"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.5626709"
+ sodipodi:arg1="1.0390722"
+ sodipodi:r2="23.694832"
+ sodipodi:r1="69.884941"
+ sodipodi:cy="572.24408"
+ sodipodi:cx="136.41731"
+ sodipodi:sides="6"
+ id="path5250-8"
+ style="fill:#00fffc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5274-5"
+ y="903.69153"
+ x="631.06201"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="903.69153"
+ x="631.06201"
+ id="tspan5276-33"
+ sodipodi:role="line">VM</tspan><tspan
+ id="tspan3167-8"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="926.19153"
+ x="631.06201"
+ sodipodi:role="line">tenant-Y</tspan></text>
+ <path
+ transform="matrix(0.69506452,0,0,0.47991755,-2.2454252,626.85615)"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.5626709"
+ sodipodi:arg1="1.0390722"
+ sodipodi:r2="23.694832"
+ sodipodi:r1="69.884941"
+ sodipodi:cy="572.24408"
+ sodipodi:cx="136.41731"
+ sodipodi:sides="6"
+ id="path5250-1"
+ style="fill:#05ff00;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5274-0"
+ y="892.95691"
+ x="93.579659"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="892.95691"
+ x="93.579659"
+ id="tspan5276-2"
+ sodipodi:role="line">VM</tspan><tspan
+ id="tspan3167-2"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="915.45691"
+ x="93.579659"
+ sodipodi:role="line">tenant-X</tspan></text>
+ <path
+ transform="matrix(0.69506452,0,0,0.47991755,101.65942,627.9557)"
+ d="m 171.85039,632.4803 -69.88264,0.56783 -35.433072,-60.23622 34.449562,-60.80405 69.88263,-0.56783 35.43308,60.23622 z"
+ inkscape:randomized="0"
+ inkscape:rounded="0"
+ inkscape:flatsided="true"
+ sodipodi:arg2="1.5626709"
+ sodipodi:arg1="1.0390722"
+ sodipodi:r2="23.694832"
+ sodipodi:r1="69.884941"
+ sodipodi:cy="572.24408"
+ sodipodi:cx="136.41731"
+ sodipodi:sides="6"
+ id="path5250-8-9"
+ style="fill:#00fffc;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="star" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text5274-5-7"
+ y="894.05646"
+ x="197.48451"
+ style="font-size:18px;font-style:normal;font-weight:normal;text-align:center;line-height:125%;letter-spacing:0px;word-spacing:0px;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="894.05646"
+ x="197.48451"
+ id="tspan5276-33-5"
+ sodipodi:role="line">VM</tspan><tspan
+ id="tspan3167-8-6"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
+ y="916.55646"
+ x="197.48451"
+ sodipodi:role="line">tenant-Y</tspan></text>
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6232-4-4-8"
+ d="M 97.441766,873.64536 137.01125,829.79363"
+ style="fill:none;stroke:#000000;stroke-width:3.04127908;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ sodipodi:nodetypes="cc"
+ inkscape:connector-curvature="0"
+ id="path6232-4-7"
+ d="m 534.23096,882.74513 19.22881,-42.78116"
+ style="fill:none;stroke:#000000;stroke-width:3.04127908;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3785"
+ d="m 101.65031,875.0723 c 63.16314,-111.33842 18.86393,-195.98912 39.61079,-215.1829 26.42833,-24.44994 128.6858,24.61555 158.44314,-3.21169 29.75734,-27.82724 9.7041,-58.97426 7.49393,-85.64494 -2.21017,-26.67068 -32.0601,-4.94935 -31.0463,-66.37482 0.73763,-44.69236 -14.7438,-120.37565 20.34068,-120.97348 35.08448,-0.59782 76.20965,-0.20687 110.26786,1.07057 34.05821,1.27743 1.13332,106.04614 4.28225,135.96133 3.14893,29.91519 -24.3996,20.09006 -29.97573,47.10472 -5.57614,27.01466 -22.71879,28.74224 1.07057,76.00988 23.78935,47.26763 164.40377,3.54639 189.48942,27.83461 25.08565,24.28822 66.37482,214.11234 66.37482,214.11234"
+ style="fill:none;stroke:#ff0000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:16, 4;stroke-dashoffset:0;marker-start:none;marker-end:url(#Arrow1MendNb)"
+ sodipodi:nodetypes="cszzszzzzzzc" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path6954"
+ d="m 178.78381,888.1186 -2.14112,-191.63055 359.70874,4.28224 -1.07057,191.63055"
+ style="fill:none;stroke:#094efb;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:10, 5;stroke-dashoffset:0;marker-end:url(#Arrow1MendNbS)" />
+ <g
+ id="g6090-0"
+ transform="matrix(1.2451588,0,0,0.17441948,-374.01725,619.41308)"
+ style="opacity:0.77916715;fill:#ebf039;fill-opacity:0.67579908;stroke:#bbbb49;stroke-opacity:1">
+ <path
+ transform="translate(0,308.2677)"
+ inkscape:connector-curvature="0"
+ d="m 602.42044,72.550062 c -0.4075,2.691888 -0.26973,5.434103 -0.21876,8.14726 0.0961,2.419483 0.0449,4.837495 0.02,7.256796 0.0222,2.815434 -0.11484,5.595399 -0.47386,8.387727 -0.4192,2.406883 -0.4577,4.844455 -0.58875,7.276385 -0.0643,2.48712 -0.002,4.97528 0.0302,7.46246 0.0278,2.18415 0.0347,4.36848 0.0389,6.55277 -0.0388,1.93504 -0.10842,3.84524 0.58719,5.67746 0.55097,2.00697 1.57541,3.73077 2.0821,5.76013 0.4623,2.20508 0.5141,4.46371 0.55192,6.70771 0.0195,2.15602 0.006,4.31218 5.3e-4,6.46825 -0.006,2.14105 -0.007,4.28211 -0.008,6.42318 -6.7e-4,2.14089 -5.6e-4,4.28178 -5.3e-4,6.42267 5e-5,2.14111 8e-5,4.28222 10e-5,6.42333 -0.0208,1.95886 -0.12762,3.70592 0.36327,5.60309 1.24963,1.12913 1.75849,2.91852 2.18528,4.50237 0.52859,2.27585 0.61078,4.61647 0.66348,6.94213 -0.0592,2.7368 -0.78817,5.19296 -2.3608,7.42651 -1.25292,1.48313 -1.60721,3.34323 -2.12842,5.1549 -0.56997,1.88909 -0.72639,3.85367 -0.81952,5.81336 0.0374,1.9879 -0.25785,4.02223 0.0676,5.99206 0.18248,1.97168 1.48714,3.43882 2.06106,5.26765 0.0337,0.47739 0.0673,0.95477 0.10095,1.43215 0,0 -53.04587,0.0679 -53.04587,0.0679 l 0,0 c 0.0285,0.0736 0.057,0.14719 0.0855,0.22079 -0.82072,-2.05443 -1.64038,-4.12828 -1.86714,-6.35462 -0.22106,-2.28199 -0.12716,-4.57463 -0.0756,-6.8649 0.10225,-2.34925 0.27371,-4.70524 0.85096,-6.99385 0.61831,-2.32808 1.03831,-4.74768 2.21478,-6.87835 0.94363,-1.43524 2.2748,-2.24658 2.2357,-4.14484 -0.0547,-1.79985 -0.0868,-3.64225 -0.71015,-5.35398 -0.79065,-1.72238 -2.0438,-3.24247 -2.2505,-5.19832 -0.34142,-2.19939 -0.24314,-4.41445 -0.24641,-6.63398 -2e-5,-2.14111 -6e-5,-4.28222 -9e-5,-6.42333 0,-2.14178 -7e-5,-4.28356 8.4e-4,-6.42534 10e-4,-2.14463 0.003,-4.28927 0.009,-6.4339 0.005,-2.11287 0.0179,-4.22599 -0.018,-6.33866 -0.0495,-1.7832 -0.0834,-3.5962 -0.61072,-5.31599 -0.69229,-1.91853 -1.46513,-3.80227 -1.95246,-5.79169 -0.55985,-2.35896 -0.76595,-4.72626 -0.64061,-7.15105 0.002,-2.18419 0.004,-4.36843 0.027,-6.55253 0.0297,-2.533 0.0852,-5.06555 0.11476,-7.59854 -0.004,-2.641 0.16264,-5.296461 0.51202,-7.91302 0.42341,-2.532224 0.76663,-5.038996 0.49576,-7.618062 -0.0249,-2.419301 -0.0761,-4.837313 0.02,-7.256796 0.051,-2.713157 0.18875,-5.455372 -0.21876,-8.14726 0,0 52.91646,0 52.91646,0 z"
+ id="path6084-9"
+ style="fill:#ebf039;fill-opacity:0.67579908;fill-rule:nonzero;stroke:#bbbb49;stroke-width:4;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ <path
+ transform="translate(0,308.2677)"
+ inkscape:connector-curvature="0"
+ id="path6086-5"
+ d="M 603.79682,72.852278 552.40985,206.67249"
+ style="fill:#ebf039;fill-opacity:0.67579908;stroke:#bbbb49;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ transform="translate(0,308.2677)"
+ inkscape:connector-curvature="0"
+ id="path6088-7"
+ d="M 549.19817,70.711154 602.72625,207.74306"
+ style="fill:#ebf039;fill-opacity:0.67579908;stroke:#bbbb49;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+ <g
+ id="g6090"
+ transform="matrix(2.1649115,0,0,0.43311781,-906.34831,189.648)"
+ style="opacity:0.77916715;fill:#ebf039;fill-opacity:0.67579908;stroke:#bbbb49;stroke-opacity:1">
+ <path
+ transform="translate(0,308.2677)"
+ inkscape:connector-curvature="0"
+ d="m 602.42044,72.550062 c -0.4075,2.691888 -0.26973,5.434103 -0.21876,8.14726 0.0961,2.419483 0.0449,4.837495 0.02,7.256796 0.0222,2.815434 -0.11484,5.595399 -0.47386,8.387727 -0.4192,2.406883 -0.4577,4.844455 -0.58875,7.276385 -0.0643,2.48712 -0.002,4.97528 0.0302,7.46246 0.0278,2.18415 0.0347,4.36848 0.0389,6.55277 -0.0388,1.93504 -0.10842,3.84524 0.58719,5.67746 0.55097,2.00697 1.57541,3.73077 2.0821,5.76013 0.4623,2.20508 0.5141,4.46371 0.55192,6.70771 0.0195,2.15602 0.006,4.31218 5.3e-4,6.46825 -0.006,2.14105 -0.007,4.28211 -0.008,6.42318 -6.7e-4,2.14089 -5.6e-4,4.28178 -5.3e-4,6.42267 5e-5,2.14111 8e-5,4.28222 10e-5,6.42333 -0.0208,1.95886 -0.12762,3.70592 0.36327,5.60309 1.24963,1.12913 1.75849,2.91852 2.18528,4.50237 0.52859,2.27585 0.61078,4.61647 0.66348,6.94213 -0.0592,2.7368 -0.78817,5.19296 -2.3608,7.42651 -1.25292,1.48313 -1.60721,3.34323 -2.12842,5.1549 -0.56997,1.88909 -0.72639,3.85367 -0.81952,5.81336 0.0374,1.9879 -0.25785,4.02223 0.0676,5.99206 0.18248,1.97168 1.48714,3.43882 2.06106,5.26765 0.0337,0.47739 0.0673,0.95477 0.10095,1.43215 0,0 -53.04587,0.0679 -53.04587,0.0679 l 0,0 c 0.0285,0.0736 0.057,0.14719 0.0855,0.22079 -0.82072,-2.05443 -1.64038,-4.12828 -1.86714,-6.35462 -0.22106,-2.28199 -0.12716,-4.57463 -0.0756,-6.8649 0.10225,-2.34925 0.27371,-4.70524 0.85096,-6.99385 0.61831,-2.32808 1.03831,-4.74768 2.21478,-6.87835 0.94363,-1.43524 2.2748,-2.24658 2.2357,-4.14484 -0.0547,-1.79985 -0.0868,-3.64225 -0.71015,-5.35398 -0.79065,-1.72238 -2.0438,-3.24247 -2.2505,-5.19832 -0.34142,-2.19939 -0.24314,-4.41445 -0.24641,-6.63398 -2e-5,-2.14111 -6e-5,-4.28222 -9e-5,-6.42333 0,-2.14178 -7e-5,-4.28356 8.4e-4,-6.42534 10e-4,-2.14463 0.003,-4.28927 0.009,-6.4339 0.005,-2.11287 0.0179,-4.22599 -0.018,-6.33866 -0.0495,-1.7832 -0.0834,-3.5962 -0.61072,-5.31599 -0.69229,-1.91853 -1.46513,-3.80227 -1.95246,-5.79169 -0.55985,-2.35896 -0.76595,-4.72626 -0.64061,-7.15105 0.002,-2.18419 0.004,-4.36843 0.027,-6.55253 0.0297,-2.533 0.0852,-5.06555 0.11476,-7.59854 -0.004,-2.641 0.16264,-5.296461 0.51202,-7.91302 0.42341,-2.532224 0.76663,-5.038996 0.49576,-7.618062 -0.0249,-2.419301 -0.0761,-4.837313 0.02,-7.256796 0.051,-2.713157 0.18875,-5.455372 -0.21876,-8.14726 0,0 52.91646,0 52.91646,0 z"
+ id="path6084"
+ style="fill:#ebf039;fill-opacity:0.67579908;fill-rule:nonzero;stroke:#bbbb49;stroke-width:4;stroke-linecap:butt;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ <path
+ transform="translate(0,308.2677)"
+ inkscape:connector-curvature="0"
+ id="path6086"
+ d="M 603.79682,72.852278 552.40985,206.67249"
+ style="fill:#ebf039;fill-opacity:0.67579908;stroke:#bbbb49;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ transform="translate(0,308.2677)"
+ inkscape:connector-curvature="0"
+ id="path6088"
+ d="M 549.19817,70.711154 602.72625,207.74306"
+ style="fill:#ebf039;fill-opacity:0.67579908;stroke:#bbbb49;stroke-width:5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ff0024;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="302.35144"
+ y="377.06155"
+ id="text6095"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan6097"
+ x="302.35144"
+ y="377.06155"
+ style="font-size:24px;fill:#ff0024;fill-opacity:1">firewall</tspan><tspan
+ sodipodi:role="line"
+ x="302.35144"
+ y="407.06155"
+ id="tspan6099"
+ style="font-size:24px;fill:#ff0024;fill-opacity:1">iptables</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="282.31516"
+ y="342.8486"
+ id="text3193-6"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3195-3"
+ x="282.31516"
+ y="342.8486">physical host</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="104.60192"
+ y="992.0567"
+ id="text3193-6-2"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3195-3-5"
+ x="104.60192"
+ y="992.0567">physical host</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:22px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="544.60278"
+ y="998.48004"
+ id="text3193-6-2-4"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3195-3-5-4"
+ x="544.60278"
+ y="998.48004">physical host</tspan></text>
+ </g>
+</svg>
diff --git a/doc/source/index.rst b/doc/source/index.rst
new file mode 100644
index 00000000..2320e219
--- /dev/null
+++ b/doc/source/index.rst
@@ -0,0 +1,26 @@
+.. ryu documentation master file, created by
+ sphinx-quickstart on Mon Dec 5 15:38:48 2011.
+ You can adapt this file completely to your liking, but it should at least
+ contain the root `toctree` directive.
+
+**********************************
+Welcome to RYU the Network OS(NOS)
+**********************************
+
+Contents:
+
+.. toctree::
+ :maxdepth: 2
+
+ overview.rst
+ getting_started.rst
+ using_with_openstack.rst
+ how_l2_segregation_works.rst
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
+
diff --git a/doc/source/overview.rst b/doc/source/overview.rst
new file mode 100644
index 00000000..a6210d3d
--- /dev/null
+++ b/doc/source/overview.rst
@@ -0,0 +1 @@
+.. include:: ../../README.rst
diff --git a/doc/source/using_with_openstack.rst b/doc/source/using_with_openstack.rst
new file mode 100644
index 00000000..143a3042
--- /dev/null
+++ b/doc/source/using_with_openstack.rst
@@ -0,0 +1,251 @@
+.. _using_with_openstack:
+
+***************************************************************
+Using Ryu Network OS with with OpenStack as OpenFlow controller
+***************************************************************
+This section describes how to setup openstack (nova, quantum) and
+ryu-manager.
+It is assumed that kvm with libvirt is used and each host machines that run
+nova-compute/nova-network has two physical NICs.
+It would be possible to deploy it with single NIC machines as described at
+the last section.
+
+NOTE: How to use nova isn't described in this document.
+
+Overview
+========
+
+Ryu is designed/implemented with for production use in mind, so it cooperates
+very well with `OpenStack <http://www.openstack.org/>`_ .
+With nova and quantum OVS plugin,
+Ryu provides L2 segregation of Multi-tenants without any switch feature/settings
+like VLAN. So it's very easy to use/experiment/deploy this segregation as
+the below figure.
+
+ .. image:: /images/logical-view.png
+
+
+
+Physical machine setup
+----------------------
+The following figure depicts how physical hosts are connected and each daemons
+are deployed.
+
+ .. image:: /images/physical-view.png
+
+Although the nova-api, nova-scheduler, nova-network and related openstack
+daemons are installed in each own physical machines in the above picture,
+they can be installed on a physical machine which also runs nova-compute.
+Each host machine has two nics and one is connected to management LAN
+and other is connected to deployment LAN.
+
+
+How to install/setup
+====================
+If you are not familiar with installing/setting up nova/quantum/openvswitch
+from the source, please refer to OpenStack document and get back here again.
+[
+`OpenStack docs <http://docs.openstack.org/>`_ ,
+`Nova <http://www.openstack.org/projects/compute/>`_ ,
+`Quantum <http://docs.openstack.org/incubation/>`_ ,
+`OpenvSwtich and Quantum Part 1 <http://openvswitch.org/openstack/2011/07/25/openstack-quantum-and-open-vswitch-part-1/>`_ ,
+`OpenvSwtich and Quantum Part 2 <http://openvswitch.org/openstack/2011/07/25/openstack-quantum-and-open-vswitch-part-1/>`_ ,
+`OVS Quantum Plugin Documentation <http://openvswitch.org/openstack/documentation/>`_
+]
+
+* Install ryu and run ryu-manager
+ * install ryu from the source code on the hosts on which you run
+ * nova-compute,
+ * quantum-server and
+ * ryu-manager.
+
+ This is because quantum-server and ova quantum agent which runs on
+ nova-compute node needs ryu-client library to communicate ryu-manager.
+
+ Type in ryu source directory::
+
+ % python ./setup.py install
+
+ * edit /etc/ryu/ryu.conf on the host on which you run ryu-manager
+ if necessary
+
+ No configuration is needed on hosts that runs quantum and ovs quantum
+ agent.
+
+ * run ryu network os::
+
+ % ryu-manager [----flagfile /etc/ryu/ryu.conf]
+
+
+* get nova source and quantum source from github
+ * They are a bit modified from openstack master tree. They are available
+ at github for convinience
+
+ * https://github.com/osrg/nova/tree/ryu
+ * https://github.com/osrg/quantum/tree/ryu
+
+ clone them by typing the followings in an appropriate directory::
+
+ % git clone --branch ryu git://github.com/osrg/nova.git
+ % git clone --branch ryu git://github.com/osrg/quantum.git
+
+ If you prefer https, try those::
+
+ % git clone --branch ryu https://github.com/osrg/nova.git
+ % git clone --branch ryu https://github.com/osrg/quantum.git
+
+
+* Install nova and quantum as usual.
+ (And other Openstack related component if necessary. e.g. glance)
+
+ Each daemons can be installed in a single machine or in different machines.
+ Please refer to Openstack documentation for details.
+ You may want to set up multiple nova-compute nodes for interesting use case.
+
+* Setup nova daemons. (Edit nova.conf)
+ Specifically configure nova-network and nova-compute
+
+ * configure nova-network
+ * --fixed_ranges=<setup here>
+ * --network_size=<setup here>
+ * --network_manager=nova.network.quantum.manager.QuantumManage
+ * --quantum_connection_host=<quantume server ip address>
+ * --firewall_driver=nova.virt.libvirt.firewall.NopFirewallDriver
+
+ NOP firewall driver is newly introduced for demonstrating Ryu
+ capability.
+ If you want, other existing firewall driver can be specified.
+ But such specification don't have any effect in fact
+ because ryu directly controls packets to VM instance via OVS bypassing
+ netfilter/iptables.
+
+ * --linuxnet_interface_driver=nova.network.linux_net.LinuxOVSOFInterfaceDriver
+ * set up OVS on each nova-compute node
+
+ If Ubuntu is used, you can install it from packages as
+ openvswitch-datapath-dkms, openvswitch-common, openvswitch-switch
+ If you already use bridge, you may need to edit /etc/modules to load
+ openvswitch kernel module, openvswitch_mod and brcompat_mod, before
+ bridge module and reboot to unload bridge module.
+
+ And then create ovs bridge::
+
+ # ovs-vsctl add-br <bridge name: usually br-int>
+
+ And if you connect NIC to OVS bridge.::
+
+ # ovs-vsctl add-port <bridge name:br-int> <ether interface: e.g. eth<N>>
+
+ * configure each nova-compute
+ * --libvirt_type=kvm
+ * --libvirt_ovs_integration_bridge=<OVS bridge:br-int>
+ * --libvirt_vif_type=ethernet
+ * --libvirt_vif_driver=nova.virt.libvirt.vif.LibvirtOpenVswitchDriver
+
+* install quantum server and have quantum to use OVS pluging
+ * Edit [PLUGIN] section of /etc/quantum/plugins.ini
+ * provider = quantum.plugins.openvswitch.ovs_quantum_plugin.OVSQuantumPlugin
+
+ * Edit [OVS] section of
+ /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini
+
+ In addition to normal quantum OVS settings, add the followings.
+ * integration-bridge = <OVS bridge name: br-int>
+ * plugin_driver = quantum.plugins.openvswitch.ovs_quantum_plugin.OFPRyuDriver
+ * agent_driver = OVSQuantumOFPRyuAgent
+ * openflow-controller = <ryu-manager IP address>:<ryu openflow port: default 6633>
+ * openflow-rest-api = <ryu-manager IP address>:<RYU reset API port: default 8080>
+
+ * Run quantum server
+* install quantum OVS agent on each nova-compute node
+ * Edit /etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini
+ * Run ovs agent::
+
+ # ovs_quantum_agent.py -v ./etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini
+
+* Then as usual openstack nova operation, create user, project, network and
+ run instances.
+* Enjoy!
+
+
+Testing
+=======
+Yay, now you have ryu network OS set up.
+You would want to really they are L2-segregated.
+
+* create multi projects and run instances.
+* ping/traceroute between them.
+* tcpdump in the instances
+
+The routing between gateway(gw-xxx) of each tenants are disabled
+by nova.network.linux_net.LinuxOVSOFInterfaceDriver by installing iptables
+rule on nova-network host::
+
+ # iptable -t filter -A nova-network-FORWARD --in-interface gw-+ --out-interface gw-+
+
+Thus pinging/tracerouting between VMs in distinct tenants doesn't work.
+If you drop the above rule by::
+
+ # iptable -t filter -D nova-network-FORWARD --in-interface gw-+ --out-interface gw-+
+
+You will see ping/tracerout works. Please notice that the packets go through
+gw-xxx and gw-yyy, not directly.
+
+ .. image:: /images/trace-route.png
+
+
+Caveats
+=======
+* Run the following daemons in this order
+ #. Run Ryu network OS
+ #. Run quantum with OVS plugin
+ #. Run quantum OVS agent
+ #. run your guest instance
+
+ For now, ryu-manager doesn't have persistent store, so if it's rebooted,
+ all the necessary information must be told again from quantum server/agent.
+
+* nova-manage network delete doesn't work
+
+ At this moment, quantum doesn't implement network delete fully yet.
+ If you issue the command, it fails. And you need to fix nova/quantum DB
+ by hand using SQL.
+
+
+Appendix
+========
+In the above, two physical NIC deployment is described.
+Some people may want to use those settings with single NIC machine or even
+with single machine.
+It would be possible as the following pictures, but we haven't tested those
+setting. If you success it, please report it.
+
+single NIC/All-in-One setting
+-----------------------------
+If your host machines have only single NIC, it would be possible to use
+Ryu network OS with Linux bridge. However we haven't tested such setups.
+
+ .. image:: /images/compute-node.png
+
+
+All-in-One Setup
+----------------
+You can also setup in single physical host as the following picture.
+
+ .. image:: /images/minimul-setup.png
+
+You can setup the above environment quickly using DevStack.
+
+ #. Install Ubuntu 11.10 (Oneiric)
+
+ #. Download Ryu enabled DevStack from github
+ ::
+
+ % git clone --branch ryu git://github.com/osrg/devstack.git
+
+ #. Start the install
+ ::
+
+ % cd devstack; ./stack.sh
+
+ It will take a few minutes.
diff --git a/etc/ryu/ryu.conf b/etc/ryu/ryu.conf
new file mode 100644
index 00000000..604e2609
--- /dev/null
+++ b/etc/ryu/ryu.conf
@@ -0,0 +1,7 @@
+# Sample configuration file
+
+#--wsapi_host=<hostip>
+#--wsapi_port=<port:8080>
+#--ofp_listen_host=<hostip>
+#--ofp_listen_port=<port:6633>
+#--simple_isolation_allow_host=False
diff --git a/ryu/__init__.py b/ryu/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/ryu/__init__.py
diff --git a/ryu/app/__init__.py b/ryu/app/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/ryu/app/__init__.py
diff --git a/ryu/app/client.py b/ryu/app/client.py
new file mode 100644
index 00000000..1371a06e
--- /dev/null
+++ b/ryu/app/client.py
@@ -0,0 +1,74 @@
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import httplib
+import urlparse
+
+
+class OFPClientV1_0(object):
+ version = 'v1.0'
+
+ # /{network_id}/{dpid}_{port}
+ network_path = '%s'
+ port_path = '%s/%s_%s'
+
+ def __init__(self, address):
+ r = urlparse.SplitResult('', address, '', '', '')
+ self.host = r.hostname
+ self.port = r.port
+ self.url_prefix = '/' + self.version + '/'
+
+ def _do_request(self, method, action):
+ conn = httplib.HTTPConnection(self.host, self.port)
+ url = self.url_prefix + action
+ conn.request(method, url)
+ res = conn.getresponse()
+ if res.status in (httplib.OK,
+ httplib.CREATED,
+ httplib.ACCEPTED,
+ httplib.NO_CONTENT):
+ return res
+
+ raise httplib.HTTPException('code %d reason %s' %
+ (res.status, res.reason))
+
+ def get_networks(self):
+ res = self._do_request('GET', '')
+ return res.read()
+
+ def create_network(self, network_id):
+ self._do_request('POST', self.network_path % network_id)
+
+ def update_network(self, network_id):
+ self._do_request('PUT', self.network_path % network_id)
+
+ def delete_network(self, network_id):
+ self._do_request('DELETE', self.network_path % network_id)
+
+ def get_ports(self, network_id):
+ res = self._do_request('GET', self.network_path % network_id)
+ return res.read()
+
+ def create_port(self, network_id, dpid, port):
+ self._do_request('POST', self.port_path % (network_id, dpid, port))
+
+ def update_port(self, network_id, dpid, port):
+ self._do_request('PUT', self.port_path % (network_id, dpid, port))
+
+ def delete_port(self, network_id, dpid, port):
+ self._do_request('DELETE', self.port_path % (network_id, dpid, port))
+
+
+OFPClient = OFPClientV1_0
diff --git a/ryu/app/rest.py b/ryu/app/rest.py
new file mode 100644
index 00000000..2d9a81b3
--- /dev/null
+++ b/ryu/app/rest.py
@@ -0,0 +1,210 @@
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import json
+from ryu.exception import NetworkNotFound, NetworkAlreadyExist
+from ryu.exception import PortNotFound, PortAlreadyExist
+from ryu.app.wsapi import *
+
+# REST API
+
+# get the list of networks
+# GET /v1.0/
+#
+# register a new network.
+# Fail if the network is already registered.
+# POST /v1.0/{network-id}
+#
+# update a new network.
+# Success as nop even if the network is already registered.
+#
+# PUT /v1.0/{network-id}
+#
+# remove a network
+# DELETE /v1.0/{network-id}
+#
+# get the list of sets of dpid and port
+# GET /v1.0/{network-id}/
+#
+# register a new set of dpid and port
+# Fail if the port is already registered.
+# POST /v1.0/{network-id}/{dpid}_{port-id}
+#
+# update a new set of dpid and port
+# Success as nop even if same port already registered
+# PUT /v1.0/{network-id}/{dpid}_{port-id}
+#
+# remove a set of dpid and port
+# DELETE /v1.0/{network-id}/{dpid}_{port-id}
+
+# We store networks and ports like the following:
+#
+# {network_id: [(dpid, port), ...
+# {3: [(3,4), (4,7)], 5: [(3,6)], 1: [(5,6), (4,5), (4, 10)]}
+#
+
+
+class WSPathNetwork(WSPathComponent):
+ """ Match a network id string """
+
+ def __str__(self):
+ return "{network-id}"
+
+ def extract(self, pc, data):
+ if pc == None:
+ return WSPathExtractResult(error="End of requested URI")
+
+ return WSPathExtractResult(value=pc)
+
+
+class WSPathPort(WSPathComponent):
+ """ Match a {dpid}_{port-id} string """
+
+ def __str__(self):
+ return "{dpid}_{port-id}"
+
+ def extract(self, pc, data):
+ if pc == None:
+ return WSPathExtractResult(error="End of requested URI")
+
+ try:
+ dpid_str, port_str = pc.split('_')
+ dpid = int(dpid_str, 16)
+ port = int(port_str)
+ except ValueError:
+ return WSPathExtractResult(error="Invalid format: %s" % pc)
+
+ return WSPathExtractResult(value={'dpid': dpid, 'port': port})
+
+
+class restapi:
+
+ def __init__(self, *args, **kwargs):
+ self.ws = wsapi()
+ self.api = self.ws.get_version("1.0")
+ self.nw = kwargs['network']
+ self.register()
+
+ def list_networks_handler(self, request, data):
+ request.setHeader("Content-Type", 'application/json')
+ return json.dumps(self.nw.list_networks())
+
+ def create_network_handler(self, request, data):
+ network_id = data['{network-id}']
+
+ try:
+ self.nw.create_network(network_id)
+ except NetworkAlreadyExist:
+ request.setResponseCode(409)
+
+ return ""
+
+ def update_network_handler(self, request, data):
+ network_id = data['{network-id}']
+ self.nw.update_network(network_id)
+ return ""
+
+ def remove_network_handler(self, request, data):
+ network_id = data['{network-id}']
+
+ try:
+ self.nw.remove_network(network_id)
+ except NetworkNotFound:
+ request.setResponseCode(404)
+
+ return ""
+
+ def list_ports_handler(self, request, data):
+ network_id = data['{network-id}']
+
+ try:
+ body = json.dumps(self.nw.list_ports(network_id))
+ except NetworkNotFound:
+ body = ""
+ request.setResponseCode(404)
+
+ request.setHeader("Content-Type", 'application/json')
+ return body
+
+ def create_port_handler(self, request, data):
+ network_id = data['{network-id}']
+ dpid = data['{dpid}_{port-id}']['dpid']
+ port = data['{dpid}_{port-id}']['port']
+
+ try:
+ self.nw.create_port(network_id, dpid, port)
+ except NetworkNotFound:
+ request.setResponseCode(404)
+ except PortAlreadyExist:
+ request.setResponseCode(409)
+
+ return ""
+
+ def update_port_handler(self, request, data):
+ network_id = data['{network-id}']
+ dpid = data['{dpid}_{port-id}']['dpid']
+ port = data['{dpid}_{port-id}']['port']
+
+ try:
+ self.nw.update_port(network_id, dpid, port)
+ except NetworkNotFound:
+ request.setResponseCode(404)
+
+ return ""
+
+ def remove_port_handler(self, request, data):
+ network_id = data['{network-id}']
+ dpid = data['{dpid}_{port-id}']['dpid']
+ port = data['{dpid}_{port-id}']['port']
+
+ try:
+ self.nw.remove_port(network_id, dpid, port)
+ except (NetworkNotFound, PortNotFound):
+ request.setResponseCode(404)
+
+ return ""
+
+ def register(self):
+ self.api.register_request(self.list_networks_handler, "GET",
+ [],
+ "get the list of networks")
+
+ self.api.register_request(self.create_network_handler, "POST",
+ [WSPathNetwork()],
+ "register a new network")
+
+ self.api.register_request(self.update_network_handler, "PUT",
+ [WSPathNetwork()],
+ "update a network")
+
+ self.api.register_request(self.remove_network_handler, "DELETE",
+ [WSPathNetwork()],
+ "remove a network")
+
+ self.api.register_request(self.list_ports_handler, "GET",
+ [WSPathNetwork()],
+ "get the list of sets of dpid and port")
+
+ self.api.register_request(self.create_port_handler, "POST",
+ [WSPathNetwork(), WSPathPort()],
+ "register a new set of dpid and port")
+
+ self.api.register_request(self.update_port_handler, "PUT",
+ [WSPathNetwork(), WSPathPort()],
+ "update a set of dpid and port")
+
+ self.api.register_request(self.remove_port_handler, "DELETE",
+ (WSPathNetwork(), WSPathPort()),
+ "remove a set of dpid and port")
diff --git a/ryu/app/rest_nw_id.py b/ryu/app/rest_nw_id.py
new file mode 100644
index 00000000..5422c81d
--- /dev/null
+++ b/ryu/app/rest_nw_id.py
@@ -0,0 +1,21 @@
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+NW_ID_EXTERNAL = '__NW_ID_EXTERNAL__'
+NW_ID_UNKNOWN = '__NW_ID_UNKNOWN__'
+
+# PORT_TYPE_VM = 'guestvm'
+# PORT_TYPE_GW = 'gateway'
+# PORT_TYPE_EXTERNAL = 'external'
diff --git a/ryu/app/simple_isolation.py b/ryu/app/simple_isolation.py
new file mode 100644
index 00000000..43e945c1
--- /dev/null
+++ b/ryu/app/simple_isolation.py
@@ -0,0 +1,242 @@
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import logging
+import struct
+
+from ryu.app.rest_nw_id import NW_ID_UNKNOWN, NW_ID_EXTERNAL
+from ryu.exception import MacAddressDuplicated
+from ryu.exception import PortUnknown
+from ryu.controller import event
+from ryu.controller import mac_to_network
+from ryu.controller import mac_to_port
+from ryu.controller.handler import main_dispatcher
+from ryu.controller.handler import config_dispatcher
+from ryu.controller.handler import set_ev_cls
+from ryu.lib.mac import haddr_to_str
+
+LOG = logging.getLogger('ryu.app.simple_isolation')
+
+
+class SimpleIsolation(object):
+ def __init__(self, *args, **kwargs):
+ self.nw = kwargs['network']
+ self.mac2port = mac_to_port.MacToPortTable()
+ self.mac2net = mac_to_network.MacToNetwork(self.nw)
+
+ @set_ev_cls(event.EventOFPSwitchFeatures, config_dispatcher)
+ def switch_features_handler(self, ev):
+ self.mac2port.dpid_add(ev.msg.datapath_id)
+ self.nw.add_datapath(ev.msg)
+
+ @set_ev_cls(event.EventOFPBarrierReply)
+ def barrier_reply_handler(ev):
+ LOG.debug('barrier reply ev %s msg %s', ev, ev.msg)
+
+ def _modflow_and_send_packet(self, msg, src, dst, actions):
+ datapath = msg.datapath
+
+ #
+ # install flow and then send packet
+ #
+ wildcards = datapath.ofproto.OFPFW_ALL
+ wildcards &= ~(datapath.ofproto.OFPFW_IN_PORT |
+ datapath.ofproto.OFPFW_DL_SRC |
+ datapath.ofproto.OFPFW_DL_DST)
+ match = datapath.ofproto_parser.OFPMatch(wildcards,
+ msg.in_port, src, dst,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0)
+
+ datapath.send_flow_mod(
+ match=match, cookie=0, command=datapath.ofproto.OFPFC_ADD,
+ idle_timeout=0, hard_timeout=0, priority=32768,
+ buffer_id=0xffffffff, out_port=datapath.ofproto.OFPP_NONE,
+ flags=datapath.ofproto.OFPFF_SEND_FLOW_REM, actions=actions)
+
+ datapath.send_packet_out(msg.buffer_id, msg.in_port, actions)
+
+ def _forward_to_nw_id(self, msg, src, dst, nw_id, out_port):
+ assert out_port is not None
+ datapath = msg.datapath
+
+ if not self.nw.same_network(datapath.id, nw_id, out_port,
+ NW_ID_EXTERNAL):
+ LOG.debug('packet is blocked src %s dst %s '
+ 'from %d to %d on datapath %d',
+ haddr_to_str(src), haddr_to_str(dst),
+ msg.in_port, out_port, datapath.id)
+ return
+
+ LOG.debug("learned dpid %s in_port %d out_port %d src %s dst %s",
+ datapath.id, msg.in_port, out_port,
+ haddr_to_str(src), haddr_to_str(dst))
+ actions = [datapath.ofproto_parser.OFPActionOutput(out_port)]
+ self._modflow_and_send_packet(msg, src, dst, actions)
+
+ def _flood_to_nw_id(self, msg, src, dst, nw_id):
+ datapath = msg.datapath
+ actions = []
+ LOG.debug("dpid %s in_port %d src %s dst %s ports %s",
+ datapath.id, msg.in_port,
+ haddr_to_str(src), haddr_to_str(dst),
+ self.nw.dpids.get(datapath.id, {}).items())
+ for port_no in self.nw.filter_ports(datapath.id, msg.in_port,
+ nw_id, NW_ID_EXTERNAL):
+ LOG.debug("port_no %s", port_no)
+ actions.append(datapath.ofproto_parser.OFPActionOutput(port_no))
+ self._modflow_and_send_packet(msg, src, dst, actions)
+
+ def _learned_mac_or_flood_to_nw_id(self, msg, src, dst,
+ dst_nw_id, out_port):
+ if out_port is not None:
+ self._forward_to_nw_id(msg, src, dst, dst_nw_id, out_port)
+ else:
+ self._flood_to_nw_id(msg, src, dst, dst_nw_id)
+
+ @set_ev_cls(event.EventOFPPacketIn, main_dispatcher)
+ def packet_in_handler(self, ev):
+ # LOG.debug('packet in ev %s msg %s', ev, ev.msg)
+ msg = ev.msg
+ datapath = msg.datapath
+
+ dst, src, eth_type = struct.unpack_from('!6s6sH', buffer(msg.data), 0)
+
+ try:
+ port_nw_id = self.nw.get_network(datapath.id, msg.in_port)
+ except PortUnknown:
+ port_nw_id = NW_ID_UNKNOWN
+
+ if port_nw_id != NW_ID_UNKNOWN:
+ # Here it is assumed that the
+ # (port <-> network id)/(mac <-> network id) relationship
+ # is stable once the port is created. The port will be destroyed
+ # before assigning new network id to the given port.
+ # This is correct nova-network/nova-compute.
+ try:
+ # allow external -> known nw id change
+ self.mac2net.add_mac(src, port_nw_id, NW_ID_EXTERNAL)
+ except MacAddressDuplicated:
+ LOG.warn('mac address %s is already in use.'
+ ' So (dpid %s, port %s) can not use it',
+ haddr_to_str(src), datapath.id, msg.in_port)
+ #
+ # should we install drop action pro-actively for future?
+ #
+ return
+
+ old_port = self.mac2port.port_add(datapath.id, msg.in_port, src)
+ if old_port is not None and old_port != msg.in_port:
+ # We really overwrite already learned mac address.
+ # So discard already installed stale flow entry which conflicts
+ # new port.
+ wildcards = datapath.ofproto.OFPFW_ALL
+ wildcards &= ~datapath.ofproto.OFPFW_DL_DST
+ match = datapath.ofproto_parser.OFPMatch(wildcards,
+ 0, 0, src,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0)
+
+ datapath.send_flow_mod(match=match, cookie=0,
+ command=datapath.ofproto.OFPFC_DELETE, idle_timeout=0,
+ hard_timeout=0, priority=32768, out_port=old_port)
+
+ # to make sure the old flow entries are purged.
+ datapath.send_barrier()
+
+ src_nw_id = self.mac2net.get_network(src, NW_ID_UNKNOWN)
+ dst_nw_id = self.mac2net.get_network(dst, NW_ID_UNKNOWN)
+
+ # we handle multicast packet as same as broadcast
+ first_oct = struct.unpack_from('B', dst)[0]
+ broadcast = (dst == '\xff' * 6) or (first_oct & 0x01)
+ out_port = self.mac2port.port_get(datapath.id, dst)
+
+ #
+ # there are several combinations:
+ # in_port: known nw_id, external, unknown nw,
+ # src mac: known nw_id, external, unknown nw,
+ # dst mac: known nw_id, external, unknown nw, and broadcast/multicast
+ # where known nw_id: is quantum network id
+ # external: means that these ports are connected to outside
+ # unknown nw: means that we don't know this port is bounded to
+ # specific nw_id or external
+ # broadcast: the destination mac address is broadcast address
+ # (or multicast address)
+ #
+ # Can the following logic be refined/shortened?
+ #
+
+ if port_nw_id != NW_ID_EXTERNAL and port_nw_id != NW_ID_UNKNOWN:
+ if broadcast:
+ # flood to all ports of external or src_nw_id
+ self._flood_to_nw_id(msg, src, dst, src_nw_id)
+ elif src_nw_id != NW_ID_EXTERNAL and src_nw_id != NW_ID_UNKNOWN:
+ # try learned mac check if the port is net_id
+ # or
+ # flood to all ports of external or src_nw_id
+ self._learned_mac_or_flood_to_nw_id(msg, src, dst,
+ src_nw_id, out_port)
+ else:
+ # NW_ID_EXTERNAL or NW_ID_UNKNOWN
+ # drop packets
+ return
+
+ elif port_nw_id == NW_ID_EXTERNAL:
+ if src_nw_id != NW_ID_EXTERNAL and src_nw_id != NW_ID_UNKNOWN:
+ if broadcast:
+ # flood to all ports of external or src_nw_id
+ self._flood_to_nw_id(msg, src, dst, src_nw_id)
+ elif (dst_nw_id != NW_ID_EXTERNAL and
+ dst_nw_id != NW_ID_UNKNOWN):
+ if src_nw_id == dst_nw_id:
+ # try learned mac
+ # check if the port is external or same net_id
+ # or
+ # flood to all ports of external or src_nw_id
+ self._learned_mac_or_flood_to_nw_id(msg, src, dst,
+ src_nw_id,
+ out_port)
+ else:
+ # should not occur?
+ LOG.debug("should this case happen?")
+ elif dst_nw_id == NW_ID_EXTERNAL:
+ # try learned mac
+ # or
+ # flood to all ports of external or src_nw_id
+ self._learned_mac_or_flood_to_nw_id(msg, src, dst,
+ src_nw_id, out_port)
+ else:
+ assert dst_nw_id == NW_ID_UNKNOWN
+
+ elif src_nw_id == NW_ID_EXTERNAL:
+ # drop packet
+ pass
+ else:
+ # should not occur?
+ # drop packets
+ assert src_nw_id == NW_ID_UNKNOWN
+ else:
+ # drop packets?
+ assert port_nw_id == NW_ID_UNKNOWN
+
+ @set_ev_cls(event.EventOFPPortStatus, main_dispatcher)
+ def port_status_handler(self, ev):
+ msg = ev.msg
+ datapath = msg.datapath
+ datapath.send_delete_all_flows()
+ datapath.send_barrier()
+
+ @set_ev_cls(event.EventOFPBarrierReply, main_dispatcher)
+ def barrier_replay_handler(self, ev):
+ pass
diff --git a/ryu/app/simple_switch.py b/ryu/app/simple_switch.py
new file mode 100644
index 00000000..1a3084ae
--- /dev/null
+++ b/ryu/app/simple_switch.py
@@ -0,0 +1,93 @@
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import logging
+import struct
+
+from ryu.controller import event
+from ryu.controller import mac_to_port
+from ryu.controller.handler import main_dispatcher
+from ryu.controller.handler import set_ev_cls
+from ryu.lib.mac import haddr_to_str
+from ryu.lib.mac import haddr_to_bin
+
+
+LOG = logging.getLogger('ryu.app.simple_switch')
+
+# TODO: we should split the handler into two parts, protocol
+# independent and dependant parts.
+
+# TODO: can we use dpkt python library?
+
+# TODO: we need to move the followings to something like db
+
+
+class SimpleSwitch(object):
+ def __init__(self, *args, **kwargs):
+ self.mac2port = mac_to_port.MacToPortTable()
+
+ @set_ev_cls(event.EventOFPPacketIn, main_dispatcher)
+ def packetInHandler(self, ev):
+ msg = ev.msg
+ datapath = msg.datapath
+ ofproto = datapath.ofproto
+
+ dst, src, eth_type = struct.unpack_from('!6s6sH', buffer(msg.data), 0)
+
+ dpid = datapath.id
+ self.mac2port.dpid_add(dpid)
+ LOG.info("packet in %s %s %s %s",
+ dpid, haddr_to_str(src), haddr_to_str(dst), msg.in_port)
+
+ self.mac2port.port_add(dpid, msg.in_port, src)
+ out_port = self.mac2port.port_get(dpid, dst)
+
+ if out_port == None:
+ LOG.info("out_port not found")
+ out_port = ofproto.OFPP_FLOOD
+
+ actions = [datapath.ofproto_parser.OFPActionOutput(out_port)]
+
+ if out_port != ofproto.OFPP_FLOOD:
+ wildcards = ofproto.OFPFW_ALL
+ wildcards &= ~(ofproto.OFPFW_IN_PORT |
+ ofproto.OFPFW_DL_DST |
+ ofproto.OFPFW_NW_TOS)
+ match = datapath.ofproto_parser.OFPMatch(
+ wildcards, msg.in_port,
+ haddr_to_bin('00:00:00:00:00:00'), dst,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0)
+
+ datapath.send_flow_mod(
+ match=match, cookie=0, command=ofproto.OFPFC_ADD,
+ idle_timeout=0, hard_timeout=0, priority=32768,
+ flags=ofproto.OFPFF_SEND_FLOW_REM, actions=actions)
+
+ datapath.send_packet_out(msg.buffer_id, msg.in_port, actions)
+
+ @set_ev_cls(event.EventOFPPortStatus, main_dispatcher)
+ def portStatusHandler(self, ev):
+ msg = ev.msg
+ reason = msg.reason
+ port_no = msg.port_no
+
+ ofproto = msg.datapath.ofproto
+ if reason == ofproto.OFPPR_ADD:
+ LOG.info("port added %s", port_no)
+ elif reason == ofproto.OFPPR_DELETE:
+ LOG.info("port deleted %s", port_no)
+ elif reason == ofproto.OFPPR_MODIFY:
+ LOG.info("port modified %s", port_no)
+ else:
+ LOG.info("Illeagal port state %s %s", port_no, reason)
diff --git a/ryu/app/wsapi.py b/ryu/app/wsapi.py
new file mode 100644
index 00000000..6205565a
--- /dev/null
+++ b/ryu/app/wsapi.py
@@ -0,0 +1,578 @@
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# This code is based on webservice.py from NOX project:
+# Copyright 2008 (C) Nicira, Inc.
+
+import gflags
+import logging
+import re
+import textwrap
+import simplejson
+from copy import copy
+from gevent.pywsgi import WSGIServer
+from webob import Request, Response
+
+LOG = logging.getLogger('ryu.app.wsapi')
+
+FLAGS = gflags.FLAGS
+gflags.DEFINE_string('wsapi_host', '', 'webapp listen host')
+gflags.DEFINE_integer('wsapi_port', 8080, 'webapp listen port')
+
+### Response functions:
+#
+# The following functions can be used to generate various error responses.
+# These should only ever be used for the web-services interface, not the
+# user-facing web interface.
+
+
+def forbidden(request, errmsg, otherInfo={}):
+ """Return an error code indicating client is forbidden from accessing."""
+ request.setResponseCode(403)
+ request.setHeader("Content-Type", "application/json")
+ d = copy(otherInfo)
+ d["displayError"] = errmsg
+ return simplejson.dumps(d)
+
+
+def badRequest(request, errmsg, otherInfo={}):
+ """Return an error indicating a problem in data from the client."""
+ request.setResponseCode(400, "Bad request")
+ request.setHeader("Content-Type", "application/json")
+ d = copy(otherInfo)
+ d["displayError"] = "The server did not understand the request."
+ d["error"] = errmsg
+ return simplejson.dumps(d)
+
+
+def conflictError(request, errmsg, otherURI=None, otherInfo={}):
+ """Return an error indicating something conflicts with the request."""
+ if otherURI != None:
+ request.setResponseCode(409, "Conflicts with another resource")
+ request.setHeader("Location", otherURI.encode("utf-8"))
+ else:
+ request.setResponseCode(409, "Internal server conflict")
+ request.setHeader("Content-Type", "application/json")
+ d = copy(otherInfo)
+ d["displayError"] = "Request failed due to simultaneous access."
+ d["error"] = errmsg
+ d["otherURI"] = otherURI
+ return simplejson.dumps(d)
+
+
+def internalError(request, errmsg, otherInfo={}):
+ """Return an error code indicating an error in the server."""
+ request.setResponseCode(500)
+ request.setHeader("Content-Type", "application/json")
+ d = copy(otherInfo)
+ d["displayError"] = \
+ "The server failed while attempting to perform request."
+ d["error"] = errmsg
+ return simplejson.dumps(d)
+
+
+def notFound(request, errmsg, otherInfo={}):
+ """Return an error indicating a resource could not be found."""
+ request.setResponseCode(404, "Resource not found")
+ request.setHeader("Content-Type", "application/json")
+ d = copy(otherInfo)
+ d["displayError"] = "The server does not have data for the request."
+ d["error"] = errmsg
+ return simplejson.dumps(d)
+
+
+def methodNotAllowed(request, errmsg, valid_methods, otherInfo={}):
+ """Return an error indicating this request method is not allowed."""
+ request.setResponseCode(405, "Method not allowed")
+ method_txt = ", ".join(valid_methods)
+ request.setHeader("Allow", method_txt)
+ request.setHeader("Content-Type", "application/json")
+ d = copy(otherInfo)
+ d["displayError"] = "The server can not perform this operation."
+ d["error"] = errmsg
+ d["validMethods"] = valid_methods
+ return simplejson.dumps(d)
+
+
+def unauthorized(request, errmsg="", otherInfo={}):
+ """Return an error indicating a client was not authorized."""
+ request.setResponseCode(401, "Unauthorized")
+ request.setHeader("Content-Type", "application/json")
+ if errmsg != "":
+ errmsg = ": " + errmsg
+ d = copy(otherInfo)
+ d["displayError"] = "Unauthorized%s\n\n" % (errmsg, )
+ d["error"] = errmsg
+ d["loginInstructions"] = \
+ "You must login using 'POST /ws.v1/login' nd pass the resulting " + \
+ "cookie with\neach equest."
+ return simplejson.dumps(d)
+
+
+### Message Body handling
+#
+def json_parse_message_body(request):
+ content = request.content.read()
+ content_type = request.getHeader("content-type")
+ if content_type == None or content_type.find("application/json") == -1:
+ e = ["The message body must have Content-Type application/json\n",
+ "instead of %s. " % content_type]
+ if content_type == "application/x-www-form-urlencoded":
+ e.append("The web\nserver decoded the message body as:\n\n")
+ e.append(str(request.args))
+ else:
+ e.append("The message body was:\n\n")
+ e.append(content)
+ LOG.error("".join(e))
+ return None
+ if len(content) == 0:
+ LOG.error("Message body was empty. "
+ "It should be valid JSON encoded data for this request.")
+ return None
+ try:
+ data = simplejson.loads(content)
+ except:
+ LOG.error("Message body is not valid json data. "
+ "It was:\n\n%s" % (content,))
+ return None
+ return data
+
+
+class WhitespaceNormalizer:
+ def __init__(self):
+ self._re = re.compile("\s+")
+
+ def normalize_whitespace(self, s):
+ return self._re.sub(" ", s).strip()
+
+
+class WSPathTreeNode:
+ _wsn = WhitespaceNormalizer()
+
+ def __init__(self, parent, path_component):
+ self.path_component = path_component
+ self._handlers = {}
+ self._parent = parent
+ self._children = []
+ self._tw = textwrap.TextWrapper()
+ self._tw.width = 78
+ self._tw.initial_indent = " " * 4
+ self._tw.subsequent_indent = self._tw.initial_indent
+
+ def parent(self):
+ return self._parent()
+
+ def _matching_child(self, path_component):
+ for c in self._children:
+ if str(c.path_component) == str(path_component):
+ return c
+ return None
+
+ def has_child(self, path_component):
+ return self._matching_child(path_component) != None
+
+ def add_child(self, path_component):
+ c = self._matching_child(path_component)
+ if c == None:
+ c = WSPathTreeNode(self, path_component)
+ self._children.append(c)
+ return c
+
+ def path_str(self):
+ if self._parent == None:
+ return ""
+ return self._parent.path_str() + "/" + str(self.path_component)
+
+ def set_handler(self, request_method, handler, doc):
+ if request_method in self._handlers:
+ raise KeyError("%s %s is already handled by '%s'" %
+ (request_method, self.path_str(),
+ repr(self._handlers[request_method][0])))
+ d = self._wsn.normalize_whitespace(doc)
+ d = self._tw.fill(d)
+ self._handlers[request_method] = (handler, d)
+
+ def interface_doc(self, base_path):
+ msg = []
+ p = base_path + self.path_str()
+ for k in self._handlers:
+ msg.extend((k, " ", p, "\n"))
+ doc = self._handlers[k][1]
+ if doc != None:
+ msg.extend((doc, "\n\n"))
+ for c in self._children:
+ msg.append(c.interface_doc(base_path))
+ return "".join(msg)
+
+ def handle(self, t):
+ s = t.next_path_string()
+ if s != None:
+ r = None
+ if len(self._children) == 0:
+ t.request_uri_too_long()
+ for c in self._children:
+ r = c.path_component.extract(s, t.data)
+ if r.error == None:
+ t.data[str(c.path_component)] = r.value
+ t.failed_paths = []
+ r = c.handle(t)
+ break
+ else:
+ t.failed_paths.append((c.path_str(), r.error))
+ if len(t.failed_paths) > 0:
+ return t.invalid_request()
+ return r
+ else:
+ try:
+ h, d = self._handlers[t.request_method()]
+ except KeyError:
+ return t.unsupported_method(self._handlers.keys())
+ return t.call_handler(h)
+
+
+class WSPathTraversal:
+
+ def __init__(self, request):
+ self._request = request
+ self._pathiter = iter(request.postpath)
+ self.data = {}
+ self.failed_paths = []
+
+ def request_method(self):
+ return self._request.method
+
+ def next_path_string(self):
+ try:
+ return self._pathiter.next()
+ except StopIteration:
+ return None
+
+ def call_handler(self, handler):
+ try:
+ return handler(self._request, self.data)
+ except Exception, e:
+ LOG.error("caught unhandled exception with path '%s' : %s" % \
+ (str(self._request.postpath), e))
+ internalError(self._request, "Unhandled server error")
+
+ def _error_wrapper(self, l):
+ msg = []
+ msg.append("You submitted the following request.\n\n")
+ msg.append(" %s %s\n\n" %
+ (self._request.method, self._request.path))
+ msg.append("This request is not valid. ")
+ msg.extend(l)
+ msg.append("\n\nYou can get a list of all valid requests with the ")
+ msg.append("following request.\n\n ")
+ msg.append("GET /" + "/".join(self._request.prepath) + "/doc")
+ return "".join(msg)
+
+ def request_uri_too_long(self):
+ e = ["The request URI path extended beyond all available URIs."]
+ return notFound(self._request, self._error_wrapper(e))
+
+ def unsupported_method(self, valid_methods):
+ if len(valid_methods) > 0:
+ e = ["This URI only supports the following methods.\n\n "]
+ e.append(", ".join(valid_methods))
+ else:
+ e = ["There are no supported request methods\non this URI. "]
+ e.append("It is only used as part of longer URI paths.")
+ return methodNotAllowed(self._request, self._error_wrapper(e),
+ valid_methods)
+
+ def invalid_request(self):
+ e = []
+ if len(self.failed_paths) > 0:
+ e.append("The following paths were evaluated and failed\n")
+ e.append("for the indicated reason.")
+ for p, m in self.failed_paths:
+ e.append("\n\n - %s\n %s" % (p, m))
+ return notFound(self._request, self._error_wrapper(e))
+
+
+### Registering for requests
+#
+class WSRequestHandler:
+ """Class to determine appropriate handler for a web services request."""
+
+ def __init__(self):
+ self._path_tree = WSPathTreeNode(None, None)
+
+ def register(self, handler, request_method, path_components, doc=None):
+ """Register a web services request handler.
+
+ The parameters are:
+
+ - handler: a function to be called when the specified request
+ method and path component list are matched. It must
+ have the signature:
+
+ handler(request, extracted_data)
+
+ Here the 'request' parameter is a twisted request object
+ to be used to output the result and extracted_data is a
+ dictionary of data extracted by the WSPath subclass
+ instances in the 'path_components' parameter indexed
+ by str(path_component_instance).
+
+ - request_method: the HTTP request method of the request to
+ be handled.
+
+ - path_components: a list of 'WSPathComponent' subclasses
+ describing the path to be handled.
+
+ - doc: a string describing the result of this request."""
+ pn = self._path_tree
+ for pc in path_components:
+ pn = pn.add_child(pc)
+ pn.set_handler(request_method.upper(), handler, doc)
+
+ def handle(self, request):
+ return self._path_tree.handle(WSPathTraversal(request))
+
+ def interface_doc(self, base_path):
+ """Text describing all current valid requests."""
+ d = """\
+This is a RESTful web interface to NOX network applications. The applications
+running on this NOX instance support the following requests.\n\n"""
+
+ return d + self._path_tree.interface_doc(base_path)
+
+
+class WSPathExtractResult:
+ def __init__(self, value=None, error=None):
+ self.value = value
+ self.error = error
+
+
+class WSPathComponent:
+ """Base class for WS path component extractors"""
+
+ def __init__(self):
+ """Initialize a path component extractor
+
+ Currently this does nothing but that may change in the future.
+ Subclasses should call this to be sure."""
+ pass
+
+ def __str__(self):
+ """Get the string representation of the path component
+
+ This is used in generating information about the available paths
+ and conform to the following conventions:
+
+ - If a fixed string is being matched, it should be that string.
+ - In all other cases, it should be a description of what is
+ being extracted within angle brackets, for example,
+ '<existing database table name>'.
+
+ This string is also the key in the dictionary callbacks registered
+ with a WSPathParser instance receive to obtain the extracted
+ information."""
+ err = "The '__str__' method must be implemented by subclasses."
+ raise NotImplementedError(err)
+
+ def extract(self, pc, extracted_data):
+ """Determine if 'pc' matches this path component type
+
+ Returns a WSPathExtractResult object with value set to the
+ extracted value for this path component if the extraction succeeded
+ or error set to an error describing why it did not succeed.
+
+ The 'pc' parameter may have the value 'None' if all path components
+ have been exhausted during previous WS path parsing. This is
+ to allow path component types that are optional at the end
+ of a WS.
+
+ The extracted_data parameter contains data extracted
+ from earlier path components, which can be used during the
+ extraction if needed. It is a dictionary keyed by the
+ str(path_component) for each previous path component."""
+ err = "The 'extract' method must be implemented by subclasses."
+ raise NotImplementedError(err)
+
+
+class WSPathStaticString(WSPathComponent):
+ """Match a static string in the WS path, possibly case insensitive."""
+
+ def __init__(self, str, case_insensitive=False):
+ WSPathComponent.__init__(self)
+ self.case_insensitive = case_insensitive
+ if case_insensitive:
+ self.str = str.lower()
+ else:
+ self.str = str
+
+ def __str__(self):
+ return self.str
+
+ def extract(self, pc, data):
+ if pc == None:
+ return WSPathExtractResult(error="End of requested URI")
+
+ if self.case_insensitive:
+ if pc.lower() == self.str:
+ return WSPathExtractResult(value=pc)
+ else:
+ if pc == self.str:
+ return WSPathExtractResult(value=pc)
+ return WSPathExtractResult(error="'%s' != '%s'" % (pc, self.str))
+
+
+class WSPathRegex(WSPathComponent):
+ """Match a regex in the WS path.
+
+ This can not be used directly but must be subclassed. Typically
+ the only thing a subclass must override is the '__str__'
+ method.
+
+ The value returned from the 'extract' method is the python regular
+ expression match object, from subgroups in the expression can be
+ examined, etc."""
+ def __init__(self, regexp):
+ WSPathComponent.__init__(self)
+ self.re = re.compile(regexp)
+
+ def extract(self, pc, data):
+ if pc == None:
+ return WSPathExtractResult(error="End of requested URI")
+ m = re.match(pc)
+ if m == None:
+ return WSPathExtractResult(error="Regexp did not match: %s" %
+ self.re.pattern)
+ return WSPathExtractResult(value=m)
+
+
+class WSPathTrailingSlash(WSPathComponent):
+ """Match a null string at a location in the WS path.
+
+ This is typically used at the end of a WS path to require a
+ trailing slash."""
+
+ def __init__(self):
+ WSPathComponent.__init__(self)
+
+ def __str__(self):
+ return "/"
+
+ def extract(self, pc, data):
+ if pc == "":
+ return WSPathExtractResult(True)
+ else:
+ return WSPathExtractResult(
+ error="Data following expected trailing slash")
+
+
+# match any string, and retrieve it by 'name'
+# (e.g., WSPathArbitraryString('<hostname>')
+class WSPathArbitraryString(WSPathComponent):
+ def __init__(self, name):
+ WSPathComponent.__init__(self)
+ self._name = name
+
+ def __str__(self):
+ return self._name
+
+ def extract(self, pc, data):
+ if pc == None:
+ return WSPathExtractResult(error="End of requested URI")
+ return WSPathExtractResult(unicode(pc, 'utf-8'))
+
+
+class WSRequest:
+
+ def __init__(self, env, start_response):
+ self.env = env
+ self.start_response = start_response
+ self.version = None
+
+ req = Request(env)
+ self.method = req.method
+ self.path = req.path
+ self.segs = [s for s in self.path.split('/') if s]
+
+ self.rsp = Response(status=200)
+
+ try:
+ version_str = self.segs[0]
+ except IndexError:
+ return
+
+ p = re.compile('^v(?P<ver>.+)$')
+ m = p.match(version_str)
+ if m:
+ self.version = m.group('ver')
+
+ self.prepath = [version_str]
+ self.postpath = self.segs[1:]
+
+ def setHeader(self, name, value):
+ self.rsp.headers[name] = value
+
+ def setResponseCode(self, code, message=None):
+ if not isinstance(code, (int, long)):
+ raise TypeError("HTTP response code must be int or long")
+ if message:
+ self.rsp.status = str(code) + " " + message
+ else:
+ self.rsp.status = code
+
+ def sendResponse(self, body):
+ self.rsp.body = body
+ return self.rsp(self.env, self.start_response)
+
+
+class WSRes:
+
+ def _get_interface_doc(self, request, arg):
+ request.setHeader("Content-Type", "text/plain")
+ return self.mgr.interface_doc("/" + "/".join(request.prepath))
+
+ def __init__(self, version='1.0'):
+ self.version = version
+ self.mgr = WSRequestHandler()
+ self.register_request(self._get_interface_doc,
+ "GET", (WSPathStaticString("doc"),),
+ """Get a summary of requests supported by this
+ web service interface.""")
+
+ def register_request(self, handler, request_method, path_components, doc):
+ self.mgr.register(handler, request_method, path_components, doc)
+
+ def render(self, request):
+ return self.mgr.handle(request)
+
+
+class wsapi:
+
+ _versions = {'1.0': WSRes('1.0')}
+
+ @classmethod
+ def get_version(cls, version):
+ return cls._versions[version]
+
+ def application(self, env, start_response):
+ wsreq = WSRequest(env, start_response)
+ if wsreq.version in wsapi._versions:
+ body = wsapi._versions[wsreq.version].render(wsreq)
+ else:
+ body = notFound(wsreq, "")
+ return wsreq.sendResponse(body)
+
+ def __call__(self):
+ server = WSGIServer((FLAGS.wsapi_host, FLAGS.wsapi_port),
+ self.application)
+ server.serve_forever()
diff --git a/ryu/base/__init__.py b/ryu/base/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/ryu/base/__init__.py
diff --git a/ryu/base/app_manager.py b/ryu/base/app_manager.py
new file mode 100644
index 00000000..39474e0e
--- /dev/null
+++ b/ryu/base/app_manager.py
@@ -0,0 +1,45 @@
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import itertools
+import logging
+
+from ryu import utils
+from ryu.controller.handler import register_instance
+
+LOG = logging.getLogger('ryu.base.app_manager')
+
+
+class AppManager(object):
+ def __init__(self):
+ self.applications = {}
+
+ def load(self, app_mod_name, *args, **kwargs):
+ # for now, only single instance of a given module
+ # Do we need to support multiple instances?
+ # Yes, maybe for slicing.
+ assert app_mod_name not in self.applications
+
+ cls = utils.import_object(app_mod_name)
+ app = cls(*args, **kwargs)
+ register_instance(app)
+
+ self.applications[app_mod_name] = app
+
+ def load_apps(self, app_lists, *args, **kwargs):
+ for app in itertools.chain.from_iterable([app_list.split(',')
+ for app_list in app_lists]):
+ self.load(app, *args, **kwargs)
+ LOG.info('loading app %s', app)
diff --git a/ryu/controller/__init__.py b/ryu/controller/__init__.py
new file mode 100644
index 00000000..059122a7
--- /dev/null
+++ b/ryu/controller/__init__.py
@@ -0,0 +1,14 @@
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
diff --git a/ryu/controller/controller.py b/ryu/controller/controller.py
new file mode 100644
index 00000000..186f1fc1
--- /dev/null
+++ b/ryu/controller/controller.py
@@ -0,0 +1,201 @@
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import gflags
+import logging
+import gevent
+from gevent.server import StreamServer
+from gevent.queue import Queue
+
+from ryu.ofproto import ofproto
+from ryu.ofproto import ofproto_parser
+from ryu.ofproto import ofproto_v1_0
+from ryu.ofproto import ofproto_v1_0_parser
+
+from ryu.controller import dispatcher
+from ryu.controller import event
+from ryu.controller import handler
+from ryu.lib.mac import haddr_to_bin
+
+LOG = logging.getLogger('ryu.controller.controller')
+
+FLAGS = gflags.FLAGS
+gflags.DEFINE_string('ofp_listen_host', '', 'openflow listen host')
+gflags.DEFINE_integer('ofp_tcp_listen_port', ofproto.OFP_TCP_PORT,
+ 'openflow tcp listen port')
+
+
+class OpenFlowController(object):
+ def __init__(self):
+ super(OpenFlowController, self).__init__()
+
+ # entry point
+ def __call__(self):
+ #LOG.debug('call')
+ self.server_loop()
+
+ def server_loop(self):
+ server = StreamServer((FLAGS.ofp_listen_host,
+ FLAGS.ofp_tcp_listen_port),
+ DatapathConnectionFactory)
+ #LOG.debug('loop')
+ server.serve_forever()
+
+
+def _deactivate(method):
+ def deactivate(self):
+ try:
+ method(self)
+ finally:
+ self.is_active = False
+ return deactivate
+
+
+class Datapath(object):
+ supported_ofp_version = {
+ ofproto_v1_0.OFP_VERSION: (ofproto_v1_0,
+ ofproto_v1_0_parser),
+ }
+ default_ofp_version = ofproto_v1_0.OFP_VERSION
+
+ def __init__(self, socket, address):
+ super(Datapath, self).__init__()
+
+ self.socket = socket
+ self.address = address
+ self.is_active = True
+
+ # XIX limit queue size somehow to prevent it from eating memory up
+ self.recv_q = Queue()
+ self.send_q = Queue()
+
+ self.ev_q = dispatcher.EventQueue(handler.handshake_dispatcher)
+
+ self.version_sent = None
+ self.version_recv = None
+ self.version_used = None
+ self.set_version(self.default_ofp_version)
+ self.id = None # datapath_id is unknown yet
+ self.ports = None
+
+ def set_version(self, version):
+ assert version in self.supported_ofp_version
+ self.ofproto, self.ofproto_parser = self.supported_ofp_version[version]
+
+ # Low level socket handling layer
+ @_deactivate
+ def _recv_loop(self):
+ buf = bytearray()
+ required_len = ofproto.OFP_HEADER_SIZE
+
+ while self.is_active:
+ ret = self.socket.recv(ofproto.OFP_MSG_SIZE_MAX)
+ if len(ret) == 0:
+ self.is_active = False
+ break
+ buf += ret
+ while len(buf) >= required_len:
+ (version, msg_type, msg_len, xid) = ofproto_parser.header(buf)
+ required_len = msg_len
+ if len(buf) < required_len:
+ break
+
+ msg = ofproto_parser.msg(self,
+ version, msg_type, msg_len, xid, buf)
+ #LOG.debug('queue msg %s cls %s', msg, msg.__class__)
+ self.recv_q.put(msg)
+
+ buf = buf[required_len:]
+ required_len = ofproto.OFP_HEADER_SIZE
+
+ @_deactivate
+ def _send_loop(self):
+ while self.is_active:
+ buf = self.send_q.get()
+ self.socket.sendall(buf)
+
+ def send(self, buf):
+ self.send_q.put(buf)
+
+ def send_msg(self, msg):
+ assert isinstance(msg, self.ofproto_parser.MsgBase)
+ msg.serialize()
+ # LOG.debug('send_msg %s', msg)
+ self.send(msg.buf)
+
+ def serve(self):
+ send_thr = gevent.spawn(self._send_loop)
+ ev_thr = gevent.spawn(self._event_loop)
+
+ # send hello message immediately
+ self.version_sent = self.ofproto.OFP_VERSION
+ hello = self.ofproto_parser.OFPHello(self)
+ self.send_msg(hello)
+
+ self._recv_loop()
+ gevent.joinall([ev_thr, send_thr])
+
+ @_deactivate
+ def _event_loop(self):
+ while self.is_active:
+ msg = self.recv_q.get()
+ #LOG.debug('_event_loop ev %s cls %s', msg, msg.__class__)
+ self.ev_q.queue(event.ofp_msg_to_ev(msg))
+
+ def send_ev(self, ev):
+ #LOG.debug('send_ev %s', ev)
+ self.ev_q.queue(ev)
+
+ #
+ # Utility methods for convenience
+ #
+ def send_packet_out(self, buffer_id=0xffffffff, in_port=None,
+ actions=None, data=None):
+ if in_port is None:
+ in_port = self.ofproto.OFPP_NONE
+ packet_out = self.ofproto_parser.OFPPacketOut(
+ self, buffer_id, in_port, actions, data)
+ self.send_msg(packet_out)
+
+ def send_flow_mod(self, match, cookie, command, idle_timeout, hard_timeout,
+ priority, buffer_id=0xffffffff,
+ out_port=None, flags=0, actions=None):
+ if out_port is None:
+ out_port = self.ofproto.OFPP_NONE
+ flow_mod = self.ofproto_parser.OFPFlowMod(
+ self, match, cookie, command, idle_timeout, hard_timeout,
+ priority, buffer_id, out_port, flags, actions)
+ self.send_msg(flow_mod)
+
+ def send_delete_all_flows(self):
+ addr = haddr_to_bin('00:00:00:00:00:00')
+ match = self.ofproto_parser.OFPMatch(self.ofproto.OFPFW_ALL,
+ 0, addr, addr, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0)
+ self.send_flow_mod(
+ match=match, cookie=0, command=self.ofproto.OFPFC_DELETE,
+ idle_timeout=0, hard_timeout=0, priority=0, buffer_id=0,
+ out_port=self.ofproto.OFPP_NONE, flags=0, actions=None)
+
+ def send_barrier(self):
+ barrier_request = self.ofproto_parser.OFPBarrierRequest(self)
+ self.send_msg(barrier_request)
+
+
+def DatapathConnectionFactory(socket, address):
+ LOG.debug('connected socket:%s address:%s', socket, address)
+
+ datapath = Datapath(socket, address)
+ datapath.serve()
diff --git a/ryu/controller/dispatcher.py b/ryu/controller/dispatcher.py
new file mode 100644
index 00000000..188c41a3
--- /dev/null
+++ b/ryu/controller/dispatcher.py
@@ -0,0 +1,108 @@
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import copy
+import logging
+from gevent import queue
+
+LOG = logging.getLogger('ryu.controller.dispatcher')
+
+
+class EventQueue(object):
+ def __init__(self, dispatcher):
+ self.dispatcher = dispatcher
+ self.is_dispatching = False
+ self.ev_q = queue.Queue()
+
+ def set_dispatcher(self, dispatcher):
+ self.dispatcher = dispatcher
+
+ def queue_raw(self, ev):
+ self.ev_q.put(ev)
+
+ class _EventQueueGuard(object):
+ def __init__(self, ev_q):
+ self.ev_q = ev_q
+
+ def __enter__(self):
+ self.ev_q.is_dispatching = True
+
+ def __exit__(self, type, value, traceback):
+ self.ev_q.is_dispatching = False
+ return False
+
+ def queue(self, ev):
+ if self.is_dispatching:
+ self.queue_raw(ev)
+ return
+
+ with self._EventQueueGuard(self):
+ assert self.ev_q.empty()
+
+ self.dispatcher(ev)
+ while not self.ev_q.empty():
+ ev = self.ev_q.get()
+ self.dispatcher(ev)
+
+
+class EventDispatcher(object):
+ def __init__(self, name):
+ self.name = name
+ self.events = {}
+
+ def register_handler(self, ev_cls, handler):
+ assert callable(handler)
+ self.events.setdefault(ev_cls, [])
+ self.events[ev_cls].append(handler)
+
+ def register_handlers(self, handlers):
+ for ev_cls, h in handlers:
+ self.register_handler(ev_cls, h)
+
+ def unregister_handler(self, ev_cls, handler):
+ del self.events[ev_cls][handler]
+
+ def register_static(self, ev_cls):
+ '''helper decorator to statically register handler for event class'''
+ def register(handler):
+ '''helper decorator to register handler statically '''
+ if isinstance(handler, staticmethod):
+ # class staticmethod is not callable.
+ handler = handler.__func__
+ self.register_handler(ev_cls, handler)
+ return handler
+ return register
+
+ def __call__(self, ev):
+ self.dispatch(ev)
+
+ def dispatch(self, ev):
+ #LOG.debug('dispatch %s', ev)
+ if ev.__class__ not in self.events:
+ LOG.info('unhandled event %s', ev)
+ return
+
+ # Is this necessary?
+ #
+ # copy handler list because the list is not stable.
+ # event handler may block/switch thread execution
+ # and un/register other handlers.
+ #
+ handlers = copy.copy(self.events[ev.__class__])
+
+ for h in handlers:
+ ret = h(ev)
+ if ret is False:
+ break
diff --git a/ryu/controller/event.py b/ryu/controller/event.py
new file mode 100644
index 00000000..54d135d9
--- /dev/null
+++ b/ryu/controller/event.py
@@ -0,0 +1,76 @@
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import inspect
+
+
+class EventBase(object):
+ # Nothing yet
+ pass
+
+
+class EventOFPMsgBase(EventBase):
+ def __init__(self, msg):
+ self.msg = msg
+
+
+#
+# Create event type corresponding to OFP Msg
+#
+
+_OFP_MSG_EVENTS = {}
+
+
+def _ofp_msg_name_to_ev_name(msg_name):
+ return 'Event' + msg_name
+
+
+def ofp_msg_to_ev(msg):
+ name = _ofp_msg_name_to_ev_name(msg.__class__.__name__)
+ return _OFP_MSG_EVENTS[name](msg)
+
+
+def _create_ofp_msg_ev_class(msg_cls):
+ name = _ofp_msg_name_to_ev_name(msg_cls.__name__)
+ # print 'creating event %s' % name
+
+ if name in _OFP_MSG_EVENTS:
+ return
+
+ cls = type(name, (EventOFPMsgBase,),
+ dict(__init__=lambda self, msg:
+ super(self.__class__, self).__init__(msg)))
+ globals()[name] = cls
+ _OFP_MSG_EVENTS[name] = cls
+
+
+def _create_ofp_msg_ev_from_module(modname):
+ (f, s, t) = modname.rpartition('.')
+ mod = __import__(modname, fromlist=[f])
+ print mod
+ for k, cls in mod.__dict__.items():
+ if not inspect.isclass(cls):
+ continue
+ if 'cls_msg_type' not in cls.__dict__:
+ continue
+ _create_ofp_msg_ev_class(cls)
+
+
+# TODO:XXX
+_PARSER_MODULE_LIST = ['ryu.ofproto.ofproto_v1_0_parser']
+
+for m in _PARSER_MODULE_LIST:
+ # print 'loading module %s' % m
+ _create_ofp_msg_ev_from_module(m)
diff --git a/ryu/controller/handler.py b/ryu/controller/handler.py
new file mode 100644
index 00000000..b60b6fa6
--- /dev/null
+++ b/ryu/controller/handler.py
@@ -0,0 +1,219 @@
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import copy
+import inspect
+import logging
+import struct
+
+from ryu.controller import event
+from ryu.controller import dispatcher
+from ryu.lib.mac import haddr_to_bin
+
+LOG = logging.getLogger('ryu.controller.handler')
+
+handshake_dispatcher = dispatcher.EventDispatcher('handshake')
+config_dispatcher = dispatcher.EventDispatcher('config')
+main_dispatcher = dispatcher.EventDispatcher('main')
+
+
+def set_ev_cls(ev_cls, dispatchers=None):
+ def _set_ev_cls_dec(handler):
+ handler.ev_cls = ev_cls
+ if dispatchers is not None:
+ handler.dispatchers = dispatchers
+ return handler
+ return _set_ev_cls_dec
+
+
+def _is_ev_handler(meth):
+ return 'ev_cls' in meth.__dict__
+
+
+def _listify(may_list):
+ if may_list is None:
+ may_list = []
+ if not isinstance(may_list, list):
+ may_list = [may_list]
+ return may_list
+
+
+def _get_hnd_spec_dispatchers(handler, dispatchers):
+ hnd_spec_dispatchers = _listify(getattr(handler, 'dispatchers', None))
+ # LOG.debug("hnd_spec_dispatchers %s", hnd_spec_dispatchers)
+ if hnd_spec_dispatchers:
+ _dispatchers = copy.copy(dispatchers)
+ _dispatchers.extend(hnd_spec_dispatchers)
+ else:
+ _dispatchers = dispatchers
+
+ return _dispatchers
+
+
+def register_cls(dispatchers=None):
+ dispatchers = _listify(dispatchers)
+
+ def _register_cls_method(cls):
+ for k, f in inspect.getmembers(cls, inspect.isfunction):
+ # LOG.debug('cls %s k %s f %s', cls, k, f)
+ if not _is_ev_handler(f):
+ continue
+
+ _dispatchers = _get_hnd_spec_dispatchers(f, dispatchers)
+ # LOG.debug("_dispatchers %s", _dispatchers)
+ for d in _dispatchers:
+ # LOG.debug('register dispatcher %s ev %s cls %s k %s f %s',
+ # d.name, f.ev_cls, cls, k, f)
+ d.register_handler(f.ev_cls, f)
+
+ return _register_cls_method
+
+
+def register_instance(i, dispatchers=None):
+ dispatchers = _listify(dispatchers)
+
+ for k, m in inspect.getmembers(i, inspect.ismethod):
+ # LOG.debug('instance %s k %s m %s', i, k, m)
+ if not _is_ev_handler(m):
+ continue
+
+ _dispatchers = _get_hnd_spec_dispatchers(m, dispatchers)
+ # LOG.debug("_dispatchers %s", _dispatchers)
+ for d in _dispatchers:
+ # LOG.debug('register dispatcher %s ev %s k %s m %s',
+ # d.name, m.ev_cls, k, m)
+ d.register_handler(m.ev_cls, m)
+
+
+@register_cls([handshake_dispatcher, config_dispatcher, main_dispatcher])
+class EchoHandler(object):
+ @staticmethod
+ @set_ev_cls(event.EventOFPEchoRequest)
+ def echo_request_handler(ev):
+ msg = ev.msg
+ # LOG.debug('echo request msg %s %s', msg, str(msg.data))
+ datapath = msg.datapath
+ echo_reply = datapath.ofproto_parser.OFPEchoReply(datapath)
+ echo_reply.data = msg.data
+ datapath.send_msg(echo_reply)
+
+ @staticmethod
+ @set_ev_cls(event.EventOFPEchoReply)
+ def echo_reply_handler(ev):
+ # do nothing
+ # msg = ev.msg
+ # LOG.debug('echo reply ev %s %s', msg, str(msg.data))
+ pass
+
+
+@register_cls([handshake_dispatcher, config_dispatcher, main_dispatcher])
+class ErrorMsgHandler(object):
+ @staticmethod
+ @set_ev_cls(event.EventOFPErrorMsg)
+ def error_msg_handler(ev):
+ msg = ev.msg
+ LOG.debug('error msg ev %s type 0x%x code 0x%x %s',
+ msg, msg.type, msg.code, str(msg.data))
+ msg.datapath.is_active = False
+
+
+@register_cls(handshake_dispatcher)
+class HandShakeHandler(object):
+ @staticmethod
+ @set_ev_cls(event.EventOFPHello)
+ def hello_handler(ev):
+ LOG.debug('hello ev %s', ev)
+ msg = ev.msg
+ datapath = msg.datapath
+
+ # TODO: check if received version is supported.
+ # pre 1.0 is not supported
+ if msg.version not in datapath.supported_ofp_version:
+ # send the error
+ error_msg = datapath.ofproto_parser.OFPErrorMsg(datapath)
+ error_msg.type = datapath.ofproto.OFPET_HELLO_FAILED
+ error_msg.code = datapath.ofproto.OFPHFC_INCOMPATIBLE
+ error_msg.data = 'unsupported version 0x%x' % msg.version
+ datapath.send_msg(error_msg)
+ return
+
+ datapath.version = min(datapath.version_sent, msg.version)
+ datapath.set_version(datapath.version)
+
+ # now send feature
+ features_reqeust = datapath.ofproto_parser.OFPFeaturesRequest(datapath)
+ datapath.send_msg(features_reqeust)
+
+ # now move on to config state
+ LOG.debug('move onto config mode')
+ datapath.ev_q.set_dispatcher(config_dispatcher)
+
+
+@register_cls(config_dispatcher)
+class ConfigHandler(object):
+ @staticmethod
+ @set_ev_cls(event.EventOFPSwitchFeatures)
+ def switch_features_handler(ev):
+ msg = ev.msg
+ datapath = msg.datapath
+ LOG.debug('switch features ev %s', msg)
+
+ datapath.id = msg.datapath_id
+ datapath.ports = msg.ports
+
+ ofproto = datapath.ofproto
+ ofproto_parser = datapath.ofproto_parser
+ set_config = ofproto_parser.OFPSetConfig(
+ datapath, ofproto.OFPC_FRAG_NORMAL,
+ 128 # TODO:XXX
+ )
+ datapath.send_msg(set_config)
+
+ #
+ # drop all flows in order to put datapath into unknown state
+ #
+ datapath.send_delete_all_flows()
+
+ datapath.send_barrier()
+
+ # The above OFPC_DELETE request may trigger flow removed event.
+ # Just ignore them.
+ @staticmethod
+ @set_ev_cls(event.EventOFPFlowRemoved)
+ def flow_removed_handler(ev):
+ LOG.debug("flow removed ev %s msg %s", ev, ev.msg)
+
+ @staticmethod
+ @set_ev_cls(event.EventOFPBarrierReply)
+ def barrier_reply_handler(ev):
+ LOG.debug('barrier reply ev %s msg %s', ev, ev.msg)
+
+ # move on to main state
+ LOG.debug('move onto main mode')
+ ev.msg.datapath.ev_q.set_dispatcher(main_dispatcher)
+
+
+@register_cls(main_dispatcher)
+class MainHandler(object):
+ @staticmethod
+ @set_ev_cls(event.EventOFPFlowRemoved)
+ def flow_removed_handler(ev):
+ msg = ev.msg
+
+ @staticmethod
+ @set_ev_cls(event.EventOFPPortStatus)
+ def port_status_handler(ev):
+ msg = ev.msg
+ LOG.debug('port status %s', msg.reason)
diff --git a/ryu/controller/mac_to_network.py b/ryu/controller/mac_to_network.py
new file mode 100644
index 00000000..bc189296
--- /dev/null
+++ b/ryu/controller/mac_to_network.py
@@ -0,0 +1,56 @@
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import logging
+
+from ryu.exception import MacAddressDuplicated
+from ryu.lib.mac import haddr_to_str
+
+LOG = logging.getLogger('ryu.controller.mac_to_network')
+
+
+class MacToNetwork(object):
+ def __init__(self, nw):
+ self.mac_to_net = {}
+ self.dpid = {}
+ self.nw = nw
+
+ def get_network(self, mac, default=None):
+ return self.mac_to_net.get(mac, default)
+
+ def add_mac(self, mac, nw_id, nw_id_external=None):
+ _nw_id = self.mac_to_net.get(mac)
+ if _nw_id == nw_id:
+ return
+
+ # allow changing from nw_id_external to known nw id
+ if _nw_id is None or _nw_id == nw_id_external:
+ self.mac_to_net[mac] = nw_id
+ LOG.debug('overwrite nw_id: mac %s nw old %s new %s',
+ haddr_to_str(mac), _nw_id, nw_id)
+ return
+
+ if nw_id == nw_id_external:
+ # this can happens when the packet traverses
+ # VM-> tap-> ovs-> ext-port-> wire-> ext-port-> ovs-> tap-> VM
+ return
+
+ LOG.warn('duplicated nw_id: mac %s nw old %s new %s',
+ haddr_to_str(mac), _nw_id, nw_id)
+
+ raise MacAddressDuplicated(mac=mac)
+
+ def del_mac(self, mac):
+ del self.mac_to_net[mac]
diff --git a/ryu/controller/mac_to_port.py b/ryu/controller/mac_to_port.py
new file mode 100644
index 00000000..32e61f49
--- /dev/null
+++ b/ryu/controller/mac_to_port.py
@@ -0,0 +1,48 @@
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import logging
+from ryu.lib.mac import haddr_to_str
+
+LOG = logging.getLogger('ryu.controller.mac_to_port')
+
+
+class MacToPortTable(object):
+ """MAC addr <-> (dpid, port name)"""
+
+ def __init__(self):
+ self.mac_to_port = {}
+
+ def dpid_add(self, dpid):
+ LOG.debug('dpid_add: 0x%016x', dpid)
+ self.mac_to_port.setdefault(dpid, {})
+
+ def port_add(self, dpid, port, mac):
+ """
+ :returns: old port if learned. (this may be = port)
+ None otherwise
+ """
+ old_port = self.mac_to_port[dpid].get(mac, None)
+ self.mac_to_port[dpid][mac] = port
+
+ if old_port is not None and old_port != port:
+ LOG.debug('port_add: 0x%016x 0x%04x %s',
+ dpid, port, haddr_to_str(mac))
+
+ return old_port
+
+ def port_get(self, dpid, mac):
+ # LOG.debug('dpid 0x%016x mac %s', dpid, haddr_to_str(mac))
+ return self.mac_to_port[dpid].get(mac)
diff --git a/ryu/controller/network.py b/ryu/controller/network.py
new file mode 100644
index 00000000..db8c8960
--- /dev/null
+++ b/ryu/controller/network.py
@@ -0,0 +1,155 @@
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import logging
+
+from ryu.exception import NetworkNotFound, NetworkAlreadyExist
+from ryu.exception import PortAlreadyExist, PortNotFound, PortUnknown
+from ryu.app.rest_nw_id import NW_ID_UNKNOWN
+
+LOG = logging.getLogger('ryu.controller.network')
+
+
+class network(object):
+ def __init__(self, nw_id_unknown=NW_ID_UNKNOWN):
+ self.nw_id_unknown = nw_id_unknown
+ self.networks = {}
+ self.dpids = {}
+
+ def _check_nw_id_unknown(self, network_id):
+ if network_id == self.nw_id_unknown:
+ raise NetworkAlreadyExist(network_id=network_id)
+
+ def list_networks(self):
+ return self.networks.keys()
+
+ def update_network(self, network_id):
+ self._check_nw_id_unknown(network_id)
+ self.networks.setdefault(network_id, set())
+
+ def create_network(self, network_id):
+ self._check_nw_id_unknown(network_id)
+ if network_id in self.networks:
+ raise NetworkAlreadyExist(network_id=network_id)
+
+ self.networks[network_id] = set()
+
+ def remove_network(self, network_id):
+ try:
+ del(self.networks[network_id])
+ except KeyError:
+ raise NetworkNotFound(network_id=network_id)
+
+ def list_ports(self, network_id):
+ try:
+ # use list() to keep compatibility for output
+ # set() isn't json serializable
+ return list(self.networks[network_id])
+ except KeyError:
+ raise NetworkNotFound(network_id=network_id)
+
+ def _update_port(self, network_id, dpid, port, port_may_exist):
+ def _known_nw_id(nw_id):
+ return nw_id is not None and nw_id != self.nw_id_unknown
+
+ self._check_nw_id_unknown(network_id)
+ try:
+ old_network_id = self.dpids.get(dpid, {}).get(port, None)
+ if ((dpid, port) in self.networks[network_id] or
+ _known_nw_id(old_network_id)):
+ if not port_may_exist:
+ raise PortAlreadyExist(network_id=network_id,
+ dpid=dpid, port=port)
+
+ if old_network_id != network_id:
+ self.networks[network_id].add((dpid, port))
+ if _known_nw_id(old_network_id):
+ self.networks[old_network_id].remove((dpid, port))
+ except KeyError:
+ raise NetworkNotFound(network_id=network_id)
+
+ self.dpids.setdefault(dpid, {})
+ self.dpids[dpid][port] = network_id
+
+ def create_port(self, network_id, dpid, port):
+ self._update_port(network_id, dpid, port, False)
+
+ def update_port(self, network_id, dpid, port):
+ self._update_port(network_id, dpid, port, True)
+
+ def remove_port(self, network_id, dpid, port):
+ try:
+ self.networks[network_id].remove((dpid, port))
+ except KeyError:
+ raise NetworkNotFound(network_id=network_id)
+ except ValueError:
+ raise PortNotFound(network_id=network_id, dpid=dpid, port=port)
+
+ del self.dpids[dpid][port]
+
+ def same_network(self, dpid, nw_id, out_port, allow_nw_id_external=None):
+ assert nw_id != self.nw_id_unknown
+ dp = self.dpids.get(dpid, {})
+ out_nw = dp.get(out_port)
+
+ if nw_id == out_nw:
+ return True
+
+ if (allow_nw_id_external is not None and
+ (allow_nw_id_external == nw_id or allow_nw_id_external == out_nw)):
+ # allow external network -> known network id
+ return True
+
+ LOG.debug('blocked dpid %s nw_id %s out_port %d out_nw %s'
+ 'external %s',
+ dpid, nw_id, out_port, out_nw, allow_nw_id_external)
+ return False
+
+ def get_network(self, dpid, port):
+ try:
+ return self.dpids[dpid][port]
+ except KeyError:
+ raise PortUnknown(dpid=dpid, port=port)
+
+ def add_datapath(self, ofp_switch_features):
+ datapath = ofp_switch_features.datapath
+ dpid = ofp_switch_features.datapath_id
+ ports = ofp_switch_features.ports
+ self.dpids.setdefault(dpid, {})
+ dp = self.dpids[dpid]
+ for port_no in ports:
+ if port_no == 0 or port_no >= datapath.ofproto.OFPP_MAX:
+ # skip fake output ports
+ continue
+
+ if port_no not in dp:
+ dp[port_no] = self.nw_id_unknown
+
+ def filter_ports(self, dpid, in_port, nw_id, allow_nw_id_external=None):
+ assert nw_id != self.nw_id_unknown
+ ret = []
+
+ ports = self.dpids.get(dpid, {})
+ for port_no, _nw_id in ports.items():
+ if port_no == in_port:
+ continue
+
+ if _nw_id == nw_id:
+ ret.append(port_no)
+ elif (allow_nw_id_external is not None and
+ _nw_id == allow_nw_id_external):
+ ret.append(port_no)
+
+ return ret
diff --git a/ryu/exception.py b/ryu/exception.py
new file mode 100644
index 00000000..4ced457d
--- /dev/null
+++ b/ryu/exception.py
@@ -0,0 +1,63 @@
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+class RyuException(Exception):
+ message = 'An unknown exception'
+
+ def __init__(self, msg=None, **kwargs):
+ self.kwargs = kwargs
+ if msg is None:
+ msg = self.message
+
+ try:
+ msg = msg % kwargs
+ except Exception as e:
+ msg = self.message
+
+ super(RyuException, self).__init__(msg)
+
+
+class OFPUnknownVersion(RyuException):
+ message = 'unknown version %(version)x'
+
+
+class OFPMalformedMessage:
+ message = 'malformed message'
+
+
+class NetworkNotFound(RyuException):
+ message = 'no such network id %(network_id)s'
+
+
+class NetworkAlreadyExist(RyuException):
+ message = 'network id %(network_id)s already exists'
+
+
+class PortNotFound(RyuException):
+ message = 'no such port (%(dpid)s, %(port)s) in network %(network_id)s'
+
+
+class PortAlreadyExist(RyuException):
+ message = 'port (%(dpid)s, %(port)s) in network %(network_id)s ' \
+ 'already exists'
+
+
+class PortUnknown(RyuException):
+ message = 'unknown network id for port (%(dpid)s %(port)s)'
+
+
+class MacAddressDuplicated(RyuException):
+ message = 'MAC address %(mac)s is duplicated'
diff --git a/ryu/flags.py b/ryu/flags.py
new file mode 100644
index 00000000..c3ad4062
--- /dev/null
+++ b/ryu/flags.py
@@ -0,0 +1,24 @@
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+"""
+global flags
+"""
+
+import gflags
+
+FLAGS = gflags.FLAGS
+
+# GLOBAL flags
+gflags.DEFINE_boolean('monkey_patch', False, 'do monkey patch')
diff --git a/ryu/lib/__init__.py b/ryu/lib/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/ryu/lib/__init__.py
diff --git a/ryu/lib/mac.py b/ryu/lib/mac.py
new file mode 100644
index 00000000..2dbf6e80
--- /dev/null
+++ b/ryu/lib/mac.py
@@ -0,0 +1,23 @@
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+def haddr_to_str(addr):
+ return ''.join(['%02x:' % ord(char) for char in addr[0:6]])[:-1]
+
+
+def haddr_to_bin(string):
+ return ''.join(['%c' % chr(int(i, 16)) for i in
+ string.split(':')])
diff --git a/ryu/log.py b/ryu/log.py
new file mode 100644
index 00000000..4c3159b5
--- /dev/null
+++ b/ryu/log.py
@@ -0,0 +1,82 @@
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import gflags
+import inspect
+import logging
+import os
+import sys
+
+
+FLAGS = gflags.FLAGS
+
+gflags.DEFINE_integer('default_log_level', None, 'default log level')
+gflags.DEFINE_bool('verbose', False, 'show debug output')
+
+gflags.DEFINE_bool('use_stderr', True, 'log to standard error')
+gflags.DEFINE_string('use_syslog', False, 'output to syslog')
+gflags.DEFINE_string('log_dir', None, 'log file directory')
+gflags.DEFINE_string('log_file', None, 'log file name')
+gflags.DEFINE_string('log_file_mode', '0644', 'default log file permission')
+
+
+_early_log_handler = None
+
+
+def earlyInitLog(level=None):
+ global _early_log_handler
+ _early_log_handler = logging.StreamHandler(sys.stderr)
+
+ log = logging.getLogger()
+ log.addHandler(_early_log_handler)
+ if level is not None:
+ log.setLevel(level)
+
+
+def _get_log_file():
+ if FLAGS.log_file:
+ return FLAGS.log_file
+ if FLAGS.log_dir:
+ return os.path.join(FLAGS.logdir,
+ os.path.basename(inspect.stack()[-1][1])) + '.log'
+ return None
+
+
+def initLog():
+ global _early_log_handler
+
+ log = logging.getLogger()
+ if FLAGS.use_stderr:
+ log.addHandler(logging.StreamHandler(sys.stderr))
+ if _early_log_handler is not None:
+ log.removeHandler(_early_log_handler)
+ _early_log_handler = None
+
+ if FLAGS.use_syslog:
+ syslog = logging.handlers.SysLogHandler(address='/dev/log')
+ log.addHandler(syslog)
+
+ log_file = _get_log_file()
+ if log_file is not None:
+ logging.addHandler(logging.handlers.WatchedFileHandler(log_file))
+ mode = int(FLAGS.log_file_mnode, 8)
+ os.chmod(log_file, mode)
+
+ if FLAGS.verbose:
+ log.setLevel(logging.DEBUG)
+ elif FLAGS.default_log_level is not None:
+ log.setLevel(FLAGS.default_log_level)
+ else:
+ log.setLevel(logging.INFO)
diff --git a/ryu/ofproto/__init__.py b/ryu/ofproto/__init__.py
new file mode 100644
index 00000000..58736d4a
--- /dev/null
+++ b/ryu/ofproto/__init__.py
@@ -0,0 +1,16 @@
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from . import ofproto_v1_0 as ofproto
diff --git a/ryu/ofproto/ofproto_parser.py b/ryu/ofproto/ofproto_parser.py
new file mode 100644
index 00000000..4bc31f87
--- /dev/null
+++ b/ryu/ofproto/ofproto_parser.py
@@ -0,0 +1,49 @@
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import logging
+import struct
+
+from ryu import exception
+
+from . import ofproto
+
+LOG = logging.getLogger('ryu.ofproto.ofproto_parser')
+
+
+def header(buf):
+ assert len(buf) >= ofproto.OFP_HEADER_SIZE
+ #LOG.debug('len %d bufsize %d', len(buf), ofproto.OFP_HEADER_SIZE)
+ return struct.unpack_from(ofproto.OFP_HEADER_PACK_STR, buffer(buf))
+
+
+_MSG_PARSERS = {}
+
+
+def register_msg_parser(version):
+ def register(msg_parser):
+ _MSG_PARSERS[version] = msg_parser
+ return msg_parser
+ return register
+
+
+def msg(datapath, version, msg_type, msg_len, xid, buf):
+ assert len(buf) >= msg_len
+
+ msg_parser = _MSG_PARSERS.get(version)
+ if msg_parser is None:
+ raise exception.OFPUnknownVersion(version=version)
+
+ return msg_parser(datapath, version, msg_type, msg_len, xid, buf)
diff --git a/ryu/ofproto/ofproto_v1_0.py b/ryu/ofproto/ofproto_v1_0.py
new file mode 100644
index 00000000..9ac3b957
--- /dev/null
+++ b/ryu/ofproto/ofproto_v1_0.py
@@ -0,0 +1,437 @@
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+from struct import calcsize
+
+# define constants
+OFP_VERSION = 0x01
+OFP_MAX_TABLE_NAME_LEN = 32
+OFP_MAX_TABLE_NAME_LEN_STR = str(OFP_MAX_TABLE_NAME_LEN)
+OFP_MAX_PORT_NAME_LEN = 16
+OFP_TCP_PORT = 6633
+OFP_SSL_PORT = 6633
+OFP_ETH_ALEN = 6
+OFP_ETH_ALEN_STR = str(OFP_ETH_ALEN)
+
+# enum ofp_port
+OFPP_MAX = 0xff00
+OFPP_IN_PORT = 0xfff8 # Send the packet out the input port. This
+ # virtual port must be explicitly used
+ # in order to send back out of the input
+ # port.
+OFPP_TABLE = 0xfff9 # Perform actions in flow table.
+ # NB: This can only be the destination
+ # port for packet-out messages.
+OFPP_NORMAL = 0xfffa # Process with normal L2/L3 switching.
+OFPP_FLOOD = 0xfffb # All physical ports except input port and
+ # those disabled by STP.
+OFPP_ALL = 0xfffc # All physical ports except input port.
+OFPP_CONTROLLER = 0xfffd # Send to controller.
+OFPP_LOCAL = 0xfffe # Local openflow "port".
+OFPP_NONE = 0xffff # Not associated with a physical port.
+
+# enum ofp_type
+OFPT_HELLO = 0 # Symmetric message
+OFPT_ERROR = 1 # Symmetric message
+OFPT_ECHO_REQUEST = 2 # Symmetric message
+OFPT_ECHO_REPLY = 3 # Symmetric message
+OFPT_VENDOR = 4 # Symmetric message
+OFPT_FEATURES_REQUEST = 5 # Controller/switch message
+OFPT_FEATURES_REPLY = 6 # Controller/switch message
+OFPT_GET_CONFIG_REQUEST = 7 # Controller/switch message
+OFPT_GET_CONFIG_REPLY = 8 # Controller/switch message
+OFPT_SET_CONFIG = 9 # Controller/switch message
+OFPT_PACKET_IN = 10 # Async message
+OFPT_FLOW_REMOVED = 11 # Async message
+OFPT_PORT_STATUS = 12 # Async message
+OFPT_PACKET_OUT = 13 # Controller/switch message
+OFPT_FLOW_MOD = 14 # Controller/switch message
+OFPT_PORT_MOD = 15 # Controller/switch message
+OFPT_STATS_REQUEST = 16 # Controller/switch message
+OFPT_STATS_REPLY = 17 # Controller/switch message
+OFPT_BARRIER_REQUEST = 18 # Controller/switch message
+OFPT_BARRIER_REPLY = 19 # Controller/switch message
+OFPT_QUEUE_GET_CONFIG_REQUEST = 20 # Controller/switch message
+OFPT_QUEUE_GET_CONFIG_REPLY = 21 # Controller/switch message
+
+OFP_HEADER_PACK_STR = '!BBHI'
+OFP_HEADER_SIZE = 8
+OFP_MSG_SIZE_MAX = 65535
+assert calcsize(OFP_HEADER_PACK_STR) == OFP_HEADER_SIZE
+
+# define constants
+OFP_DEFAULT_MISS_SEND_LEN = 128
+
+# enum ofp_config_flags
+OFPC_FRAG_NORMAL = 0 # No special handling for fragments.
+OFPC_FRAG_DROP = 1 # Drop fragments.
+OFPC_FRAG_REASM = 2 # Reassemble (only if OFPC_IP_REASM set).
+OFPC_FRAG_NX_MATCH = 3 # Make first fragments available for matching.
+OFPC_FRAG_MASK = 3
+
+OFP_SWITCH_CONFIG_PACK_STR = '!HH'
+OFP_SWITCH_CONFIG_SIZE = 12
+assert (calcsize(OFP_SWITCH_CONFIG_PACK_STR) + OFP_HEADER_SIZE ==
+ OFP_SWITCH_CONFIG_SIZE)
+
+# enum ofp_capabilities
+OFPC_FLOW_STATS = 1 << 0 # Flow statistics.
+OFPC_TABLE_STATS = 1 << 1 # Table statistics.
+OFPC_PORT_STATS = 1 << 2 # Port statistics.
+OFPC_STP = 1 << 3 # 802.1d spanning tree.
+OFPC_RESERVED = 1 << 4 # Reserved, must not be set.
+OFPC_IP_REASM = 1 << 5 # Can reassemble IP fragments.
+OFPC_QUEUE_STATS = 1 << 6 # Queue statistics.
+OFPC_ARP_MATCH_IP = 1 << 7 # Match IP addresses in ARP pkts.
+
+# enum ofp_port_config
+OFPPC_PORT_DOWN = 1 << 0 # Port is administratively down.
+OFPPC_NO_STP = 1 << 1 # Disable 802.1D spanning tree on port.
+OFPPC_NO_RECV = 1 << 2 # Drop all packets except 802.1D
+ # spanning tree packets
+OFPPC_NO_RECV_STP = 1 << 3 # Drop received 802.1D STP packets.
+OFPPC_NO_FLOOD = 1 << 4 # Do not include this port when flooding.
+OFPPC_NO_FWD = 1 << 5 # Drop packets forwarded to port.
+OFPPC_NO_PACKET_IN = 1 << 6 # Do not send packet-in msgs for port.
+
+# enum ofp_port_state
+OFPPS_LINK_DOWN = 1 << 0 # No physical link present.
+OFPPS_STP_LISTEN = 0 << 8 # Not learning or relaying frames.
+OFPPS_STP_LEARN = 1 << 8 # Learning but not relaying frames.
+OFPPS_STP_FORWARD = 2 << 8 # Learning and relaying frames.
+OFPPS_STP_BLOCK = 3 << 8 # Not part of spanning tree.
+OFPPS_STP_MASK = 3 << 8 # Bit mask for OFPPS_STP_* values.
+
+# enum ofp_port_features
+OFPPF_10MB_HD = 1 << 0 # 10 Mb half-duplex rate support.
+OFPPF_10MB_FD = 1 << 1 # 10 Mb full-duplex rate support.
+OFPPF_100MB_HD = 1 << 2 # 100 Mb half-duplex rate support.
+OFPPF_100MB_FD = 1 << 3 # 100 Mb full-duplex rate support.
+OFPPF_1GB_HD = 1 << 4 # 1 Gb half-duplex rate support.
+OFPPF_1GB_FD = 1 << 5 # 1 Gb full-duplex rate support.
+OFPPF_10GB_FD = 1 << 6 # 10 Gb full-duplex rate support.
+OFPPF_COPPER = 1 << 7 # Copper medium.
+OFPPF_FIBER = 1 << 8 # Fiber medium.
+OFPPF_AUTONEG = 1 << 9 # Auto-negotiation.
+OFPPF_PAUSE = 1 << 10 # Pause.
+OFPPF_PAUSE_ASYM = 1 << 11 # Asymmetric pause.
+
+_OFP_PHY_PORT_PACK_STR = 'H' + OFP_ETH_ALEN_STR + 's' + str(OFP_MAX_PORT_NAME_LEN) + 'sIIIIII'
+OFP_PHY_PORT_PACK_STR = '!' + _OFP_PHY_PORT_PACK_STR
+OFP_PHY_PORT_SIZE = 48
+assert calcsize(OFP_PHY_PORT_PACK_STR) == OFP_PHY_PORT_SIZE
+
+OFP_SWITCH_FEATURES_PACK_STR = '!QIB3xII'
+OFP_SWITCH_FEATURES_SIZE = 32
+assert (calcsize(OFP_SWITCH_FEATURES_PACK_STR) + OFP_HEADER_SIZE ==
+ OFP_SWITCH_FEATURES_SIZE)
+
+# enum ofp_port_reason
+OFPPR_ADD = 0 # The port was added.
+OFPPR_DELETE = 1 # The port was removed.
+OFPPR_MODIFY = 2 # Some attribute of the port has changed.
+
+OFP_PORT_STATUS_PACK_STR = '!B7x' + _OFP_PHY_PORT_PACK_STR
+OFP_PORT_STATUS_DESC_OFFSET = OFP_HEADER_SIZE + 8
+OFP_PORT_STATUS_SIZE = 64
+assert (calcsize(OFP_PORT_STATUS_PACK_STR) + OFP_HEADER_SIZE ==
+ OFP_PORT_STATUS_SIZE)
+
+OFP_PORT_MOD_PACK_STR = '!H' + OFP_ETH_ALEN_STR + 'BIII4x'
+OFP_PORT_MOD_SIZE = 32
+assert calcsize(OFP_PORT_MOD_PACK_STR) + OFP_HEADER_SIZE == OFP_PORT_MOD_SIZE
+
+# enum ofp_packet_in_reason
+OFPR_NO_MATCH = 0 # No matching flow.
+OFPR_ACTION = 1 # Action explicitly output to controller.
+
+OFP_PACKET_IN_PACK_STR = '!IHHBx2x' # the last 2x is for ofp_packet_in::data
+OFP_PACKET_IN_SIZE = 20
+OFP_PACKET_IN_DATA_OFFSET = 18
+assert calcsize(OFP_PACKET_IN_PACK_STR) + OFP_HEADER_SIZE == OFP_PACKET_IN_SIZE
+
+# enum ofp_action_type
+OFPAT_OUTPUT = 0 # Output to switch port.
+OFPAT_SET_VLAN_VID = 1 # Set the 802.1q VLAN id.
+OFPAT_SET_VLAN_PCP = 2 # Set the 802.1q priority.
+OFPAT_STRIP_VLAN = 3 # Strip the 802.1q header.
+OFPAT_SET_DL_SRC = 4 # Ethernet source address.
+OFPAT_SET_DL_DST = 5 # Ethernet destination address.
+OFPAT_SET_NW_SRC = 6 # IP source address.
+OFPAT_SET_NW_DST = 7 # IP destination address.
+OFPAT_SET_NW_TOS = 8 # IP ToS (DSCP field, 6 bits).
+OFPAT_SET_TP_SRC = 9 # TCP/UDP source port.
+OFPAT_SET_TP_DST = 10 # TCP/UDP destination port.
+OFPAT_ENQUEUE = 11 # Output to queue.
+OFPAT_VENDOR = 0xffff
+
+OFP_ACTION_OUTPUT_PACK_STR = '!HHHH'
+OFP_ACTION_OUTPUT_SIZE = 8
+assert calcsize(OFP_ACTION_OUTPUT_PACK_STR) == OFP_ACTION_OUTPUT_SIZE
+OFP_ACTION_OUTPUT_LEN = 8
+
+# define constants
+OFP_VLAN_NONE = 0xffff
+
+OFP_ACTION_VLAN_VID_PACK_STR = '!HHH2x'
+OFP_ACTION_VLAN_VID_SIZE = 8
+assert calcsize(OFP_ACTION_VLAN_VID_PACK_STR) == OFP_ACTION_VLAN_VID_SIZE
+
+OFP_ACTION_VLAN_PCP_PACK_STR = '!HHB3x'
+OFP_ACTION_VLAN_PCP_SIZE = 8
+assert calcsize(OFP_ACTION_VLAN_PCP_PACK_STR) == OFP_ACTION_VLAN_PCP_SIZE
+
+OFP_ACTION_DL_ADDR_PACK_STR = '!HH' + OFP_ETH_ALEN_STR + 'B6x'
+OFP_ACTION_DL_ADDR_SIZE = 16
+assert calcsize(OFP_ACTION_DL_ADDR_PACK_STR) == OFP_ACTION_DL_ADDR_SIZE
+
+OFP_ACTION_NW_ADDR_PACK_STR = '!HHI'
+OFP_ACTION_NW_ADDR_SIZE = 8
+assert calcsize(OFP_ACTION_NW_ADDR_PACK_STR) == OFP_ACTION_NW_ADDR_SIZE
+
+OFP_ACTION_NW_TOS_PACK_STR = '!HHB3x'
+OFP_ACTION_NW_TOS_SIZE = 8
+assert calcsize(OFP_ACTION_NW_TOS_PACK_STR) == OFP_ACTION_NW_TOS_SIZE
+
+OFP_ACTION_TP_PORT_PACK_STR = '!HHH2x'
+OFP_ACTION_TP_PORT_SIZE = 8
+assert calcsize(OFP_ACTION_TP_PORT_PACK_STR) == OFP_ACTION_TP_PORT_SIZE
+
+OFP_ACTION_VENDOR_HEADER_PACK_STR = '!HHI'
+OFP_ACTION_VENDOR_HEADER_SIZE = 8
+assert (calcsize(OFP_ACTION_VENDOR_HEADER_PACK_STR) ==
+ OFP_ACTION_VENDOR_HEADER_SIZE)
+
+OFP_ACTION_HEADER_PACK_STR = '!HH4x'
+OFP_ACTION_HEADER_SIZE = 8
+assert calcsize(OFP_ACTION_HEADER_PACK_STR) == OFP_ACTION_HEADER_SIZE
+
+OFP_ACTION_QUEUE_PACK_STR = '!HHH6xI'
+OFP_ACTION_QUEUE_SIZE = 16
+assert calcsize(OFP_ACTION_QUEUE_PACK_STR) == OFP_ACTION_QUEUE_SIZE
+
+OFP_ACTION_PACK_STR = '!H'
+# because of union ofp_action
+# OFP_ACTION_SIZE = 8
+# assert calcsize(OFP_ACTION_PACK_STR) == OFP_ACTION_SIZE
+
+OFP_PACKET_OUT_PACK_STR = '!IHH'
+OFP_PACKET_OUT_SIZE = 16
+assert (calcsize(OFP_PACKET_OUT_PACK_STR) + OFP_HEADER_SIZE ==
+ OFP_PACKET_OUT_SIZE)
+
+# enum ofp_flow_mod_command
+OFPFC_ADD = 0 # New flow.
+OFPFC_MODIFY = 1 # Modify all matching flows.
+OFPFC_MODIFY_STRICT = 2 # Modify entry strictly matching wildcards
+OFPFC_DELETE = 3 # Delete all matching flows.
+OFPFC_DELETE_STRICT = 4 # Strictly match wildcards and priority.
+
+# enum ofp_flow_wildcards
+OFPFW_IN_PORT = 1 << 0 # Switch input port.
+OFPFW_DL_VLAN = 1 << 1 # VLAN vid.
+OFPFW_DL_SRC = 1 << 2 # Ethernet source address.
+OFPFW_DL_DST = 1 << 3 # Ethernet destination address.
+OFPFW_DL_TYPE = 1 << 4 # Ethernet frame type.
+OFPFW_NW_PROTO = 1 << 5 # IP protocol.
+OFPFW_TP_SRC = 1 << 6 # TCP/UDP source port.
+OFPFW_TP_DST = 1 << 7 # TCP/UDP destination port.
+OFPFW_NW_SRC_SHIFT = 8
+OFPFW_NW_SRC_BITS = 6
+OFPFW_NW_SRC_MASK = ((1 << OFPFW_NW_SRC_BITS) - 1) << OFPFW_NW_SRC_SHIFT
+OFPFW_NW_SRC_ALL = 32 << OFPFW_NW_SRC_SHIFT
+OFPFW_NW_DST_SHIFT = 14
+OFPFW_NW_DST_BITS = 6
+OFPFW_NW_DST_MASK = ((1 << OFPFW_NW_DST_BITS) - 1) << OFPFW_NW_DST_SHIFT
+OFPFW_NW_DST_ALL = 32 << OFPFW_NW_DST_SHIFT
+OFPFW_DL_VLAN_PCP = 1 << 20 # VLAN priority.
+OFPFW_NW_TOS = 1 << 21 # IP ToS (DSCP field, 6 bits).
+OFPFW_ALL = ((1 << 22) - 1)
+
+# define constants
+OFPFW_ICMP_TYPE = OFPFW_TP_SRC
+OFPFW_ICMP_CODE = OFPFW_TP_DST
+OFP_DL_TYPE_ETH2_CUTOFF = 0x0600
+OFP_DL_TYPE_NOT_ETH_TYPE = 0x05ff
+OFP_VLAN_NONE = 0xffff
+
+_OFP_MATCH_PACK_STR = 'IH' + OFP_ETH_ALEN_STR + 's' + OFP_ETH_ALEN_STR + 'sHBxHBB2xIIHH'
+OFP_MATCH_PACK_STR = '!' + _OFP_MATCH_PACK_STR
+OFP_MATCH_SIZE = 40
+assert calcsize(OFP_MATCH_PACK_STR) == OFP_MATCH_SIZE
+
+OFP_FLOW_PERMANENT = 0
+OFP_DEFAULT_PRIORITY = 0x8000
+
+# enum ofp_flow_mod_flags
+OFPFF_SEND_FLOW_REM = 1 << 0 # Send flow removed message when flow
+ # expires or is deleted.
+OFPFF_CHECK_OVERLAP = 1 << 1 # Check for overlapping entries first.
+OFPFF_EMERG = 1 << 2 # Ramark this is for emergency.
+
+_OFP_FLOW_MOD_PACK_STR0 = 'QHHHHIHH'
+OFP_FLOW_MOD_PACK_STR = '!' + _OFP_MATCH_PACK_STR + _OFP_FLOW_MOD_PACK_STR0
+OFP_FLOW_MOD_PACK_STR0 = '!' + _OFP_FLOW_MOD_PACK_STR0
+OFP_FLOW_MOD_SIZE = 72
+assert calcsize(OFP_FLOW_MOD_PACK_STR) + OFP_HEADER_SIZE == OFP_FLOW_MOD_SIZE
+
+# enum ofp_flow_removed_reason
+OFPRR_IDLE_TIMEOUT = 0 # Flow idle time exceeded idle_timeout.
+OFPRR_HARD_TIMEOUT = 1 # Time exceeded hard_timeout.
+OFPRR_DELETE = 2 # Evicted by a DELETE flow mod.
+
+_OFP_FLOW_REMOVED_PACK_STR0 = 'QHBxIIH2xQQ'
+OFP_FLOW_REMOVED_PACK_STR = '!' + _OFP_MATCH_PACK_STR + \
+ _OFP_FLOW_REMOVED_PACK_STR0
+OFP_FLOW_REMOVED_PACK_STR0 = '!' + _OFP_FLOW_REMOVED_PACK_STR0
+OFP_FLOW_REMOVED_SIZE = 88
+assert (calcsize(OFP_FLOW_REMOVED_PACK_STR) + OFP_HEADER_SIZE ==
+ OFP_FLOW_REMOVED_SIZE)
+
+
+# enum ofp_error_type
+OFPET_HELLO_FAILED = 0 # Hello protocol failed.
+OFPET_BAD_REQUEST = 1 # Request was not understood.
+OFPET_BAD_ACTION = 2 # Error in action description.
+OFPET_FLOW_MOD_FAILED = 3 # Problem modifying flow entry.
+OFPET_PORT_MOD_FAILED = 4 # OFPT_PORT_MOD failed.
+OFPET_QUEUE_OP_FAILED = 5 # Queue operation failed.
+
+# enum ofp_hello_failed_code
+OFPHFC_INCOMPATIBLE = 0 # No compatible version.
+OFPHFC_EPERM = 1 # Permissions error.
+
+# enum ofp_bad_request_code
+OFPBRC_BAD_VERSION = 0 # ofp_header.version not supported.
+OFPBRC_BAD_TYPE = 1 # ofp_header.type not supported.
+OFPBRC_BAD_STAT = 2 # ofp_stats_msg.type not supported.
+OFPBRC_BAD_VENDOR = 3 # Vendor not supported (in ofp_vendor_header
+ # or ofp_stats_msg).
+OFPBRC_BAD_SUBTYPE = 4 # Vendor subtype not supported.
+OFPBRC_EPERM = 5 # Permissions error.
+OFPBRC_BAD_LEN = 6 # Wrong request length for type.
+OFPBRC_BUFFER_EMPTY = 7 # Specified buffer has already been used.
+OFPBRC_BUFFER_UNKNOWN = 8 # Specified buffer does not exist.
+
+# enum ofp_bad_action_code
+OFPBAC_BAD_TYPE = 0 # Unknown action type.
+OFPBAC_BAD_LEN = 1 # Length problem in actions.
+OFPBAC_BAD_VENDOR = 2 # Unknown vendor id specified.
+OFPBAC_BAD_VENDOR_TYPE = 3 # Unknown action type for vendor id.
+OFPBAC_BAD_OUT_PORT = 4 # Problem validating output action.
+OFPBAC_BAD_ARGUMENT = 5 # Bad action argument.
+OFPBAC_EPERM = 6 # Permissions error.
+OFPBAC_TOO_MANY = 7 # Can't handle this many actions.
+OFPBAC_BAD_QUEUE = 8 # Problem validating output queue.
+
+# enum ofp_flow_mod_failed_code
+OFPFMFC_ALL_TABLES_FULL = 0 # Flow not added because of full tables.
+OFPFMFC_OVERLAP = 1 # Attempted to add overlapping flow with
+ # CHECK_OVERLAP flags set.
+OFPFMFC_EPERM = 2 # Permissions error.
+OFPFMFC_BAD_EMERG_TIMEOUT = 3 # Flow not added because of non-zero idle/hard
+ # timeout.
+OFPFMFC_BAD_COMMAND = 4 # Unknown command.
+OFPFMFC_UNSUPPORTED = 5 # Unsupported action list - cannot process in
+ # the order specified.
+
+# enum ofp_port_mod_failed_code
+OFPPMFC_BAD_PORT = 0 # Specified port does not exist.
+OFPPMFC_BAD_HW_ADDR = 1 # Specified hardware address is wrong.
+
+# enum ofp_queue_op_failed_code
+OFPQOFC_BAD_PORT = 0 # Invalid port (or port does not exist).
+OFPQOFC_BAD_QUEUE = 1 # Queue does not exist.
+OFPQOFC_EPERM = 2 # Permissions error.
+
+OFP_ERROR_MSG_PACK_STR = '!HH'
+OFP_ERROR_MSG_SIZE = 12
+assert calcsize(OFP_ERROR_MSG_PACK_STR) + OFP_HEADER_SIZE == OFP_ERROR_MSG_SIZE
+
+# enum ofp_stats_types
+OFPST_DESC = 1
+OFPST_FLOW = 2
+OFPST_AGGREGATE = 3
+OFPST_TABLE = 4
+OFPST_PORT = 5
+OFPST_QUEUE = 6
+OFPST_VENDOR = 0xffff
+
+_OFP_STATS_MSG_PACK_STR = 'HH'
+OFP_STATS_MSG_PACK_STR = '!' + _OFP_STATS_MSG_PACK_STR
+OFP_STATS_MSG_SIZE = 12
+assert calcsize(OFP_STATS_MSG_PACK_STR) + OFP_HEADER_SIZE == OFP_STATS_MSG_SIZE
+
+# enum ofp_stats_reply_flags
+OFPSF_REPLY_MORE = 1 << 0 # More replies to follow.
+
+# define constants
+DESC_STR_LEN = 256
+DESC_STR_LEN_STR = str(DESC_STR_LEN)
+SERIAL_NUM_LEN = 32
+SERIAL_NUM_LEN_STR = str(SERIAL_NUM_LEN)
+
+OFP_DESC_STATS_PACK_STR = '!' + \
+ DESC_STR_LEN_STR + 'c' + \
+ DESC_STR_LEN_STR + 'c' + \
+ DESC_STR_LEN_STR + 'c' + \
+ SERIAL_NUM_LEN_STR + 'c' + \
+ DESC_STR_LEN_STR + 'c'
+OFP_DESC_STATS_SIZE = 1068
+assert (calcsize(OFP_DESC_STATS_PACK_STR) + OFP_STATS_MSG_SIZE ==
+ OFP_DESC_STATS_SIZE)
+
+OFP_FLOW_STATS_REQUEST_PACK_STR = '!' + _OFP_MATCH_PACK_STR + 'BxH'
+OFP_FLOW_STATS_REQUEST_SIZE = 56
+assert (calcsize(OFP_FLOW_STATS_REQUEST_PACK_STR) + OFP_STATS_MSG_SIZE ==
+ OFP_FLOW_STATS_REQUEST_SIZE)
+
+OFP_FLOW_STATS_PACK_STR = '!HBx' + _OFP_MATCH_PACK_STR + 'IIHHH6xQQQ'
+OFP_FLOW_STATS_SIZE = 88
+assert calcsize(OFP_FLOW_STATS_PACK_STR) == OFP_FLOW_STATS_SIZE
+
+OFP_AGGREGATE_STATS_REPLY_PACK_STR = '!QQI4x'
+OFP_AGGREGATE_STATS_REPLY_SIZE = 36
+assert (calcsize(OFP_AGGREGATE_STATS_REPLY_PACK_STR) +
+ OFP_STATS_MSG_SIZE == OFP_AGGREGATE_STATS_REPLY_SIZE)
+
+OFP_TABLE_STATS_PACK_STR = '!B3x' + OFP_MAX_TABLE_NAME_LEN_STR + 'cIIIQQ'
+OFP_TABLE_STATS_SIZE = 64
+assert calcsize(OFP_TABLE_STATS_PACK_STR) == OFP_TABLE_STATS_SIZE
+
+OFP_PORT_STATS_REQUEST_PACK_STR = '!H6x'
+OFP_PORT_STATS_REQUEST_SIZE = 20
+assert (calcsize(OFP_PORT_STATS_REQUEST_PACK_STR) + OFP_STATS_MSG_SIZE ==
+ OFP_PORT_STATS_REQUEST_SIZE)
+
+OFP_PORT_STATS_PACK_STR = '!H6xQQQQQQQQQQQQ'
+OFP_PORT_STATS_SIZE = 104
+assert calcsize(OFP_PORT_STATS_PACK_STR) == OFP_PORT_STATS_SIZE
+
+OFPQ_ALL = 0xffffffff
+
+OFP_QUEUE_STATS_PACK_STR = '!H2xIQQQ'
+OFP_QUEUE_STATS_SIZE = 32
+assert calcsize(OFP_QUEUE_STATS_PACK_STR) == OFP_QUEUE_STATS_SIZE
+
+OFP_VENDOR_STATS_MSG_PACK_STR = '!I'
+OFP_VENDOR_STATS_MSG_SIZE = 16
+assert (calcsize(OFP_VENDOR_STATS_MSG_PACK_STR) + OFP_STATS_MSG_SIZE ==
+ OFP_VENDOR_STATS_MSG_SIZE)
+
+OFP_VENDOR_HEADER_PACK_STR = '!I'
+OFP_VENDOR_HEADER_SIZE = 12
+assert (calcsize(OFP_VENDOR_HEADER_PACK_STR) + OFP_HEADER_SIZE ==
+ OFP_VENDOR_HEADER_SIZE)
diff --git a/ryu/ofproto/ofproto_v1_0_parser.py b/ryu/ofproto/ofproto_v1_0_parser.py
new file mode 100644
index 00000000..e1fdc6a9
--- /dev/null
+++ b/ryu/ofproto/ofproto_v1_0_parser.py
@@ -0,0 +1,542 @@
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import collections
+import struct
+
+from . import ofproto_parser
+from . import ofproto_v1_0
+
+import logging
+LOG = logging.getLogger('ryu.ofproto.ofproto_v1_0_parser')
+
+_MSG_PARSERS = {}
+
+
+def _set_msg_type(msg_type):
+ def _set_cls_msg_type(cls):
+ cls.cls_msg_type = msg_type
+ return cls
+ return _set_cls_msg_type
+
+
+def _register_parser(cls):
+ '''class decorator to register msg parser'''
+ assert cls.cls_msg_type is not None
+ assert cls.cls_msg_type not in _MSG_PARSERS
+ _MSG_PARSERS[cls.cls_msg_type] = cls.parser
+ return cls
+
+
+@ofproto_parser.register_msg_parser(ofproto_v1_0.OFP_VERSION)
+def msg_parser(datapath, version, msg_type, msg_len, xid, buf):
+ parser = _MSG_PARSERS.get(msg_type)
+ return parser(datapath, version, msg_type, msg_len, xid, buf)
+
+
+class MsgBase(object):
+ def __init__(self, datapath):
+ self.datapath = datapath
+ self.version = None
+ self.msg_type = None
+ self.msg_len = None
+ self.xid = None
+ self.buf = None
+
+ def set_headers(self, version, msg_type, msg_len, xid):
+ assert msg_type == self.cls_msg_type
+
+ self.version = version
+ self.msg_type = msg_type
+ self.msg_len = msg_len
+ self.xid = xid
+
+ def set_buf(self, buf):
+ self.buf = buffer(buf)
+
+ def __str__(self):
+ return 'version: 0x%x msg_type 0x%x xid 0x%x' % (self.version,
+ self.msg_type,
+ self.xid)
+
+ @classmethod
+ def parser(cls, datapath, version, msg_type, msg_len, xid, buf):
+ msg = cls(datapath)
+ msg.set_headers(version, msg_type, msg_len, xid)
+ msg.set_buf(buf)
+ return msg
+
+ def _serialize_pre(self):
+ assert self.version is None
+ assert self.msg_type is None
+ assert self.buf is None
+
+ self.version = ofproto_v1_0.OFP_VERSION
+ self.msg_type = self.cls_msg_type
+ self.buf = bytearray().zfill(ofproto_v1_0.OFP_HEADER_SIZE)
+
+ def _serialize_header(self):
+ # buffer length is determined after trailing data is formated.
+ assert self.version is not None
+ assert self.msg_type is not None
+ assert self.msg_len is None
+ assert self.xid is None
+ assert self.buf is not None
+ assert len(self.buf) >= ofproto_v1_0.OFP_HEADER_SIZE
+
+ self.msg_len = len(self.buf)
+ self.xid = 0 # TODO:XXX
+
+ struct.pack_into(ofproto_v1_0.OFP_HEADER_PACK_STR, self.buf, 0,
+ self.version, self.msg_type, self.msg_len, self.xid)
+
+ def _serialize_body(self):
+ pass
+
+ def serialize(self):
+ self._serialize_pre()
+ self._serialize_body()
+ self._serialize_header()
+
+
+def _pack_into(fmt, buf, offset, *args):
+ if len(buf) < offset:
+ buf += bytearray().zfill(offset - len(buf))
+
+ if len(buf) == offset:
+ buf += struct.pack(fmt, *args)
+ return
+
+ needed_len = offset + struct.calcsize(fmt)
+ if len(buf) < needed_len:
+ buf += bytearray().zfill(needed_len - len(buf))
+
+ struct.pack_into(fmt, buf, offset, *args)
+
+
+def _str_attr(msg, buf, attr_list):
+ for attr in attr_list:
+ val = getattr(msg, attr, None)
+ if val is not None:
+ buf += ' %s %s' % (attr, val)
+
+ return buf
+
+
+#
+# common structures
+#
+
+class OFPPhyPort(collections.namedtuple('OFPPhyPort', (
+ 'port_no', 'hw_addr', 'name', 'config', 'state', 'curr', 'advertised',
+ 'supported', 'peer'))):
+
+ @classmethod
+ def parser(cls, buf, offset):
+ port = struct.unpack_from(ofproto_v1_0.OFP_PHY_PORT_PACK_STR,
+ buf, offset)
+ return cls(*port)
+
+
+class OFPMatch(collections.namedtuple('OFPMatchBase', (
+ 'wildcards', 'in_port', 'dl_src', 'dl_dst', 'dl_vlan',
+ 'dl_vlan_pcp', 'dl_type', 'nw_tos', 'nw_proto',
+ 'nw_src', 'nw_dst', 'tp_src', 'tp_dst'))):
+
+ def serialize(self, buf, offset):
+ _pack_into(ofproto_v1_0.OFP_MATCH_PACK_STR, buf, offset, *self)
+
+ @classmethod
+ def parse(cls, buf, offset):
+ match = struct.unpack_from(ofproto_v1_0.OFP_MATCH_PACK_STR,
+ buf, offset)
+ return cls(*match)
+
+
+class OFPActionHeader(object):
+ def __init__(self, type, len):
+ self.type = type
+ self.len = len
+
+ def serlize(self, buf, offset):
+ _pack_into(ofproto_v1_0.OFP_ACTION_HEADER_PACK_STR,
+ buf, offset, self.type, self.len)
+
+
+class OFPActionOutput(OFPActionHeader):
+ def __init__(self, port, max_len=0):
+ super(OFPActionOutput,
+ self).__init__(ofproto_v1_0.OFPAT_OUTPUT,
+ ofproto_v1_0.OFP_ACTION_OUTPUT_LEN)
+ self.port = port
+ self.max_len = max_len
+
+ def serialize(self, buf, offset):
+ _pack_into(ofproto_v1_0.OFP_ACTION_OUTPUT_PACK_STR,
+ buf, offset, self.type, self.len, self.port, self.max_len)
+
+
+# TODO:XXX more actions
+
+
+#
+# Symmetric messages
+# parser + serializer
+#
+
+
+@_register_parser
+@_set_msg_type(ofproto_v1_0.OFPT_HELLO)
+class OFPHello(MsgBase):
+ def __init__(self, datapath):
+ super(OFPHello, self).__init__(datapath)
+
+
+@_register_parser
+@_set_msg_type(ofproto_v1_0.OFPT_ERROR)
+class OFPErrorMsg(MsgBase):
+ def __init__(self, datapath):
+ super(OFPErrorMsg, self).__init__(datapath)
+ self.type = None
+ self.code = None
+ self.data = None
+
+ @classmethod
+ def parser(cls, datapath, version, msg_type, msg_len, xid, buf):
+ msg = super(OFPErrorMsg, cls).parser(datapath, version, msg_type,
+ msg_len, xid, buf)
+ msg.type, msg.code = struct.unpack_from(
+ ofproto_v1_0.OFP_ERROR_MSG_PACK_STR, msg.buf,
+ ofproto_v1_0.OFP_HEADER_SIZE)
+ msg.data = msg.buf[ofproto_v1_0.OFP_ERROR_MSG_SIZE:]
+ return msg
+
+ def _serialize_body(self):
+ assert self.data is not None
+ _pack_into(ofproto_v1_0.OFP_ERROR_MSG_PACK_STR, self.buf,
+ ofproto_v1_0.OFP_HEADER_SIZE, self.type, self.code)
+ self.buf += self.data
+
+
+@_register_parser
+@_set_msg_type(ofproto_v1_0.OFPT_ECHO_REQUEST)
+class OFPEchoRequest(MsgBase):
+ def __init__(self, datapath):
+ super(OFPEchoRequest, self).__init__(datapath)
+ self.data = None
+
+ @classmethod
+ def parser(cls, datapath, version, msg_type, msg_len, xid, buf):
+ msg = super(OFPEchoRequest, cls).parser(datapath, version, msg_type,
+ msg_len, xid, buf)
+ msg.data = msg.buf[ofproto_v1_0.OFP_HEADER_SIZE:]
+ return msg
+
+ def _serialize_body(self):
+ assert self.data is not None
+ self.buf += self.data
+
+
+@_register_parser
+@_set_msg_type(ofproto_v1_0.OFPT_ECHO_REPLY)
+class OFPEchoReply(MsgBase):
+ def __init__(self, datapath):
+ super(OFPEchoReply, self).__init__(datapath)
+ self.data = None
+
+ @classmethod
+ def parser(cls, datapath, version, msg_type, msg_len, xid, buf):
+ msg = super(OFPEchoReply, cls).parser(datapath, version, msg_type,
+ msg_len, xid, buf)
+ msg.data = msg.buf[ofproto_v1_0.OFP_HEADER_SIZE:]
+ return msg
+
+ def _serialize_body(self):
+ assert self.data is not None
+ self.buf += self.data
+
+
+@_register_parser
+@_set_msg_type(ofproto_v1_0.OFPT_VENDOR)
+class OFPVendor(MsgBase):
+ def __init__(self, datapath):
+ super(OFPVendor, self).__init__(datapath)
+ self.data = None
+
+ @classmethod
+ def parser(cls, datapath, version, msg_type, msg_len, xid, buf):
+ msg = super(OFPVendor, cls).parser(datapath, version, msg_type,
+ msg_len, xid, buf)
+ msg.vendor = struct.unpack_from(
+ ofproto_v1_0.OFP_VENDOR_HEADER_PACK_STR, msg.buf,
+ ofproto_v1_0.OFP_HEADER_SIZE)
+ msg.data = msg.buf[ofproto_v1_0.OFP_VENDOR_HEADER_SIZE:]
+ return msg
+
+ def _serialize_body(self):
+ assert self.data is not None
+ _pack_into(ofproto_v1_0.OFP_VENDOR_HEADER_PACK_STR,
+ self.buf, ofproto_v1_0.OFP_HEADER_SIZE, self.vendor)
+ self.buf += self.data
+
+
+#
+# asymmetric message (datapath -> controller)
+# parser only
+#
+
+
+@_register_parser
+@_set_msg_type(ofproto_v1_0.OFPT_FEATURES_REPLY)
+class OFPSwitchFeatures(MsgBase):
+ def __init__(self, datapath):
+ super(OFPSwitchFeatures, self).__init__(datapath)
+
+ def __str__(self):
+ buf = super(OFPSwitchFeatures, self).__str__() + ' port'
+ for port_no, p in getattr(self, 'ports', {}).items():
+ buf += ' ' + str(p)
+ return buf
+
+ @classmethod
+ def parser(cls, datapath, version, msg_type, msg_len, xid, buf):
+ msg = super(OFPSwitchFeatures, cls).parser(datapath, version, msg_type,
+ msg_len, xid, buf)
+ (msg.datapath_id,
+ msg.n_buffers,
+ msg.n_tables,
+ msg.capabilities,
+ msg.actions) = struct.unpack_from(
+ ofproto_v1_0.OFP_SWITCH_FEATURES_PACK_STR, msg.buf,
+ ofproto_v1_0.OFP_HEADER_SIZE)
+
+ msg.ports = {}
+ n_ports = ((msg_len - ofproto_v1_0.OFP_SWITCH_FEATURES_SIZE) /
+ ofproto_v1_0.OFP_PHY_PORT_SIZE)
+ offset = ofproto_v1_0.OFP_SWITCH_FEATURES_SIZE
+ for i in range(n_ports):
+ port = OFPPhyPort.parser(msg.buf, offset)
+ # print 'port = %s' % str(port)
+ msg.ports[port.port_no] = port
+ offset += ofproto_v1_0.OFP_PHY_PORT_SIZE
+
+ return msg
+
+
+@_register_parser
+@_set_msg_type(ofproto_v1_0.OFPT_PORT_STATUS)
+class OFPPortStatus(MsgBase):
+ def __init__(self, datapath):
+ super(OFPPortStatus, self).__init__(datapath)
+
+ @classmethod
+ def parser(cls, datapath, version, msg_type, msg_len, xid, buf):
+ msg = super(OFPPortStatus, cls).parser(datapath, version, msg_type,
+ msg_len, xid, buf)
+ msg.reason = struct.unpack_from(
+ ofproto_v1_0.OFP_PORT_STATUS_PACK_STR,
+ msg.buf, ofproto_v1_0.OFP_HEADER_SIZE)[0]
+ msg.desc = OFPPhyPort.parser(msg.buf,
+ ofproto_v1_0.OFP_PORT_STATUS_DESC_OFFSET)
+ return msg
+
+
+@_register_parser
+@_set_msg_type(ofproto_v1_0.OFPT_PACKET_IN)
+class OFPPacketIn(MsgBase):
+ def __init__(self, datapath):
+ super(OFPPacketIn, self).__init__(datapath)
+
+ def __str__(self):
+ buf = super(OFPPacketIn, self).__str__()
+ return _str_attr(self, buf,
+ ('buffer_id', 'total_len', 'in_port', 'reason'))
+
+ @classmethod
+ def parser(cls, datapath, version, msg_type, msg_len, xid, buf):
+ msg = super(OFPPacketIn, cls).parser(datapath, version, msg_type,
+ msg_len, xid, buf)
+ (msg.buffer_id,
+ msg.total_len,
+ msg.in_port,
+ msg.reason) = struct.unpack_from(
+ ofproto_v1_0.OFP_PACKET_IN_PACK_STR,
+ msg.buf, ofproto_v1_0.OFP_HEADER_SIZE)
+ msg.data = msg.buf[ofproto_v1_0.OFP_PACKET_IN_DATA_OFFSET:]
+ return msg
+
+
+@_register_parser
+@_set_msg_type(ofproto_v1_0.OFPT_GET_CONFIG_REPLY)
+class OFPSwitchConfig(MsgBase):
+ def __init__(self, datapath):
+ super(OFPSwitchConfig, self).__init__(datapath)
+
+ @classmethod
+ def parser(cls, datapath, version, msg_type, msg_len, xid, buf):
+ msg = super(OFPSwitchConfig, cls).parser(datapath, version, msg_type,
+ msg_len, xid, buf)
+ (msg.flags, msg.miss_send_len) = struct.unpack_from(
+ ofproto_v1_0.OFP_SWITCH_CONFIG_PACK_STR,
+ msg.buf, ofproto_v1_0.OFP_HEADER_SIZE)
+ return msg
+
+
+@_register_parser
+@_set_msg_type(ofproto_v1_0.OFPT_BARRIER_REPLY)
+class OFPBarrierReply(MsgBase):
+ def __init__(self, datapath):
+ super(OFPBarrierReply, self).__init__(datapath)
+
+
+@_register_parser
+@_set_msg_type(ofproto_v1_0.OFPT_FLOW_REMOVED)
+class OFPFlowRemoved(MsgBase):
+ def __init__(self, datapath):
+ super(OFPFlowRemoved, self).__init__(datapath)
+
+ def __str__(self):
+ buf = super(OFPFlowRemoved, self).__str__()
+ return _str_attr(self, buf,
+ ('match', 'cookie', 'priority', 'reason',
+ 'duration_sec', 'duration_nsec',
+ 'idle_timeout', 'packet_count', 'idle_count'))
+
+ @classmethod
+ def parser(cls, datapath, version, msg_type, msg_len, xid, buf):
+ msg = super(OFPFlowRemoved, cls).parser(datapath, version, msg_type,
+ msg_len, xid, buf)
+
+ msg.match = OFPMatch.parse(msg.buf, ofproto_v1_0.OFP_HEADER_SIZE)
+
+ (msg.cookie,
+ msg.priority,
+ msg.reason,
+ msg.duration_sec,
+ msg.duration_nsec,
+ msg.idle_timeout,
+ msg.packet_count,
+ msg.byte_count) = struct.unpack_from(
+ ofproto_v1_0.OFP_FLOW_REMOVED_PACK_STR0, msg.buf,
+ ofproto_v1_0.OFP_HEADER_SIZE + ofproto_v1_0.OFP_MATCH_SIZE)
+
+ return msg
+
+#
+# controller-to-switch message
+# serializer only
+#
+
+
+@_set_msg_type(ofproto_v1_0.OFPT_FEATURES_REQUEST)
+class OFPFeaturesRequest(MsgBase):
+ def __init__(self, datapath):
+ super(OFPFeaturesRequest, self).__init__(datapath)
+
+
+@_set_msg_type(ofproto_v1_0.OFPT_GET_CONFIG_REQUEST)
+class OFPGetConfigRequest(MsgBase):
+ def __init__(self, datapath):
+ super(OFPGetConfigRequest, self).__init__(datapath)
+
+
+@_set_msg_type(ofproto_v1_0.OFPT_SET_CONFIG)
+class OFPSetConfig(MsgBase):
+ def __init__(self, datapath, flags=None, miss_send_len=None):
+ super(OFPSetConfig, self).__init__(datapath)
+ self.flags = flags
+ self.miss_send_len = miss_send_len
+
+ def _serialize_body(self):
+ assert self.flags is not None
+ assert self.miss_send_len is not None
+ _pack_into(ofproto_v1_0.OFP_SWITCH_CONFIG_PACK_STR,
+ self.buf, ofproto_v1_0.OFP_HEADER_SIZE,
+ self.flags, self.miss_send_len)
+
+
+@_set_msg_type(ofproto_v1_0.OFPT_PACKET_OUT)
+class OFPPacketOut(MsgBase):
+ def __init__(self, datapath, buffer_id=None, in_port=None, actions=None,
+ data=None):
+ super(OFPPacketOut, self).__init__(datapath)
+ self.buffer_id = buffer_id
+ self.in_port = in_port
+ self.actions_len = None
+ self.actions = actions
+ self.data = data
+
+ def _serialize_body(self):
+ assert self.buffer_id is not None
+ assert self.in_port is not None
+ assert self.actions_len is None
+ assert self.actions is not None
+
+ self.actions_len = 0
+ offset = ofproto_v1_0.OFP_PACKET_OUT_SIZE
+ for a in self.actions:
+ a.serialize(self.buf, offset)
+ offset += a.len
+ self.actions_len += a.len
+
+ if self.data is not None:
+ assert self.buffer_id == -1
+ self.buf += self.data
+
+ _pack_into(ofproto_v1_0.OFP_PACKET_OUT_PACK_STR,
+ self.buf, ofproto_v1_0.OFP_HEADER_SIZE,
+ self.buffer_id, self.in_port, self.actions_len)
+
+
+@_set_msg_type(ofproto_v1_0.OFPT_FLOW_MOD)
+class OFPFlowMod(MsgBase):
+ def __init__(self, datapath, match=None, cookie=None,
+ command=None, idle_timeout=None, hard_timeout=None,
+ priority=None, buffer_id=None, out_port=None,
+ flags=None, actions=None):
+ super(OFPFlowMod, self).__init__(datapath)
+ self.match = match
+ self.cookie = cookie
+ self.command = command
+ self.idle_timeout = idle_timeout
+ self.hard_timeout = hard_timeout
+ self.priority = priority
+ self.buffer_id = buffer_id
+ self.out_port = out_port
+ self.flags = flags
+ self.actions = actions
+
+ def _serialize_body(self):
+ offset = ofproto_v1_0.OFP_HEADER_SIZE
+ self.match.serialize(self.buf, offset)
+
+ offset += ofproto_v1_0.OFP_MATCH_SIZE
+ _pack_into(ofproto_v1_0.OFP_FLOW_MOD_PACK_STR0, self.buf, offset,
+ self.cookie, self.command,
+ self.idle_timeout, self.hard_timeout,
+ self.priority, self.buffer_id, self.out_port,
+ self.flags)
+
+ offset = ofproto_v1_0.OFP_FLOW_MOD_SIZE
+ if self.actions is not None:
+ for a in self.actions:
+ a.serialize(self.buf, offset)
+ offset += a.len
+
+
+@_set_msg_type(ofproto_v1_0.OFPT_BARRIER_REQUEST)
+class OFPBarrierRequest(MsgBase):
+ def __init__(self, datapath):
+ super(OFPBarrierRequest, self).__init__(datapath)
diff --git a/ryu/utils.py b/ryu/utils.py
new file mode 100644
index 00000000..c3f3fe52
--- /dev/null
+++ b/ryu/utils.py
@@ -0,0 +1,62 @@
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import inspect
+import logging
+import os
+import sys
+
+LOG = logging.getLogger('ryu.utils')
+
+def import_module(modname):
+ (f, s, t) = modname.rpartition('.')
+ mod = __import__(modname, fromlist=[f])
+ return mod
+
+
+def import_object(modname):
+ try:
+ return import_module(modname)
+ except ImportError:
+ (from_mod, sep, target) = modname.rpartition('.')
+ mod = import_module(from_mod)
+ return getattr(mod, target)
+
+
+RYU_DEFAULT_FLAG_FILE = ('ryu.conf', 'etc/ryu/ryu.conf' '/etc/ryu/ryu.conf')
+
+
+def find_flagfile(default_path=RYU_DEFAULT_FLAG_FILE):
+ if '--flagfile' in sys.argv:
+ return
+
+ script_dir = os.path.dirname(inspect.stack()[-1][1])
+
+ for filename in RYU_DEFAULT_FLAG_FILE:
+ if not os.path.abspath(filename):
+ if os.path.exists(filename):
+ # try relative to current path
+ filename = os.path.abspath(filename)
+ elif os.path.exists(os.path.join(script_dir, filename)):
+ # try relative to script dir
+ filename = os.path.join(script_dir, filename)
+
+ if not os.path.exists(filename):
+ continue
+
+ flagfile = '--flagfile=%s' % filename
+ sys.argv.insert(1, flagfile)
+ LOG.debug('flagfile = %s', filename)
+ return
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 00000000..46409041
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1 @@
+# TODO
diff --git a/setup.py b/setup.py
new file mode 100644
index 00000000..41583033
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,38 @@
+# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
+# Copyright (C) 2011 Isaku Yamahata <yamahata at valinux co jp>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, version 3 of the License.
+#
+# This program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import os
+
+from setuptools import find_packages
+from setuptools import setup
+
+README = os.path.join(os.path.dirname(__file__), 'README.rst')
+long_description = open(README).read() + '\n\n'
+
+setup(name='ryu',
+ version='0.1',
+ description=("Ryu Network Operating System"),
+ long_description=long_description,
+ keywords='openflow openvswitch openstack',
+ url='http://www.osrg.net/ryu/',
+# author='',
+ autor_email='ryu-devel@lists.sourceforge.net',
+ license='GPL v3 only',
+ packages=find_packages(),
+ scripts=['bin/ryu-manager',
+ 'bin/ryu-client'],
+ data_files=[('etc/ryu', ['etc/ryu/ryu.conf'])],
+# install_requires=[]
+ )