{"id":2377,"date":"2013-07-03T11:54:06","date_gmt":"2013-07-03T11:54:06","guid":{"rendered":"http:\/\/www.cloudcomp.ch\/?p=2377"},"modified":"2013-07-03T11:54:06","modified_gmt":"2013-07-03T11:54:06","slug":"a-learning-switch-in-openflow-1-3","status":"publish","type":"post","link":"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/","title":{"rendered":"A learning Switch in OpenFlow 1.3"},"content":{"rendered":"<p>So this is our second post about a learning Switch and as promised, it covers OpenFlow 1.3. Before we go into the details, this is what you should already know about SDN and OpenFlow:<\/p>\n<ul>\n<li><span style=\"line-height: 13px\">General SDN\u00a0Paradigm, otherwise go and read <a href=\"http:\/\/www.cloudcomp.ch\/2012\/09\/an-introduction-to-software-defined-networking-sdn\/\" target=\"_blank\">this<\/a><\/span><\/li>\n<li>A common understanding about what OpenFlow is in contrast to SDN<\/li>\n<li>What a simple <a href=\"http:\/\/www.cloudcomp.ch\/2012\/10\/openflow-setting-up-a-learning-switch\/\" target=\"_blank\">learning switch<\/a> is<\/li>\n<\/ul>\n<p>What we are\u00a0discussing in this post is the simple switch implementation that comes out of the\u00a0<a href=\"https:\/\/github.com\/FlowForwarding\/LINC-Switch\" target=\"_blank\">LINC &#8211; OpenFlow software switch<\/a> project as well as some basic principals from the latest OpenFlow Protocol (OFP) specification made by the Open Networking Foundation (ONF). One of the most important things you should know about OFP 1.3.x is the so called &#8220;table pipe-lining&#8221;. In previous versions of OFP there was a FlowTable in an OpenFlow enabled switch and that table stored the logic of how\u00a0traffic flows through the network. Furthermore, a SDN-Controller jumps into the game when a packet that arrives at the switch doesn&#8217;t\u00a0match any of the entries in the FlowTable. If this happens, we call it a &#8220;table-miss&#8221; and the switch sends the packet to the SDN-Controller. Now consider the following: In OpenFlow 1.3.x you not only have\u00a0one FlowTable in an OpenFlow enabled switch,\u00a0but there\u00a0are as many FlowTables as the switch supports and the process how this multiple FlowTables are handled by OpenFlow is called the &#8220;table pipe-lining&#8221;. The inital behaviour isn&#8217;t that much different. If the packet arrives at the switch, the packet is always compared to\u00a0the FlowTableEntries in the first the &#8211; table-0.<\/p>\n<p><!--more--><\/p>\n<p>If this table-0 contains a FlowTableEntry that matches against the packet, the instruction set of this\u00a0packet will be updated, but not executed. There are different instructions defined in the OFP specification that can be applied but only two of them a switch must support:<\/p>\n<ul>\n<li>Write Action<\/li>\n<li>GOTO-next-table<\/li>\n<\/ul>\n<p>When a packet matches a FlowTableEntry and this entry contains a write-action instruction but no goto instruction, the process of the table pipe-lining stops and the action from the write-action instruction is executed. That is usually an output-action. But if the entry also contains a\u00a0goto instruction, the action-set of the packet will be updated. After this, the packet goes to the table specified by the goto instruction and the process starts again until there is no more\u00a0goto instruction or the packet arrives at the last table-n. When one of this two events occurs, the complete action-set is executed. This process is visualized in the picture below.<\/p>\n<figure id=\"attachment_2808\" aria-describedby=\"caption-attachment-2808\" style=\"width: 300px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/blog.zhaw.ch\/icclab\/files\/2013\/07\/table-pipeline.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-2808\" alt=\"table-pipeline\" src=\"http:\/\/blog.zhaw.ch\/icclab\/files\/2013\/07\/table-pipeline-300x85.png\" width=\"300\" height=\"85\" srcset=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2013\/07\/table-pipeline-300x85.png 300w, https:\/\/blog.zhaw.ch\/icclab\/files\/2013\/07\/table-pipeline-1024x290.png 1024w, https:\/\/blog.zhaw.ch\/icclab\/files\/2013\/07\/table-pipeline-1000x288.png 1000w, https:\/\/blog.zhaw.ch\/icclab\/files\/2013\/07\/table-pipeline-500x141.png 500w, https:\/\/blog.zhaw.ch\/icclab\/files\/2013\/07\/table-pipeline.png 1511w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-2808\" class=\"wp-caption-text\">Figure 1: Illustration of the table pipe-lining from the OFP 1.3<\/figcaption><\/figure>\n<p>Moreover, there can be some metadata added\u00a0to the packet from table to table but that is material for a next post. The next thing we have to look at is the &#8220;table-miss&#8221; behavior in OFP1.3. In previous versions, when there was no matching FlowTableEntry for a packet, the packet was automatically sent to the SDN-Controller. In OFP1.3 the packet is dropped, yes right, you gonna loose it forever. What you have to do by yourself\u00a0is to install a FlowTableEntry with an &#8220;empty-match&#8221; and a priority of &#8220;0&#8221;. Usually, this FlowTableEntry contains a write-action instruction with a output-action that points to the SDN-Controller. But of course, a more complex &#8220;table-miss&#8221; behavior is possible. That&#8217;s all you have to know for the learning OpenFlow 1.3 switch.\u00a0For this we gonna use the code from the LINC switch as mentioned in the beginning of this post. You can find the code of the L2-switch <a href=\"https:\/\/github.com\/FlowForwarding\/LINC-Switch\/blob\/master\/scripts\/ryu\/l2_switch_v1_3.py\" target=\"_blank\">here<\/a>\u00a0in the LINC-switch repository on GitHub. The code is written in python and can be used along with the <a href=\"http:\/\/osrg.github.io\/ryu\/\" target=\"_blank\">RYU<\/a> SDN-Controller.<\/p>\n<p>The general structure of the L2 Switch application is as follows:<\/p>\n<p><!--\n.post ol li {padding:5px 5px 5px 20px;}\n--><\/p>\n<ul>\n<li><span style=\"line-height: 13px\">The application can react to\u00a0two OpenFlow events: OFPSwitchFeatures which\u00a0is raised every time a new switch comes up and\u00a0OFPPacketIn which is raised every time a packet hits a &#8220;table-miss&#8221; FlowEntry<\/span><\/li>\n<li>Four methods to send OFP messages,\u00a0install_table_miss,\u00a0install_src_entry,\u00a0install_dst_entry and flood<\/li>\n<li>Some helper-methods for cleaner code<\/li>\n<\/ul>\n<p>Every time a new switch appears, the\u00a0OFPSwitchFeatures event is raised. The application installs in this method a table-miss FlowEntry in table-0 and table-1. The table-miss FlowEntry is as discussed before, a FlowTableEntry with an empty match and a priority of 0 &#8211; that is by the way the lowest existing priority. Now consider the following situtation: two hosts, host-1 and host-2, are connected to one switch and they want to start to communicate to each other. host-1 sends a ping to host-2:<\/p>\n<ol>\n<li>The packet arrives at the switch -&gt; there is no matching FlowTableEntry for host-1 in table-0 thus, the table-miss entry will match and send the packet to the controller (OFPPacketIn)\n<ul style=\"padding: auto\">\n<li>The controller checks if the packet is coming from table-0.<\/li>\n<li>If the packet is coming from table-0, the controller installs two FlowTableEntries. Keep in mind, that this packet contains two important information&#8217;s: The in_port and the MAC-address from host-1. The two Entries that will be installed are doing the following:\n<ul>\n<li>Entry one is installed in table-0 and matches every packet that has the in-port and the Source-MAC-address from host-1. The only action is a GOTO-action to table-1.<\/li>\n<li>Entry two is installed in table-1 and matches every packet\u00a0that has the Destination-MAC-address from host-1. The action for this entry is an output-action on the Port where host-1 is connected to.<\/li>\n<\/ul>\n<\/li>\n<li>Since the controller doesn&#8217;t know the recipient host-2, the controller performs a flood of the packet<\/li>\n<\/ul>\n<\/li>\n<li>host-2 receives the ping from host-1 and sends a response as answer of the ping.<\/li>\n<li>The packet arrives at the switch -&gt; still, there is no matching FlowTableEntry for host-2 in table-0 thus, the\u00a0the table-miss entry will match and send the packet to the controller (OFPPacketIn)\n<ul>\n<li>The controller checks if the packet is coming from table-0. The controller performs the exact same steps as before but with the in-port and the MAC-address from host-2\n<ul>\n<li>Entry one is installed in table-0 and matches every packet that has the in-port and the Source-MAC-address from host-2. The only action is a GOTO-action to table-1.<\/li>\n<li>Entry two is installed in table-1 and matches every packet\u00a0that has the Destination-MAC-address from host-2. The action for this entry is an output-action on the Port where host-2 is connected to.<\/li>\n<\/ul>\n<\/li>\n<li>Since the controller don&#8217;t know the recipient host-2, the controller performs a flood of the packet<\/li>\n<\/ul>\n<\/li>\n<li>If host-1 now sends a second packet to host-2, the FlowTableEntry in table-0 will match\n<ul>\n<li>The FlowTableEntry that matches is the one who says: If the in-port and the Source-MAC-address is the one from host-1, GOTO table-1<\/li>\n<li>In table-1 is a FlowTableEntry that says: If the packet has the Destination-MAC-address of host-2, send it out on the port where host-2 is connected to<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h3>Discussion<\/h3>\n<p>In the simple learning switch from the previous blog post we had to store the MAC-address associated with the in-ports in a python-dict in the controller. This is not necessary anymore because this information is now stored in table-0 of the device itself. Furthermore there is a possibility to make a more complex processing of the packets. Table-0 can be seen as the table of the known hosts and table-1 contains the actual forwarding logic. If you want now to add some more changes to a packet like QoS settings, you can forward the packet first to a table that updates the instruction-set of the packet with QoS related actions. If this is done, add a GOTO-action to the table that applies the forwarding logic. The table pipe-lining gives the network-programmers a very powerful processing without asking every time the SDN-controller what kind of actions needs to be applied to it.<\/p>\n<h3>Whats next?<\/h3>\n<p>As usual, there are lot more things you should look at about OFP1.3. For instance the how the metadata information works that can be passed between the tables or which FlowTableEntry is applied if multiple Entries match in one table. The best thing at the moment is: Go and read the OFP specification and check out SDN applications build for OFP1.3 and learn by example. The SDN-controller and also SDN-applications the ICCLab can recommend is the <a href=\"http:\/\/osrg.github.io\/ryu\/\" target=\"_blank\">RYU<\/a> controller.<\/p>\n<div class=\"pt-sm\">Schlagw\u00f6rter: <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/sdn\/\">SDN<\/a><br><\/div>","protected":false},"excerpt":{"rendered":"<p>So this is our second post about a learning Switch and as promised, it covers OpenFlow 1.3. Before we go into the details, this is what you should already know about SDN and OpenFlow: General SDN\u00a0Paradigm, otherwise go and read this A common understanding about what OpenFlow is in contrast to SDN What a simple [&hellip;]<\/p>\n","protected":false},"author":77,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[1],"tags":[293],"features":[],"class_list":["post-2377","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-sdn"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>A learning Switch in OpenFlow 1.3 - Service Engineering (ICCLab &amp; SPLab)<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"A learning Switch in OpenFlow 1.3\" \/>\n<meta property=\"og:description\" content=\"So this is our second post about a learning Switch and as promised, it covers OpenFlow 1.3. Before we go into the details, this is what you should already know about SDN and OpenFlow: General SDN\u00a0Paradigm, otherwise go and read this A common understanding about what OpenFlow is in contrast to SDN What a simple [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/\" \/>\n<meta property=\"og:site_name\" content=\"Service Engineering (ICCLab &amp; SPLab)\" \/>\n<meta property=\"article:published_time\" content=\"2013-07-03T11:54:06+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/blog.zhaw.ch\/icclab\/files\/2013\/07\/table-pipeline-300x85.png\" \/>\n<meta name=\"author\" content=\"aepp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"aepp\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/\"},\"author\":{\"name\":\"aepp\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/c20de5cec176301c9c02b3c2299cb413\"},\"headline\":\"A learning Switch in OpenFlow 1.3\",\"datePublished\":\"2013-07-03T11:54:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/\"},\"wordCount\":1366,\"commentCount\":1,\"image\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/blog.zhaw.ch\/icclab\/files\/2013\/07\/table-pipeline-300x85.png\",\"keywords\":[\"SDN\"],\"articleSection\":[\"*.*\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/\",\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/\",\"name\":\"A learning Switch in OpenFlow 1.3 - Service Engineering (ICCLab &amp; SPLab)\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/blog.zhaw.ch\/icclab\/files\/2013\/07\/table-pipeline-300x85.png\",\"datePublished\":\"2013-07-03T11:54:06+00:00\",\"author\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/c20de5cec176301c9c02b3c2299cb413\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/#primaryimage\",\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/files\/2013\/07\/table-pipeline.png\",\"contentUrl\":\"https:\/\/blog.zhaw.ch\/icclab\/files\/2013\/07\/table-pipeline.png\",\"width\":1511,\"height\":429},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\/\/blog.zhaw.ch\/icclab\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"A learning Switch in OpenFlow 1.3\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#website\",\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/\",\"name\":\"Service Engineering (ICCLab &amp; SPLab)\",\"description\":\"A Blog of the ZHAW Zurich University of Applied Sciences\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.zhaw.ch\/icclab\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/c20de5cec176301c9c02b3c2299cb413\",\"name\":\"aepp\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/ebbf60d8764e660fb8b3af74447019e2b124e803016fdd2a48f8492e93cfe320?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/ebbf60d8764e660fb8b3af74447019e2b124e803016fdd2a48f8492e93cfe320?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/ebbf60d8764e660fb8b3af74447019e2b124e803016fdd2a48f8492e93cfe320?s=96&d=mm&r=g\",\"caption\":\"aepp\"},\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/author\/aepp\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"A learning Switch in OpenFlow 1.3 - Service Engineering (ICCLab &amp; SPLab)","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/","og_locale":"en_US","og_type":"article","og_title":"A learning Switch in OpenFlow 1.3","og_description":"So this is our second post about a learning Switch and as promised, it covers OpenFlow 1.3. Before we go into the details, this is what you should already know about SDN and OpenFlow: General SDN\u00a0Paradigm, otherwise go and read this A common understanding about what OpenFlow is in contrast to SDN What a simple [&hellip;]","og_url":"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/","og_site_name":"Service Engineering (ICCLab &amp; SPLab)","article_published_time":"2013-07-03T11:54:06+00:00","og_image":[{"url":"http:\/\/blog.zhaw.ch\/icclab\/files\/2013\/07\/table-pipeline-300x85.png","type":"","width":"","height":""}],"author":"aepp","twitter_card":"summary_large_image","twitter_misc":{"Written by":"aepp","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/#article","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/"},"author":{"name":"aepp","@id":"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/c20de5cec176301c9c02b3c2299cb413"},"headline":"A learning Switch in OpenFlow 1.3","datePublished":"2013-07-03T11:54:06+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/"},"wordCount":1366,"commentCount":1,"image":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/#primaryimage"},"thumbnailUrl":"http:\/\/blog.zhaw.ch\/icclab\/files\/2013\/07\/table-pipeline-300x85.png","keywords":["SDN"],"articleSection":["*.*"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/","url":"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/","name":"A learning Switch in OpenFlow 1.3 - Service Engineering (ICCLab &amp; SPLab)","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/#primaryimage"},"image":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/#primaryimage"},"thumbnailUrl":"http:\/\/blog.zhaw.ch\/icclab\/files\/2013\/07\/table-pipeline-300x85.png","datePublished":"2013-07-03T11:54:06+00:00","author":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/c20de5cec176301c9c02b3c2299cb413"},"breadcrumb":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/#primaryimage","url":"https:\/\/blog.zhaw.ch\/icclab\/files\/2013\/07\/table-pipeline.png","contentUrl":"https:\/\/blog.zhaw.ch\/icclab\/files\/2013\/07\/table-pipeline.png","width":1511,"height":429},{"@type":"BreadcrumbList","@id":"https:\/\/blog.zhaw.ch\/icclab\/a-learning-switch-in-openflow-1-3\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/blog.zhaw.ch\/icclab\/"},{"@type":"ListItem","position":2,"name":"A learning Switch in OpenFlow 1.3"}]},{"@type":"WebSite","@id":"https:\/\/blog.zhaw.ch\/icclab\/#website","url":"https:\/\/blog.zhaw.ch\/icclab\/","name":"Service Engineering (ICCLab &amp; SPLab)","description":"A Blog of the ZHAW Zurich University of Applied Sciences","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.zhaw.ch\/icclab\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/c20de5cec176301c9c02b3c2299cb413","name":"aepp","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/ebbf60d8764e660fb8b3af74447019e2b124e803016fdd2a48f8492e93cfe320?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/ebbf60d8764e660fb8b3af74447019e2b124e803016fdd2a48f8492e93cfe320?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ebbf60d8764e660fb8b3af74447019e2b124e803016fdd2a48f8492e93cfe320?s=96&d=mm&r=g","caption":"aepp"},"url":"https:\/\/blog.zhaw.ch\/icclab\/author\/aepp\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts\/2377","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/users\/77"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/comments?post=2377"}],"version-history":[{"count":0,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts\/2377\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/media?parent=2377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/categories?post=2377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/tags?post=2377"},{"taxonomy":"features","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/features?post=2377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}