trema 0.2.7 → 0.2.8

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.
Files changed (29) hide show
  1. data/Rakefile +1 -0
  2. data/Rantfile +14 -13
  3. data/features/example.openflow_message.echo.feature +59 -0
  4. data/features/{example.message.hello.feature → example.openflow_message.hello.feature} +0 -0
  5. data/ruby/trema/mac.rb +2 -0
  6. data/ruby/trema/set-eth-dst-addr.rb +3 -2
  7. data/ruby/trema/set-eth-src-addr.rb +3 -2
  8. data/ruby/trema/version.rb +1 -1
  9. data/spec/spec_helper.rb +1 -0
  10. data/spec/trema/set-eth-dst-addr_spec.rb +6 -0
  11. data/spec/trema/set-eth-src-addr_spec.rb +6 -0
  12. data/src/examples/openflow_message/{echo_request.c → echo.c} +12 -2
  13. data/src/examples/openflow_message/{echo-request.rb → echo.rb} +2 -2
  14. data/src/examples/openflow_switch/echo_switch.c +89 -0
  15. data/src/examples/openflow_switch/hello_switch.c +24 -20
  16. data/src/examples/simple_router/arp-table.rb +92 -0
  17. data/src/examples/simple_router/interface.rb +99 -0
  18. data/src/examples/simple_router/router-utils.rb +211 -0
  19. data/src/examples/simple_router/routing-table.rb +67 -0
  20. data/src/examples/simple_router/simple-router.rb +180 -0
  21. data/src/examples/simple_router/simple_router.conf +18 -0
  22. data/src/examples/simple_router/simple_router_netns.conf +15 -0
  23. data/src/examples/simple_router/simple_router_network.conf +6 -0
  24. data/src/tremashark/plugin/packet-trema/packet-trema.c +8 -8
  25. metadata +17 -11
  26. data/features/example.message.echo_reply.feature +0 -26
  27. data/features/example.message.echo_request.feature +0 -25
  28. data/src/examples/openflow_message/echo-reply.rb +0 -59
  29. data/src/examples/openflow_message/echo_reply.c +0 -70
