trema 0.2.3 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +87 -13
 - data/ruby/trema/barrier-reply.c +1 -3
 - data/ruby/trema/controller.rb +165 -3
 - data/ruby/trema/get-config-reply.c +6 -8
 - data/ruby/trema/link.rb +2 -2
 - data/ruby/trema/openflow-error.c +2 -4
 - data/ruby/trema/queue-get-config-reply.c +3 -5
 - data/ruby/trema/send-out-port.rb +29 -18
 - data/ruby/trema/set-eth-addr.rb +1 -1
 - data/ruby/trema/set-ip-addr.rb +1 -1
 - data/ruby/trema/set-ip-tos.rb +1 -1
 - data/ruby/trema/set-transport-port.rb +1 -1
 - data/ruby/trema/switch-daemon.rb +18 -7
 - data/ruby/trema/vendor.c +1 -1
 - data/ruby/trema/version.rb +1 -3
 - data/spec/trema/barrier-request_spec.rb +2 -4
 - data/spec/trema/controller_spec.rb +0 -2
 - data/spec/trema/get-config-reply_spec.rb +0 -2
 - data/spec/trema/get-config-request_spec.rb +2 -4
 - data/spec/trema/link_spec.rb +2 -4
 - data/spec/trema/openflow-error_spec.rb +13 -15
 - data/spec/trema/set-config_spec.rb +1 -1
 - data/spec/trema/switch-daemon_spec.rb +44 -2
 - data/src/examples/dumper/dumper.rb +15 -16
 - data/src/lib/openflow_message.c +12 -22
 - data/unittests/lib/openflow_message_test.c +6 -12
 - metadata +5 -5
 
    
        data/README.md
    CHANGED
    
    | 
         @@ -17,6 +17,18 @@ testing your own controllers. For debugging, a wireshark plug-in to 
     | 
|
| 
       17 
17 
     | 
    
         
             
            diagnose internal data-flows among functional modules is provided.
         
     | 
| 
       18 
18 
     | 
    
         | 
| 
       19 
19 
     | 
    
         | 
| 
      
 20 
     | 
    
         
            +
            Supported Platforms
         
     | 
| 
      
 21 
     | 
    
         
            +
            -------------------
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            Trema supports GNU/Linux only. And it has been tested on the following environments:
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            * Ubuntu 12.04, 11.10, 11.04, 10.10, and 10.04 (i386/amd64, Desktop Edition)
         
     | 
| 
      
 26 
     | 
    
         
            +
            * Debian GNU/Linux 6.0 (i386/amd64)
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
            It may also run on other GNU/Linux distributions but is not tested and
         
     | 
| 
      
 29 
     | 
    
         
            +
            NOT SUPPORTED at this moment.
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
       20 
32 
     | 
    
         
             
            Getting Started
         
     | 
| 
       21 
33 
     | 
    
         
             
            ---------------
         
     | 
| 
       22 
34 
     | 
    
         | 
| 
         @@ -33,10 +45,84 @@ Getting Started 
     | 
|
| 
       33 
