trema 0.4.5 → 0.4.6

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 (56) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +4 -4
  3. data/Guardfile +8 -0
  4. data/Rakefile +2 -1
  5. data/bin/trema +4 -0
  6. data/cruise.rb +1 -1
  7. data/features/core/switch_manager.feature +2 -2
  8. data/features/examples/message.vendor-action.feature +2 -2
  9. data/features/examples/message.vendor-stats-request.feature +20 -0
  10. data/features/trema_commands/kill.feature +4 -0
  11. data/features/trema_commands/killall.feature +1 -0
  12. data/features/trema_commands/run.feature +20 -1
  13. data/ruby/trema/command/run.rb +4 -0
  14. data/ruby/trema/default_openflow_channel_port.rb +26 -0
  15. data/ruby/trema/dsl/configuration.rb +2 -1
  16. data/ruby/trema/open-vswitch.rb +2 -4
  17. data/ruby/trema/stats-reply.c +10 -1
  18. data/ruby/trema/stats-request.c +34 -1
  19. data/ruby/trema/vendor-stats-reply.rb +6 -2
  20. data/ruby/trema/version.rb +1 -1
  21. data/spec/trema/dsl/runner_spec.rb +1 -1
  22. data/spec/trema/dsl/syntax_spec.rb +1 -1
  23. data/spec/trema/shell/vswitch_spec.rb +1 -1
  24. data/spec/trema/stats-reply_spec.rb +2 -1
  25. data/spec/trema/stats-request_spec.rb +11 -0
  26. data/src/examples/cbench_switch/cbench-switch.rb +1 -0
  27. data/src/examples/cbench_switch/cbench_switch.c +1 -1
  28. data/src/examples/openflow_message/vendor-action.rb +4 -4
  29. data/src/examples/openflow_message/vendor-stats-request.rb +66 -0
  30. data/src/examples/simple_router/arp-table.rb +6 -17
  31. data/src/examples/simple_router/interface.rb +20 -29
  32. data/src/examples/simple_router/routing-table.rb +15 -22
  33. data/src/examples/simple_router/simple-router.rb +75 -64
  34. data/src/lib/chibach.c +3 -2
  35. data/src/lib/event_handler.c +55 -23
  36. data/src/lib/event_handler.h +0 -5
  37. data/src/lib/external_callback.c +126 -0
  38. data/src/lib/external_callback.h +46 -0
  39. data/src/lib/messenger.c +58 -35
  40. data/src/lib/openflow_message.c +32 -11
  41. data/src/lib/trema.c +13 -7
  42. data/src/lib/trema.h +1 -0
  43. data/src/lib/utility.c +13 -2
  44. data/src/switch_manager/secure_channel_receiver.c +6 -1
  45. data/src/switch_manager/switch.c +27 -26
  46. data/src/switch_manager/switch_manager.c +31 -10
  47. data/src/tremashark/packet_capture.c +3 -2
  48. data/src/tremashark/tremashark.c +2 -2
  49. data/trema.gemspec +1 -1
  50. data/unittests/lib/external_callback_test.c +282 -0
  51. data/unittests/lib/messenger_test.c +22 -0
  52. data/unittests/lib/openflow_message_test.c +1 -1
  53. data/unittests/lib/trema_test.c +1 -1
  54. data/unittests/switch_manager/switch_manager_test.c +3 -3
  55. metadata +12 -6
  56. data/src/examples/simple_router/router-utils.rb +0 -211
@@ -31,6 +31,7 @@
31
31
  #include "checks.h"
32
32
  #include "cmockery_trema.h"
33
33
  #include "doubly_linked_list.h"
34
+ #include "external_callback.h"
34
35
  #include "hash_table.h"
35
36
  #include "event_handler.h"
36
37
  #include "messenger.h"
@@ -163,6 +164,27 @@ static uint32_t last_transaction_id;
163
164
  * Mocks.
164
165
  ********************************************************************************/
165
166
 
167
+ void
168
+ mock_init_external_callback() {
169
+ }
170
+
171
+
172
+ void
173
+ mock_finalize_external_callback() {
174
+ }
175
+
176
+
177
+ void
178
+ mock_push_external_callback( external_callback_t callback ) {
179
+ check_expected( callback );
180
+ }
181
+
182
+
183
+ void
184
+ mock_run_external_callback() {
185
+ }
186
+
187
+
166
188
  void
