diff options
author | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2011-12-09 15:56:05 +0900 |
---|---|---|
committer | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2011-12-09 15:56:05 +0900 |
commit | aa5051a162c496c3beaef0cef24c720f78305eea (patch) | |
tree | 91242f799b1c166d3e9e765475b9a6e36c3608ac |
initial commit
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
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 Binary files differnew file mode 100644 index 00000000..16e0386a --- /dev/null +++ b/doc/source/images/assoc-ovs-port.png 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 Binary files differnew file mode 100644 index 00000000..50efa04f --- /dev/null +++ b/doc/source/images/compute-node.png 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 Binary files differnew file mode 100644 index 00000000..08dd7b1c --- /dev/null +++ b/doc/source/images/filtering-broadcast.png 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 Binary files differnew file mode 100644 index 00000000..5151b540 --- /dev/null +++ b/doc/source/images/filtering-incoming.png 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 Binary files differnew file mode 100644 index 00000000..c7495929 --- /dev/null +++ b/doc/source/images/filtering-outgoing.png 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 Binary files differnew file mode 100644 index 00000000..f3a87bbf --- /dev/null +++ b/doc/source/images/logical-view.png 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 Binary files differnew file mode 100644 index 00000000..cdd0f7b3 --- /dev/null +++ b/doc/source/images/mac-learning.png 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 Binary files differnew file mode 100644 index 00000000..67f52f78 --- /dev/null +++ b/doc/source/images/minimul-setup.png 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 Binary files differnew file mode 100644 index 00000000..d2fe033f --- /dev/null +++ b/doc/source/images/network-creation.png 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 Binary files differnew file mode 100644 index 00000000..33354379 --- /dev/null +++ b/doc/source/images/physical-view.png 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 Binary files differnew file mode 100644 index 00000000..694cf1c9 --- /dev/null +++ b/doc/source/images/trace-route.png 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=[] + ) |