@@ -0,0 +1,211 @@
1
+ #
2
+ # A router implementation in Trema
3
+ #
4
+ # Copyright (C) 2012 NEC Corporation
5
+ #
6
+ # This program is free software; you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License, version 2, as
8
+ # published by the Free Software Foundation.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License along
16
+ # with this program; if not, write to the Free Software Foundation, Inc.,
17
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
+ #
19
+
20
+
21
+ require 'ipaddr'
22
+
23
+
24
+ def get_checksum csum, val
25
+ sum = ( ~csum & 0xffff ) + val
26
+ while sum > 0xffff
27
+ sum = ( sum & 0xffff ) + ( sum >> 16 )
28
+ end
29
+ ~sum & 0xffff
30
+ end
31
+
32
+
33
+ class IPAddr
34
+ def to_a
35
+ self.to_s.split( "." ).collect do | each |
36
+ each.to_i
37
+ end
38
+ end
39
+ end
40
+
41
+
42
+ class EthernetHeader
43
+ attr_accessor :macda, :macsa, :eth_type
44
+
45
+
46
+ def initialize macda, macsa, eth_type
47
+ @macda = macda
48
+ @macsa = macsa
49
+ @eth_type = eth_type
50
+ end
51
+
52
+
53
+ def pack
54
+ ( @macda.to_a + @macsa.to_a + [ eth_type ] ).pack( "C12n" )
55
+ end
56
+ end
57
+
58
+
59
+ class ARPPacket
60
+ attr_accessor :type, :tha, :sha, :tpa, :spa
61
+
62
+
63
+ def initialize type, tha, sha, tpa, spa
64
+ @type = type
65
+ @tha = tha
66
+ @sha = sha
67
+ @tpa = tpa
68
+ @spa = spa
69
+ end
70
+
71
+
72
+ def pack
73
+ eth_header = EthernetHeader.new( @tha, @sha, 0x0806 )
74
+
75
+ # arp
76
+ arp = [ 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, @type ]
77
+ arp += @sha.to_a + @spa.to_a + @tha.to_a + @tpa.to_a
78
+
79
+ while arp.length < 46 do
80
+ arp += [ 0x00 ]
81
+ end
82
+
83
+ eth_header.pack + arp.pack( "C*" )
84
+ end
85
+ end
86
+
87
+
88
+ class ARPRequest < ARPPacket
89
+ def initialize sha, tpa, spa
90
+ tha = [ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff ]
91
+ super( 1, tha, sha, tpa, spa )
92
+ end
93
+ end
94
+
95
+
96
+ class ARPReply < ARPPacket
97
+ def initialize tha, sha, tpa, spa
98
+ super( 2, tha, sha, tpa, spa )
99
+ end
100
+ end
101
+
102
+
103
+ class IPPacket
104
+ attr_accessor :id, :protocol, :daddr, :saddr, :payload
105
+
106
+
107
+ def initialize options
108
+ @id = options[ :id ]
109
+ @protocol = options[ :protocol ]
110
+ @daddr = options[ :daddr ]
111
+ @saddr = options[ :saddr ]
112
+ @payload = options[ :payload ]
113
+ @tot_len = 20 + payload.length
114
+ end
115
+
116
+
117
+ def pack
118
+ csum = get_checksum( 0, 0x4500 )
119
+ header = [ 0x45, 0x00 ] # Version, IHL, ToS
120
+
121
+ csum = get_checksum( csum, @tot_len )
122
+ header += [ @tot_len >> 8, @tot_len & 0xff ] # len
123
+
124
+ csum = get_checksum( csum, @id )
125
+ header += [ @id >> 8, @id & 0xff ] # ID
126
+
127
+ csum = get_checksum( csum, 0x4000 )
128
+ header += [ 0x40, 0x00 ] # Flags, Frag offset
129
+
130
+ csum = get_checksum( csum, 0x40 * 0x100 + @protocol )
131
+ header += [ 0x40, @protocol ] # ttl, protocol
132
+
133
+ csum = get_checksum( csum, @saddr.to_i >> 16 )
134
+ csum = get_checksum( csum, @saddr.to_i & 0xffff )
135
+ csum = get_checksum( csum, @daddr.to_i >> 16 )
136
+ csum = get_checksum( csum, @daddr.to_i & 0xffff )
137
+ header += [ csum >> 8, csum & 0xff ] # checksum
138
+ header += @saddr.to_a + @daddr.to_a
139
+
140
+ header.pack( "C*" ) + @payload.pack
141
+ end
142
+ end
143
+
144
+
145
+ class ICMPPacket
146
+ attr_reader :payload, :length
147
+
148
+
149
+ def initialize type, code, payload
150
+ @type = type
151
+ @code = code
152
+ @payload = payload
153
+ @length = 4 + payload.length
154
+ end
155
+
156
+
157
+ def pack
158
+ @checksum = get_checksum( 0, @type * 0x100 + @code )
159
+
160
+ words = @payload.pack( "C*" ).unpack( "n*" )
161
+ words.each do | each |
162
+ @checksum = get_checksum( @checksum, each )
163
+ end
164
+
165
+ [ @type, @code, @checksum ].pack( "C2n" ) + @payload.pack( "C*" )
166
+ end
167
+ end
168
+
169
+
170
+ class ICMPEchoReply < ICMPPacket
171
+ def initialize payload
172
+ super( 0x00, 0x00, payload )
173
+ end
174
+ end
175
+
176
+
177
+ module RouterUtils
178
+ def create_arp_request_from interface, addr
179
+ arp = ARPRequest.new( interface.hwaddr, addr, interface.ipaddr )
180
+ arp.pack
181
+ end
182
+
183
+
184
+ def create_arp_reply_from message, replyaddr
185
+ arp = ARPReply.new( message.macsa, replyaddr, message.arp_spa, message.arp_tpa )
186
+ arp.pack
187
+ end
188
+
189
+
190
+ def create_icmpv4_reply entry, interface, message
191
+ offset = 14 + 20 + 4
192
+ payload = message.data.unpack( "C*" )[ offset .. message.data.length - 1 ]
193
+ icmp = ICMPEchoReply.new( payload )
194
+ ip_packet = IPPacket.new( :id => message.ipv4_id,
195
+ :protocol => message.ipv4_protocol,
196
+ :ttl => message.ipv4_ttl,
197
+ :daddr => message.ipv4_saddr,
198
+ :saddr => message.ipv4_daddr,
199
+ :payload => icmp )
200
+ eth_header = EthernetHeader.new( entry.hwaddr, interface.hwaddr, 0x0800 )
201
+
202
+ eth_header.pack + ip_packet.pack
203
+ end
204
+ end
205
+
206
+
207
+ ### Local variables:
208
+ ### mode: Ruby
209
+ ### coding: utf-8
210
+ ### indent-tabs-mode: nil
211
+ ### End:
@@ -0,0 +1,67 @@
1
+ #
2
+ # Routing Table
3
+ #
4
+ # Copyright (C) 2012 NEC Corporation
5
+ #
6
+ # This program is free software; you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License, version 2, as
8
+ # published by the Free Software Foundation.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License along
16
+ # with this program; if not, write to the Free Software Foundation, Inc.,
17
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
+ #
19
+
20
+
21
+ require "ipaddr"
22
+
23
+
24
+ class RoutingTable
25
+ ADDR_LEN = 32
26
+
27
+
28
+ def initialize route = []
29
+ @db = Array.new( ADDR_LEN + 1 ) { Hash.new }
30
+ route.each do | each |
31
+ add( each )
32
+ end
33
+ end
34
+
35
+
36
+ def add options
37
+ dest = IPAddr.new( options[ :destination ] )
38
+ masklen = options[ :masklen ]
39
+ prefix = dest.mask( masklen )
40
+ @db[ masklen ][ prefix.to_i ] = IPAddr.new( options[ :gateway ] )
41
+ end
42
+
43
+
44
+ def delete options
45
+ dest = IPAddr.new( options[ :destination ] )
46
+ masklen = options[ :masklen ]
47
+ prefix = dest.mask( masklen )
48
+ @db[ masklen ].delete( prefix.to_i )
49
+ end
50
+
51
+
52
+ def lookup dest
53
+ ( 0..ADDR_LEN ).reverse_each do | masklen |
54
+ prefix = dest.mask( masklen )
55
+ entry = @db[ masklen ][ prefix.to_i ]
56
+ return entry if entry
57
+ end
58
+ nil
59
+ end
60
+ end
61
+
62
+
63
+ ### Local variables:
64
+ ### mode: Ruby
65
+ ### coding: utf-8-unix
66
+ ### indent-tabs-mode: nil
67
+ ### End:
@@ -0,0 +1,180 @@
1
+ #
2
+ # A router implementation in Trema
3
+ #
4
+ # Copyright (C) 2012 NEC Corporation
5
+ #
6
+ # This program is free software; you can redistribute it and/or modify
7
+ # it under the terms of the GNU General Public License, version 2, as
8
+ # published by the Free Software Foundation.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU General Public License along
16
+ # with this program; if not, write to the Free Software Foundation, Inc.,
17
+ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
+ #
19
+
20
+ require "arp-table"
21
+ require "interface"
22
+ require "router-utils"
23
+ require "routing-table"
24
+
25
+
26
+ class SimpleRouter < Controller
27
+ include RouterUtils
28
+
29
+
30
+ def start
31
+ load "simple_router.conf"
32
+ @interfaces = Interfaces.new( $interface )
33
+ @arp_table = ARPTable.new
34
+ @routing_table = RoutingTable.new( $route )
35
+ end
36
+
37
+
38
+ def packet_in( dpid, message )
39
+ return if not to_me?( message )
40
+
41
+ if message.arp_request?
42
+ handle_arp_request dpid, message
43
+ elsif message.arp_reply?
44
+ handle_arp_reply message
45
+ elsif message.ipv4?
46
+ handle_ipv4 dpid, message
47
+ else
48
+ # noop.
49
+ end
50
+ end
51
+
52
+
53
+ private
54
+
55
+
56
+ def to_me?( message )
57
+ return true if message.macda.broadcast?
58
+
59
+ interface = @interfaces.find_by_port( message.in_port )
60
+ if interface and interface.has?( message.macda )
61
+ return true
62
+ end
63
+ end
64
+
65
+
66
+ def handle_arp_request( dpid, message )
67
+ port = message.in_port
68
+ daddr = message.arp_tpa
69
+ interface = @interfaces.find_by_port_and_ipaddr( port, daddr )
70
+ if interface
71
+ arp_reply = create_arp_reply_from( message, interface.hwaddr )
72
+ packet_out dpid, arp_reply, SendOutPort.new( interface.port )
73
+ end
74
+ end
75
+
76
+
77
+ def handle_arp_reply( message )
78
+ @arp_table.update message.in_port, message.arp_spa, message.arp_sha
79
+ end
80
+
81
+
82
+ def handle_ipv4( dpid, message )
83
+ if should_forward?( message )
84
+ forward dpid, message
85
+ elsif message.icmpv4_echo_request?
86
+ handle_icmpv4_echo_request dpid, message
87
+ else
88
+ # noop.
89
+ end
90
+ end
91
+
92
+
93
+ def should_forward?( message )
94
+ not @interfaces.find_by_ipaddr( message.ipv4_daddr )
95
+ end
96
+
97
+
98
+ def handle_icmpv4_echo_request( dpid, message )
99
+ interface = @interfaces.find_by_port( message.in_port )
100
+ saddr = message.ipv4_saddr.value
101
+ arp_entry = @arp_table.lookup( saddr )
102
+ if arp_entry
103
+ icmpv4_reply = create_icmpv4_reply( arp_entry, interface, message )
104
+ packet_out dpid, icmpv4_reply, SendOutPort.new( interface.port )
105
+ else
106
+ handle_unresolved_packet dpid, message, interface, saddr
107
+ end
108
+ end
109
+
110
+
111
+ def forward( dpid, message )
112
+ next_hop = resolve_next_hop( message.ipv4_daddr )
113
+
114
+ interface = @interfaces.find_by_prefix( next_hop )
115
+ if not interface or interface.port == message.in_port
116
+ return
117
+ end
118
+
119
+ arp_entry = @arp_table.lookup( next_hop )
120
+ if arp_entry
121
+ macsa = interface.hwaddr
122
+ macda = arp_entry.hwaddr
123
+ action = create_action_from( macsa, macda, interface.port )
124
+ flow_mod dpid, message, action
125
+ packet_out dpid, message.data, action
126
+ else
127
+ handle_unresolved_packet dpid, message, interface, next_hop
128
+ end
129
+ end
130
+
131
+
132
+ def resolve_next_hop( daddr )
133
+ next_hop = @routing_table.lookup( daddr.value )
134
+ if next_hop
135
+ next_hop
136
+ else
137
+ daddr.value
138
+ end
139
+ end
140
+
141
+
142
+ def flow_mod( dpid, message, action )
143
+ send_flow_mod_add(
144
+ dpid,
145
+ :match => ExactMatch.from( message ),
146
+ :actions => action
147
+ )
148
+ end
149
+
150
+
151
+ def packet_out( dpid, packet, action )
152
+ send_packet_out(
153
+ dpid,
154
+ :data => packet,
155
+ :actions => action
156
+ )
157
+ end
158
+
159
+
160
+ def handle_unresolved_packet( dpid, message, interface, ipaddr )
161
+ arp_request = create_arp_request_from( interface, ipaddr )
162
+ packet_out dpid, arp_request, SendOutPort.new( interface.port )
163
+ end
164
+
165
+
166
+ def create_action_from( macsa, macda, port )
167
+ [
168
+ SetEthSrcAddr.new( macsa.to_s ),
169
+ SetEthDstAddr.new( macda.to_s ),
170
+ SendOutPort.new( port )
171
+ ]
172
+ end
173
+ end
174
+
175
+
176
+ ### Local variables:
177
+ ### mode: Ruby
178
+ ### coding: utf-8
179
+ ### indent-tabs-mode: nil
180
+ ### End:
@@ -0,0 +1,18 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ $interface = [
4
+ {
5
+ :port => 2,
6
+ :hwaddr => "00:00:00:01:00:01",
7
+ :ipaddr => "192.168.1.1",
8
+ :masklen => 24
9
+ },
10
+ {
11
+ :port => 1,
12
+ :hwaddr => "00:00:00:01:00:02",
13
+ :ipaddr => "192.168.2.1",
14
+ :masklen => 24
15
+ }
16
+ ]
17
+
18
+ $route = []
@@ -0,0 +1,15 @@
1
+ vswitch { dpid "0x1" }
2
+
3
+ netns ( "host1" ) {
4
+ ip "192.168.1.2"
5
+ netmask "255.255.255.0"
6
+ route :net=>"0.0.0.0/0", :gw=>"192.168.1.1"
7
+ }
8
+ netns ( "host2" ) {
9
+ ip "192.168.2.2"
10
+ netmask "255.255.255.0"
11
+ route :net=>"0.0.0.0/0", :gw=>"192.168.2.1"
12
+ }
13
+
14
+ link "host1", "0x1"
15
+ link "host2", "0x1"
@@ -0,0 +1,6 @@
1
+ vswitch ( "switch" ) {
2
+ datapath_id "0x1"
3
+ }
4
+
5
+ link "switch", "eth1"
6
+ link "switch", "eth0"
@@ -22,20 +22,20 @@
22
22
  #include "config.h"