167
189
  mock_execute_timer_events( int *next_timeout_usec ) {
168
190
  UNUSED( next_timeout_usec );
@@ -3505,7 +3505,7 @@ test_validate_stats_reply_fails_with_unsupported_stats_type() {
3505
3505
 
3506
3506
  static void
3507
3507
  test_validate_queue_stats_request() {
3508
- buffer *port_stats_request = create_queue_stats_request( MY_TRANSACTION_ID, NO_FLAGS, OFPP_ALL, OFPQ_ALL );
3508
+ buffer *port_stats_request = create_queue_stats_request( MY_TRANSACTION_ID, NO_FLAGS, 1, OFPQ_ALL );
3509
3509
 
3510
3510
  assert_int_equal( validate_queue_stats_request( port_stats_request ), 0 );
3511
3511
 
@@ -333,7 +333,7 @@ mock_clock_gettime( clockid_t clk_id, struct timespec *tp ) {
333
333
 
334
334
 
335
335
  bool
336
- mock_set_external_callback( void ( *callback )( void ) ) {
336
+ mock_push_external_callback( void ( *callback )( void ) ) {
337
337
  UNUSED( callback );
338
338
  return true;
339
339
  }
@@ -167,7 +167,7 @@ mock_get_executable_name( void ) {
167
167
 
168
168
 
169
169
  void
170
- mock_set_external_callback( void ( *callback )( void ) ) {
170
+ mock_push_external_callback( void ( *callback )( void ) ) {
171
171
  check_expected( callback );
172
172
  }
173
173
 
@@ -309,7 +309,7 @@ static void
309
309
  test_handle_sigchld_succeeded() {
310
310
  setup();
311
311
 
312
- expect_value( mock_set_external_callback, callback, wait_child );
312
+ expect_value( mock_push_external_callback, callback, wait_child );
313
313
 
314
314
  handle_sigchld( 3 );
315
315
 
@@ -625,7 +625,7 @@ test_switch_manager_main_and_port_option_succeeded() {
625
625
 
626
626
  char *argv[] = {
627
627
  ( char * ) ( uintptr_t ) "switch_manager",
628
- ( char * ) ( uintptr_t ) "--port=6633",
628
+ ( char * ) ( uintptr_t ) "--port=6653",
629
629
  NULL,
630
630
  };
631
631
  int argc = ARRAY_SIZE( argv ) - 1;
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trema
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.5
4
+ version: 0.4.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yasuhito Takamiya
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-08 00:00:00.000000000 Z
11
+ date: 2013-12-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - ~>
60
60
  - !ruby/object:Gem::Version
61
- version: 0.2.6
61
+ version: 0.3.0
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ~>
67
67
  - !ruby/object:Gem::Version
68
- version: 0.2.6
68
+ version: 0.3.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rake
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -113,6 +113,7 @@ files:
113
113
  - CONTRIBUTING.md
114
114
  - Doxyfile
115
115
  - Gemfile
116
+ - Guardfile
116
117
  - README.md
117
118
  - Rakefile
118
119
  - bin/quality
@@ -133,6 +134,7 @@ files:
133
134
  - features/examples/list_switches.feature
134
135
  - features/examples/message.set_config.feature
135
136
  - features/examples/message.vendor-action.feature
137
+ - features/examples/message.vendor-stats-request.feature
136
138
  - features/examples/multi_learning_switch.feature
137
139
  - features/examples/openflow_message.echo.feature
138
140
  - features/examples/openflow_message.features_request.feature
@@ -211,6 +213,7 @@ files:
211
213
  - ruby/trema/default-logger.c
212
214
  - ruby/trema/default-logger.h
213
215
  - ruby/trema/default-logger.rb
216
+ - ruby/trema/default_openflow_channel_port.rb
214
217
  - ruby/trema/desc-stats-reply.rb
215
218
  - ruby/trema/dsl.rb
216
219
  - ruby/trema/dsl/configuration.rb
@@ -466,6 +469,7 @@ files:
466
469
  - src/examples/openflow_message/set-config.rb
467
470
  - src/examples/openflow_message/set_config.c
468
471
  - src/examples/openflow_message/vendor-action.rb
472
+ - src/examples/openflow_message/vendor-stats-request.rb
469
473
  - src/examples/openflow_message/vendor_action.c
470
474
  - src/examples/openflow_switch/echo_switch.c
471
475
  - src/examples/openflow_switch/hello_switch.c
@@ -494,7 +498,6 @@ files:
494
498
  - src/examples/simple_router/README
495
499
  - src/examples/simple_router/arp-table.rb
496
500
  - src/examples/simple_router/interface.rb
497
- - src/examples/simple_router/router-utils.rb
498
501
  - src/examples/simple_router/routing-table.rb
499
502
  - src/examples/simple_router/simple-router.rb
500
503
  - src/examples/simple_router/simple_router.conf
@@ -544,6 +547,8 @@ files:
544
547
  - src/lib/event_forward_interface.h
545
548
  - src/lib/event_handler.c
546
549
  - src/lib/event_handler.h
550
+ - src/lib/external_callback.c
551
+ - src/lib/external_callback.h
547
552
  - src/lib/hash_table.c
548
553
  - src/lib/hash_table.h
549
554
  - src/lib/icmp.h
@@ -664,6 +669,7 @@ files:
664
669
  - unittests/lib/doubly_linked_list_test.c
665
670
  - unittests/lib/ether_test.c
666
671
  - unittests/lib/event_forward_interface_test.c
672
+ - unittests/lib/external_callback_test.c
667
673
  - unittests/lib/hash_table_test.c
668
674
  - unittests/lib/linked_list_test.c
669
675
  - unittests/lib/log_test.c
@@ -814,7 +820,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
814
820
  version: '0'
815
821
  requirements: []
816
822
  rubyforge_project:
817
- rubygems_version: 2.0.3
823
+ rubygems_version: 2.1.11
818
824
  signing_key:
819
825
  specification_version: 4
820
826
  summary: Full-stack OpenFlow framework.
@@ -1,211 +0,0 @@
1
- #
2
- # A router implementation in Trema
3
- #
4
- # Copyright (C) 2013 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: