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 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
 
@@ -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" ), 1, barrier_reply );
88
+ rb_funcall( controller, rb_intern( "barrier_reply" ), 2, ULL2NUM( datapath_id ), barrier_reply );
91
89
  }
92
90
 
93
91
 
@@ -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
- # Callback invoked whenever a subclass of this class is created.
37
- # This adds the created object to the DB of controllers.
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" ), 1, 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
 
@@ -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
 
@@ -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" ), 1, 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" ), 1, 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
 
@@ -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 = 2 ** 16 - 1
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
 
@@ -22,7 +22,7 @@ require "trema/mac"
22
22
 
23
23
  module Trema
24
24
  #
25
- # A super-class of {SetEthSrcAddr} and {SetEthDstAddr} action.
25
+ # @abstract The base class of {SetEthSrcAddr} and {SetEthDstAddr} action.
26
26
  #
27
27
  class SetEthAddr < Action
28
28
  attr_reader :mac_address
@@ -21,7 +21,7 @@ require "trema/action"
21
21
 
22
22
  module Trema
23
23
  #
24
- # A super-class of {SetIpSrcAddr} and {SetIpDstAddr} action.
24
+ # @abstract The base class of {SetIpSrcAddr} and {SetIpDstAddr} action.
25
25
  #
26
26
  class SetIpAddr < Action
27
27
  attr_reader :ip_address
@@ -34,7 +34,7 @@ module Trema
34
34
  # @example
35
35
  # SetIpTos.new(32)
36
36
  #
37
- # @param [Integer] :type_of_service
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
- # A super-class of {SetTransportSrcPort} and {SetTransportDstPort} action.
25
+ # @abstract The base class of {SetTransportSrcPort} and {SetTransportDstPort} action.
26
26
  #
27
27
  class SetTransportPort < Action
28
28
  attr_reader :port_number
@@ -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
- [ portstatus_queue, packetin_queue, statenotify_queue, vendor_queue ]
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
- "port_status::#{ @queues[ :port_status ] }"
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
- "packet_in::#{ @queues[ :packet_in ] }"
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
- "state_notify::#{ @queues[ :state_notify ] }"
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
- "vendor::#{ @queues[ :vendor ] }"
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
@@ -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" ), 1, vendor_r );
212
+ rb_funcall( controller, rb_intern( "vendor" ), 2, ULL2NUM( datapath_id ), vendor_r );
213
213
  }
214
214
 
215
215
 
@@ -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.3"
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
- message.datapath_id.should == 0xabc
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: 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
@@ -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
@@ -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
- message.datapath_id.should == 0xabc
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
@@ -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 | arg |
39
- arg.datapath_id.should == 0xabc
40
- arg.type.should == Error::OFPET_PORT_MOD_FAILED
41
- arg.code.should == Error::OFPPMFC_BAD_PORT
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 | arg |
67
- arg.datapath_id.should == 0xabc
68
- arg.type.should == Error::OFPET_PORT_MOD_FAILED
69
- arg.code.should == Error::OFPPMFC_BAD_HW_ADDR
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 | arg |
89
- arg.datapath_id.should == 0xabc
90
- arg.type.should == Error::OFPET_BAD_ACTION
91
- arg.code.should == Error::OFPBAC_BAD_OUT_PORT
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 = { :port_status => "topology", :packet_in => "controller", :state_notify => "topology", :vendor => "controller" }
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 == [ "port_status::topology", "packet_in::controller", "state_notify::topology", "vendor::controller" ]
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: #{ message.datapath_id.to_hex }"
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: #{ message.datapath_id.to_hex }"
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: #{ message.datapath_id.to_hex }"
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: #{ message.datapath_id.to_hex }"
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: #{ message.datapath_id.to_hex }"
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: #{ message.datapath_id.to_hex }"
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:" );
@@ -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
- if ( ( wildcards & OFPFW_NW_SRC_MASK ) == 0 ) {
3983
- match->nw_src = ( ( packet_info * ) packet->user_data )->ipv4_saddr;
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
- else {
3986
- match->nw_src = ( ( packet_info * ) packet->user_data )->ipv4_saddr &
3987
- ( ( wildcards & OFPFW_NW_SRC_MASK ) >> OFPFW_NW_SRC_SHIFT );
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
- if ( ( wildcards & OFPFW_NW_SRC_MASK ) == 0 ) {
4032
- match->nw_src = ( ( packet_info * ) packet->user_data )->arp_spa;
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
- else {
4035
- match->nw_src = ( ( packet_info * ) packet->user_data )->arp_spa & ( ( wildcards & OFPFW_NW_SRC_MASK ) >> OFPFW_NW_SRC_SHIFT );
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
- uint32_t ip_source_address_flag = ntohl( ipv4->saddr ) & ( OFPFW_NW_SRC_ALL >> OFPFW_NW_SRC_SHIFT );
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
- uint32_t ip_destination_address_flag = ntohl( ipv4->daddr ) & ( OFPFW_NW_DST_ALL >> OFPFW_NW_DST_SHIFT );
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
- uint32_t ip_source_address_flag = ntohl( ipv4->saddr ) & ( OFPFW_NW_SRC_ALL >> OFPFW_NW_SRC_SHIFT );
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
- uint32_t ip_destination_address_flag = ntohl( ipv4->daddr ) & ( OFPFW_NW_DST_ALL >> OFPFW_NW_DST_SHIFT );
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
- uint32_t ip_source_address_flag = ntohl( ipv4->saddr ) & ( OFPFW_NW_SRC_ALL >> OFPFW_NW_SRC_SHIFT );
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
- uint32_t ip_destination_address_flag = ntohl( ipv4->daddr ) & ( OFPFW_NW_DST_ALL >> OFPFW_NW_DST_SHIFT );
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: 17
4
+ hash: 31
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 3
10
- version: 0.2.3
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-30 00:00:00 Z
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.15
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