23
23
  #endif
24
24
 
25
- #include <arpa/inet.h>
26
- #include <epan/addr_resolv.h>
27
- #include <epan/dissectors/packet-tcp.h>
25
+ #include <stdio.h>
26
+ #include <stdlib.h>
27
+ #include <glib.h>
28
28
  #include <epan/emem.h>
29
- #include <epan/etypes.h>
30
- #include <epan/ipproto.h>
31
29
  #include <epan/packet.h>
30
+ #include <epan/dissectors/packet-tcp.h>
32
31
  #include <epan/prefs.h>
32
+ #include <epan/ipproto.h>
33
+ #include <epan/etypes.h>
34
+ #include <epan/addr_resolv.h>
33
35
  #include <epan/reassemble.h>
34
- #include <glib.h>
35
36
  #include <pcap/pcap.h>
36
- #include <stdio.h>
37
- #include <stdlib.h>
38
37
  #include <string.h>
38
+ #include <arpa/inet.h>
39
39
  #include "messenger.h"
40
40
  #include "openflow_service_interface.h"
41
41
 
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: 25
4
+ hash: 7
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 7
10
- version: 0.2.7
9
+ - 8
10
+ version: 0.2.8
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-12-27 00:00:00 Z
18
+ date: 2013-01-01 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  prerelease: false
@@ -118,13 +118,12 @@ files:
118
118
  - features/example.hello_trema.feature
