trema 0.1.3.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rantfile +87 -80
- data/VERSION +1 -1
- data/cruise.rb +3 -3
- data/features/step_definitions/misc_steps.rb +2 -2
- data/features/support/env.rb +3 -3
- data/ruby/trema/command/kill.rb +1 -1
- data/ruby/trema/daemon.rb +3 -3
- data/ruby/trema/executables.rb +36 -54
- data/ruby/trema/link.rb +4 -1
- data/ruby/trema/monkey-patch/module.rb +2 -0
- data/ruby/trema/monkey-patch/module/class-method.rb +40 -0
- data/ruby/trema/open-vswitch.rb +1 -1
- data/ruby/trema/packet_in.c +96 -0
- data/ruby/trema/path.rb +42 -92
- data/ruby/trema/util.rb +6 -1
- data/spec/trema/dsl/runner_spec.rb +31 -8
- data/spec/trema/echo-request_spec.rb +1 -1
- data/spec/trema/executables_spec.rb +22 -41
- data/spec/trema/packet-in_spec.rb +375 -67
- data/spec/trema/packet-out_spec.rb +2 -1
- data/spec/trema/queue-get-config-request_spec.rb +1 -1
- data/src/lib/ipv4.h +18 -1
- data/src/lib/packet_info.h +1 -1
- data/src/lib/packet_parser.c +2 -2
- data/trema +3 -4
- data/trema.gemspec +3 -2
- data/unittests/lib/openflow_message_test.c +1 -1
- data/unittests/lib/packet_parser_test.c +1 -1
- data/unittests/lib/utility_test.c +2 -2
- metadata +5 -5
data/ruby/trema/util.rb
CHANGED
@@ -50,6 +50,11 @@ EOF
|
|
50
50
|
|
51
51
|
|
52
52
|
def cleanup session
|
53
|
+
# [FIXME] Use session.switch_manager
|
54
|
+
sm_pid = File.join( Trema.pid, "switch_manager.pid" )
|
55
|
+
if FileTest.exist?( sm_pid )
|
56
|
+
Trema::Process.read( sm_pid ).kill!
|
57
|
+
end
|
53
58
|
session.apps.each do | name, app |
|
54
59
|
app.shutdown!
|
55
60
|
end
|
@@ -63,7 +68,7 @@ EOF
|
|
63
68
|
link.delete!
|
64
69
|
end
|
65
70
|
|
66
|
-
Dir.glob( File.join Trema.
|
71
|
+
Dir.glob( File.join Trema.pid, "*.pid" ).each do | each |
|
67
72
|
Trema::Process.read( each ).kill!
|
68
73
|
end
|
69
74
|
|
@@ -20,6 +20,7 @@
|
|
20
20
|
|
21
21
|
require File.join( File.dirname( __FILE__ ), "..", "..", "spec_helper" )
|
22
22
|
require "trema/dsl/runner"
|
23
|
+
require "trema/ordered-hash"
|
23
24
|
|
24
25
|
|
25
26
|
module Trema
|
@@ -128,13 +129,25 @@ module Trema
|
|
128
129
|
host2 = mock( "host2" )
|
129
130
|
|
130
131
|
host0.should_receive( :run! ).once.ordered
|
131
|
-
host0.should_receive( :add_arp_entry ).with
|
132
|
+
host0.should_receive( :add_arp_entry ).with do | arg |
|
133
|
+
arg.size.should == 2
|
134
|
+
arg.should include( host1 )
|
135
|
+
arg.should include( host2 )
|
136
|
+
end
|
132
137
|
|
133
138
|
host1.should_receive( :run! ).once.ordered
|
134
|
-
host1.should_receive( :add_arp_entry ).with
|
139
|
+
host1.should_receive( :add_arp_entry ).with do | arg |
|
140
|
+
arg.size.should == 2
|
141
|
+
arg.should include( host0 )
|
142
|
+
arg.should include( host2 )
|
143
|
+
end
|
135
144
|
|
136
145
|
host2.should_receive( :run! ).once.ordered
|
137
|
-
host2.should_receive( :add_arp_entry ).with
|
146
|
+
host2.should_receive( :add_arp_entry ).with do | arg |
|
147
|
+
arg.size.should == 2
|
148
|
+
arg.should include( host0 )
|
149
|
+
arg.should include( host1 )
|
150
|
+
end
|
138
151
|
|
139
152
|
context = mock(
|
140
153
|
"context",
|
@@ -179,14 +192,19 @@ module Trema
|
|
179
192
|
|
180
193
|
|
181
194
|
it "should run apps" do
|
182
|
-
|
195
|
+
apps = OrderedHash.new
|
196
|
+
|
197
|
+
app0 = mock( "app0", :name => "app0" )
|
183
198
|
app0.should_receive( :daemonize! ).once.ordered
|
199
|
+
apps[ "app0" ] = app0
|
184
200
|
|
185
|
-
app1 = mock( "app1" )
|
201
|
+
app1 = mock( "app1", :name => "app1" )
|
186
202
|
app1.should_receive( :daemonize! ).once.ordered
|
203
|
+
apps[ "app1" ] = app1
|
187
204
|
|
188
|
-
app2 = mock( "app2", :name => "
|
205
|
+
app2 = mock( "app2", :name => "app2" )
|
189
206
|
app2.should_receive( :run! ).once.ordered
|
207
|
+
apps[ "app2" ] = app2
|
190
208
|
|
191
209
|
context = mock(
|
192
210
|
"context",
|
@@ -196,7 +214,7 @@ module Trema
|
|
196
214
|
:links => {},
|
197
215
|
:hosts => {},
|
198
216
|
:switches => {},
|
199
|
-
:apps =>
|
217
|
+
:apps => apps
|
200
218
|
)
|
201
219
|
|
202
220
|
Runner.new( context ).run
|
@@ -204,14 +222,19 @@ module Trema
|
|
204
222
|
|
205
223
|
|
206
224
|
it "should daemonize apps" do
|
225
|
+
apps = OrderedHash.new
|
226
|
+
|
207
227
|
app0 = mock( "app0" )
|
208
228
|
app0.should_receive( :daemonize! ).once.ordered
|
229
|
+
apps[ "app0" ] = app0
|
209
230
|
|
210
231
|
app1 = mock( "app1" )
|
211
232
|
app1.should_receive( :daemonize! ).once.ordered
|
233
|
+
apps[ "app1" ] = app1
|
212
234
|
|
213
235
|
app2 = mock( "app2", :name => "App2" )
|
214
236
|
app2.should_receive( :daemonize! ).once.ordered
|
237
|
+
apps[ "app2" ] = app2
|
215
238
|
|
216
239
|
context = mock(
|
217
240
|
"context",
|
@@ -221,7 +244,7 @@ module Trema
|
|
221
244
|
:links => {},
|
222
245
|
:hosts => {},
|
223
246
|
:switches => {},
|
224
|
-
:apps =>
|
247
|
+
:apps => apps
|
225
248
|
)
|
226
249
|
|
227
250
|
Runner.new( context ).daemonize
|
@@ -59,7 +59,7 @@ describe EchoRequest, ".new( VALID OPTIONS )" do
|
|
59
59
|
}.run( EchoRequestController ) {
|
60
60
|
echo_request = EchoRequest.new( :transaction_id => 1234, :user_data => 'this is a test' )
|
61
61
|
controller( "EchoRequestController" ).send_message( 0xabc, echo_request )
|
62
|
-
log_file = Trema.
|
62
|
+
log_file = Trema.log + "/openflowd.echo_request.log"
|
63
63
|
IO.read( log_file ).should include( "OFPT_ECHO_REPLY" )
|
64
64
|
sleep 1
|
65
65
|
}
|
@@ -23,47 +23,28 @@ require "trema/executables"
|
|
23
23
|
|
24
24
|
|
25
25
|
describe Trema::Executables do
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
end
|
49
|
-
|
50
|
-
|
51
|
-
it "should know the path of phost's cli executable" do
|
52
|
-
Trema::Executables.should respond_to( :cli )
|
53
|
-
end
|
54
|
-
|
55
|
-
|
56
|
-
it "should know the path of ovs-openflowd executable" do
|
57
|
-
Trema::Executables.should respond_to( :ovs_openflowd )
|
58
|
-
end
|
59
|
-
|
60
|
-
|
61
|
-
it "should detect if all executables are compled or not" do
|
62
|
-
FileTest.stub!( :executable? ).and_return( true )
|
63
|
-
Trema::Executables.compiled?.should be_true
|
64
|
-
|
65
|
-
FileTest.stub!( :executable? ).and_return( false )
|
66
|
-
Trema::Executables.compiled?.should be_false
|
26
|
+
subject { Trema::Executables }
|
27
|
+
|
28
|
+
its ( :cli ) { should be_a( String ) }
|
29
|
+
its ( :ovs_ofctl ) { should be_a( String ) }
|
30
|
+
its ( :ovs_openflowd ) { should be_a( String ) }
|
31
|
+
its ( :packet_capture ) { should be_a( String ) }
|
32
|
+
its ( :packetin_filter ) { should be_a( String ) }
|
33
|
+
its ( :phost ) { should be_a( String ) }
|
34
|
+
its ( :stdin_relay ) { should be_a( String ) }
|
35
|
+
its ( :switch ) { should be_a( String ) }
|
36
|
+
its ( :switch_manager ) { should be_a( String ) }
|
37
|
+
its ( :syslog_relay ) { should be_a( String ) }
|
38
|
+
its ( :tremashark ) { should be_a( String ) }
|
39
|
+
|
40
|
+
context "when Trema is compiled" do
|
41
|
+
before { FileTest.stub!( :executable? ).and_return( true ) }
|
42
|
+
its ( :compiled? ) { should be_true }
|
43
|
+
end
|
44
|
+
|
45
|
+
context "when Trema is not compiled" do
|
46
|
+
before { FileTest.stub!( :executable? ).and_return( false ) }
|
47
|
+
its ( :compiled? ) { should be_false }
|
67
48
|
end
|
68
49
|
end
|
69
50
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
|
2
2
|
# Author: Nick Karanatsios <nickkaranatsios@gmail.com>
|
3
3
|
#
|
4
4
|
# Copyright (C) 2008-2012 NEC Corporation
|
@@ -31,9 +31,23 @@ describe Trema::PacketIn do
|
|
31
31
|
|
32
32
|
class PacketInController < Controller; end
|
33
33
|
|
34
|
+
class PacketInSendController < Controller
|
35
|
+
def packet_in datapath_id, message
|
36
|
+
send_flow_mod_add(
|
37
|
+
datapath_id,
|
38
|
+
:match => Match.from( message ),
|
39
|
+
:actions => Trema::ActionOutput.new( :port => 2 )
|
40
|
+
)
|
41
|
+
send_packet_out(
|
42
|
+
datapath_id,
|
43
|
+
:packet_in => message,
|
44
|
+
:actions => Trema::ActionOutput.new( :port => 2 )
|
45
|
+
)
|
46
|
+
end
|
47
|
+
end
|
34
48
|
|
35
49
|
context "when instance is created" do
|
36
|
-
it "should have valid datapath_id" do
|
50
|
+
it "should have valid datapath_id and in_port" do
|
37
51
|
network {
|
38
52
|
vswitch( "test" ) { datapath_id 0xabc }
|
39
53
|
vhost "host1"
|
@@ -44,17 +58,20 @@ describe Trema::PacketIn do
|
|
44
58
|
controller( "PacketInController" ).should_receive( :packet_in ) do | datapath_id, message |
|
45
59
|
datapath_id.should == 0xabc
|
46
60
|
message.datapath_id.should == 0xabc
|
61
|
+
message.in_port.should > 0
|
47
62
|
end
|
48
63
|
send_and_wait
|
49
64
|
}
|
50
65
|
end
|
51
66
|
|
52
67
|
|
53
|
-
it "should have user data" do
|
68
|
+
it "should have vaild user data" do
|
54
69
|
network {
|
55
70
|
vswitch( "test" ) { datapath_id 0xabc }
|
56
|
-
vhost "host1"
|
57
|
-
|
71
|
+
vhost( "host1" ) { mac "00:00:00:00:00:01"
|
72
|
+
ip "192.168.1.1" }
|
73
|
+
vhost( "host2" ) { mac "00:00:00:00:00:02"
|
74
|
+
ip "192.168.1.2" }
|
58
75
|
link "test", "host1"
|
59
76
|
link "test", "host2"
|
60
77
|
}.run( PacketInController ) {
|
@@ -63,103 +80,394 @@ describe Trema::PacketIn do
|
|
63
80
|
message.total_len.should > 20
|
64
81
|
message.data.should be_instance_of( String )
|
65
82
|
message.buffered?.should be_false
|
83
|
+
|
84
|
+
message.macsa.should be_instance_of( Trema::Mac )
|
85
|
+
message.macsa.to_s.should == "00:00:00:00:00:01"
|
86
|
+
message.macda.should be_instance_of( Trema::Mac )
|
87
|
+
message.macda.to_s.should == "00:00:00:00:00:02"
|
88
|
+
|
89
|
+
message.eth_type.should == 0x0800
|
90
|
+
message.ipv4?.should == true
|
91
|
+
message.ipv4_version.should == 4
|
92
|
+
message.ipv4_saddr.should be_instance_of( Trema::IP )
|
93
|
+
message.ipv4_saddr.to_s.should == "192.168.1.1"
|
94
|
+
message.ipv4_daddr.should be_instance_of( Trema::IP )
|
95
|
+
message.ipv4_daddr.to_s.should == "192.168.1.2"
|
66
96
|
end
|
67
97
|
send_and_wait
|
68
98
|
}
|
69
99
|
end
|
100
|
+
end
|
70
101
|
|
71
|
-
|
72
|
-
it "should have
|
102
|
+
context "when reading packet content" do
|
103
|
+
it "should have correct ARP packet fields" do
|
73
104
|
network {
|
74
|
-
vswitch( "
|
75
|
-
vhost
|
76
|
-
vhost( "host2" ) { mac "00:00:00:00:00:02" }
|
77
|
-
link "
|
78
|
-
link "
|
79
|
-
}.run(
|
80
|
-
|
81
|
-
|
82
|
-
|
105
|
+
vswitch( "packet-in" ) { datapath_id 0xabc }
|
106
|
+
vhost "host1"
|
107
|
+
vhost ( "host2" ) { mac "00:00:00:00:00:02" }
|
108
|
+
link "host1", "packet-in"
|
109
|
+
link "host2", "packet-in"
|
110
|
+
}.run( PacketInSendController ) {
|
111
|
+
data = [
|
112
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x02, # dst
|
113
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, # src
|
114
|
+
0x08, 0x06, # ether type
|
115
|
+
# arp
|
116
|
+
0x00, 0x01, # hardware type
|
117
|
+
0x08, 0x00, # protocol type
|
118
|
+
0x06, # hardware address length
|
119
|
+
0x04, # protocol address length
|
120
|
+
0x00, 0x02, # operation
|
121
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, # sender hardware address
|
122
|
+
0xc0, 0xa8, 0x00, 0x01, # sender protocol address
|
123
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x02, # target hardware address
|
124
|
+
0xc0, 0xa8, 0x00, 0x02, # target protocol address
|
125
|
+
# padding to 64 bytes
|
126
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
127
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
128
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
129
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
130
|
+
0x00, 0x00
|
131
|
+
].pack( "C*" )
|
132
|
+
controller( "PacketInSendController" ).should_receive( :packet_in ) do | datapath_id, message |
|
133
|
+
message.in_port.should > 0
|
134
|
+
message.vtag?.should be_false
|
135
|
+
message.arp?.should be_true
|
136
|
+
message.ipv4?.should be_false
|
137
|
+
message.tcp?.should be_false
|
138
|
+
message.udp?.should be_false
|
139
|
+
message.icmpv4?.should be_false
|
140
|
+
message.igmp?.should be_false
|
141
|
+
|
142
|
+
message.arp_oper.should == 2
|
143
|
+
message.arp_sha.to_s.should == "00:00:00:00:00:01"
|
144
|
+
message.arp_spa.to_s.should == "192.168.0.1"
|
145
|
+
message.arp_tha.to_s.should == "00:00:00:00:00:02"
|
146
|
+
message.arp_tpa.to_s.should == "192.168.0.2"
|
83
147
|
end
|
84
|
-
|
148
|
+
|
149
|
+
controller( "PacketInSendController" ).send_packet_out(
|
150
|
+
0xabc,
|
151
|
+
:data => data,
|
152
|
+
:actions => Trema::ActionOutput.new( :port => Controller::OFPP_CONTROLLER )
|
153
|
+
)
|
154
|
+
sleep 2
|
85
155
|
}
|
86
156
|
end
|
87
|
-
|
88
157
|
|
89
|
-
it "should have
|
158
|
+
it "should have correct TCP packet fields" do
|
90
159
|
network {
|
91
|
-
vswitch( "
|
92
|
-
vhost
|
93
|
-
vhost( "host2" ) {
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
160
|
+
vswitch( "packet-in" ) { datapath_id 0xabc }
|
161
|
+
vhost "host1"
|
162
|
+
vhost ( "host2" ) {
|
163
|
+
ip "192.168.0.2"
|
164
|
+
netmask "255.255.0.0"
|
165
|
+
mac "00:00:00:00:00:02"
|
166
|
+
}
|
167
|
+
link "host1", "packet-in"
|
168
|
+
link "host2", "packet-in"
|
169
|
+
}.run( PacketInSendController ) {
|
170
|
+
data = [
|
171
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x02, # dst
|
172
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, # src
|
173
|
+
0x08, 0x00, # ether type
|
174
|
+
# ipv4
|
175
|
+
0x45, 0x00, # version
|
176
|
+
0x00, 0x28, # length
|
177
|
+
0x00, 0x00,
|
178
|
+
0x00, 0x00,
|
179
|
+
0x00, # ttl
|
180
|
+
0x06, # protocol
|
181
|
+
0x39, 0x7d, # checksum
|
182
|
+
0xc0, 0xa8, 0x00, 0x01, # src
|
183
|
+
0xc0, 0xa8, 0x00, 0x02, # dst
|
184
|
+
# tcp
|
185
|
+
0x00, 0x01, # src port
|
186
|
+
0x00, 0x02, # dst port
|
187
|
+
0x00, 0x00, 0x00, 0x00, # sequence number
|
188
|
+
0x00, 0x00, 0x00, 0x00, # acknowledgement number
|
189
|
+
0x50, # data offset,
|
190
|
+
0x00, # flags
|
191
|
+
0x00, 0x00, # window size
|
192
|
+
0x2e, 0x86, # checksum
|
193
|
+
0x00, 0x00, # urgent pointer
|
194
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
195
|
+
].pack( "C*" )
|
196
|
+
controller( "PacketInSendController" ).should_receive( :packet_in ) do | datapath_id, message |
|
197
|
+
message.in_port.should > 0
|
198
|
+
message.vtag?.should be_false
|
199
|
+
message.arp?.should be_false
|
200
|
+
message.ipv4?.should be_true
|
201
|
+
message.udp?.should be_false
|
202
|
+
message.tcp?.should be_true
|
203
|
+
message.icmpv4?.should be_false
|
204
|
+
message.igmp?.should be_false
|
205
|
+
|
206
|
+
message.ipv4_version.should == 4
|
207
|
+
message.ipv4_ihl.should == 5
|
208
|
+
message.ipv4_tos.should == 0
|
209
|
+
message.ipv4_tot_len.should == 0x28
|
210
|
+
message.ipv4_id.should == 0
|
211
|
+
message.ipv4_frag_off.should == 0
|
212
|
+
message.ipv4_ttl.should == 0
|
213
|
+
message.ipv4_protocol.should == 6
|
214
|
+
message.ipv4_checksum.should == 0x397d
|
215
|
+
message.ipv4_saddr.to_s.should == "192.168.0.1"
|
216
|
+
message.ipv4_daddr.to_s.should == "192.168.0.2"
|
217
|
+
|
218
|
+
message.tcp_src_port.should == 1
|
219
|
+
message.tcp_dst_port.should == 2
|
220
|
+
message.tcp_seq_no.should == 0
|
221
|
+
message.tcp_ack_no.should == 0
|
222
|
+
message.tcp_offset.should == 5
|
223
|
+
message.tcp_flags.should == 0
|
224
|
+
message.tcp_window.should == 0
|
225
|
+
message.tcp_checksum.should == 11910 # 0x2e86
|
226
|
+
message.tcp_urgent.should == 0
|
100
227
|
end
|
101
|
-
|
228
|
+
|
229
|
+
controller( "PacketInSendController" ).send_packet_out(
|
230
|
+
0xabc,
|
231
|
+
:data => data,
|
232
|
+
:actions => Trema::ActionOutput.new( :port => Controller::OFPP_CONTROLLER )
|
233
|
+
)
|
234
|
+
sleep 2
|
102
235
|
}
|
103
236
|
end
|
104
237
|
|
105
|
-
|
106
|
-
it "should have user L3 information" do
|
238
|
+
it "should have correct UDP packet fields" do
|
107
239
|
network {
|
108
|
-
vswitch( "
|
109
|
-
vhost
|
110
|
-
vhost( "host2" ) {
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
240
|
+
vswitch( "packet-in" ) { datapath_id 0xabc }
|
241
|
+
vhost "host1"
|
242
|
+
vhost ( "host2" ) {
|
243
|
+
ip "192.168.0.2"
|
244
|
+
netmask "255.255.0.0"
|
245
|
+
mac "00:00:00:00:00:02"
|
246
|
+
}
|
247
|
+
link "host1", "packet-in"
|
248
|
+
link "host2", "packet-in"
|
249
|
+
}.run( PacketInSendController ) {
|
250
|
+
data = [
|
251
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x02, # dst
|
252
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, # src
|
253
|
+
0x08, 0x00, # ether type
|
254
|
+
# ipv4
|
255
|
+
0x45, 0x00, # version
|
256
|
+
0x00, 0x32, # length
|
257
|
+
0x00, 0x00,
|
258
|
+
0x00, 0x00,
|
259
|
+
0x40, # ttl
|
260
|
+
0x11, # protocol
|
261
|
+
0xf9, 0x68, # checksum
|
262
|
+
0xc0, 0xa8, 0x00, 0x01, # src
|
263
|
+
0xc0, 0xa8, 0x00, 0x02, # dst
|
264
|
+
# udp
|
265
|
+
0x00, 0x01, # src port
|
266
|
+
0x00, 0x02, # dst port
|
267
|
+
0x00, 0x1e, # length
|
268
|
+
0x00, 0x00, # checksum
|
269
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
270
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
271
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
272
|
+
].pack( "C*" )
|
273
|
+
controller( "PacketInSendController" ).should_receive( :packet_in ) do | datapath_id, message |
|
274
|
+
message.in_port.should > 0
|
275
|
+
message.vtag?.should be_false
|
276
|
+
message.arp?.should be_false
|
277
|
+
message.ipv4?.should be_true
|
278
|
+
message.tcp?.should be_false
|
279
|
+
message.udp?.should be_true
|
280
|
+
message.icmpv4?.should be_false
|
281
|
+
message.igmp?.should be_false
|
282
|
+
|
117
283
|
message.ipv4_version.should == 4
|
118
|
-
message.
|
119
|
-
message.
|
120
|
-
message.
|
121
|
-
message.
|
122
|
-
message.
|
284
|
+
message.ipv4_ihl.should == 5
|
285
|
+
message.ipv4_tos.should == 0
|
286
|
+
message.ipv4_tot_len.should == 0x32
|
287
|
+
message.ipv4_id.should == 0
|
288
|
+
message.ipv4_frag_off.should == 0
|
289
|
+
message.ipv4_ttl.should == 0x40
|
290
|
+
message.ipv4_protocol.should == 17
|
291
|
+
message.ipv4_checksum.should == 0xf968
|
292
|
+
message.ipv4_saddr.to_s.should == "192.168.0.1"
|
293
|
+
message.ipv4_daddr.to_s.should == "192.168.0.2"
|
294
|
+
|
295
|
+
message.udp_src_port.should == 1
|
296
|
+
message.udp_dst_port.should == 2
|
297
|
+
message.udp_checksum.should == 0
|
298
|
+
message.udp_len.should == 0x1e
|
123
299
|
end
|
124
|
-
|
300
|
+
|
301
|
+
controller( "PacketInSendController" ).send_packet_out(
|
302
|
+
0xabc,
|
303
|
+
:data => data,
|
304
|
+
:actions => Trema::ActionOutput.new( :port => Controller::OFPP_CONTROLLER )
|
305
|
+
)
|
306
|
+
sleep 2
|
125
307
|
}
|
126
308
|
end
|
127
309
|
|
128
|
-
|
129
|
-
it "should have user L4 information (udp)" do
|
310
|
+
it "should have correct VLAN and ICMPv4 packet fields" do
|
130
311
|
network {
|
131
|
-
vswitch( "
|
132
|
-
vhost
|
133
|
-
vhost( "host2" )
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
312
|
+
vswitch( "packet-in" ) { datapath_id 0xabc }
|
313
|
+
vhost "host1"
|
314
|
+
vhost ( "host2" ) {
|
315
|
+
ip "192.168.32.1"
|
316
|
+
netmask "255.255.255.0"
|
317
|
+
mac "00:00:00:00:00:02"
|
318
|
+
}
|
319
|
+
link "host1", "packet-in"
|
320
|
+
link "host2", "packet-in"
|
321
|
+
}.run( PacketInSendController ) {
|
322
|
+
data = [
|
323
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x02, # dst
|
324
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, # src
|
325
|
+
# vlan tag
|
326
|
+
0x81, 0x00, # tpid
|
327
|
+
0x0f, 0x9f, # tci
|
328
|
+
0x08, 0x00, # ether type
|
329
|
+
# ipv4
|
330
|
+
0x45, 0x00, # version
|
331
|
+
0x00, 0x3c, # length
|
332
|
+
0x8c, 0x1b,
|
333
|
+
0x00, 0x00,
|
334
|
+
0x80, # ttl
|
335
|
+
0x01, # protocol
|
336
|
+
0xed, 0x09, # checksum
|
337
|
+
0xc0, 0xa8, 0x20, 0x4a, # src
|
338
|
+
0xc0, 0xa8, 0x20, 0x01, # dst
|
339
|
+
# icmp
|
340
|
+
0x08, # type
|
341
|
+
0x00, # code
|
342
|
+
0xe9, 0x5b, # checksum
|
343
|
+
0x04, 0x00, # id
|
344
|
+
0x60, 0x00, # seq
|
345
|
+
0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
|
346
|
+
0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70,
|
347
|
+
0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x61,
|
348
|
+
0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69
|
349
|
+
].pack( "C*" )
|
350
|
+
controller( "PacketInSendController" ).should_receive( :packet_in ) do | datapath_id, message |
|
351
|
+
message.in_port.should > 0
|
352
|
+
message.vtag?.should be_true
|
353
|
+
message.arp?.should be_false
|
354
|
+
message.ipv4?.should be_true
|
355
|
+
message.udp?.should be_false
|
356
|
+
message.tcp?.should be_false
|
357
|
+
message.icmpv4?.should be_true
|
358
|
+
message.igmp?.should be_false
|
359
|
+
|
360
|
+
message.vlan_tpid.should == 0x8100
|
361
|
+
message.vlan_tci.should == 0x0f9f
|
362
|
+
message.vlan_prio.should == 0
|
363
|
+
message.vlan_cfi.should == 0
|
364
|
+
message.vlan_vid.should == 0xf9f
|
365
|
+
message.eth_type.should == 0x0800
|
366
|
+
|
367
|
+
message.ipv4_version.should == 4
|
368
|
+
message.ipv4_ihl.should == 5
|
369
|
+
message.ipv4_tos.should == 0
|
370
|
+
message.ipv4_tot_len.should == 0x003c
|
371
|
+
message.ipv4_id.should == 0x8c1b
|
372
|
+
message.ipv4_frag_off.should == 0
|
373
|
+
message.ipv4_ttl.should == 0x80
|
374
|
+
message.ipv4_protocol.should == 1
|
375
|
+
message.ipv4_checksum.should == 0xed09
|
376
|
+
message.ipv4_saddr.to_s.should == "192.168.32.74"
|
377
|
+
message.ipv4_daddr.to_s.should == "192.168.32.1"
|
378
|
+
|
379
|
+
message.icmpv4_type.should == 8
|
380
|
+
message.icmpv4_code.should == 0
|
381
|
+
message.icmpv4_checksum.should == 0xe95b
|
382
|
+
message.icmpv4_id.should == 0x0400
|
383
|
+
message.icmpv4_seq.should == 0x6000
|
141
384
|
end
|
142
|
-
|
385
|
+
|
386
|
+
controller( "PacketInSendController" ).send_packet_out(
|
387
|
+
0xabc,
|
388
|
+
:data => data,
|
389
|
+
:actions => Trema::ActionOutput.new( :port => Controller::OFPP_CONTROLLER )
|
390
|
+
)
|
143
391
|
sleep 2
|
144
392
|
}
|
145
393
|
end
|
146
394
|
|
147
|
-
|
148
|
-
it "should have valid input port" do
|
395
|
+
it "should have correct IGMP packet fields" do
|
149
396
|
network {
|
150
|
-
vswitch( "
|
397
|
+
vswitch( "packet-in" ) { datapath_id 0xabc }
|
151
398
|
vhost "host1"
|
152
399
|
vhost "host2"
|
153
|
-
link "
|
154
|
-
link "
|
155
|
-
}.run(
|
156
|
-
|
400
|
+
link "host1", "packet-in"
|
401
|
+
link "host2", "packet-in"
|
402
|
+
}.run( PacketInSendController ) {
|
403
|
+
data = [
|
404
|
+
0x01, 0x00, 0x5e, 0x00, 0x00, 0x01, # dst
|
405
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, # src
|
406
|
+
0x08, 0x00, # ether type
|
407
|
+
# ipv4
|
408
|
+
0x46, 0xc0, # version
|
409
|
+
0x00, 0x20, # length
|
410
|
+
0x3a, 0xea,
|
411
|
+
0x00, 0x00,
|
412
|
+
0x01, # ttl
|
413
|
+
0x02, # protocol
|
414
|
+
0xe4, 0x58, # checksum
|
415
|
+
0xc0, 0xa8, 0x64, 0x2b, # src
|
416
|
+
0xe0, 0x00, 0x00, 0x01, # dst
|
417
|
+
0x94, 0x04, 0x00, 0x00,
|
418
|
+
# igmp
|
419
|
+
0x11, # type
|
420
|
+
0x64, # code
|
421
|
+
0xee, 0x9b, # checksum
|
422
|
+
0x00, 0x00, 0x00, 0x00,
|
423
|
+
0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
|
424
|
+
0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70,
|
425
|
+
0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x61,
|
426
|
+
0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69
|
427
|
+
].pack( "C*" )
|
428
|
+
controller( "PacketInSendController" ).should_receive( :packet_in ) do | datapath_id, message |
|
157
429
|
message.in_port.should > 0
|
430
|
+
message.vtag?.should be_false
|
431
|
+
message.arp?.should be_false
|
432
|
+
message.ipv4?.should be_true
|
433
|
+
message.udp?.should be_false
|
434
|
+
message.tcp?.should be_false
|
435
|
+
message.icmpv4?.should be_false
|
436
|
+
message.igmp?.should be_true
|
437
|
+
|
438
|
+
message.igmp_membership_query?.should be_true
|
439
|
+
message.igmp_v1_membership_report?.should be_false
|
440
|
+
message.igmp_v2_membership_report?.should be_false
|
441
|
+
message.igmp_v2_leave_group?.should be_false
|
442
|
+
message.igmp_v3_membership_report?.should be_false
|
443
|
+
|
444
|
+
message.ipv4_version.should == 4
|
445
|
+
message.ipv4_ihl.should == 6
|
446
|
+
message.ipv4_tos.should == 0xc0
|
447
|
+
message.ipv4_tot_len.should == 0x0020
|
448
|
+
message.ipv4_id.should == 0x3aea
|
449
|
+
message.ipv4_frag_off.should == 0
|
450
|
+
message.ipv4_ttl.should == 1
|
451
|
+
message.ipv4_protocol.should == 2
|
452
|
+
message.ipv4_checksum.should == 0xe458
|
453
|
+
message.ipv4_saddr.to_s.should == "192.168.100.43"
|
454
|
+
message.ipv4_daddr.to_s.should == "224.0.0.1"
|
455
|
+
|
456
|
+
message.igmp_type.should == 0x11
|
457
|
+
message.igmp_checksum.should == 0xee9b
|
158
458
|
end
|
159
|
-
|
459
|
+
|
460
|
+
controller( "PacketInSendController" ).send_packet_out(
|
461
|
+
0xabc,
|
462
|
+
:data => data,
|
463
|
+
:actions => Trema::ActionOutput.new( :port => Controller::OFPP_CONTROLLER )
|
464
|
+
)
|
465
|
+
sleep 2
|
160
466
|
}
|
161
467
|
end
|
468
|
+
|
162
469
|
end
|
470
|
+
|
163
471
|
end
|
164
472
|
|
165
473
|
|