trema 0.3.12 → 0.3.13
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/bin/trema +195 -179
- data/ruby/trema/command/run.rb +1 -1
- data/ruby/trema/features-reply.c +39 -8
- data/ruby/trema/packet-in.c +17 -0
- data/ruby/trema/version.rb +1 -1
- data/spec/trema/packet-in_spec.rb +49 -0
- metadata +9 -9
data/bin/trema
CHANGED
@@ -21,7 +21,6 @@
|
|
21
21
|
|
22
22
|
$LOAD_PATH.unshift File.expand_path( File.join File.dirname( __FILE__ ), "..", "ruby" )
|
23
23
|
|
24
|
-
|
25
24
|
require "rubygems"
|
26
25
|
|
27
26
|
require "gli"
|
@@ -30,257 +29,274 @@ require "trema/util"
|
|
30
29
|
require "trema/version"
|
31
30
|
|
32
31
|
|
33
|
-
|
34
|
-
include Trema::
|
35
|
-
include Trema::
|
32
|
+
class BinTrema
|
33
|
+
include Trema::Command
|
34
|
+
include Trema::Util
|
35
|
+
include GLI::App
|
36
36
|
|
37
37
|
|
38
|
-
|
38
|
+
def initialize
|
39
|
+
program_desc "Trema command-line tool"
|
39
40
|
|
40
41
|
|
41
|
-
desc "Displays the current runtime version"
|
42
|
-
version Trema::VERSION
|
42
|
+
desc "Displays the current runtime version"
|
43
|
+
version Trema::VERSION
|
43
44
|
|
44
45
|
|
45
|
-
desc "Be verbose"
|
46
|
-
switch [ :v, :verbose ], :negatable => false
|
46
|
+
desc "Be verbose"
|
47
|
+
switch [ :v, :verbose ], :negatable => false
|
47
48
|
|
48
49
|
|
49
|
-
desc "Runs a trema application"
|
50
|
-
arg_name "controller"
|
51
|
-
command :run do | c |
|
52
|
-
|
53
|
-
|
50
|
+
desc "Runs a trema application"
|
51
|
+
arg_name "controller"
|
52
|
+
command :run do | c |
|
53
|
+
c.desc "Runs as a daemon"
|
54
|
+
c.switch [ :d, :daemonize ], :negatable => false
|
54
55
|
|
55
|
-
|
56
|
-
|
56
|
+
c.desc "Enables Trema wireshark plugin"
|
57
|
+
c.switch [ :s, :tremashark ], :negatable => false
|
57
58
|
|
58
|
-
|
59
|
-
|
59
|
+
c.desc "Specifies emulated network configuration"
|
60
|
+
c.flag [ :c, :conf ]
|
60
61
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
end
|
62
|
+
c.action do | global_options, options, args |
|
63
|
+
trema_run options
|
64
|
+
end
|
65
|
+
end
|
65
66
|
|
66
67
|
|
67
|
-
desc "Terminates a trema process"
|
68
|
-
arg_name "name"
|
69
|
-
command :kill do | c |
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
68
|
+
desc "Terminates a trema process"
|
69
|
+
arg_name "name"
|
70
|
+
command :kill do | c |
|
71
|
+
c.action do | global_options, options, args |
|
72
|
+
help_now!( "name is required" ) if args.empty?
|
73
|
+
args.each do | each |
|
74
|
+
trema_kill each
|
75
|
+
end
|
76
|
+
end
|
74
77
|
end
|
75
|
-
end
|
76
|
-
end
|
77
78
|
|
78
79
|
|
79
|
-
desc "Starts a killed trema process again"
|
80
|
-
arg_name "name"
|
81
|
-
command :up do | c |
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
end
|
80
|
+
desc "Starts a killed trema process again"
|
81
|
+
arg_name "name"
|
82
|
+
command :up do | c |
|
83
|
+
c.action do | global_options, options, args |
|
84
|
+
trema_up args[ 0 ]
|
85
|
+
end
|
86
|
+
end
|
86
87
|
|
87
88
|
|
88
|
-
desc "Terminates all trema processes"
|
89
|
-
command :killall do | c |
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
end
|
89
|
+
desc "Terminates all trema processes"
|
90
|
+
command :killall do | c |
|
91
|
+
c.action do
|
92
|
+
trema_killall
|
93
|
+
end
|
94
|
+
end
|
94
95
|
|
95
96
|
|
96
|
-
desc "Sends UDP packets to destination host"
|
97
|
-
command :send_packets do | c |
|
98
|
-
|
99
|
-
|
97
|
+
desc "Sends UDP packets to destination host"
|
98
|
+
command :send_packets do | c |
|
99
|
+
c.desc "host that sends packets"
|
100
|
+
c.flag [ :s, :source ]
|
100
101
|
|
101
|
-
|
102
|
-
|
102
|
+
c.desc "host that receives packets"
|
103
|
+
c.flag [ :d, :dest ]
|
103
104
|
|
104
|
-
|
105
|
-
|
106
|
-
|
105
|
+
c.desc "number of times to increment the IP source address"
|
106
|
+
c.default_value nil
|
107
|
+
c.flag [ :inc_ip_src ]
|
107
108
|
|
108
|
-
|
109
|
-
|
110
|
-
|
109
|
+
c.desc "number of times to increment the IP destination address"
|
110
|
+
c.default_value nil
|
111
|
+
c.flag [ :inc_ip_dst ]
|
111
112
|
|
112
|
-
|
113
|
-
|
113
|
+
c.desc "set the initial UDP source port"
|
114
|
+
c.flag [ :tp_src ]
|
114
115
|
|
115
|
-
|
116
|
-
|
117
|
-
|
116
|
+
c.desc "number of times to increment the UDP source port"
|
117
|
+
c.default_value nil
|
118
|
+
c.flag [ :inc_tp_src ]
|
118
119
|
|
119
|
-
|
120
|
-
|
120
|
+
c.desc "set the initial UDP destination port"
|
121
|
+
c.flag [ :tp_dst ]
|
121
122
|
|
122
|
-
|
123
|
-
|
124
|
-
|
123
|
+
c.desc "number of times to increment the UDP destination port"
|
124
|
+
c.default_value nil
|
125
|
+
c.flag [ :inc_tp_dst ]
|
125
126
|
|
126
|
-
|
127
|
-
|
127
|
+
c.desc "send packet rate - packets per second"
|
128
|
+
c.flag [ :pps ]
|
128
129
|
|
129
|
-
|
130
|
-
|
130
|
+
c.desc "number of packets to send"
|
131
|
+
c.flag [ :n_pkts ]
|
131
132
|
|
132
|
-
|
133
|
-
|
133
|
+
c.desc "time duration to send packets"
|
134
|
+
c.flag [ :duration ]
|
134
135
|
|
135
|
-
|
136
|
-
|
136
|
+
c.desc "length of UDP payload"
|
137
|
+
c.flag [ :length ]
|
137
138
|
|
138
|
-
|
139
|
-
|
140
|
-
|
139
|
+
c.desc "increment UDP payload"
|
140
|
+
c.default_value nil
|
141
|
+
c.flag [ :inc_payload ]
|
141
142
|
|
142
|
-
|
143
|
-
|
144
|
-
|
143
|
+
c.action do | global_options, options, args |
|
144
|
+
raise "--source option is mandatory" if options[ :source ].nil?
|
145
|
+
raise "--dest option is mandatory" if options[ :dest ].nil?
|
145
146
|
|
146
|
-
|
147
|
-
|
148
|
-
end
|
147
|
+
trema_send_packets options[ :source ], options[ :dest ], options
|
148
|
+
end
|
149
|
+
end
|
149
150
|
|
150
151
|
|
151
|
-
desc "Brings a switch's specified port up"
|
152
|
-
command :port_up do | c |
|
153
|
-
|
154
|
-
|
152
|
+
desc "Brings a switch's specified port up"
|
153
|
+
command :port_up do | c |
|
154
|
+
c.desc "switch name"
|
155
|
+
c.flag [ :s, :switch ]
|
155
156
|
|
156
|
-
|
157
|
-
|
157
|
+
c.desc "port"
|
158
|
+
c.flag [ :p, :port ]
|
158
159
|
|
159
|
-
|
160
|
-
|
161
|
-
|
160
|
+
c.action do | global_options, options, args |
|
161
|
+
raise "--switch option is mandatory" if options[ :switch ].nil?
|
162
|
+
raise "--port option is mandatory" if options[ :port ].nil?
|
162
163
|
|
163
|
-
|
164
|
-
|
165
|
-
end
|
164
|
+
trema_port_up options[ :switch ], options[ :port ]
|
165
|
+
end
|
166
|
+
end
|
166
167
|
|
167
168
|
|
168
|
-
desc "Brings a switch's specified port down"
|
169
|
-
command :port_down do | c |
|
170
|
-
|
171
|
-
|
169
|
+
desc "Brings a switch's specified port down"
|
170
|
+
command :port_down do | c |
|
171
|
+
c.desc "switch name"
|
172
|
+
c.flag [ :s, :switch ]
|
172
173
|
|
173
|
-
|
174
|
-
|
174
|
+
c.desc "port"
|
175
|
+
c.flag [ :p, :port ]
|
175
176
|
|
176
|
-
|
177
|
-
|
178
|
-
|
177
|
+
c.action do | global_options, options, args |
|
178
|
+
raise "--switch option is mandatory" if options[ :switch ].nil?
|
179
|
+
raise "--port option is mandatory" if options[ :port ].nil?
|
179
180
|
|
180
|
-
|
181
|
-
|
182
|
-
end
|
181
|
+
trema_port_down options[ :switch ], options[ :port ]
|
182
|
+
end
|
183
|
+
end
|
183
184
|
|
184
185
|
|
185
|
-
desc "Shows stats of packets"
|
186
|
-
arg_name "host"
|
187
|
-
command :show_stats do | c |
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
186
|
+
desc "Shows stats of packets"
|
187
|
+
arg_name "host"
|
188
|
+
command :show_stats do | c |
|
189
|
+
c.desc "Show stats of packets sent"
|
190
|
+
c.switch [ :t, :tx ], :negatable => false
|
191
|
+
c.desc "Show stats of packets received"
|
192
|
+
c.switch [ :r, :rx ], :negatable => false
|
192
193
|
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
end
|
194
|
+
c.action do | global_options, options, args |
|
195
|
+
help_now!( "host is required" ) if args.empty?
|
196
|
+
trema_show_stats args[ 0 ], options[ :tx ], options[ :rx ]
|
197
|
+
end
|
198
|
+
end
|
198
199
|
|
199
200
|
|
200
|
-
desc "Resets stats of packets"
|
201
|
-
arg_name "hosts..."
|
202
|
-
command :reset_stats do | c |
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
201
|
+
desc "Resets stats of packets"
|
202
|
+
arg_name "hosts..."
|
203
|
+
command :reset_stats do | c |
|
204
|
+
c.action do | global_options, options, args |
|
205
|
+
hosts = args
|
206
|
+
if hosts.empty?
|
207
|
+
hosts = Trema::DSL::Context.load_current.hosts.keys
|
208
|
+
end
|
209
|
+
hosts.each do | each |
|
210
|
+
trema_reset_stats each
|
211
|
+
end
|
212
|
+
end
|
207
213
|
end
|
208
|
-
|
209
|
-
|
214
|
+
|
215
|
+
|
216
|
+
desc "Print all flow entries"
|
217
|
+
arg_name "switches..."
|
218
|
+
command :dump_flows do | c |
|
219
|
+
c.action do | global_options, options, args |
|
220
|
+
help_now!( "switches is required" ) if args.empty?
|
221
|
+
trema_dump_flows args
|
222
|
+
end
|
210
223
|
end
|
211
|
-
end
|
212
|
-
end
|
213
224
|
|
214
225
|
|
215
|
-
desc "
|
216
|
-
arg_name "
|
217
|
-
command :
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
end
|
226
|
+
desc "Opens a new shell in the specified network namespace"
|
227
|
+
arg_name "name"
|
228
|
+
command :netns do | c |
|
229
|
+
c.action do | global_options, options, args |
|
230
|
+
trema_netns args[ 0 ]
|
231
|
+
end
|
232
|
+
end
|
223
233
|
|
224
234
|
|
225
|
-
desc "Opens
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
end
|
235
|
+
desc "Opens in your browser Trema's Ruby API documentation"
|
236
|
+
command :ruby do | c |
|
237
|
+
c.action do
|
238
|
+
trema_ruby
|
239
|
+
end
|
240
|
+
end
|
232
241
|
|
233
242
|
|
234
|
-
desc "
|
235
|
-
command :
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
end
|
243
|
+
desc "Displays the current runtime version"
|
244
|
+
command :version do | c |
|
245
|
+
c.action do
|
246
|
+
trema_version
|
247
|
+
end
|
248
|
+
end
|
240
249
|
|
241
250
|
|
242
|
-
|
243
|
-
command :version do | c |
|
244
|
-
c.action do
|
245
|
-
trema_version
|
246
|
-
end
|
247
|
-
end
|
251
|
+
GLI::Commands::Help.skips_pre = false
|
248
252
|
|
249
253
|
|
250
|
-
|
254
|
+
pre do | global, command, options, args |
|
255
|
+
$verbose = global[ :verbose ]
|
251
256
|
|
257
|
+
if global[ :version ]
|
258
|
+
trema_version
|
259
|
+
exit_now! nil, 0
|
260
|
+
end
|
252
261
|
|
253
|
-
|
254
|
-
$verbose = global[ :verbose ]
|
262
|
+
assert_trema_is_built
|
255
263
|
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
264
|
+
if FileTest.exist?( Trema.tmp ) and not FileTest.writable?( Trema.tmp )
|
265
|
+
# Trema is system widely installed with gem command
|
266
|
+
sh "sudo chmod o+w -R #{ Trema.tmp }"
|
267
|
+
end
|
260
268
|
|
261
|
-
|
269
|
+
FileUtils.mkdir_p Trema.log
|
270
|
+
FileUtils.mkdir_p Trema.pid
|
271
|
+
FileUtils.mkdir_p Trema.sock
|
262
272
|
|
263
|
-
|
264
|
-
|
265
|
-
sh "sudo chmod o+w -R #{ Trema.tmp }"
|
266
|
-
end
|
273
|
+
true
|
274
|
+
end
|
267
275
|
|
268
|
-
FileUtils.mkdir_p Trema.log
|
269
|
-
FileUtils.mkdir_p Trema.pid
|
270
|
-
FileUtils.mkdir_p Trema.sock
|
271
276
|
|
272
|
-
|
273
|
-
|
277
|
+
on_error do | exception |
|
278
|
+
# Error logic here
|
279
|
+
# return false to skip default error handling
|
280
|
+
true
|
281
|
+
end
|
282
|
+
end
|
274
283
|
|
275
284
|
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
285
|
+
def start argv
|
286
|
+
begin
|
287
|
+
run argv
|
288
|
+
rescue
|
289
|
+
puts $!
|
290
|
+
$!.backtrace.each do | each |
|
291
|
+
puts each
|
292
|
+
end
|
293
|
+
exit
|
294
|
+
end
|
295
|
+
end
|
280
296
|
end
|
281
297
|
|
282
298
|
|
283
|
-
exit
|
299
|
+
exit BinTrema.new.start( ARGV )
|
284
300
|
|
285
301
|
|
286
302
|
### Local variables:
|
data/ruby/trema/command/run.rb
CHANGED
@@ -72,7 +72,7 @@ module Trema
|
|
72
72
|
controller_file = ARGV[ 0 ].split.first
|
73
73
|
if ruby_controller?
|
74
74
|
require "trema"
|
75
|
-
include Trema
|
75
|
+
Object.__send__ :include, Trema
|
76
76
|
ARGV.replace ARGV[ 0 ].split[ 1..-1 ]
|
77
77
|
$LOAD_PATH << File.dirname( controller_file )
|
78
78
|
load controller_file
|
data/ruby/trema/features-reply.c
CHANGED
@@ -68,7 +68,7 @@ features_reply_alloc( VALUE klass ) {
|
|
68
68
|
* @option options [Number] :actions
|
69
69
|
* supported actions expressed as a 32-bit bitmap.
|
70
70
|
* @option options [Port] :port
|
71
|
-
* an array of {Port} objects detailing
|
71
|
+
* an array of {Port} objects detailing port description and function.
|
72
72
|
* @return [FeaturesReply]
|
73
73
|
*/
|
74
74
|
static VALUE
|
@@ -117,8 +117,6 @@ features_reply_init( VALUE self, VALUE options ) {
|
|
117
117
|
features_reply->actions = htonl( ( uint32_t ) NUM2UINT( tmp ) );
|
118
118
|
}
|
119
119
|
|
120
|
-
// TODO: ports
|
121
|
-
|
122
120
|
rb_iv_set( self, "@attribute", options );
|
123
121
|
|
124
122
|
return self;
|
@@ -203,7 +201,7 @@ features_reply_actions( VALUE self ) {
|
|
203
201
|
|
204
202
|
|
205
203
|
/*
|
206
|
-
* An array of {Port} objects detailing
|
204
|
+
* An array of {Port} objects detailing port description and function.
|
207
205
|
*
|
208
206
|
* @return [Array<Port>] the value of ports.
|
209
207
|
*/
|
@@ -213,6 +211,17 @@ features_reply_ports( VALUE self ) {
|
|
213
211
|
}
|
214
212
|
|
215
213
|
|
214
|
+
/*
|
215
|
+
* An array of {Port} objects detailing physical port description and function.
|
216
|
+
*
|
217
|
+
* @return [Array<Port>] the value of ports.
|
218
|
+
*/
|
219
|
+
static VALUE
|
220
|
+
features_reply_physical_ports( VALUE self ) {
|
221
|
+
return rb_hash_aref( rb_iv_get( self, "@attribute" ), ID2SYM( rb_intern( "physical_ports" ) ) );
|
222
|
+
}
|
223
|
+
|
224
|
+
|
216
225
|
void
|
217
226
|
Init_features_reply() {
|
218
227
|
mTrema = rb_define_module( "Trema" );
|
@@ -227,6 +236,7 @@ Init_features_reply() {
|
|
227
236
|
rb_define_method( cFeaturesReply, "capabilities", features_reply_capabilities, 0 );
|
228
237
|
rb_define_method( cFeaturesReply, "actions", features_reply_actions, 0 );
|
229
238
|
rb_define_method( cFeaturesReply, "ports", features_reply_ports, 0 );
|
239
|
+
rb_define_method( cFeaturesReply, "physical_ports", features_reply_physical_ports, 0 );
|
230
240
|
}
|
231
241
|
|
232
242
|
|
@@ -242,11 +252,15 @@ handle_switch_ready( uint64_t datapath_id, void *controller ) {
|
|
242
252
|
* Extract and map {Port} to +ofp_phy_port+ structure.
|
243
253
|
*/
|
244
254
|
static VALUE
|
245
|
-
ports_from( const list_element *
|
255
|
+
ports_from( const list_element *c_ports ) {
|
246
256
|
VALUE ports = rb_ary_new();
|
247
257
|
|
258
|
+
if ( c_ports == NULL ) {
|
259
|
+
return ports;
|
260
|
+
}
|
261
|
+
|
248
262
|
list_element *port_head = xmalloc( sizeof( list_element ) );
|
249
|
-
memcpy( port_head,
|
263
|
+
memcpy( port_head, c_ports, sizeof( list_element ) );
|
250
264
|
list_element *port = NULL;
|
251
265
|
for ( port = port_head; port != NULL; port = port->next ) {
|
252
266
|
rb_ary_push( ports, port_from( ( struct ofp_phy_port * ) port->data ) );
|
@@ -256,6 +270,14 @@ ports_from( const list_element *phy_ports ) {
|
|
256
270
|
}
|
257
271
|
|
258
272
|
|
273
|
+
static void
|
274
|
+
append_physical_port( void *port, void *physical_ports ) {
|
275
|
+
if ( ( ( struct ofp_phy_port * ) port )->port_no <= OFPP_MAX ) {
|
276
|
+
append_to_tail( ( list_element ** ) physical_ports, port );
|
277
|
+
}
|
278
|
+
}
|
279
|
+
|
280
|
+
|
259
281
|
void
|
260
282
|
handle_features_reply(
|
261
283
|
uint64_t datapath_id,
|
@@ -264,7 +286,7 @@ handle_features_reply(
|
|
264
286
|
uint8_t n_tables,
|
265
287
|
uint32_t capabilities,
|
266
288
|
uint32_t actions,
|
267
|
-
const list_element *
|
289
|
+
const list_element *ports,
|
268
290
|
void *controller
|
269
291
|
) {
|
270
292
|
if ( rb_respond_to( ( VALUE ) controller, rb_intern( "features_reply" ) ) == Qfalse ) {
|
@@ -278,7 +300,16 @@ handle_features_reply(
|
|
278
300
|
rb_hash_aset( attributes, ID2SYM( rb_intern( "n_tables" ) ), UINT2NUM( n_tables ) );
|
279
301
|
rb_hash_aset( attributes, ID2SYM( rb_intern( "capabilities" ) ), UINT2NUM( capabilities ) );
|
280
302
|
rb_hash_aset( attributes, ID2SYM( rb_intern( "actions" ) ), UINT2NUM( actions ) );
|
281
|
-
rb_hash_aset( attributes, ID2SYM( rb_intern( "ports" ) ), ports_from(
|
303
|
+
rb_hash_aset( attributes, ID2SYM( rb_intern( "ports" ) ), ports_from( ports ) );
|
304
|
+
|
305
|
+
list_element *tmp_ports = xmalloc( sizeof( list_element ) );
|
306
|
+
memcpy( tmp_ports, ports, sizeof( list_element ) );
|
307
|
+
list_element *physical_ports = xmalloc( sizeof( list_element ) );
|
308
|
+
create_list( &physical_ports );
|
309
|
+
iterate_list( tmp_ports, append_physical_port, &physical_ports );
|
310
|
+
rb_hash_aset( attributes, ID2SYM( rb_intern( "physical_ports" ) ), ports_from( physical_ports ) );
|
311
|
+
xfree( physical_ports );
|
312
|
+
xfree( tmp_ports );
|
282
313
|
|
283
314
|
VALUE features_reply = rb_funcall( cFeaturesReply, rb_intern( "new" ), 1, attributes );
|
284
315
|
rb_funcall( ( VALUE ) controller, rb_intern( "features_reply" ), 2, ULL2NUM( datapath_id ), features_reply );
|
data/ruby/trema/packet-in.c
CHANGED
@@ -593,6 +593,22 @@ packet_in_ipv4_daddr( VALUE self ) {
|
|
593
593
|
}
|
594
594
|
|
595
595
|
|
596
|
+
/*
|
597
|
+
* Is it a LLDP packet?
|
598
|
+
*
|
599
|
+
* @return [Boolean] whether the packet is a LLDP packet or not.
|
600
|
+
*/
|
601
|
+
static VALUE
|
602
|
+
packet_in_is_lldp( VALUE self ) {
|
603
|
+
if ( ( get_packet_in_info( self )->format & NW_LLDP ) ) {
|
604
|
+
return Qtrue;
|
605
|
+
}
|
606
|
+
else {
|
607
|
+
return Qfalse;
|
608
|
+
}
|
609
|
+
}
|
610
|
+
|
611
|
+
|
596
612
|
/*
|
597
613
|
* Is it an ICMPv4 packet?
|
598
614
|
*
|
@@ -1103,6 +1119,7 @@ Init_packet_in() {
|
|
1103
1119
|
rb_define_method( cPacketIn, "vtag?", packet_in_is_vtag, 0 );
|
1104
1120
|
rb_define_method( cPacketIn, "arp?", packet_in_is_arp, 0 );
|
1105
1121
|
rb_define_method( cPacketIn, "ipv4?", packet_in_is_ipv4, 0 );
|
1122
|
+
rb_define_method( cPacketIn, "lldp?", packet_in_is_lldp, 0 );
|
1106
1123
|
rb_define_method( cPacketIn, "icmpv4?", packet_in_is_icmpv4, 0 );
|
1107
1124
|
rb_define_method( cPacketIn, "igmp?", packet_in_is_igmp, 0 );
|
1108
1125
|
rb_define_method( cPacketIn, "tcp?", packet_in_is_tcp, 0 );
|
data/ruby/trema/version.rb
CHANGED
@@ -131,6 +131,7 @@ describe Trema::PacketIn do
|
|
131
131
|
expect( message.vtag? ).to be_false
|
132
132
|
expect( message.arp? ).to be_true
|
133
133
|
expect( message.ipv4? ).to be_false
|
134
|
+
expect( message.lldp? ).to be_false
|
134
135
|
expect( message.tcp? ).to be_false
|
135
136
|
expect( message.udp? ).to be_false
|
136
137
|
expect( message.icmpv4? ).to be_false
|
@@ -241,6 +242,7 @@ describe Trema::PacketIn do
|
|
241
242
|
expect( message.vtag? ).to be_false
|
242
243
|
expect( message.arp? ).to be_false
|
243
244
|
expect( message.ipv4? ).to be_true
|
245
|
+
expect( message.lldp? ).to be_false
|
244
246
|
expect( message.udp? ).to be_false
|
245
247
|
expect( message.tcp? ).to be_true
|
246
248
|
expect( message.icmpv4? ).to be_false
|
@@ -324,6 +326,7 @@ describe Trema::PacketIn do
|
|
324
326
|
expect( message.vtag? ).to be_false
|
325
327
|
expect( message.arp? ).to be_false
|
326
328
|
expect( message.ipv4? ).to be_true
|
329
|
+
expect( message.lldp? ).to be_false
|
327
330
|
expect( message.tcp? ).to be_false
|
328
331
|
expect( message.udp? ).to be_true
|
329
332
|
expect( message.icmpv4? ).to be_false
|
@@ -404,6 +407,7 @@ describe Trema::PacketIn do
|
|
404
407
|
expect( message.vtag? ).to be_true
|
405
408
|
expect( message.arp? ).to be_false
|
406
409
|
expect( message.ipv4? ).to be_true
|
410
|
+
expect( message.lldp? ).to be_false
|
407
411
|
expect( message.udp? ).to be_false
|
408
412
|
expect( message.tcp? ).to be_false
|
409
413
|
expect( message.icmpv4? ).to be_true
|
@@ -487,6 +491,7 @@ describe Trema::PacketIn do
|
|
487
491
|
expect( message.vtag? ).to be_false
|
488
492
|
expect( message.arp? ).to be_false
|
489
493
|
expect( message.ipv4? ).to be_true
|
494
|
+
expect( message.lldp? ).to be_false
|
490
495
|
expect( message.udp? ).to be_false
|
491
496
|
expect( message.tcp? ).to be_false
|
492
497
|
expect( message.icmpv4? ).to be_false
|
@@ -523,6 +528,50 @@ describe Trema::PacketIn do
|
|
523
528
|
}
|
524
529
|
end
|
525
530
|
|
531
|
+
it "should have correct LLDP packet fields" do
|
532
|
+
network {
|
533
|
+
vswitch( "packet-in" ) { datapath_id 0xabc }
|
534
|
+
vhost "host1"
|
535
|
+
vhost "host2"
|
536
|
+
link "host1", "packet-in"
|
537
|
+
link "host2", "packet-in"
|
538
|
+
}.run( PacketInSendController ) {
|
539
|
+
data = [
|
540
|
+
0x01, 0x80, 0xC2, 0x00, 0x00, 0x0E, # dst
|
541
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x02, # src
|
542
|
+
0x88, 0xcc, # ether type
|
543
|
+
0x02, 0x05, 0x07, 0x30, 0x78, 0x65, 0x31, # Chasis ID
|
544
|
+
0x04, 0x02, 0x07, 0x31, # Port ID
|
545
|
+
0x06, 0x02, 0x00, 0xb4, # TTL
|
546
|
+
0x00, 0x00, # EOF
|
547
|
+
0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
|
548
|
+
0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
|
549
|
+
0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
|
550
|
+
0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
|
551
|
+
0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5,
|
552
|
+
0xa5, 0xa5, 0xa5, 0xa5, 0xa5
|
553
|
+
].pack( "C*" )
|
554
|
+
controller( "PacketInSendController" ).should_receive( :packet_in ) do | datapath_id, message |
|
555
|
+
expect( message.in_port ).to be > 0
|
556
|
+
expect( message.vtag? ).to be_false
|
557
|
+
expect( message.arp? ).to be_false
|
558
|
+
expect( message.ipv4? ).to be_false
|
559
|
+
expect( message.lldp? ).to be_true
|
560
|
+
expect( message.udp? ).to be_false
|
561
|
+
expect( message.tcp? ).to be_false
|
562
|
+
expect( message.icmpv4? ).to be_false
|
563
|
+
expect( message.igmp? ).to be_false
|
564
|
+
end
|
565
|
+
|
566
|
+
controller( "PacketInSendController" ).send_packet_out(
|
567
|
+
0xabc,
|
568
|
+
:data => data,
|
569
|
+
:actions => Trema::ActionOutput.new( :port => Controller::OFPP_CONTROLLER )
|
570
|
+
)
|
571
|
+
sleep 2
|
572
|
+
}
|
573
|
+
end
|
574
|
+
|
526
575
|
end
|
527
576
|
|
528
577
|
end
|
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: 9
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.3.
|
9
|
+
- 13
|
10
|
+
version: 0.3.13
|
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: 2013-02-
|
18
|
+
date: 2013-02-18 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
prerelease: false
|
@@ -31,8 +31,8 @@ dependencies:
|
|
31
31
|
- 2
|
32
32
|
- 3
|
33
33
|
version: 1.2.3
|
34
|
-
requirement: *id001
|
35
34
|
type: :runtime
|
35
|
+
requirement: *id001
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
prerelease: false
|
38
38
|
name: gli
|
@@ -47,8 +47,8 @@ dependencies:
|
|
47
47
|
- 5
|
48
48
|
- 4
|
49
49
|
version: 2.5.4
|
50
|
-
requirement: *id002
|
51
50
|
type: :runtime
|
51
|
+
requirement: *id002
|
52
52
|
- !ruby/object:Gem::Dependency
|
53
53
|
prerelease: false
|
54
54
|
name: rake
|
@@ -63,8 +63,8 @@ dependencies:
|
|
63
63
|
- 0
|
64
64
|
- 3
|
65
65
|
version: 10.0.3
|
66
|
-
requirement: *id003
|
67
66
|
type: :runtime
|
67
|
+
requirement: *id003
|
68
68
|
- !ruby/object:Gem::Dependency
|
69
69
|
prerelease: false
|
70
70
|
name: rdoc
|
@@ -79,8 +79,8 @@ dependencies:
|
|
79
79
|
- 12
|
80
80
|
- 1
|
81
81
|
version: 3.12.1
|
82
|
-
requirement: *id004
|
83
82
|
type: :runtime
|
83
|
+
requirement: *id004
|
84
84
|
description: Trema is a full-stack, easy-to-use framework for developing OpenFlow controllers in Ruby and C.
|
85
85
|
email:
|
86
86
|
- yasuhito@gmail.com
|
@@ -787,7 +787,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
787
787
|
requirements: []
|
788
788
|
|
789
789
|
rubyforge_project:
|
790
|
-
rubygems_version: 1.8.
|
790
|
+
rubygems_version: 1.8.25
|
791
791
|
signing_key:
|
792
792
|
specification_version: 3
|
793
793
|
summary: Full-stack OpenFlow framework.
|