119
119
  - features/example.learning_switch.feature
120
120
  - features/example.list_switches.feature
121
- - features/example.message.echo_reply.feature
122
- - features/example.message.echo_request.feature
123
121
  - features/example.message.features_request.feature
124
- - features/example.message.hello.feature
125
122
  - features/example.message.set_config.feature
126
123
  - features/example.message.vendor-action.feature
127
124
  - features/example.multi_learning_switch.feature
125
+ - features/example.openflow_message.echo.feature
126
+ - features/example.openflow_message.hello.feature
128
127
  - features/example.packet_in.feature
129
128
  - features/example.packetin_filter_config.feature
130
129
  - features/example.patch_panel.feature
@@ -432,10 +431,8 @@ files:
432
431
  - src/examples/multi_learning_switch/multi_learning_switch.c
433
432
  - src/examples/multi_learning_switch/multi_learning_switch.conf
434
433
  - src/examples/openflow_message/README
435
- - src/examples/openflow_message/echo-reply.rb
436
- - src/examples/openflow_message/echo-request.rb
437
- - src/examples/openflow_message/echo_reply.c
438
- - src/examples/openflow_message/echo_request.c
434
+ - src/examples/openflow_message/echo.c
435
+ - src/examples/openflow_message/echo.rb
439
436
  - src/examples/openflow_message/example.rb