45 
     | 
    
         
             
            * The [Getting Started with Trema](https://github.com/trema/trema/wiki/Quick-start).
         
     | 
| 
       34 
46 
     | 
    
         
             
            * The [Trema in 10 Minutes Tutorial](http://trema-10min.heroku.com/).
         
     | 
| 
       35 
47 
     | 
    
         
             
            * The [Trema Tutorial](http://trema-tutorial.heroku.com/).
         
     | 
| 
       36 
     | 
    
         
            -
            * The [Trema Ruby API documents](http://rubydoc.info/github/trema/trema/master/frames).
         
     | 
| 
       37 
48 
     | 
    
         
             
            * The [Programming Trema Article (in Japanese)](http://gihyo.jp/dev/serial/01/openflow_sd/0007).
         
     | 
| 
       38 
49 
     | 
    
         | 
| 
       39 
50 
     | 
    
         | 
| 
      
 51 
     | 
    
         
            +
            Ruby API
         
     | 
| 
      
 52 
     | 
    
         
            +
            --------
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
            The following is an exerpt from the Trema Ruby API.
         
     | 
| 
      
 55 
     | 
    
         
            +
            The full documents are found here http://rubydoc.info/github/trema/trema/master/frames
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
            ### Event and Message Handlers
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
            Subclass
         
     | 
| 
      
 60 
     | 
    
         
            +
            [Trema::Controller](http://rubydoc.info/github/trema/trema/master/Trema/Controller)
         
     | 
| 
      
 61 
     | 
    
         
            +
            and override some of the following methods to implement your own
         
     | 
| 
      
 62 
     | 
    
         
            +
            controller.
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
            * [switch_ready(datapath_id)](http://rubydoc.info/github/trema/trema/master/Trema/Controller:switch_ready)
         
     | 
| 
      
 65 
     | 
    
         
            +
            * [switch_disconnected(datapath_id)](http://rubydoc.info/github/trema/trema/master/Trema/Controller:switch_disconnected)
         
     | 
| 
      
 66 
     | 
    
         
            +
            * [packet_in(datapath_id, message)](http://rubydoc.info/github/trema/trema/master/Trema/Controller:packet_in)
         
     | 
| 
      
 67 
     | 
    
         
            +
            * [flow_removed(datapath_id, message)](http://rubydoc.info/github/trema/trema/master/Trema/Controller:flow_removed)
         
     | 
| 
      
 68 
     | 
    
         
            +
            * [port_status(datapath_id, message)](http://rubydoc.info/github/trema/trema/master/Trema/Controller:port_status)
         
     | 
| 
      
 69 
     | 
    
         
            +
            * [openflow_error(datapath_id, message)](http://rubydoc.info/github/trema/trema/master/Trema/Controller:openflow_error)
         
     | 
| 
      
 70 
     | 
    
         
            +
            * [features_reply(datapath_id, message)](http://rubydoc.info/github/trema/trema/master/Trema/Controller:features_reply)
         
     | 
| 
      
 71 
     | 
    
         
            +
            * [stats_reply(datapath_id, message)](http://rubydoc.info/github/trema/trema/master/Trema/Controller:stats_reply)
         
     | 
| 
      
 72 
     | 
    
         
            +
            * [barrier_reply(datapath_id, message)](http://rubydoc.info/github/trema/trema/master/Trema/Controller:barrier_reply)
         
     | 
| 
      
 73 
     | 
    
         
            +
            * [get_config_reply(datapath_id, message)](http://rubydoc.info/github/trema/trema/master/Trema/Controller:get_config_reply)
         
     | 
| 
      
 74 
     | 
    
         
            +
            * [queue_get_config_reply(datapath_id, message)](http://rubydoc.info/github/trema/trema/master/Trema/Controller:queue_get_config_reply)
         
     | 
| 
      
 75 
     | 
    
         
            +
            * [vendor(datapath_id, message)](http://rubydoc.info/github/trema/trema/master/Trema/Controller:vendor)
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
            ### Flow-Mod and Packet-Out
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
            For sending Flow-Mod and Packet-Out, there are some methods defined in
         
     | 
| 
      
 80 
     | 
    
         
            +
            [Trema::Controller](http://rubydoc.info/github/trema/trema/master/Trema/Controller)
         
     | 
| 
      
 81 
     | 
    
         
            +
            class.
         
     | 
| 
      
 82 
     | 
    
         
            +
             
     | 
| 
      
 83 
     | 
    
         
            +
            * [send_flow_mod_add(datapath_id, options)](http://rubydoc.info/github/trema/trema/master/Trema/Controller:send_flow_mod_add)
         
     | 
| 
      
 84 
     | 
    
         
            +
            * [send_flow_mod_delete(datapath_id, options)](http://rubydoc.info/github/trema/trema/master/Trema/Controller:send_flow_mod_delete)
         
     | 
| 
      
 85 
     | 
    
         
            +
            * [send_flow_mod_modify(datapath_id, options)](http://rubydoc.info/github/trema/trema/master/Trema/Controller:send_flow_mod_modify)
         
     | 
| 
      
 86 
     | 
    
         
            +
            * [send_packet_out(datapath_id, options)](http://rubydoc.info/github/trema/trema/master/Trema/Controller:send_packet_out)
         
     | 
| 
      
 87 
     | 
    
         
            +
             
     | 
| 
      
 88 
     | 
    
         
            +
            ### Other OpenFlow Messages
         
     | 
| 
      
 89 
     | 
    
         
            +
             
     | 
| 
      
 90 
     | 
    
         
            +
            The following OpenFlow messages can be sent with
         
     | 
| 
      
 91 
     | 
    
         
            +
            [Trema::Controller#send_message](http://rubydoc.info/github/trema/trema/master/Trema/Controller:send_message)
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
            * [Trema::FeaturesRequest](http://rubydoc.info/github/trema/trema/master/Trema/FeaturesRequest)
         
     | 
| 
      
 94 
     | 
    
         
            +
            * [Trema::SetConfigRequest](http://rubydoc.info/github/trema/trema/master/Trema/SetConfigRequest)
         
     | 
| 
      
 95 
     | 
    
         
            +
            * [Trema::GetConfigRequest](http://rubydoc.info/github/trema/trema/master/Trema/GetConfigRequest)
         
     | 
| 
      
 96 
     | 
    
         
            +
            * [Trema::QueueGetConfigRequest](http://rubydoc.info/github/trema/trema/master/Trema/QueueGetConfigRequest)
         
     | 
| 
      
 97 
     | 
    
         
            +
            * [Trema::DescStatsRequest](http://rubydoc.info/github/trema/trema/master/Trema/DescStatsRequest)
         
     | 
| 
      
 98 
     | 
    
         
            +
            * [Trema::FlowStatsRequest](http://rubydoc.info/github/trema/trema/master/Trema/FlowStatsRequest)
         
     | 
| 
      
 99 
     | 
    
         
            +
            * [Trema::AggregateStatsRequest](http://rubydoc.info/github/trema/trema/master/Trema/AggregateStatsRequest)
         
     | 
| 
      
 100 
     | 
    
         
            +
            * [Trema::TableStatsRequest](http://rubydoc.info/github/trema/trema/master/Trema/TableStatsRequest)
         
     | 
| 
      
 101 
     | 
    
         
            +
            * [Trema::PortStatsRequest](http://rubydoc.info/github/trema/trema/master/Trema/PortStatsRequest)
         
     | 
| 
      
 102 
     | 
    
         
            +
            * [Trema::QueueStatsRequest](http://rubydoc.info/github/trema/trema/master/Trema/QueueStatsRequest)
         
     | 
| 
      
 103 
     | 
    
         
            +
            * [Trema::VendorStatsRequest](http://rubydoc.info/github/trema/trema/master/Trema/VendorStatsRequest)
         
     | 
| 
      
 104 
     | 
    
         
            +
            * [Trema::BarrierRequest](http://rubydoc.info/github/trema/trema/master/Trema/BarrierRequest)
         
     | 
| 
      
 105 
     | 
    
         
            +
            * [Trema::PortMod](http://rubydoc.info/github/trema/trema/master/Trema/PortMod)
         
     | 
| 
      
 106 
     | 
    
         
            +
            * [Trema::Vendor](http://rubydoc.info/github/trema/trema/master/Trema/Vendor)
         
     | 
| 
      
 107 
     | 
    
         
            +
             
     | 
| 
      
 108 
     | 
    
         
            +
            ### Actions
         
     | 
| 
      
 109 
     | 
    
         
            +
             
     | 
| 
      
 110 
     | 
    
         
            +
            Each flow table entry contains a list of actions that will be executed when a packet matches the entry.
         
     | 
| 
      
 111 
     | 
    
         
            +
             
     | 
| 
      
 112 
     | 
    
         
            +
            * [Trema::SendOutPort](http://rubydoc.info/github/trema/trema/master/Trema/SendOutPort)
         
     | 
| 
      
 113 
     | 
    
         
            +
            * [Trema::SetEthSrcAddr](http://rubydoc.info/github/trema/trema/master/Trema/SetEthSrcAddr)
         
     | 
| 
      
 114 
     | 
    
         
            +
            * [Trema::SetEthDstAddr](http://rubydoc.info/github/trema/trema/master/Trema/SetEthDstAddr)
         
     | 
| 
      
 115 
     | 
    
         
            +
            * [Trema::SetIpSrcAddr](http://rubydoc.info/github/trema/trema/master/Trema/SetIpSrcAddr)
         
     | 
| 
      
 116 
     | 
    
         
            +
            * [Trema::SetIpDstAddr](http://rubydoc.info/github/trema/trema/master/Trema/SetIpDstAddr)
         
     | 
| 
      
 117 
     | 
    
         
            +
            * [Trema::SetIpTos](http://rubydoc.info/github/trema/trema/master/Trema/SetIpTos)
         
     | 
| 
      
 118 
     | 
    
         
            +
            * [Trema::SetTransportSrcPort](http://rubydoc.info/github/trema/trema/master/Trema/SetTransportSrcPort)
         
     | 
| 
      
 119 
     | 
    
         
            +
            * [Trema::SetTransportDstPort](http://rubydoc.info/github/trema/trema/master/Trema/SetTransportDstPort)
         
     | 
| 
      
 120 
     | 
    
         
            +
            * [Trema::SetVlanVid](http://rubydoc.info/github/trema/trema/master/Trema/SetVlanVid)
         
     | 
| 
      
 121 
     | 
    
         
            +
            * [Trema::SetVlanPriority](http://rubydoc.info/github/trema/trema/master/Trema/SetVlanPriority)
         
     | 
| 
      
 122 
     | 
    
         
            +
            * [Trema::StripVlanHeader](http://rubydoc.info/github/trema/trema/master/Trema/StripVlanHeader)
         
     | 
| 
      
 123 
     | 
    
         
            +
            * [Trema::VendorAction](http://rubydoc.info/github/trema/trema/master/Trema/VendorAction)
         
     | 
| 
      
 124 
     | 
    
         
            +
             
     | 
| 
      
 125 
     | 
    
         
            +
             
     | 
| 
       40 
126 
     | 
    
         
             
            Meta
         
     | 
| 
       41 
127 
     | 
    
         
             
            ----
         
     | 
| 
       42 
128 
     | 
    
         | 
| 
         @@ -46,18 +132,6 @@ Meta 
     | 
|
| 
       46 
132 
     | 
    
         
             
            * Twitter: http://twitter.com/trema_news
         
     | 
| 
       47 
133 
     | 
    
         | 
| 
       48 
134 
     | 
    
         | 
| 
       49 
     | 
    
         
            -
            Supported Platforms
         
     | 
| 
       50 
     | 
    
         
            -
            -------------------
         
     | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
            Trema has been tested ONLY on the following environments:
         
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
            * Ubuntu 12.04, 11.10, 11.04, 10.10, and 10.04 (i386/amd64, Desktop Edition)
         
     | 
| 
       55 
     | 
    
         
            -
            * Debian GNU/Linux 6.0 (i386/amd64)
         
     | 
| 
       56 
     | 
    
         
            -
             
     | 
| 
       57 
     | 
    
         
            -
            It may also run on other GNU/Linux distributions but is not tested and
         
     | 
| 
       58 
     | 
    
         
            -
            NOT SUPPORTED at this moment.
         
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
       61 
135 
     | 
    
         
             
            Contributors
         
     | 
| 
       62 
136 
     | 
    
         
             
            ------------
         
     | 
| 
       63 
137 
     | 
    
         | 
    
        data/ruby/trema/barrier-reply.c
    CHANGED
    
    | 
         @@ -1,6 +1,4 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            /*
         
     | 
| 
       2 
     | 
    
         
            -
             * Author: Nick Karanatsios <nickkaranatsios@gmail.com>
         
     | 
| 
       3 
     | 
    
         
            -
             *
         
     | 
| 
       4 
2 
     | 
    
         
             
             * Copyright (C) 2008-2012 NEC Corporation
         
     | 
| 
       5 
3 
     | 
    
         
             
             *
         
     | 
| 
       6 
4 
     | 
    
         
             
             * This program is free software; you can redistribute it and/or modify
         
     | 
| 
         @@ -87,7 +85,7 @@ handle_barrier_reply( uint64_t datapath_id, uint32_t transaction_id, void *user_ 
     | 
|
| 
       87 
85 
     | 
    
         
             
              }
         
     | 
| 
       88 
86 
     | 
    
         | 
| 
       89 
87 
     | 
    
         
             
              VALUE barrier_reply = rb_funcall( cBarrierReply, rb_intern( "new" ), 2, ULL2NUM( datapath_id ), UINT2NUM( transaction_id ) );
         
     | 
| 
       90 
     | 
    
         
            -
              rb_funcall( controller, rb_intern( "barrier_reply" ),  
     | 
| 
      
 88 
     | 
    
         
            +
              rb_funcall( controller, rb_intern( "barrier_reply" ), 2, ULL2NUM( datapath_id ), barrier_reply );
         
     | 
| 
       91 
89 
     | 
    
         
             
            }
         
     | 
| 
       92 
90 
     | 
    
         | 
| 
       93 
91 
     | 
    
         | 
    
        data/ruby/trema/controller.rb
    CHANGED
    
    | 
         @@ -25,7 +25,7 @@ require "trema/timers" 
     | 
|
| 
       25 
25 
     | 
    
         | 
| 
       26 
26 
     | 
    
         
             
            module Trema
         
     | 
| 
       27 
27 
     | 
    
         
             
              #
         
     | 
| 
       28 
     | 
    
         
            -
              # The base class of Trema controller.
         
     | 
| 
      
 28 
     | 
    
         
            +
              # @abstract The base class of Trema controller. Subclass and override handlers to implement a custom OpenFlow controller.
         
     | 
| 
       29 
29 
     | 
    
         
             
              #
         
     | 
| 
       30 
30 
     | 
    
         
             
              class Controller < App
         
     | 
| 
       31 
31 
     | 
    
         
             
                include Logger
         
     | 
| 
         @@ -33,14 +33,176 @@ module Trema 
     | 
|
| 
       33 
33 
     | 
    
         | 
| 
       34 
34 
     | 
    
         | 
| 
       35 
35 
     | 
    
         
             
                #
         
     | 
| 
       36 
     | 
    
         
            -
                #  
     | 
| 
       37 
     | 
    
         
            -
                # 
     | 
| 
      
 36 
     | 
    
         
            +
                # @private Just a placeholder for YARD.
         
     | 
| 
      
 37 
     | 
    
         
            +
                #
         
     | 
| 
      
 38 
     | 
    
         
            +
                def self.handler name
         
     | 
| 
      
 39 
     | 
    
         
            +
                  # Do nothing.
         
     | 
| 
      
 40 
     | 
    
         
            +
                end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                #
         
     | 
| 
      
 44 
     | 
    
         
            +
                # @!method switch_ready( datapath_id )
         
     | 
| 
      
 45 
     | 
    
         
            +
                #
         
     | 
| 
      
 46 
     | 
    
         
            +
                # @abstract Switch Ready event handler. Override this to implement a custom handler.
         
     | 
| 
      
 47 
     | 
    
         
            +
                #
         
     | 
| 
      
 48 
     | 
    
         
            +
                # @param [Integer] datapath_id
         
     | 
| 
      
 49 
     | 
    
         
            +
                #   the datapath ID of connected OpenFlow switch.
         
     | 
| 
      
 50 
     | 
    
         
            +
                #
         
     | 
| 
      
 51 
     | 
    
         
            +
                handler :switch_ready
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                #
         
     | 
| 
      
 55 
     | 
    
         
            +
                # @!method switch_disconnected( datapath_id )
         
     | 
| 
      
 56 
     | 
    
         
            +
                #
         
     | 
| 
      
 57 
     | 
    
         
            +
                # @abstract Switch Disconnected event handler. Override this to implement a custom handler.
         
     | 
| 
      
 58 
     | 
    
         
            +
                #
         
     | 
| 
      
 59 
     | 
    
         
            +
                # @param [Integer] datapath_id
         
     | 
| 
      
 60 
     | 
    
         
            +
                #   the datapath ID of disconnected OpenFlow switch.
         
     | 
| 
      
 61 
     | 
    
         
            +
                #
         
     | 
| 
      
 62 
     | 
    
         
            +
                handler :switch_disconnected
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
                #
         
     | 
| 
      
 66 
     | 
    
         
            +
                # @!method packet_in( datapath_id, message )
         
     | 
| 
      
 67 
     | 
    
         
            +
                #
         
     | 
| 
      
 68 
     | 
    
         
            +
                # @abstract Packet In message handler. Override this to implement a custom handler.
         
     | 
| 
      
 69 
     | 
    
         
            +
                #
         
     | 
| 
      
 70 
     | 
    
         
            +
                # @param [Integer] datapath_id
         
     | 
| 
      
 71 
     | 
    
         
            +
                #   the datapath from which a message is sent.
         
     | 
| 
      
 72 
     | 
    
         
            +
                # @param [PacketIn] message
         
     | 
| 
      
 73 
     | 
    
         
            +
                #   the Packet In message.
         
     | 
| 
      
 74 
     | 
    
         
            +
                #
         
     | 
| 
      
 75 
     | 
    
         
            +
                handler :packet_in
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
                #
         
     | 
| 
      
 79 
     | 
    
         
            +
                # @!method flow_removed( datapath_id, message )
         
     | 
| 
      
 80 
     | 
    
         
            +
                #
         
     | 
| 
      
 81 
     | 
    
         
            +
                # @abstract Flow Removed message handler. Override this to implement a custom handler.
         
     | 
| 
      
 82 
     | 
    
         
            +
                #
         
     | 
| 
      
 83 
     | 
    
         
            +
                # @param [Integer] datapath_id
         
     | 
| 
      
 84 
     | 
    
         
            +
                #   the datapath from which a message is sent.
         
     | 
| 
      
 85 
     | 
    
         
            +
                # @param [FlowRemoved] message
         
     | 
| 
      
 86 
     | 
    
         
            +
                #   the Flow Removed message.
         
     | 
| 
      
 87 
     | 
    
         
            +
                #
         
     | 
| 
      
 88 
     | 
    
         
            +
                handler :flow_removed
         
     | 
| 
      
 89 
     | 
    
         
            +
             
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
                #
         
     | 
| 
      
 92 
     | 
    
         
            +
                # @!method port_status( datapath_id, message )
         
     | 
| 
      
 93 
     | 
    
         
            +
                #
         
     | 
| 
      
 94 
     | 
    
         
            +
                # @abstract Port Status message handler. Override this to implement a custom handler.
         
     | 
| 
      
 95 
     | 
    
         
            +
                #
         
     | 
| 
      
 96 
     | 
    
         
            +
                # @param [Integer] datapath_id
         
     | 
| 
      
 97 
     | 
    
         
            +
                #   the datapath from which a message is sent.
         
     | 
| 
      
 98 
     | 
    
         
            +
                # @param [PortStatus] message
         
     | 
| 
      
 99 
     | 
    
         
            +
                #   the Port Status message.
         
     | 
| 
      
 100 
     | 
    
         
            +
                #
         
     | 
| 
      
 101 
     | 
    
         
            +
                handler :port_status
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
      
 103 
     | 
    
         
            +
             
     | 
| 
      
 104 
     | 
    
         
            +
                #
         
     | 
| 
      
 105 
     | 
    
         
            +
                # @!method openflow_error( datapath_id, message )
         
     | 
| 
      
 106 
     | 
    
         
            +
                #
         
     | 
| 
      
 107 
     | 
    
         
            +
                # @abstract OpenFlow Error message handler. Override this to implement a custom handler.
         
     | 
| 
      
 108 
     | 
    
         
            +
                #
         
     | 
| 
      
 109 
     | 
    
         
            +
                # @param [Integer] datapath_id
         
     | 
| 
      
 110 
     | 
    
         
            +
                #   the datapath from which a message is sent.
         
     | 
| 
      
 111 
     | 
    
         
            +
                # @param [OpenflowError] message
         
     | 
| 
      
 112 
     | 
    
         
            +
                #   the OpenFlow Error message.
         
     | 
| 
      
 113 
     | 
    
         
            +
                #
         
     | 
| 
      
 114 
     | 
    
         
            +
                handler :openflow_error
         
     | 
| 
      
 115 
     | 
    
         
            +
             
     | 
| 
      
 116 
     | 
    
         
            +
             
     | 
| 
      
 117 
     | 
    
         
            +
                #
         
     | 
| 
      
 118 
     | 
    
         
            +
                # @!method features_reply( datapath_id, message )
         
     | 
| 
      
 119 
     | 
    
         
            +
                #
         
     | 
| 
      
 120 
     | 
    
         
            +
                # @abstract Features Reply message handler. Override this to implement a custom handler.
         
     | 
| 
      
 121 
     | 
    
         
            +
                #
         
     | 
| 
      
 122 
     | 
    
         
            +
                # @param [Integer] datapath_id
         
     | 
| 
      
 123 
     | 
    
         
            +
                #   the datapath from which a message is sent.
         
     | 
| 
      
 124 
     | 
    
         
            +
                # @param [FeaturesReply] message
         
     | 
| 
      
 125 
     | 
    
         
            +
                #   the Features Reply message.
         
     | 
| 
      
 126 
     | 
    
         
            +
                #
         
     | 
| 
      
 127 
     | 
    
         
            +
                handler :features_reply
         
     | 
| 
      
 128 
     | 
    
         
            +
             
     | 
| 
      
 129 
     | 
    
         
            +
             
     | 
| 
      
 130 
     | 
    
         
            +
                #
         
     | 
| 
      
 131 
     | 
    
         
            +
                # @!method stats_reply( datapath_id, message )
         
     | 
| 
      
 132 
     | 
    
         
            +
                #
         
     | 
| 
      
 133 
     | 
    
         
            +
                # @abstract Stats Reply message handler. Override this to implement a custom handler.
         
     | 
| 
      
 134 
     | 
    
         
            +
                #
         
     | 
| 
      
 135 
     | 
    
         
            +
                # @param [Integer] datapath_id
         
     | 
| 
      
 136 
     | 
    
         
            +
                #   the datapath from which a message is sent.
         
     | 
| 
      
 137 
     | 
    
         
            +
                # @param [StatsReply] message
         
     | 
| 
      
 138 
     | 
    
         
            +
                #   the Stats Reply message.
         
     | 
| 
      
 139 
     | 
    
         
            +
                #
         
     | 
| 
      
 140 
     | 
    
         
            +
                handler :stats_reply
         
     | 
| 
      
 141 
     | 
    
         
            +
             
     | 
| 
      
 142 
     | 
    
         
            +
             
     | 
| 
      
 143 
     | 
    
         
            +
                #
         
     | 
| 
      
 144 
     | 
    
         
            +
                # @!method barrier_reply( datapath_id, message )
         
     | 
| 
      
 145 
     | 
    
         
            +
                #
         
     | 
| 
      
 146 
     | 
    
         
            +
                # @abstract Barrier Reply message handler. Override this to implement a custom handler.
         
     | 
| 
      
 147 
     | 
    
         
            +
                #
         
     | 
| 
      
 148 
     | 
    
         
            +
                # @param [Integer] datapath_id
         
     | 
| 
      
 149 
     | 
    
         
            +
                #   the datapath from which a message is sent.
         
     | 
| 
      
 150 
     | 
    
         
            +
                # @param [BarrierReply] message
         
     | 
| 
      
 151 
     | 
    
         
            +
                #   the Barrier Reply message.
         
     | 
| 
      
 152 
     | 
    
         
            +
                #
         
     | 
| 
      
 153 
     | 
    
         
            +
                handler :barrier_reply
         
     | 
| 
      
 154 
     | 
    
         
            +
             
     | 
| 
      
 155 
     | 
    
         
            +
             
     | 
| 
      
 156 
     | 
    
         
            +
                #
         
     | 
| 
      
 157 
     | 
    
         
            +
                # @!method get_config_reply( datapath_id, message )
         
     | 
| 
      
 158 
     | 
    
         
            +
                #
         
     | 
| 
      
 159 
     | 
    
         
            +
                # @abstract Get Config Reply message handler. Override this to implement a custom handler.
         
     | 
| 
      
 160 
     | 
    
         
            +
                #
         
     | 
| 
      
 161 
     | 
    
         
            +
                # @param [Integer] datapath_id
         
     | 
| 
      
 162 
     | 
    
         
            +
                #   the datapath from which a message is sent.
         
     | 
| 
      
 163 
     | 
    
         
            +
                # @param [GetConfigReply] message
         
     | 
| 
      
 164 
     | 
    
         
            +
                #   the Get Config Reply message.
         
     | 
| 
      
 165 
     | 
    
         
            +
                #
         
     | 
| 
      
 166 
     | 
    
         
            +
                handler :get_config_reply
         
     | 
| 
      
 167 
     | 
    
         
            +
             
     | 
| 
      
 168 
     | 
    
         
            +
             
     | 
| 
      
 169 
     | 
    
         
            +
                #
         
     | 
| 
      
 170 
     | 
    
         
            +
                # @!method queue_get_config_reply( datapath_id, message )
         
     | 
| 
      
 171 
     | 
    
         
            +
                #
         
     | 
| 
      
 172 
     | 
    
         
            +
                # @abstract Queue Get Config Reply message handler. Override this to implement a custom handler.
         
     | 
| 
      
 173 
     | 
    
         
            +
                #
         
     | 
| 
      
 174 
     | 
    
         
            +
                # @param [Integer] datapath_id
         
     | 
| 
      
 175 
     | 
    
         
            +
                #   the datapath from which a message is sent.
         
     | 
| 
      
 176 
     | 
    
         
            +
                # @param [QueueGetConfigReply] message
         
     | 
| 
      
 177 
     | 
    
         
            +
                #   the Queue Get Config Reply message.
         
     | 
| 
      
 178 
     | 
    
         
            +
                #
         
     | 
| 
      
 179 
     | 
    
         
            +
                handler :queue_get_config_reply
         
     | 
| 
      
 180 
     | 
    
         
            +
             
     | 
| 
      
 181 
     | 
    
         
            +
             
     | 
| 
      
 182 
     | 
    
         
            +
                #
         
     | 
| 
      
 183 
     | 
    
         
            +
                # @!method vendor( datapath_id, message )
         
     | 
| 
      
 184 
     | 
    
         
            +
                #
         
     | 
| 
      
 185 
     | 
    
         
            +
                # @abstract Vendor message handler. Override this to implement a custom handler.
         
     | 
| 
      
 186 
     | 
    
         
            +
                #
         
     | 
| 
      
 187 
     | 
    
         
            +
                # @param [Integer] datapath_id
         
     | 
| 
      
 188 
     | 
    
         
            +
                #   the datapath from which a message is sent.
         
     | 
| 
      
 189 
     | 
    
         
            +
                # @param [Vendor] message
         
     | 
| 
      
 190 
     | 
    
         
            +
                #   the Vendor message.
         
     | 
| 
      
 191 
     | 
    
         
            +
                #
         
     | 
| 
      
 192 
     | 
    
         
            +
                handler :vendor
         
     | 
| 
      
 193 
     | 
    
         
            +
             
     | 
| 
      
 194 
     | 
    
         
            +
             
     | 
| 
      
 195 
     | 
    
         
            +
                #
         
     | 
| 
      
 196 
     | 
    
         
            +
                # @private
         
     | 
| 
       38 
197 
     | 
    
         
             
                #
         
     | 
| 
       39 
198 
     | 
    
         
             
                def self.inherited subclass
         
     | 
| 
       40 
199 
     | 
    
         
             
                  subclass.new
         
     | 
| 
       41 
200 
     | 
    
         
             
                end
         
     | 
| 
       42 
201 
     | 
    
         | 
| 
       43 
202 
     | 
    
         | 
| 
      
 203 
     | 
    
         
            +
                #
         
     | 
| 
      
 204 
     | 
    
         
            +
                # @private
         
     | 
| 
      
 205 
     | 
    
         
            +
                #
         
     | 
| 
       44 
206 
     | 
    
         
             
                def initialize
         
     | 
| 
       45 
207 
     | 
    
         
             
                  App.add self
         
     | 
| 
       46 
208 
     | 
    
         
             
                end
         
     | 
| 
         @@ -1,6 +1,4 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            /*
         
     | 
| 
       2 
     | 
    
         
            -
             * Author: Nick Karanatsios <nickkaranatsios@gmail.com>
         
     | 
| 
       3 
     | 
    
         
            -
             *
         
     | 
| 
       4 
2 
     | 
    
         
             
             * Copyright (C) 2008-2012 NEC Corporation
         
     | 
| 
       5 
3 
     | 
    
         
             
             *
         
     | 
| 
       6 
4 
     | 
    
         
             
             * This program is free software; you can redistribute it and/or modify
         
     | 
| 
         @@ -29,12 +27,12 @@ VALUE cGetConfigReply; 
     | 
|
| 
       29 
27 
     | 
    
         
             
            /*
         
     | 
| 
       30 
28 
     | 
    
         
             
             * Handles the response to +OFPT_GET_CONFIG_REQUEST+ message. The user would not
         
     | 
| 
       31 
29 
     | 
    
         
             
             * explicitly instantiate a {GetConfigReply} object but would be created while
         
     | 
| 
       32 
     | 
    
         
            -
             * parsing the +OFPT_GET_CONFIG_REPLY+ message. The {GetConfigReply} object is 
     | 
| 
      
 30 
     | 
    
         
            +
             * parsing the +OFPT_GET_CONFIG_REPLY+ message. The {GetConfigReply} object is
         
     | 
| 
       33 
31 
     | 
    
         
             
             * an object whose attributes represent the return values of the message.
         
     | 
| 
       34 
32 
     | 
    
         
             
             *
         
     | 
| 
       35 
33 
     | 
    
         
             
             * @overload initialize(options={})
         
     | 
| 
       36 
34 
     | 
    
         
             
             *
         
     | 
| 
       37 
     | 
    
         
            -
             *   @example 
     | 
| 
      
 35 
     | 
    
         
            +
             *   @example
         
     | 
| 
       38 
36 
     | 
    
         
             
             *     GetConfigReply.new(
         
     | 
| 
       39 
37 
     | 
    
         
             
             *       :datapath_id => 2748
         
     | 
| 
       40 
38 
     | 
    
         
             
             *       :transaction_id => 1,
         
     | 
| 
         @@ -55,11 +53,11 @@ VALUE cGetConfigReply; 
     | 
|
| 
       55 
53 
     | 
    
         
             
             *     indicates how IP fragments are treated.
         
     | 
| 
       56 
54 
     | 
    
         
             
             *
         
     | 
| 
       57 
55 
     | 
    
         
             
             *   @option options [Number] :miss_send_len
         
     | 
| 
       58 
     | 
    
         
            -
             *     the maximum number of bytes to send on a flow table miss or 
     | 
| 
      
 56 
     | 
    
         
            +
             *     the maximum number of bytes to send on a flow table miss or
         
     | 
| 
       59 
57 
     | 
    
         
             
             *     flow destined to controller.
         
     | 
| 
       60 
58 
     | 
    
         
             
             *
         
     | 
| 
       61 
     | 
    
         
            -
             *   @return [GetConfigReply] 
     | 
| 
       62 
     | 
    
         
            -
             *     an object that encapsulates the +OFPT_GET_CONFIG_REPLY+ OpenFlow message. 
     | 
| 
      
 59 
     | 
    
         
            +
             *   @return [GetConfigReply]
         
     | 
| 
      
 60 
     | 
    
         
            +
             *     an object that encapsulates the +OFPT_GET_CONFIG_REPLY+ OpenFlow message.
         
     | 
| 
       63 
61 
     | 
    
         
             
             */
         
     | 
| 
       64 
62 
     | 
    
         
             
            static VALUE
         
     | 
| 
       65 
63 
     | 
    
         
             
            get_config_reply_init( VALUE self, VALUE options ) {
         
     | 
| 
         @@ -147,7 +145,7 @@ handle_get_config_reply( 
     | 
|
| 
       147 
145 
     | 
    
         
             
              rb_hash_aset( attributes, ID2SYM( rb_intern( "miss_send_len" ) ), UINT2NUM( miss_send_len ) );
         
     | 
| 
       148 
146 
     | 
    
         | 
| 
       149 
147 
     | 
    
         
             
              VALUE get_config_reply = rb_funcall( cGetConfigReply, rb_intern( "new" ), 1, attributes );
         
     | 
| 
       150 
     | 
    
         
            -
              rb_funcall( controller, rb_intern( "get_config_reply" ),  
     | 
| 
      
 148 
     | 
    
         
            +
              rb_funcall( controller, rb_intern( "get_config_reply" ), 2, ULL2NUM( datapath_id ), get_config_reply );
         
     | 
| 
       151 
149 
     | 
    
         
             
            }
         
     | 
| 
       152 
150 
     | 
    
         | 
| 
       153 
151 
     | 
    
         | 
    
        data/ruby/trema/link.rb
    CHANGED
    
    | 
         @@ -98,8 +98,8 @@ module Trema 
     | 
|
| 
       98 
98 
     | 
    
         
             
                def add!
         
     | 
| 
       99 
99 
     | 
    
         
             
                  return if real_eth?
         
     | 
| 
       100 
100 
     | 
    
         
             
                  sh "sudo ip link add name #{ @name } type veth peer name #{ @name_peer }"
         
     | 
| 
       101 
     | 
    
         
            -
                  sh "sudo sysctl -w net.ipv6.conf.#{ @name }.disable_ipv6=1 >/dev/null 2>&1"
         
     | 
| 
       102 
     | 
    
         
            -
                  sh "sudo sysctl -w net.ipv6.conf.#{ @name_peer }.disable_ipv6=1 >/dev/null 2>&1"
         
     | 
| 
      
 101 
     | 
    
         
            +
                  sh "sudo /sbin/sysctl -w net.ipv6.conf.#{ @name }.disable_ipv6=1 >/dev/null 2>&1"
         
     | 
| 
      
 102 
     | 
    
         
            +
                  sh "sudo /sbin/sysctl -w net.ipv6.conf.#{ @name_peer }.disable_ipv6=1 >/dev/null 2>&1"
         
     | 
| 
       103 
103 
     | 
    
         
             
                end
         
     | 
| 
       104 
104 
     | 
    
         | 
| 
       105 
105 
     | 
    
         | 
    
        data/ruby/trema/openflow-error.c
    CHANGED
    
    | 
         @@ -1,6 +1,4 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            /*
         
     | 
| 
       2 
     | 
    
         
            -
             * Author: Nick Karanatsios <nickkaranatsios@gmail.com>
         
     | 
| 
       3 
     | 
    
         
            -
             *
         
     | 
| 
       4 
2 
     | 
    
         
             
             * Copyright (C) 2008-2012 NEC Corporation
         
     | 
| 
       5 
3 
     | 
    
         
             
             *
         
     | 
| 
       6 
4 
     | 
    
         
             
             * This program is free software; you can redistribute it and/or modify
         
     | 
| 
         @@ -28,7 +26,7 @@ VALUE cOpenflowError; 
     | 
|
| 
       28 
26 
     | 
    
         | 
| 
       29 
27 
     | 
    
         
             
            /*
         
     | 
| 
       30 
28 
     | 
    
         
             
             * The occurence of reported errors/exceptions manifested as an instance - a
         
     | 
| 
       31 
     | 
    
         
            -
             * {OpenflowError} object. The user would not explicitly instantiate 
     | 
| 
      
 29 
     | 
    
         
            +
             * {OpenflowError} object. The user would not explicitly instantiate
         
     | 
| 
       32 
30 
     | 
    
         
             
             * a {OpenflowError} but would be created while parsing the +OFPT_ERROR+ message.
         
     | 
| 
       33 
31 
     | 
    
         
             
             *
         
     | 
| 
       34 
32 
     | 
    
         
             
             * @overload initialize(options={})
         
     | 
| 
         @@ -179,7 +177,7 @@ handle_openflow_error( 
     | 
|
| 
       179 
177 
     | 
    
         
             
                  break;
         
     | 
| 
       180 
178 
     | 
    
         
             
              }
         
     | 
| 
       181 
179 
     | 
    
         
             
              VALUE openflow_error = rb_funcall( cOpenflowError, rb_intern( "new" ), 1, attributes );
         
     | 
| 
       182 
     | 
    
         
            -
              rb_funcall( controller, rb_intern( "openflow_error" ),  
     | 
| 
      
 180 
     | 
    
         
            +
              rb_funcall( controller, rb_intern( "openflow_error" ), 2, ULL2NUM( datapath_id ), openflow_error );
         
     | 
| 
       183 
181 
     | 
    
         
             
            }
         
     | 
| 
       184 
182 
     | 
    
         | 
| 
       185 
183 
     | 
    
         | 
| 
         @@ -1,6 +1,4 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            /*
         
     | 
| 
       2 
     | 
    
         
            -
             * Author: Nick Karanatsios <nickkaranatsios@gmail.com>
         
     | 
| 
       3 
     | 
    
         
            -
             *
         
     | 
| 
       4 
2 
     | 
    
         
             
             * Copyright (C) 2008-2012 NEC Corporation
         
     | 
| 
       5 
3 
     | 
    
         
             
             *
         
     | 
| 
       6 
4 
     | 
    
         
             
             * This program is free software; you can redistribute it and/or modify
         
     | 
| 
         @@ -48,7 +46,7 @@ VALUE cQueueGetConfigReply; 
     | 
|
| 
       48 
46 
     | 
    
         
             
             *
         
     | 
| 
       49 
47 
     | 
    
         
             
             *   @option options [Number] :transaction_id
         
     | 
| 
       50 
48 
     | 
    
         
             
             *     value copied from +OPFT_QUEUE_SET_CONFIG_REQUEST+ message.
         
     | 
| 
       51 
     | 
    
         
            -
             * 
     | 
| 
      
 49 
     | 
    
         
            +
             *
         
     | 
| 
       52 
50 
     | 
    
         
             
             *   @option options [Number] :port
         
     | 
| 
       53 
51 
     | 
    
         
             
             *     the port the queue is attached to.
         
     | 
| 
       54 
52 
     | 
    
         
             
             *
         
     | 
| 
         @@ -100,7 +98,7 @@ queue_get_config_reply_port( VALUE self ) { 
     | 
|
| 
       100 
98 
     | 
    
         | 
| 
       101 
99 
     | 
    
         
             
            /*
         
     | 
| 
       102 
100 
     | 
    
         
             
             * An array of {PacketQueue} objects. A packet queue is further classified
         
     | 
| 
       103 
     | 
    
         
            -
             * depending on its properties. Currently only a minimum-rate type queue 
     | 
| 
      
 101 
     | 
    
         
            +
             * depending on its properties. Currently only a minimum-rate type queue
         
     | 
| 
       104 
102 
     | 
    
         
             
             * supported.
         
     | 
| 
       105 
103 
     | 
    
         
             
             *
         
     | 
| 
       106 
104 
     | 
    
         
             
             * @return [Array<PacketQueue>] the value of queues.
         
     | 
| 
         @@ -188,7 +186,7 @@ handle_queue_get_config_reply( 
     | 
|
| 
       188 
186 
     | 
    
         
             
                rb_hash_aset( attributes, ID2SYM( rb_intern( "queues" ) ), rb_eval_string( "PacketQueue.queues" ) );
         
     | 
| 
       189 
187 
     | 
    
         
             
              }
         
     | 
| 
       190 
188 
     | 
    
         
             
              VALUE queue_get_config_reply = rb_funcall( cQueueGetConfigReply, rb_intern( "new" ), 1, attributes );
         
     | 
| 
       191 
     | 
    
         
            -
              rb_funcall( controller, rb_intern( "queue_get_config_reply" ),  
     | 
| 
      
 189 
     | 
    
         
            +
              rb_funcall( controller, rb_intern( "queue_get_config_reply" ), 2, ULL2NUM( datapath_id ), queue_get_config_reply );
         
     | 
| 
       192 
190 
     | 
    
         
             
            }
         
     | 
| 
       193 
191 
     | 
    
         | 
| 
       194 
192 
     | 
    
         | 
    
        data/ruby/trema/send-out-port.rb
    CHANGED
    
    | 
         @@ -25,6 +25,9 @@ module Trema 
     | 
|
| 
       25 
25 
     | 
    
         
             
              # An action to output a packet to a port.
         
     | 
| 
       26 
26 
     | 
    
         
             
              #
         
     | 
| 
       27 
27 
     | 
    
         
             
              class SendOutPort < Action
         
     | 
| 
      
 28 
     | 
    
         
            +
                DEFAULT_MAX_LEN = 2 ** 16 - 1
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
       28 
31 
     | 
    
         
             
                attr_reader :max_len
         
     | 
| 
       29 
32 
     | 
    
         
             
                attr_reader :port_number
         
     | 
| 
       30 
33 
     | 
    
         | 
| 
         @@ -59,29 +62,37 @@ module Trema 
     | 
|
| 
       59 
62 
     | 
    
         
             
                  case options
         
     | 
| 
       60 
63 
     | 
    
         
             
                    when Hash
         
     | 
| 
       61 
64 
     | 
    
         
             
                      @port_number = options[ :port_number ] || options[ :port ]
         
     | 
| 
       62 
     | 
    
         
            -
                      @max_len = options[ :max_len ]
         
     | 
| 
       63 
     | 
    
         
            -
                      if @port_number.nil?
         
     | 
| 
       64 
     | 
    
         
            -
                        raise ArgumentError, ":port_number is a mandatory option"
         
     | 
| 
       65 
     | 
    
         
            -
                      end
         
     | 
| 
       66 
     | 
    
         
            -
                      if not @port_number.unsigned_16bit?
         
     | 
| 
       67 
     | 
    
         
            -
                        raise ArgumentError, "Port number must be an unsigned 16-bit integer"
         
     | 
| 
       68 
     | 
    
         
            -
                      end
         
     | 
| 
       69 
     | 
    
         
            -
                      if @max_len
         
     | 
| 
       70 
     | 
    
         
            -
                        if not @max_len.unsigned_16bit?
         
     | 
| 
       71 
     | 
    
         
            -
                          raise ArgumentError, ":max_len must be an unsigned 16-bit integer"
         
     | 
| 
       72 
     | 
    
         
            -
                        end
         
     | 
| 
       73 
     | 
    
         
            -
                      else
         
     | 
| 
       74 
     | 
    
         
            -
                        @max_len = 2 ** 16 - 1
         
     | 
| 
       75 
     | 
    
         
            -
                      end
         
     | 
| 
      
 65 
     | 
    
         
            +
                      @max_len = options[ :max_len ] || DEFAULT_MAX_LEN
         
     | 
| 
       76 
66 
     | 
    
         
             
                    when Integer
         
     | 
| 
       77 
     | 
    
         
            -
                      if not options.unsigned_16bit?
         
     | 
| 
       78 
     | 
    
         
            -
                        raise ArgumentError, "Port number must be an unsigned 16-bit integer"
         
     | 
| 
       79 
     | 
    
         
            -
                      end
         
     | 
| 
       80 
67 
     | 
    
         
             
                      @port_number = options
         
     | 
| 
       81 
     | 
    
         
            -
                      @max_len =  
     | 
| 
      
 68 
     | 
    
         
            +
                      @max_len = DEFAULT_MAX_LEN
         
     | 
| 
       82 
69 
     | 
    
         
             
                    else
         
     | 
| 
       83 
70 
     | 
    
         
             
                      raise "Invalid option"
         
     | 
| 
       84 
71 
     | 
    
         
             
                  end
         
     | 
| 
      
 72 
     | 
    
         
            +
                  check_port_number
         
     | 
| 
      
 73 
     | 
    
         
            +
                  check_max_len
         
     | 
| 
      
 74 
     | 
    
         
            +
                end
         
     | 
| 
      
 75 
     | 
    
         
            +
              end
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
              ##############################################################################
         
     | 
| 
      
 79 
     | 
    
         
            +
              private
         
     | 
| 
      
 80 
     | 
    
         
            +
              ##############################################################################
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
             
     | 
| 
      
 83 
     | 
    
         
            +
              def check_port_number
         
     | 
| 
      
 84 
     | 
    
         
            +
                if @port_number.nil?
         
     | 
| 
      
 85 
     | 
    
         
            +
                  raise ArgumentError, "Port number is a mandatory option"
         
     | 
| 
      
 86 
     | 
    
         
            +
                end
         
     | 
| 
      
 87 
     | 
    
         
            +
                if not @port_number.unsigned_16bit?
         
     | 
| 
      
 88 
     | 
    
         
            +
                  raise ArgumentError, "Port number must be an unsigned 16-bit integer"
         
     | 
| 
      
 89 
     | 
    
         
            +
                end
         
     | 
| 
      
 90 
     | 
    
         
            +
              end
         
     | 
| 
      
 91 
     | 
    
         
            +
             
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
              def check_max_len
         
     | 
| 
      
 94 
     | 
    
         
            +
                if not @max_len.unsigned_16bit?
         
     | 
| 
      
 95 
     | 
    
         
            +
                  raise ArgumentError, "Max length must be an unsigned 16-bit integer"
         
     | 
| 
       85 
96 
     | 
    
         
             
                end
         
     | 
| 
       86 
97 
     | 
    
         
             
              end
         
     | 
| 
       87 
98 
     | 
    
         | 
    
        data/ruby/trema/set-eth-addr.rb
    CHANGED
    
    
    
        data/ruby/trema/set-ip-addr.rb
    CHANGED
    
    
    
        data/ruby/trema/set-ip-tos.rb
    CHANGED
    
    | 
         @@ -34,7 +34,7 @@ module Trema 
     | 
|
| 
       34 
34 
     | 
    
         
             
                # @example
         
     | 
| 
       35 
35 
     | 
    
         
             
                #   SetIpTos.new(32)
         
     | 
| 
       36 
36 
     | 
    
         
             
                #
         
     | 
| 
       37 
     | 
    
         
            -
                # @param [Integer]  
     | 
| 
      
 37 
     | 
    
         
            +
                # @param [Integer] type_of_service
         
     | 
| 
       38 
38 
     | 
    
         
             
                #   the ToS/DSCP field to set to.
         
     | 
| 
       39 
39 
     | 
    
         
             
                #
         
     | 
| 
       40 
40 
     | 
    
         
             
                # @raise [ArgumentError] if type_of_service argument is not an unsigned 8-bit Integer.
         
     | 
| 
         @@ -22,7 +22,7 @@ require "trema/monkey-patch/integer" 
     | 
|
| 
       22 
22 
     | 
    
         | 
| 
       23 
23 
     | 
    
         
             
            module Trema
         
     | 
| 
       24 
24 
     | 
    
         
             
              #
         
     | 
| 
       25 
     | 
    
         
            -
              #  
     | 
| 
      
 25 
     | 
    
         
            +
              # @abstract The base class of {SetTransportSrcPort} and {SetTransportDstPort} action.
         
     | 
| 
       26 
26 
     | 
    
         
             
              #
         
     | 
| 
       27 
27 
     | 
    
         
             
              class SetTransportPort < Action
         
     | 
| 
       28 
28 
     | 
    
         
             
                attr_reader :port_number
         
     | 
    
        data/ruby/trema/switch-daemon.rb
    CHANGED
    
    | 
         @@ -1,8 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            #
         
     | 
| 
       2 
2 
     | 
    
         
             
            # The controller class of switch daemon.
         
     | 
| 
       3 
3 
     | 
    
         
             
            #
         
     | 
| 
       4 
     | 
    
         
            -
            # Author: Yasuhito Takamiya <yasuhito@gmail.com>
         
     | 
| 
       5 
     | 
    
         
            -
            #
         
     | 
| 
       6 
4 
     | 
    
         
             
            # Copyright (C) 2008-2012 NEC Corporation
         
     | 
| 
       7 
5 
     | 
    
         
             
            #
         
     | 
| 
       8 
6 
     | 
    
         
             
            # This program is free software; you can redistribute it and/or modify
         
     | 
| 
         @@ -29,7 +27,7 @@ module Trema 
     | 
|
| 
       29 
27 
     | 
    
         | 
| 
       30 
28 
     | 
    
         | 
| 
       31 
29 
     | 
    
         
             
                def options
         
     | 
| 
       32 
     | 
    
         
            -
                   
     | 
| 
      
 30 
     | 
    
         
            +
                  portstatus_queue + packetin_queue + statenotify_queue + vendor_queue
         
     | 
| 
       33 
31 
     | 
    
         
             
                end
         
     | 
| 
       34 
32 
     | 
    
         | 
| 
       35 
33 
     | 
    
         | 
| 
         @@ -46,22 +44,35 @@ module Trema 
     | 
|
| 
       46 
44 
     | 
    
         | 
| 
       47 
45 
     | 
    
         | 
| 
       48 
46 
     | 
    
         
             
                def portstatus_queue
         
     | 
| 
       49 
     | 
    
         
            -
                   
     | 
| 
      
 47 
     | 
    
         
            +
                  controllers = @queues[ :port_status ].split( "," )
         
     | 
| 
      
 48 
     | 
    
         
            +
                  controllers.collect do | each |
         
     | 
| 
      
 49 
     | 
    
         
            +
                    "port_status::#{ each }"
         
     | 
| 
      
 50 
     | 
    
         
            +
                  end
         
     | 
| 
       50 
51 
     | 
    
         
             
                end
         
     | 
| 
       51 
52 
     | 
    
         | 
| 
       52 
53 
     | 
    
         | 
| 
       53 
54 
     | 
    
         
             
                def packetin_queue
         
     | 
| 
       54 
     | 
    
         
            -
                   
     | 
| 
      
 55 
     | 
    
         
            +
                  controllers = @queues[ :packet_in ].split( "," )
         
     | 
| 
      
 56 
     | 
    
         
            +
                  controllers.collect do | each |
         
     | 
| 
      
 57 
     | 
    
         
            +
                    "packet_in::#{ each }"
         
     | 
| 
      
 58 
     | 
    
         
            +
                  end
         
     | 
| 
       55 
59 
     | 
    
         
             
                end
         
     | 
| 
       56 
60 
     | 
    
         | 
| 
       57 
61 
     | 
    
         | 
| 
       58 
62 
     | 
    
         
             
                def statenotify_queue
         
     | 
| 
       59 
     | 
    
         
            -
                   
     | 
| 
      
 63 
     | 
    
         
            +
                  controllers = @queues[ :state_notify ].split( "," )
         
     | 
| 
      
 64 
     | 
    
         
            +
                  controllers.collect do | each |
         
     | 
| 
      
 65 
     | 
    
         
            +
                    "state_notify::#{ each }"
         
     | 
| 
      
 66 
     | 
    
         
            +
                  end
         
     | 
| 
       60 
67 
     | 
    
         
             
                end
         
     | 
| 
       61 
68 
     | 
    
         | 
| 
       62 
69 
     | 
    
         | 
| 
       63 
70 
     | 
    
         
             
                def vendor_queue
         
     | 
| 
       64 
     | 
    
         
            -
                   
     | 
| 
      
 71 
     | 
    
         
            +
                  return [] if not @queues[ :vendor ]
         
     | 
| 
      
 72 
     | 
    
         
            +
                  controllers = @queues[ :vendor ].split( "," )
         
     | 
| 
      
 73 
     | 
    
         
            +
                  controllers.collect do | each |
         
     | 
| 
      
 74 
     | 
    
         
            +
                    "vendor::#{ each }"
         
     | 
| 
      
 75 
     | 
    
         
            +
                  end
         
     | 
| 
       65 
76 
     | 
    
         
             
                end
         
     | 
| 
       66 
77 
     | 
    
         
             
              end
         
     | 
| 
       67 
78 
     | 
    
         
             
            end
         
     | 
    
        data/ruby/trema/vendor.c
    CHANGED
    
    | 
         @@ -209,7 +209,7 @@ handle_vendor( 
     | 
|
| 
       209 
209 
     | 
    
         
             
                rb_hash_aset( attributes, ID2SYM( rb_intern( "data" ) ), rb_str_new( data->data, ( long ) data->length ) );
         
     | 
| 
       210 
210 
     | 
    
         
             
              }
         
     | 
| 
       211 
211 
     | 
    
         
             
              VALUE vendor_r = rb_funcall( cVendor, rb_intern( "new" ), 1, attributes );
         
     | 
| 
       212 
     | 
    
         
            -
              rb_funcall( controller, rb_intern( "vendor" ),  
     | 
| 
      
 212 
     | 
    
         
            +
              rb_funcall( controller, rb_intern( "vendor" ), 2, ULL2NUM( datapath_id ), vendor_r );
         
     | 
| 
       213 
213 
     | 
    
         
             
            }
         
     | 
| 
       214 
214 
     | 
    
         | 
| 
       215 
215 
     | 
    
         | 
    
        data/ruby/trema/version.rb
    CHANGED
    
    | 
         @@ -1,6 +1,4 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            #
         
     | 
| 
       2 
     | 
    
         
            -
            # Author: Yasuhito Takamiya <yasuhito@gmail.com>
         
     | 
| 
       3 
     | 
    
         
            -
            #
         
     | 
| 
       4 
2 
     | 
    
         
             
            # Copyright (C) 2008-2012 NEC Corporation
         
     | 
| 
       5 
3 
     | 
    
         
             
            #
         
     | 
| 
       6 
4 
     | 
    
         
             
            # This program is free software; you can redistribute it and/or modify
         
     | 
| 
         @@ -19,7 +17,7 @@ 
     | 
|
| 
       19 
17 
     | 
    
         | 
| 
       20 
18 
     | 
    
         | 
| 
       21 
19 
     | 
    
         
             
            module Trema
         
     | 
| 
       22 
     | 
    
         
            -
              VERSION = "0.2. 
     | 
| 
      
 20 
     | 
    
         
            +
              VERSION = "0.2.4"
         
     | 
| 
       23 
21 
     | 
    
         
             
            end
         
     | 
| 
       24 
22 
     | 
    
         | 
| 
       25 
23 
     | 
    
         | 
| 
         @@ -1,6 +1,4 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            #
         
     | 
| 
       2 
     | 
    
         
            -
            # Author: Nick Karanatsios <nickkaranatsios@gmail.com>
         
     | 
| 
       3 
     | 
    
         
            -
            #
         
     | 
| 
       4 
2 
     | 
    
         
             
            # Copyright (C) 2008-2012 NEC Corporation
         
     | 
| 
       5 
3 
     | 
    
         
             
            #
         
     | 
| 
       6 
4 
     | 
    
         
             
            # This program is free software; you can redistribute it and/or modify
         
     | 
| 
         @@ -54,8 +52,8 @@ describe BarrierRequest, ".new( OPTIONAL OPTION ) - transaction_id" do 
     | 
|
| 
       54 
52 
     | 
    
         
             
                  network {
         
     | 
| 
       55 
53 
     | 
    
         
             
                    vswitch { datapath_id 0xabc }
         
     | 
| 
       56 
54 
     | 
    
         
             
                  }.run( BarrierController ) {
         
     | 
| 
       57 
     | 
    
         
            -
                    controller( "BarrierController" ).should_receive( :barrier_reply ) do | message |
         
     | 
| 
       58 
     | 
    
         
            -
                       
     | 
| 
      
 55 
     | 
    
         
            +
                    controller( "BarrierController" ).should_receive( :barrier_reply ) do | datapath_id, message |
         
     | 
| 
      
 56 
     | 
    
         
            +
                      datapath_id.should == 0xabc
         
     | 
| 
       59 
57 
     | 
    
         
             
                      message.transaction_id.should == 1234
         
     | 
| 
       60 
58 
     | 
    
         
             
                    end
         
     | 
| 
       61 
59 
     | 
    
         
             
                    barrier_request = BarrierRequest.new( :transaction_id => 1234 )
         
     | 
| 
         @@ -1,6 +1,4 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            #
         
     | 
| 
       2 
     | 
    
         
            -
            # Author: Nick Karanatsios <nickkaranatsios@gmail.com>
         
     | 
| 
       3 
     | 
    
         
            -
            #
         
     | 
| 
       4 
2 
     | 
    
         
             
            # Copyright (C) 2008-2012 NEC Corporation
         
     | 
| 
       5 
3 
     | 
    
         
             
            #
         
     | 
| 
       6 
4 
     | 
    
         
             
            # This program is free software; you can redistribute it and/or modify
         
     | 
| 
         @@ -61,8 +59,8 @@ describe GetConfigRequest, ".new( VALID OPTION )" do 
     | 
|
| 
       61 
59 
     | 
    
         
             
                    vswitch { datapath_id 0xabc }
         
     | 
| 
       62 
60 
     | 
    
         
             
                  }.run( GetConfigController ) {
         
     | 
| 
       63 
61 
     | 
    
         
             
                    get_config_request = GetConfigRequest.new( :transaction_id => 1234 )
         
     | 
| 
       64 
     | 
    
         
            -
                    controller( "GetConfigController" ).should_receive( :get_config_reply ) do | message |
         
     | 
| 
       65 
     | 
    
         
            -
                       
     | 
| 
      
 62 
     | 
    
         
            +
                    controller( "GetConfigController" ).should_receive( :get_config_reply ) do | datapath_id, message |
         
     | 
| 
      
 63 
     | 
    
         
            +
                      datapath_id.should == 0xabc
         
     | 
| 
       66 
64 
     | 
    
         
             
                      message.transaction_id.should == 1234
         
     | 
| 
       67 
65 
     | 
    
         
             
                      message.flags.should >= 0 and message.flags.should <= 3
         
     | 
| 
       68 
66 
     | 
    
         
             
                      message.miss_send_len.should == 65535
         
     | 
    
        data/spec/trema/link_spec.rb
    CHANGED
    
    | 
         @@ -1,6 +1,4 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            #
         
     | 
| 
       2 
     | 
    
         
            -
            # Author: Yasuhito Takamiya <yasuhito@gmail.com>
         
     | 
| 
       3 
     | 
    
         
            -
            #
         
     | 
| 
       4 
2 
     | 
    
         
             
            # Copyright (C) 2008-2012 NEC Corporation
         
     | 
| 
       5 
3 
     | 
    
         
             
            #
         
     | 
| 
       6 
4 
     | 
    
         
             
            # This program is free software; you can redistribute it and/or modify
         
     | 
| 
         @@ -38,8 +36,8 @@ module Trema 
     | 
|
| 
       38 
36 
     | 
    
         | 
| 
       39 
37 
     | 
    
         
             
                  it "executes ip and ifconfig command" do
         
     | 
| 
       40 
38 
     | 
    
         
             
                    @link.should_receive( :sh ).once.ordered.with( "sudo ip link add name trema0-0 type veth peer name trema0-1" )
         
     | 
| 
       41 
     | 
    
         
            -
                    @link.should_receive( :sh ).once.ordered.with( "sudo sysctl -w net.ipv6.conf.trema0-0.disable_ipv6=1 >/dev/null 2>&1" )
         
     | 
| 
       42 
     | 
    
         
            -
                    @link.should_receive( :sh ).once.ordered.with( "sudo sysctl -w net.ipv6.conf.trema0-1.disable_ipv6=1 >/dev/null 2>&1" )
         
     | 
| 
      
 39 
     | 
    
         
            +
                    @link.should_receive( :sh ).once.ordered.with( "sudo /sbin/sysctl -w net.ipv6.conf.trema0-0.disable_ipv6=1 >/dev/null 2>&1" )
         
     | 
| 
      
 40 
     | 
    
         
            +
                    @link.should_receive( :sh ).once.ordered.with( "sudo /sbin/sysctl -w net.ipv6.conf.trema0-1.disable_ipv6=1 >/dev/null 2>&1" )
         
     | 
| 
       43 
41 
     | 
    
         
             
                    @link.should_receive( :sh ).once.ordered.with( "sudo /sbin/ifconfig trema0-0 up" )
         
     | 
| 
       44 
42 
     | 
    
         
             
                    @link.should_receive( :sh ).once.ordered.with( "sudo /sbin/ifconfig trema0-1 up" )
         
     | 
| 
       45 
43 
     | 
    
         | 
| 
         @@ -1,6 +1,4 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            #
         
     | 
| 
       2 
     | 
    
         
            -
            # Author: Nick Karanatsios <nickkaranatsios@gmail.com>
         
     | 
| 
       3 
     | 
    
         
            -
            #
         
     | 
| 
       4 
2 
     | 
    
         
             
            # Copyright (C) 2008-2012 NEC Corporation
         
     | 
| 
       5 
3 
     | 
    
         
             
            #
         
     | 
| 
       6 
4 
     | 
    
         
             
            # This program is free software; you can redistribute it and/or modify
         
     | 
| 
         @@ -35,10 +33,10 @@ describe Trema::OpenflowError, "new" do 
     | 
|
| 
       35 
33 
     | 
    
         
             
                      :mask => 1,
         
     | 
| 
       36 
34 
     | 
    
         
             
                      :advertise => 0
         
     | 
| 
       37 
35 
     | 
    
         
             
                    )
         
     | 
| 
       38 
     | 
    
         
            -
                    controller( "OpenflowErrorController" ).should_receive( :openflow_error ) do |  
     | 
| 
       39 
     | 
    
         
            -
                       
     | 
| 
       40 
     | 
    
         
            -
                       
     | 
| 
       41 
     | 
    
         
            -
                       
     | 
| 
      
 36 
     | 
    
         
            +
                    controller( "OpenflowErrorController" ).should_receive( :openflow_error ) do | datapath_id, message |
         
     | 
| 
      
 37 
     | 
    
         
            +
                      datapath_id.should == 0xabc
         
     | 
| 
      
 38 
     | 
    
         
            +
                      message.type.should == Error::OFPET_PORT_MOD_FAILED
         
     | 
| 
      
 39 
     | 
    
         
            +
                      message.code.should == Error::OFPPMFC_BAD_PORT 
         
     | 
| 
       42 
40 
     | 
    
         
             
                    end
         
     | 
| 
       43 
41 
     | 
    
         
             
                    controller( "OpenflowErrorController" ).send_message( 0xabc, port_mod )
         
     | 
| 
       44 
42 
     | 
    
         
             
                    sleep 2 # FIXME: wait to send_message
         
     | 
| 
         @@ -63,10 +61,10 @@ describe Trema::OpenflowError, "new" do 
     | 
|
| 
       63 
61 
     | 
    
         
             
                      :mask => 1,
         
     | 
| 
       64 
62 
     | 
    
         
             
                      :advertise => 0
         
     | 
| 
       65 
63 
     | 
    
         
             
                    )
         
     | 
| 
       66 
     | 
    
         
            -
                    controller( "OpenflowErrorController" ).should_receive( :openflow_error ) do |  
     | 
| 
       67 
     | 
    
         
            -
                       
     | 
| 
       68 
     | 
    
         
            -
                       
     | 
| 
       69 
     | 
    
         
            -
                       
     | 
| 
      
 64 
     | 
    
         
            +
                    controller( "OpenflowErrorController" ).should_receive( :openflow_error ) do | datapath_id, message |
         
     | 
| 
      
 65 
     | 
    
         
            +
                      datapath_id.should == 0xabc
         
     | 
| 
      
 66 
     | 
    
         
            +
                      message.type.should == Error::OFPET_PORT_MOD_FAILED
         
     | 
| 
      
 67 
     | 
    
         
            +
                      message.code.should == Error::OFPPMFC_BAD_HW_ADDR
         
     | 
| 
       70 
68 
     | 
    
         
             
                    end
         
     | 
| 
       71 
69 
     | 
    
         
             
                    controller( "OpenflowErrorController" ).send_message( 0xabc, port_mod )
         
     | 
| 
       72 
70 
     | 
    
         
             
                    sleep 2 # FIXME: wait to send_message
         
     | 
| 
         @@ -85,10 +83,10 @@ describe Trema::OpenflowError, "new" do 
     | 
|
| 
       85 
83 
     | 
    
         
             
                    link "host1", "error-port"
         
     | 
| 
       86 
84 
     | 
    
         
             
                    link "host2", "error-port"
         
     | 
| 
       87 
85 
     | 
    
         
             
                  }.run( OpenflowErrorController ) {
         
     | 
| 
       88 
     | 
    
         
            -
                    controller( "OpenflowErrorController" ).should_receive( :openflow_error ) do |  
     | 
| 
       89 
     | 
    
         
            -
                       
     | 
| 
       90 
     | 
    
         
            -
                       
     | 
| 
       91 
     | 
    
         
            -
                       
     | 
| 
      
 86 
     | 
    
         
            +
                    controller( "OpenflowErrorController" ).should_receive( :openflow_error ) do | datapath_id, message |
         
     | 
| 
      
 87 
     | 
    
         
            +
                      datapath_id.should == 0xabc
         
     | 
| 
      
 88 
     | 
    
         
            +
                      message.type.should == Error::OFPET_BAD_ACTION
         
     | 
| 
      
 89 
     | 
    
         
            +
                      message.code.should == Error::OFPBAC_BAD_OUT_PORT
         
     | 
| 
       92 
90 
     | 
    
         
             
                    end
         
     | 
| 
       93 
91 
     | 
    
         
             
                    controller( "OpenflowErrorController" ).send_flow_mod_add( 0xabc, :actions => ActionOutput.new( :port => 0x5555 ) )
         
     | 
| 
       94 
92 
     | 
    
         
             
                    sleep 2 # FIXME: wait to send_flow_mod_add
         
     | 
| 
         @@ -104,7 +102,7 @@ describe Trema::OpenflowError, "new" do 
     | 
|
| 
       104 
102 
     | 
    
         
             
                    vswitch( "error-request") { datapath_id 0xabc }
         
     | 
| 
       105 
103 
     | 
    
         
             
                  }.run( OpenflowController ) {
         
     | 
| 
       106 
104 
     | 
    
         
             
                    queue_get_config_request = Trema::QueueGetConfigRequest.new( :port => 1 )
         
     | 
| 
       107 
     | 
    
         
            -
                    controller( "OpenflowController" ).should_receive( :openflow_error ) do | message |
         
     | 
| 
      
 105 
     | 
    
         
            +
                    controller( "OpenflowController" ).should_receive( :openflow_error ) do | datapath_id, message |
         
     | 
| 
       108 
106 
     | 
    
         
             
                      message.datapath_id.should == 0xabc
         
     | 
| 
       109 
107 
     | 
    
         
             
                      message.type.should satisfy { | n |
         
     | 
| 
       110 
108 
     | 
    
         
             
                        n >= 0 && n <= 5
         
     | 
| 
         @@ -58,7 +58,7 @@ describe SetConfig, ".new( VALID OPTIONS )" do 
     | 
|
| 
       58 
58 
     | 
    
         
             
                  network {
         
     | 
| 
       59 
59 
     | 
    
         
             
                    vswitch { datapath_id 0xabc }
         
     | 
| 
       60 
60 
     | 
    
         
             
                  }.run( SetConfigController ) {
         
     | 
| 
       61 
     | 
    
         
            -
                    controller( "SetConfigController" ).should_receive( :get_config_reply ) do | arg |
         
     | 
| 
      
 61 
     | 
    
         
            +
                    controller( "SetConfigController" ).should_receive( :get_config_reply ) do | dpid, arg |
         
     | 
| 
       62 
62 
     | 
    
         
             
                      arg.flags.should == 0
         
     | 
| 
       63 
63 
     | 
    
         
             
                      arg.miss_send_len.should == 0
         
     | 
| 
       64 
64 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -23,10 +23,52 @@ require "trema/switch-daemon" 
     | 
|
| 
       23 
23 
     | 
    
         
             
            module Trema
         
     | 
| 
       24 
24 
     | 
    
         
             
              describe SwitchDaemon do
         
     | 
| 
       25 
25 
     | 
    
         
             
                it "should be initialized with proper options" do
         
     | 
| 
       26 
     | 
    
         
            -
                  rule = { 
     | 
| 
      
 26 
     | 
    
         
            +
                  rule = {
         
     | 
| 
      
 27 
     | 
    
         
            +
                    :port_status => "topology",
         
     | 
| 
      
 28 
     | 
    
         
            +
                    :packet_in => "controller",
         
     | 
| 
      
 29 
     | 
    
         
            +
                    :state_notify => "topology",
         
     | 
| 
      
 30 
     | 
    
         
            +
                    :vendor => "controller"
         
     | 
| 
      
 31 
     | 
    
         
            +
                  }
         
     | 
| 
       27 
32 
     | 
    
         
             
                  switch_daemon = SwitchDaemon.new( rule )
         
     | 
| 
       28 
33 
     | 
    
         | 
| 
       29 
     | 
    
         
            -
                  switch_daemon.options.should  
     | 
| 
      
 34 
     | 
    
         
            +
                  switch_daemon.options.should include( "port_status::topology" )
         
     | 
| 
      
 35 
     | 
    
         
            +
                  switch_daemon.options.should include( "packet_in::controller" )
         
     | 
| 
      
 36 
     | 
    
         
            +
                  switch_daemon.options.should include( "state_notify::topology" )
         
     | 
| 
      
 37 
     | 
    
         
            +
                  switch_daemon.options.should include( "vendor::controller" )
         
     | 
| 
      
 38 
     | 
    
         
            +
                end
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                it "should be initialized with options which have multiple controllers" do
         
     | 
| 
      
 42 
     | 
    
         
            +
                  rule = {
         
     | 
| 
      
 43 
     | 
    
         
            +
                    :port_status => "topology0,topology1",
         
     | 
| 
      
 44 
     | 
    
         
            +
                    :packet_in => "controller0,controller1",
         
     | 
| 
      
 45 
     | 
    
         
            +
                    :state_notify => "topology0,topology1",
         
     | 
| 
      
 46 
     | 
    
         
            +
                    :vendor => "controller0,controller1"
         
     | 
| 
      
 47 
     | 
    
         
            +
                  }
         
     | 
| 
      
 48 
     | 
    
         
            +
                  switch_daemon = SwitchDaemon.new( rule )
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                  switch_daemon.options.should include( "port_status::topology0" )
         
     | 
| 
      
 51 
     | 
    
         
            +
                  switch_daemon.options.should include( "port_status::topology1" )
         
     | 
| 
      
 52 
     | 
    
         
            +
                  switch_daemon.options.should include( "packet_in::controller0" )
         
     | 
| 
      
 53 
     | 
    
         
            +
                  switch_daemon.options.should include( "packet_in::controller1" )
         
     | 
| 
      
 54 
     | 
    
         
            +
                  switch_daemon.options.should include( "state_notify::topology0" )
         
     | 
| 
      
 55 
     | 
    
         
            +
                  switch_daemon.options.should include( "state_notify::topology1" )
         
     | 
| 
      
 56 
     | 
    
         
            +
                  switch_daemon.options.should include( "vendor::controller0" )
         
     | 
| 
      
 57 
     | 
    
         
            +
                  switch_daemon.options.should include( "vendor::controller1" )
         
     | 
| 
      
 58 
     | 
    
         
            +
                end
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
                it "should be initialized without vendor options" do
         
     | 
| 
      
 62 
     | 
    
         
            +
                  rule = {
         
     | 
| 
      
 63 
     | 
    
         
            +
                    :port_status => "topology",
         
     | 
| 
      
 64 
     | 
    
         
            +
                    :packet_in => "controller",
         
     | 
| 
      
 65 
     | 
    
         
            +
                    :state_notify => "topology"
         
     | 
| 
      
 66 
     | 
    
         
            +
                  }
         
     | 
| 
      
 67 
     | 
    
         
            +
                  switch_daemon = SwitchDaemon.new( rule )
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                  switch_daemon.options.should include( "port_status::topology" )
         
     | 
| 
      
 70 
     | 
    
         
            +
                  switch_daemon.options.should include( "packet_in::controller" )
         
     | 
| 
      
 71 
     | 
    
         
            +
                  switch_daemon.options.should include( "state_notify::topology" )
         
     | 
| 
       30 
72 
     | 
    
         
             
                end
         
     | 
| 
       31 
73 
     | 
    
         
             
              end
         
     | 
| 
       32 
74 
     | 
    
         
             
            end
         
     | 
| 
         @@ -1,8 +1,4 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            #
         
     | 
| 
       2 
     | 
    
         
            -
            # Openflow message event dumper.
         
     | 
| 
       3 
     | 
    
         
            -
            #
         
     | 
| 
       4 
     | 
    
         
            -
            # Author: Nick Karanatsios <nickkaranatsios@gmail.com>
         
     | 
| 
       5 
     | 
    
         
            -
            #
         
     | 
| 
       6 
2 
     | 
    
         
             
            # Copyright (C) 2008-2012 NEC Corporation
         
     | 
| 
       7 
3 
     | 
    
         
             
            #
         
     | 
| 
       8 
4 
     | 
    
         
             
            # This program is free software; you can redistribute it and/or modify
         
     | 
| 
         @@ -20,6 +16,9 @@ 
     | 
|
| 
       20 
16 
     | 
    
         
             
            #
         
     | 
| 
       21 
17 
     | 
    
         | 
| 
       22 
18 
     | 
    
         | 
| 
      
 19 
     | 
    
         
            +
            #
         
     | 
| 
      
 20 
     | 
    
         
            +
            # Openflow message event dumper.
         
     | 
| 
      
 21 
     | 
    
         
            +
            #
         
     | 
| 
       23 
22 
     | 
    
         
             
            class Dumper < Controller
         
     | 
| 
       24 
23 
     | 
    
         
             
              def switch_ready datapath_id
         
     | 
| 
       25 
24 
     | 
    
         
             
                info "[switch_ready]"
         
     | 
| 
         @@ -33,9 +32,9 @@ class Dumper < Controller 
     | 
|
| 
       33 
32 
     | 
    
         
             
              end
         
     | 
| 
       34 
33 
     | 
    
         | 
| 
       35 
34 
     | 
    
         | 
| 
       36 
     | 
    
         
            -
              def openflow_error message
         
     | 
| 
      
 35 
     | 
    
         
            +
              def openflow_error datapath_id, message
         
     | 
| 
       37 
36 
     | 
    
         
             
                info "[error]"
         
     | 
| 
       38 
     | 
    
         
            -
                info "datapath_id: #{  
     | 
| 
      
 37 
     | 
    
         
            +
                info "datapath_id: #{ datapath_id.to_hex }"
         
     | 
| 
       39 
38 
     | 
    
         
             
                info "transaction_id: #{ message.transaction_id.to_hex }"
         
     | 
| 
       40 
39 
     | 
    
         
             
                info "type: #{ message.type.to_hex }"
         
     | 
| 
       41 
40 
     | 
    
         
             
                info "code: #{ message.code.to_hex }"
         
     | 
| 
         @@ -43,9 +42,9 @@ class Dumper < Controller 
     | 
|
| 
       43 
42 
     | 
    
         
             
              end
         
     | 
| 
       44 
43 
     | 
    
         | 
| 
       45 
44 
     | 
    
         | 
| 
       46 
     | 
    
         
            -
              def vendor message
         
     | 
| 
      
 45 
     | 
    
         
            +
              def vendor datapath_id, message
         
     | 
| 
       47 
46 
     | 
    
         
             
                info "[vendor]"
         
     | 
| 
       48 
     | 
    
         
            -
                info "datapath_id: #{  
     | 
| 
      
 47 
     | 
    
         
            +
                info "datapath_id: #{ datapath_id.to_hex }"
         
     | 
| 
       49 
48 
     | 
    
         
             
                info "transaction_id: #{ message.transaction_id.to_hex }"
         
     | 
| 
       50 
49 
     | 
    
         
             
                info "data:"
         
     | 
| 
       51 
50 
     | 
    
         
             
                info "#{ message.buffer.unpack "H*" }"
         
     | 
| 
         @@ -66,9 +65,9 @@ class Dumper < Controller 
     | 
|
| 
       66 
65 
     | 
    
         
             
              end
         
     | 
| 
       67 
66 
     | 
    
         | 
| 
       68 
67 
     | 
    
         | 
| 
       69 
     | 
    
         
            -
              def get_config_reply message
         
     | 
| 
      
 68 
     | 
    
         
            +
              def get_config_reply datapath_id, message
         
     | 
| 
       70 
69 
     | 
    
         
             
                info "[get_config_reply]"
         
     | 
| 
       71 
     | 
    
         
            -
                info "datapath_id: #{  
     | 
| 
      
 70 
     | 
    
         
            +
                info "datapath_id: #{ datapath_id.to_hex }"
         
     | 
| 
       72 
71 
     | 
    
         
             
                info "transaction_id: #{ message.transaction_id.to_hex }"
         
     | 
| 
       73 
72 
     | 
    
         
             
                info "flags: #{ message.flags.to_hex }"
         
     | 
| 
       74 
73 
     | 
    
         
             
                info "miss_send_len: #{ message.miss_send_len }"
         
     | 
| 
         @@ -127,9 +126,9 @@ class Dumper < Controller 
     | 
|
| 
       127 
126 
     | 
    
         
             
              end
         
     | 
| 
       128 
127 
     | 
    
         | 
| 
       129 
128 
     | 
    
         | 
| 
       130 
     | 
    
         
            -
              def stats_reply message
         
     | 
| 
      
 129 
     | 
    
         
            +
              def stats_reply datapath_id, message
         
     | 
| 
       131 
130 
     | 
    
         
             
                info "[stats_reply]"
         
     | 
| 
       132 
     | 
    
         
            -
                info "datapath_id: #{  
     | 
| 
      
 131 
     | 
    
         
            +
                info "datapath_id: #{ datapath_id.to_hex }"
         
     | 
| 
       133 
132 
     | 
    
         
             
                info "transaction_id: #{ message.transaction_id.to_hex }"
         
     | 
| 
       134 
133 
     | 
    
         
             
                info "type: #{ message.type.to_hex }"
         
     | 
| 
       135 
134 
     | 
    
         
             
                info "flags: #{ message.flags.to_hex }"
         
     | 
| 
         @@ -137,16 +136,16 @@ class Dumper < Controller 
     | 
|
| 
       137 
136 
     | 
    
         
             
              end
         
     | 
| 
       138 
137 
     | 
    
         | 
| 
       139 
138 
     | 
    
         | 
| 
       140 
     | 
    
         
            -
              def barrier_reply message
         
     | 
| 
      
 139 
     | 
    
         
            +
              def barrier_reply datapath_id, message
         
     | 
| 
       141 
140 
     | 
    
         
             
                info "[barrier_reply]"
         
     | 
| 
       142 
     | 
    
         
            -
                info "datapath_id: #{  
     | 
| 
      
 141 
     | 
    
         
            +
                info "datapath_id: #{ datapath_id.to_hex }"
         
     | 
| 
       143 
142 
     | 
    
         
             
                info "transaction_id: #{ message.transaction_id.to_hex }"
         
     | 
| 
       144 
143 
     | 
    
         
             
              end
         
     | 
| 
       145 
144 
     | 
    
         | 
| 
       146 
145 
     | 
    
         | 
| 
       147 
     | 
    
         
            -
              def queue_get_config_reply message
         
     | 
| 
      
 146 
     | 
    
         
            +
              def queue_get_config_reply datapath_id, message
         
     | 
| 
       148 
147 
     | 
    
         
             
                info "[queue_get_config_reply]"
         
     | 
| 
       149 
     | 
    
         
            -
                info "datapath_id: #{  
     | 
| 
      
 148 
     | 
    
         
            +
                info "datapath_id: #{ datapath_id.to_hex }"
         
     | 
| 
       150 
149 
     | 
    
         
             
                info "transaction_id: #{ message.transaction_id.to_hex }"
         
     | 
| 
       151 
150 
     | 
    
         
             
                info "port: #{ message.port }"
         
     | 
| 
       152 
151 
     | 
    
         
             
                info( "queues:" );
         
     | 
    
        data/src/lib/openflow_message.c
    CHANGED
    
    | 
         @@ -3979,19 +3979,13 @@ set_match_from_packet( struct ofp_match *match, const uint16_t in_port, 
     | 
|
| 
       3979 
3979 
     | 
    
         
             
                if ( !( wildcards & OFPFW_NW_PROTO ) ) {
         
     | 
| 
       3980 
3980 
     | 
    
         
             
                  match->nw_proto = ( ( packet_info * ) packet->user_data )->ipv4_protocol;
         
     | 
| 
       3981 
3981 
     | 
    
         
             
                }
         
     | 
| 
       3982 
     | 
    
         
            -
                 
     | 
| 
       3983 
     | 
    
         
            -
             
     | 
| 
      
 3982 
     | 
    
         
            +
                unsigned int nw_src_mask_len = ( wildcards & OFPFW_NW_SRC_MASK ) >> OFPFW_NW_SRC_SHIFT;
         
     | 
| 
      
 3983 
     | 
    
         
            +
                if ( nw_src_mask_len < 32 ) {
         
     | 
| 
      
 3984 
     | 
    
         
            +
                  match->nw_src = ( ( packet_info * ) packet->user_data )->ipv4_saddr & ( 0xffffffff << nw_src_mask_len );
         
     | 
| 
       3984 
3985 
     | 
    
         
             
                }
         
     | 
| 
       3985 
     | 
    
         
            -
                 
     | 
| 
       3986 
     | 
    
         
            -
             
     | 
| 
       3987 
     | 
    
         
            -
             
     | 
| 
       3988 
     | 
    
         
            -
                }
         
     | 
| 
       3989 
     | 
    
         
            -
                if ( ( wildcards & OFPFW_NW_DST_MASK ) == 0 ) {
         
     | 
| 
       3990 
     | 
    
         
            -
                  match->nw_dst = ( ( packet_info * ) packet->user_data )->ipv4_daddr;
         
     | 
| 
       3991 
     | 
    
         
            -
                }
         
     | 
| 
       3992 
     | 
    
         
            -
                else {
         
     | 
| 
       3993 
     | 
    
         
            -
                  match->nw_dst = ( ( packet_info * ) packet->user_data )->ipv4_daddr &
         
     | 
| 
       3994 
     | 
    
         
            -
                    ( ( wildcards & OFPFW_NW_DST_MASK ) >> OFPFW_NW_DST_SHIFT );
         
     | 
| 
      
 3986 
     | 
    
         
            +
                unsigned int nw_dst_mask_len = ( wildcards & OFPFW_NW_DST_MASK ) >> OFPFW_NW_DST_SHIFT;
         
     | 
| 
      
 3987 
     | 
    
         
            +
                if ( nw_dst_mask_len < 32 ) {
         
     | 
| 
      
 3988 
     | 
    
         
            +
                  match->nw_dst = ( ( packet_info * ) packet->user_data )->ipv4_daddr & ( 0xffffffff << nw_dst_mask_len );
         
     | 
| 
       3995 
3989 
     | 
    
         
             
                }
         
     | 
| 
       3996 
3990 
     | 
    
         | 
| 
       3997 
3991 
     | 
    
         
             
                switch ( match->nw_proto ) {
         
     | 
| 
         @@ -4028,17 +4022,13 @@ set_match_from_packet( struct ofp_match *match, const uint16_t in_port, 
     | 
|
| 
       4028 
4022 
     | 
    
         
             
                if ( !( wildcards & OFPFW_NW_PROTO ) ) {
         
     | 
| 
       4029 
4023 
     | 
    
         
             
                  match->nw_proto = ( uint8_t ) ( ( ( packet_info * ) packet->user_data )->arp_ar_op & ARP_OP_MASK );
         
     | 
| 
       4030 
4024 
     | 
    
         
             
                }
         
     | 
| 
       4031 
     | 
    
         
            -
                 
     | 
| 
       4032 
     | 
    
         
            -
             
     | 
| 
      
 4025 
     | 
    
         
            +
                unsigned int nw_src_mask_len = ( wildcards & OFPFW_NW_SRC_MASK ) >> OFPFW_NW_SRC_SHIFT;
         
     | 
| 
      
 4026 
     | 
    
         
            +
                if ( nw_src_mask_len < 32 ) {
         
     | 
| 
      
 4027 
     | 
    
         
            +
                  match->nw_src = ( ( packet_info * ) packet->user_data )->arp_spa & ( 0xffffffff << nw_src_mask_len );
         
     | 
| 
       4033 
4028 
     | 
    
         
             
                }
         
     | 
| 
       4034 
     | 
    
         
            -
                 
     | 
| 
       4035 
     | 
    
         
            -
             
     | 
| 
       4036 
     | 
    
         
            -
             
     | 
| 
       4037 
     | 
    
         
            -
                if ( ( wildcards & OFPFW_NW_DST_MASK ) == 0 ) {
         
     | 
| 
       4038 
     | 
    
         
            -
                  match->nw_dst = ( ( packet_info * ) packet->user_data )->arp_tpa;
         
     | 
| 
       4039 
     | 
    
         
            -
                }
         
     | 
| 
       4040 
     | 
    
         
            -
                else {
         
     | 
| 
       4041 
     | 
    
         
            -
                  match->nw_dst = ( ( packet_info * ) packet->user_data )->arp_tpa & ( ( wildcards & OFPFW_NW_DST_MASK ) >> OFPFW_NW_DST_SHIFT );
         
     | 
| 
      
 4029 
     | 
    
         
            +
                unsigned int nw_dst_mask_len = ( wildcards & OFPFW_NW_DST_MASK ) >> OFPFW_NW_DST_SHIFT;
         
     | 
| 
      
 4030 
     | 
    
         
            +
                if ( nw_dst_mask_len < 32 ) {
         
     | 
| 
      
 4031 
     | 
    
         
            +
                  match->nw_dst = ( ( packet_info * ) packet->user_data )->arp_tpa & ( 0xffffffff << nw_dst_mask_len );
         
     | 
| 
       4042 
4032 
     | 
    
         
             
                }
         
     | 
| 
       4043 
4033 
     | 
    
         
             
              }
         
     | 
| 
       4044 
4034 
     | 
    
         
             
            }
         
     | 
| 
         @@ -5881,8 +5881,7 @@ test_set_match_from_packet_succeeds_if_datatype_is_ipv4_udp_and_wildcards_is_OFP 
     | 
|
| 
       5881 
5881 
     | 
    
         
             
              assert_int_equal( match.dl_type, packet_info0->eth_type );
         
     | 
| 
       5882 
5882 
     | 
    
         
             
              assert_int_equal( match.nw_tos, ipv4->tos );
         
     | 
| 
       5883 
5883 
     | 
    
         
             
              assert_int_equal( match.nw_proto, packet_info0->ipv4_protocol );
         
     | 
| 
       5884 
     | 
    
         
            -
               
     | 
| 
       5885 
     | 
    
         
            -
              assert_int_equal( match.nw_src, ip_source_address_flag );
         
     | 
| 
      
 5884 
     | 
    
         
            +
              assert_int_equal( match.nw_src, 0 );
         
     | 
| 
       5886 
5885 
     | 
    
         
             
              assert_int_equal( match.nw_dst, ntohl( ipv4->daddr ) );
         
     | 
| 
       5887 
5886 
     | 
    
         
             
              assert_int_equal( match.tp_src, ntohs( udp->src_port ) );
         
     | 
| 
       5888 
5887 
     | 
    
         
             
              assert_int_equal( match.tp_dst, ntohs( udp->dst_port ) );
         
     | 
| 
         @@ -5912,8 +5911,7 @@ test_set_match_from_packet_succeeds_if_datatype_is_ipv4_udp_and_wildcards_is_OFP 
     | 
|
| 
       5912 
5911 
     | 
    
         
             
              assert_int_equal( match.nw_tos, ipv4->tos );
         
     | 
| 
       5913 
5912 
     | 
    
         
             
              assert_int_equal( match.nw_proto, packet_info0->ipv4_protocol );
         
     | 
| 
       5914 
5913 
     | 
    
         
             
              assert_int_equal( match.nw_src, ntohl( ipv4->saddr ) );
         
     | 
| 
       5915 
     | 
    
         
            -
               
     | 
| 
       5916 
     | 
    
         
            -
              assert_int_equal( match.nw_dst, ip_destination_address_flag );
         
     | 
| 
      
 5914 
     | 
    
         
            +
              assert_int_equal( match.nw_dst, 0 );
         
     | 
| 
       5917 
5915 
     | 
    
         
             
              assert_int_equal( match.tp_src, ntohs( udp->src_port ) );
         
     | 
| 
       5918 
5916 
     | 
    
         
             
              assert_int_equal( match.tp_dst, ntohs( udp->dst_port ) );
         
     | 
| 
       5919 
5917 
     | 
    
         | 
| 
         @@ -6301,8 +6299,7 @@ test_set_match_from_packet_succeeds_if_datatype_is_ipv4_tcp_and_wildcards_is_OFP 
     | 
|
| 
       6301 
6299 
     | 
    
         
             
              assert_int_equal( match.dl_type, packet_info0->eth_type );
         
     | 
| 
       6302 
6300 
     | 
    
         
             
              assert_int_equal( match.nw_tos, ipv4->tos );
         
     | 
| 
       6303 
6301 
     | 
    
         
             
              assert_int_equal( match.nw_proto, packet_info0->ipv4_protocol );
         
     | 
| 
       6304 
     | 
    
         
            -
               
     | 
| 
       6305 
     | 
    
         
            -
              assert_int_equal( match.nw_src, ip_source_address_flag );
         
     | 
| 
      
 6302 
     | 
    
         
            +
              assert_int_equal( match.nw_src, 0 );
         
     | 
| 
       6306 
6303 
     | 
    
         
             
              assert_int_equal( match.nw_dst, ntohl( ipv4->daddr ) );
         
     | 
| 
       6307 
6304 
     | 
    
         
             
              assert_int_equal( match.tp_src, ntohs( tcp->src_port ) );
         
     | 
| 
       6308 
6305 
     | 
    
         
             
              assert_int_equal( match.tp_dst, ntohs( tcp->dst_port ) );
         
     | 
| 
         @@ -6332,8 +6329,7 @@ test_set_match_from_packet_succeeds_if_datatype_is_ipv4_tcp_and_wildcards_is_OFP 
     | 
|
| 
       6332 
6329 
     | 
    
         
             
              assert_int_equal( match.nw_tos, ipv4->tos );
         
     | 
| 
       6333 
6330 
     | 
    
         
             
              assert_int_equal( match.nw_proto, packet_info0->ipv4_protocol );
         
     | 
| 
       6334 
6331 
     | 
    
         
             
              assert_int_equal( match.nw_src, ntohl( ipv4->saddr ) );
         
     | 
| 
       6335 
     | 
    
         
            -
               
     | 
| 
       6336 
     | 
    
         
            -
              assert_int_equal( match.nw_dst, ip_destination_address_flag );
         
     | 
| 
      
 6332 
     | 
    
         
            +
              assert_int_equal( match.nw_dst, 0 );
         
     | 
| 
       6337 
6333 
     | 
    
         
             
              assert_int_equal( match.tp_src, ntohs( tcp->src_port ) );
         
     | 
| 
       6338 
6334 
     | 
    
         
             
              assert_int_equal( match.tp_dst, ntohs( tcp->dst_port ) );
         
     | 
| 
       6339 
6335 
     | 
    
         | 
| 
         @@ -6720,8 +6716,7 @@ test_set_match_from_packet_succeeds_if_datatype_is_ipv4_icmp_and_wildcards_is_OF 
     | 
|
| 
       6720 
6716 
     | 
    
         
             
              assert_int_equal( match.dl_type, packet_info0->eth_type );
         
     | 
| 
       6721 
6717 
     | 
    
         
             
              assert_int_equal( match.nw_tos, ipv4->tos );
         
     | 
| 
       6722 
6718 
     | 
    
         
             
              assert_int_equal( match.nw_proto, packet_info0->ipv4_protocol );
         
     | 
| 
       6723 
     | 
    
         
            -
               
     | 
| 
       6724 
     | 
    
         
            -
              assert_int_equal( match.nw_src, ip_source_address_flag );
         
     | 
| 
      
 6719 
     | 
    
         
            +
              assert_int_equal( match.nw_src, 0 );
         
     | 
| 
       6725 
6720 
     | 
    
         
             
              assert_int_equal( match.nw_dst, ntohl( ipv4->daddr ) );
         
     | 
| 
       6726 
6721 
     | 
    
         
             
              assert_int_equal( match.icmp_type, icmp->type );
         
     | 
| 
       6727 
6722 
     | 
    
         
             
              assert_int_equal( match.icmp_code, icmp->code );
         
     | 
| 
         @@ -6751,8 +6746,7 @@ test_set_match_from_packet_succeeds_if_datatype_is_ipv4_icmp_and_wildcards_is_OF 
     | 
|
| 
       6751 
6746 
     | 
    
         
             
              assert_int_equal( match.nw_tos, ipv4->tos );
         
     | 
| 
       6752 
6747 
     | 
    
         
             
              assert_int_equal( match.nw_proto, packet_info0->ipv4_protocol );
         
     | 
| 
       6753 
6748 
     | 
    
         
             
              assert_int_equal( match.nw_src, ntohl( ipv4->saddr ) );
         
     | 
| 
       6754 
     | 
    
         
            -
               
     | 
| 
       6755 
     | 
    
         
            -
              assert_int_equal( match.nw_dst, ip_destination_address_flag );
         
     | 
| 
      
 6749 
     | 
    
         
            +
              assert_int_equal( match.nw_dst, 0 );
         
     | 
| 
       6756 
6750 
     | 
    
         
             
              assert_int_equal( match.icmp_type, icmp->type );
         
     | 
| 
       6757 
6751 
     | 
    
         
             
              assert_int_equal( match.icmp_code, icmp->code );
         
     | 
| 
       6758 
6752 
     | 
    
         | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,13 +1,13 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification 
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: trema
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version 
         
     | 
| 
       4 
     | 
    
         
            -
              hash:  
     | 
| 
      
 4 
     | 
    
         
            +
              hash: 31
         
     | 
| 
       5 
5 
     | 
    
         
             
              prerelease: 
         
     | 
| 
       6 
6 
     | 
    
         
             
              segments: 
         
     | 
| 
       7 
7 
     | 
    
         
             
              - 0
         
     | 
| 
       8 
8 
     | 
    
         
             
              - 2
         
     | 
| 
       9 
     | 
    
         
            -
              -  
     | 
| 
       10 
     | 
    
         
            -
              version: 0.2. 
     | 
| 
      
 9 
     | 
    
         
            +
              - 4
         
     | 
| 
      
 10 
     | 
    
         
            +
              version: 0.2.4
         
     | 
| 
       11 
11 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       12 
12 
     | 
    
         
             
            authors: 
         
     | 
| 
       13 
13 
     | 
    
         
             
            - Yasuhito Takamiya
         
     | 
| 
         @@ -15,7 +15,7 @@ autorequire: 
     | 
|
| 
       15 
15 
     | 
    
         
             
            bindir: .
         
     | 
| 
       16 
16 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
       18 
     | 
    
         
            -
            date: 2012-07- 
     | 
| 
      
 18 
     | 
    
         
            +
            date: 2012-07-31 00:00:00 Z
         
     | 
| 
       19 
19 
     | 
    
         
             
            dependencies: 
         
     | 
| 
       20 
20 
     | 
    
         
             
            - !ruby/object:Gem::Dependency 
         
     | 
| 
       21 
21 
     | 
    
         
             
              name: rake
         
     | 
| 
         @@ -700,7 +700,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       700 
700 
     | 
    
         
             
            requirements: []
         
     | 
| 
       701 
701 
     | 
    
         | 
| 
       702 
702 
     | 
    
         
             
            rubyforge_project: 
         
     | 
| 
       703 
     | 
    
         
            -
            rubygems_version: 1.8. 
     | 
| 
      
 703 
     | 
    
         
            +
            rubygems_version: 1.8.24
         
     | 
| 
       704 
704 
     | 
    
         
             
            signing_key: 
         
     | 
| 
       705 
705 
     | 
    
         
             
            specification_version: 3
         
     | 
| 
       706 
706 
     | 
    
         
             
            summary: Full-Stack OpenFlow Framework for Ruby and C
         
     |