440
437
  - src/examples/openflow_message/features-request.rb
441
438
  - src/examples/openflow_message/features_request.c
@@ -445,6 +442,7 @@ files:
445
442
  - src/examples/openflow_message/set_config.c
446
443
  - src/examples/openflow_message/vendor-action.rb
447
444
  - src/examples/openflow_message/vendor_action.c
445
+ - src/examples/openflow_switch/echo_switch.c
448
446
  - src/examples/openflow_switch/hello_switch.c
449
447
  - src/examples/packet_in/README
450
448
  - src/examples/packet_in/packet-in.rb
@@ -468,6 +466,14 @@ files:
468
466
  - src/examples/repeater_hub/repeater-hub_spec.rb
469
467
  - src/examples/repeater_hub/repeater_hub.c
470
468
  - src/examples/repeater_hub/repeater_hub.conf
469
+ - src/examples/simple_router/arp-table.rb
470
+ - src/examples/simple_router/interface.rb
471
+ - src/examples/simple_router/router-utils.rb
472
+ - src/examples/simple_router/routing-table.rb
473
+ - src/examples/simple_router/simple-router.rb
474
+ - src/examples/simple_router/simple_router.conf
475
+ - src/examples/simple_router/simple_router_netns.conf
476
+ - src/examples/simple_router/simple_router_network.conf
471
477
  - src/examples/switch_info/README
472
478
  - src/examples/switch_info/switch-info.rb
473
479
  - src/examples/switch_info/switch_info.c
@@ -1,26 +0,0 @@
1
- Feature: Send echo reply messages
2
-
3
- As a Trema user
4
- I want to send echo reply messages to openflow switches
5
- Because I want to reply to echo requests from openflow switches
6
-
7
- @wip
8
- Scenario: Send echo reply x 10
9
- When I try trema run "./objects/examples/openflow_message/echo_reply 10" with following configuration (backgrounded):
10
- """
11
- vswitch("echo_reply") { datapath_id "0xabc" }
12
- """
13
- And wait until "echo_reply" is up
14
- And *** sleep 2 ***
15
- Then the log file "openflowd.echo_reply.log" should include "received: OFPT_ECHO_REPLY" x 10
16
-
17
- @wip
18
- Scenario: Send echo reply x 10 in Ruby
19
- When I try trema run "./src/examples/openflow_message/echo-reply.rb 0xabc, 10" with following configuration (backgrounded):
20
- """
21
- vswitch("echo-reply") { datapath_id "0xabc" }
22
- """
23
- And wait until "EchoReplyController" is up
24
- And *** sleep 2 ***
25
- Then the log file "openflowd.echo-reply.log" should include "received: OFPT_ECHO_REPLY" x 10
26
-
@@ -1,25 +0,0 @@
1
- Feature: Send echo request messages
2
-
3
- As a Trema user
4
- I want to send echo request messages to openflow switches
5
- So that I can receive echo reply messages from openflow switches
6
-
7
- @wip
8
- Scenario: Send echo request x 10
9
- When I try trema run "./objects/examples/openflow_message/echo_request 10" with following configuration (backgrounded):
10
- """
11
- vswitch("echo_request") { datapath_id "0xabc" }
12
- """
13
- And wait until "echo_request" is up
14
- And *** sleep 2 ***
15
- Then the log file "openflowd.echo_request.log" should include "received: OFPT_ECHO_REQUEST" x 10
16
-
17
- @wip
18
- Scenario: Send echo request x 10 in Ruby
19
- When I try trema run "./src/examples/openflow_message/echo-request.rb 0xabc, 10" with following configuration (backgrounded):
20
- """
21
- vswitch("echo-request") { datapath_id "0xabc" }
22
- """
23
- And wait until "EchoRequestController" is up
24
- And *** sleep 2 ***
25
- Then the log file "openflowd.echo-request.log" should include "received: OFPT_ECHO_REQUEST" x 10