trema 0.3.14 → 0.3.15
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +5 -2
- data/Gemfile +2 -2
- data/Rakefile +28 -9
- data/Rantfile +1 -1
- data/bin/trema +1 -0
- data/build.rb +1 -1
- data/cruise.rb +2 -8
- data/features/.nav +1 -0
- data/features/core/get_pid_by_trema_name.feature +137 -0
- data/features/support/hooks.rb +17 -2
- data/ruby/trema/controller.c +1 -1
- data/ruby/trema/controller.rb +2 -2
- data/ruby/trema/{logger.c → default-logger.c} +17 -17
- data/ruby/trema/{logger.h → default-logger.h} +6 -6
- data/ruby/trema/{logger.rb → default-logger.rb} +1 -1
- data/ruby/trema/switch.c +2 -2
- data/ruby/trema/trema.c +2 -2
- data/ruby/trema/version.rb +1 -1
- data/spec/trema/{logger_spec.rb → default-logger_spec.rb} +2 -2
- data/src/examples/learning_switch/fdb.rb +1 -1
- data/src/examples/simple_router/arp-table.rb +1 -1
- data/src/lib/daemon.c +77 -3
- data/src/lib/openflow_application_interface.c +29 -0
- data/src/lib/openflow_application_interface.h +7 -0
- data/src/lib/trema.c +17 -18
- data/src/lib/trema.h +3 -3
- data/src/switch_manager/service_interface.c +1 -1
- data/src/switch_manager/switch.c +6 -2
- data/trema.gemspec +2 -2
- data/unittests/lib/daemon_test.c +0 -54
- data/unittests/lib/openflow_application_interface_test.c +50 -0
- data/unittests/lib/trema_test.c +5 -5
- metadata +26 -27
data/.travis.yml
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
language: ruby
|
2
|
+
|
1
3
|
script: "rake travis"
|
2
4
|
|
3
5
|
rvm:
|
@@ -9,5 +11,6 @@ branches:
|
|
9
11
|
- develop
|
10
12
|
|
11
13
|
before_install:
|
12
|
-
- sudo apt-get update
|
13
|
-
- sudo apt-get install libpcap-dev
|
14
|
+
- sudo apt-get update -qq
|
15
|
+
- sudo apt-get install libpcap-dev -qq
|
16
|
+
- gem install bundler
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -16,11 +16,21 @@
|
|
16
16
|
#
|
17
17
|
|
18
18
|
|
19
|
+
$LOAD_PATH.unshift( File.expand_path( File.dirname( __FILE__ ) + "/ruby" ) )
|
20
|
+
|
21
|
+
|
19
22
|
require "rubygems"
|
20
23
|
require "rake"
|
24
|
+
require "trema/path"
|
25
|
+
|
26
|
+
task :default => :build_trema
|
21
27
|
|
28
|
+
directory Trema.log
|
29
|
+
directory Trema.pid
|
30
|
+
directory Trema.sock
|
22
31
|
|
23
|
-
|
32
|
+
desc "Build Trema"
|
33
|
+
task :build_trema => [ Trema.log, Trema.pid, Trema.sock ] do
|
24
34
|
sh "#{ Gem.ruby } ./build.rb"
|
25
35
|
end
|
26
36
|
|
@@ -29,8 +39,8 @@ end
|
|
29
39
|
# Maintenance Tasks
|
30
40
|
################################################################################
|
31
41
|
|
42
|
+
# Generate a monolithic rant file"
|
32
43
|
# FIXME: Remove dependency to rant
|
33
|
-
desc "Generate a monolithic rant file"
|
34
44
|
task "build.rb" do
|
35
45
|
sh "rant-import --force --auto .mono.rant"
|
36
46
|
end
|
@@ -52,35 +62,43 @@ task :relish do
|
|
52
62
|
end
|
53
63
|
|
54
64
|
|
65
|
+
################################################################################
|
66
|
+
# Cruise
|
67
|
+
################################################################################
|
68
|
+
|
69
|
+
task :setup do
|
70
|
+
sh "./build.rb distclean"
|
71
|
+
sh "bundle update"
|
72
|
+
sh "bundle install"
|
73
|
+
end
|
74
|
+
|
75
|
+
|
55
76
|
################################################################################
|
56
77
|
# Tests
|
57
78
|
################################################################################
|
58
79
|
|
59
|
-
task :travis => [ :
|
80
|
+
task :travis => [ :setup, :spec ]
|
60
81
|
|
61
82
|
|
62
83
|
begin
|
63
84
|
require "rspec/core"
|
64
85
|
require "rspec/core/rake_task"
|
65
86
|
|
87
|
+
task :spec => :build_trema
|
66
88
|
RSpec::Core::RakeTask.new do | task |
|
67
89
|
task.verbose = $trace
|
68
90
|
task.pattern = FileList[ "spec/**/*_spec.rb" ]
|
69
91
|
task.rspec_opts = "--format documentation --color"
|
70
92
|
end
|
71
93
|
|
94
|
+
task "spec:actions" => :build_trema
|
72
95
|
RSpec::Core::RakeTask.new( "spec:actions" ) do | task |
|
73
96
|
task.verbose = $trace
|
74
97
|
task.pattern = FileList[ "spec/**/*_spec.rb" ]
|
75
98
|
task.rspec_opts = "--tag type:actions --format documentation --color"
|
76
99
|
end
|
77
100
|
|
78
|
-
|
79
|
-
spec.pattern = FileList[ "spec/**/*_spec.rb" ]
|
80
|
-
# FIXME: use --tag ~sudo
|
81
|
-
spec.rspec_opts = "--tag nosudo -fs -c"
|
82
|
-
end
|
83
|
-
|
101
|
+
task :rcov => :build_trema
|
84
102
|
RSpec::Core::RakeTask.new( :rcov ) do | spec |
|
85
103
|
spec.pattern = "spec/**/*_spec.rb"
|
86
104
|
spec.rcov = true
|
@@ -93,6 +111,7 @@ end
|
|
93
111
|
|
94
112
|
begin
|
95
113
|
require "cucumber/rake/task"
|
114
|
+
task :features => :build_trema
|
96
115
|
Cucumber::Rake::Task.new( :features ) do | t |
|
97
116
|
t.cucumber_opts = "features --tags ~@wip"
|
98
117
|
end
|
data/Rantfile
CHANGED
@@ -825,7 +825,7 @@ end
|
|
825
825
|
def libtrema_unit_tests
|
826
826
|
{
|
827
827
|
:byteorder_test => [ :log, :utility, :wrapper, :trema_wrapper ],
|
828
|
-
:daemon_test => [],
|
828
|
+
:daemon_test => [ :log, :utility, :wrapper, :trema_wrapper ],
|
829
829
|
:ether_test => [ :buffer, :log, :utility, :wrapper, :trema_wrapper ],
|
830
830
|
:messenger_test => [ :doubly_linked_list, :hash_table, :event_handler, :linked_list, :utility, :wrapper, :timer, :log, :trema_wrapper ],
|
831
831
|
:openflow_application_interface_test => [ :buffer, :byteorder, :hash_table, :doubly_linked_list, :linked_list, :log, :openflow_message, :packet_info, :stat, :trema_wrapper, :utility, :wrapper ],
|
data/bin/trema
CHANGED
data/build.rb
CHANGED
data/cruise.rb
CHANGED
@@ -317,7 +317,6 @@ end
|
|
317
317
|
def run_unit_test
|
318
318
|
test "Running unit tests ..." do
|
319
319
|
sh "./build.rb unittests"
|
320
|
-
sh "./build.rb"
|
321
320
|
sh "rake spec"
|
322
321
|
end
|
323
322
|
measure_coverage
|
@@ -326,7 +325,6 @@ end
|
|
326
325
|
|
327
326
|
def run_acceptance_test
|
328
327
|
test "Running acceptance tests ..." do
|
329
|
-
sh "./build.rb"
|
330
328
|
sh "rake features"
|
331
329
|
end
|
332
330
|
end
|
@@ -361,16 +359,12 @@ $options.parse! ARGV
|
|
361
359
|
|
362
360
|
|
363
361
|
def init_cruise
|
364
|
-
|
365
|
-
sh "./build.rb distclean"
|
366
|
-
sh "bundle install"
|
367
|
-
mkdir_p Trema.log
|
368
|
-
mkdir_p Trema.pid
|
369
|
-
mkdir_p Trema.sock
|
362
|
+
sh "rake setup"
|
370
363
|
end
|
371
364
|
|
372
365
|
|
373
366
|
Blocker.start do
|
367
|
+
$start_time = Time.now
|
374
368
|
cd Trema.home do
|
375
369
|
init_cruise
|
376
370
|
run_unit_test if not $acceptance_test_only
|
data/features/.nav
CHANGED
@@ -0,0 +1,137 @@
|
|
1
|
+
Feature: get_pid_by_trema_name()
|
2
|
+
|
3
|
+
The function get_pid_by_trema_name() returns the PID of the process
|
4
|
+
specified by its `name` argument.
|
5
|
+
If the `name` is not found, the function returns -1.
|
6
|
+
|
7
|
+
pid_t get_pid_by_trema_name( const char *name )
|
8
|
+
|
9
|
+
The `name` argument refers to controller process name called *trema-name*.
|
10
|
+
In the trema framework the trema-name is a unique identifier assigned to
|
11
|
+
each controller process.
|
12
|
+
It is determined automatically by the following rules:
|
13
|
+
|
14
|
+
**Rule 1:** When you start a Ruby controller:
|
15
|
+
|
16
|
+
class TopologyController < Controller
|
17
|
+
...
|
18
|
+
end
|
19
|
+
|
20
|
+
$ trema run topology-controller.rb
|
21
|
+
|
22
|
+
then its trema-name is set to "TopologyController",
|
23
|
+
which is the same as the class name.
|
24
|
+
|
25
|
+
**Rule 2:** When you start a C controller:
|
26
|
+
|
27
|
+
$ trema run topology_controller
|
28
|
+
|
29
|
+
then its trema-name is set to "topology_controller",
|
30
|
+
which is same as the executable name.
|
31
|
+
|
32
|
+
**Rule 3:** Trema-name can be overwritten using the `-n` or `--name`
|
33
|
+
option given by the `trema run` command.
|
34
|
+
|
35
|
+
$ trema run "topology_controller -n topology"
|
36
|
+
$ trema run "topology_controller --name=topology"
|
37
|
+
|
38
|
+
Background:
|
39
|
+
Given a file named "print_pid.c" with:
|
40
|
+
"""
|
41
|
+
#include <stdio.h>
|
42
|
+
#include "trema.h"
|
43
|
+
|
44
|
+
int
|
45
|
+
main( int argc, char* argv[] ) {
|
46
|
+
init_trema( &argc, &argv );
|
47
|
+
|
48
|
+
if ( argc >= 2 ) {
|
49
|
+
pid_t pid = get_pid_by_trema_name( argv[ 1 ] );
|
50
|
+
if ( pid == -1 ) {
|
51
|
+
printf( "No such process : %s\n", argv[ 1 ] );
|
52
|
+
}
|
53
|
+
else {
|
54
|
+
printf( "PID of %s = %d\n", argv[ 1 ], pid );
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
58
|
+
finalize_trema();
|
59
|
+
return 0;
|
60
|
+
}
|
61
|
+
"""
|
62
|
+
And I compile "print_pid.c" into "print_pid"
|
63
|
+
And a file named "c_controller.c" with:
|
64
|
+
"""
|
65
|
+
#include "trema.h"
|
66
|
+
|
67
|
+
int
|
68
|
+
main( int argc, char* argv[] ) {
|
69
|
+
init_trema( &argc, &argv );
|
70
|
+
start_trema();
|
71
|
+
return 0;
|
72
|
+
}
|
73
|
+
"""
|
74
|
+
And I compile "c_controller.c" into "c_controller"
|
75
|
+
|
76
|
+
Scenario: Getting the PID of a Ruby controller process with a default name.
|
77
|
+
Given a file named "RubyController.rb" with:
|
78
|
+
"""
|
79
|
+
class RubyController < Controller
|
80
|
+
end
|
81
|
+
"""
|
82
|
+
And I run `trema run ./RubyController.rb -d`
|
83
|
+
And wait until "RubyController" is up
|
84
|
+
When I run `trema run "./print_pid RubyController"`
|
85
|
+
Then the output should match:
|
86
|
+
"""
|
87
|
+
PID of RubyController = \d+
|
88
|
+
"""
|
89
|
+
|
90
|
+
Scenario: Getting the PID of a C controller process with a default name.
|
91
|
+
Given I run `trema run "./c_controller" -d`
|
92
|
+
And wait until "c_controller" is up
|
93
|
+
When I run `trema run "./print_pid c_controller"`
|
94
|
+
Then the output should match:
|
95
|
+
"""
|
96
|
+
PID of c_controller = \d+
|
97
|
+
"""
|
98
|
+
|
99
|
+
Scenario: Getting the PID of a C controller process renamed through CLI option '-n'.
|
100
|
+
Given I run `trema run "./c_controller -n NewName" -d`
|
101
|
+
And wait until "NewName" is up
|
102
|
+
When I run `trema run "./print_pid NewName"`
|
103
|
+
Then the output should match:
|
104
|
+
"""
|
105
|
+
PID of NewName = \d+
|
106
|
+
"""
|
107
|
+
|
108
|
+
Scenario: Getting the PID of a C controller process renamed through CLI option '--name'.
|
109
|
+
Given I run `trema run "./c_controller --name=NewName" -d`
|
110
|
+
And wait until "NewName" is up
|
111
|
+
When I run `trema run "./print_pid NewName"`
|
112
|
+
Then the output should match:
|
113
|
+
"""
|
114
|
+
PID of NewName = \d+
|
115
|
+
"""
|
116
|
+
|
117
|
+
@wip
|
118
|
+
Scenario: Getting the PID of a Ruby controller process renamed through CLI option '-n'.
|
119
|
+
Given a file named "RubyController.rb" with:
|
120
|
+
"""
|
121
|
+
class RubyController < Controller
|
122
|
+
end
|
123
|
+
"""
|
124
|
+
And I run `trema run "./RubyController.rb -n NewName" -d`
|
125
|
+
And wait until "NewName" is up
|
126
|
+
When I run `trema run "./print_pid NewName"`
|
127
|
+
Then the output should match:
|
128
|
+
"""
|
129
|
+
PID of NewName = \d+
|
130
|
+
"""
|
131
|
+
|
132
|
+
Scenario: Getting the PID of non-existent controller returns an error code -1.
|
133
|
+
When I run `trema run "./print_pid NO_SUCH_TREMA_PROCESS"`
|
134
|
+
Then the output should match:
|
135
|
+
"""
|
136
|
+
No such process : NO_SUCH_TREMA_PROCESS
|
137
|
+
"""
|
data/features/support/hooks.rb
CHANGED
@@ -16,10 +16,25 @@
|
|
16
16
|
#
|
17
17
|
|
18
18
|
|
19
|
+
require "trema/path"
|
20
|
+
|
21
|
+
|
22
|
+
def wait_until_all_pid_files_are_deleted timeout = 10
|
23
|
+
elapsed = 0
|
24
|
+
loop do
|
25
|
+
raise "Failed to clean up remaining processes." if elapsed > timeout
|
26
|
+
break if Dir.glob( File.join( Trema.pid, "*.pid" ) ).empty?
|
27
|
+
sleep 1
|
28
|
+
elapsed += 1
|
29
|
+
end
|
30
|
+
sleep 1
|
31
|
+
end
|
32
|
+
|
33
|
+
|
19
34
|
Before do
|
20
35
|
@aruba_timeout_seconds = 10
|
21
36
|
run "trema killall"
|
22
|
-
|
37
|
+
wait_until_all_pid_files_are_deleted
|
23
38
|
end
|
24
39
|
|
25
40
|
|
@@ -30,7 +45,7 @@ end
|
|
30
45
|
|
31
46
|
After do
|
32
47
|
run "trema killall"
|
33
|
-
|
48
|
+
wait_until_all_pid_files_are_deleted
|
34
49
|
end
|
35
50
|
|
36
51
|
|
data/ruby/trema/controller.c
CHANGED
@@ -21,11 +21,11 @@
|
|
21
21
|
#include "barrier-reply.h"
|
22
22
|
#include "buffer.h"
|
23
23
|
#include "controller.h"
|
24
|
+
#include "default-logger.h"
|
24
25
|
#include "features-reply.h"
|
25
26
|
#include "flow-removed.h"
|
26
27
|
#include "get-config-reply.h"
|
27
28
|
#include "list-switches-reply.h"
|
28
|
-
#include "logger.h"
|
29
29
|
#include "openflow-error.h"
|
30
30
|
#include "openflow.h"
|
31
31
|
#include "packet-in.h"
|
data/ruby/trema/controller.rb
CHANGED
@@ -17,7 +17,7 @@
|
|
17
17
|
|
18
18
|
|
19
19
|
require "trema/app"
|
20
|
-
require "trema/logger"
|
20
|
+
require "trema/default-logger"
|
21
21
|
require "trema/monkey-patch/integer"
|
22
22
|
require "trema/monkey-patch/string"
|
23
23
|
require "trema/timers"
|
@@ -28,7 +28,7 @@ module Trema
|
|
28
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
|
-
include
|
31
|
+
include DefaultLogger
|
32
32
|
include Timers
|
33
33
|
|
34
34
|
|
@@ -18,11 +18,11 @@
|
|
18
18
|
|
19
19
|
#include "checks.h"
|
20
20
|
#include "log.h"
|
21
|
-
#include "logger.h"
|
21
|
+
#include "default-logger.h"
|
22
22
|
|
23
23
|
|
24
24
|
extern VALUE mTrema;
|
25
|
-
VALUE
|
25
|
+
VALUE mDefaultLogger;
|
26
26
|
|
27
27
|
|
28
28
|
static VALUE
|
@@ -45,7 +45,7 @@ do_log( void ( *log_function )( const char *format, ... ), int argc, VALUE *argv
|
|
45
45
|
* additional arguments.
|
46
46
|
*/
|
47
47
|
static VALUE
|
48
|
-
|
48
|
+
default_logger_critical( int argc, VALUE *argv, VALUE self ) {
|
49
49
|
UNUSED( self );
|
50
50
|
return( do_log( critical, argc, argv ) );
|
51
51
|
}
|
@@ -63,7 +63,7 @@ logger_critical( int argc, VALUE *argv, VALUE self ) {
|
|
63
63
|
* additional arguments.
|
64
64
|
*/
|
65
65
|
static VALUE
|
66
|
-
|
66
|
+
default_logger_error( int argc, VALUE *argv, VALUE self ) {
|
67
67
|
UNUSED( self );
|
68
68
|
return( do_log( error, argc, argv ) );
|
69
69
|
}
|
@@ -81,7 +81,7 @@ logger_error( int argc, VALUE *argv, VALUE self ) {
|
|
81
81
|
* additional arguments.
|
82
82
|
*/
|
83
83
|
static VALUE
|
84
|
-
|
84
|
+
default_logger_warn( int argc, VALUE *argv, VALUE self ) {
|
85
85
|
UNUSED( self );
|
86
86
|
return( do_log( warn, argc, argv ) );
|
87
87
|
}
|
@@ -99,7 +99,7 @@ logger_warn( int argc, VALUE *argv, VALUE self ) {
|
|
99
99
|
* additional arguments.
|
100
100
|
*/
|
101
101
|
static VALUE
|
102
|
-
|
102
|
+
default_logger_notice( int argc, VALUE *argv, VALUE self ) {
|
103
103
|
UNUSED( self );
|
104
104
|
return( do_log( notice, argc, argv ) );
|
105
105
|
}
|
@@ -116,7 +116,7 @@ logger_notice( int argc, VALUE *argv, VALUE self ) {
|
|
116
116
|
* additional arguments.
|
117
117
|
*/
|
118
118
|
static VALUE
|
119
|
-
|
119
|
+
default_logger_info( int argc, VALUE *argv, VALUE self ) {
|
120
120
|
UNUSED( self );
|
121
121
|
return( do_log( info, argc, argv ) );
|
122
122
|
}
|
@@ -133,23 +133,23 @@ logger_info( int argc, VALUE *argv, VALUE self ) {
|
|
133
133
|
* additional arguments.
|
134
134
|
*/
|
135
135
|
static VALUE
|
136
|
-
|
136
|
+
default_logger_debug( int argc, VALUE *argv, VALUE self ) {
|
137
137
|
UNUSED( self );
|
138
138
|
return( do_log( debug, argc, argv ) );
|
139
139
|
}
|
140
140
|
|
141
141
|
|
142
142
|
void
|
143
|
-
|
143
|
+
Init_default_logger() {
|
144
144
|
mTrema = rb_define_module( "Trema" );
|
145
|
-
|
146
|
-
|
147
|
-
rb_define_method(
|
148
|
-
rb_define_method(
|
149
|
-
rb_define_method(
|
150
|
-
rb_define_method(
|
151
|
-
rb_define_method(
|
152
|
-
rb_define_method(
|
145
|
+
mDefaultLogger = rb_define_module_under( mTrema, "DefaultLogger" );
|
146
|
+
|
147
|
+
rb_define_method( mDefaultLogger, "critical", default_logger_critical, -1 );
|
148
|
+
rb_define_method( mDefaultLogger, "error", default_logger_error, -1 );
|
149
|
+
rb_define_method( mDefaultLogger, "warn", default_logger_warn, -1 );
|
150
|
+
rb_define_method( mDefaultLogger, "notice", default_logger_notice, -1 );
|
151
|
+
rb_define_method( mDefaultLogger, "info", default_logger_info, -1 );
|
152
|
+
rb_define_method( mDefaultLogger, "debug", default_logger_debug, -1 );
|
153
153
|
}
|
154
154
|
|
155
155
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
*
|
2
|
+
* DefaultLogger module.
|
3
3
|
*
|
4
4
|
* Copyright (C) 2008-2013 NEC Corporation
|
5
5
|
*
|
@@ -18,20 +18,20 @@
|
|
18
18
|
*/
|
19
19
|
|
20
20
|
|
21
|
-
#ifndef
|
22
|
-
#define
|
21
|
+
#ifndef DEFAULT_LOGGER_H
|
22
|
+
#define DEFAULT_LOGGER_H
|
23
23
|
|
24
24
|
|
25
25
|
#include "ruby.h"
|
26
26
|
|
27
27
|
|
28
|
-
extern VALUE
|
28
|
+
extern VALUE mDefaultLogger;
|
29
29
|
|
30
30
|
|
31
|
-
void
|
31
|
+
void Init_default_logger( void );
|
32
32
|
|
33
33
|
|
34
|
-
#endif //
|
34
|
+
#endif // DEFAULT_LOGGER_H
|
35
35
|
|
36
36
|
|
37
37
|
/*
|
data/ruby/trema/switch.c
CHANGED
@@ -16,8 +16,8 @@
|
|
16
16
|
*/
|
17
17
|
|
18
18
|
|
19
|
+
#include "default-logger.h"
|
19
20
|
#include "flow-mod.h"
|
20
|
-
#include "logger.h"
|
21
21
|
#include "ruby.h"
|
22
22
|
#include "rubysig.h"
|
23
23
|
#include "switch.h"
|
@@ -180,7 +180,7 @@ void
|
|
180
180
|
Init_switch() {
|
181
181
|
mTrema = rb_define_module( "Trema" );
|
182
182
|
cSwitch = rb_define_class_under( mTrema, "Switch", rb_cObject );
|
183
|
-
rb_include_module( cSwitch,
|
183
|
+
rb_include_module( cSwitch, mDefaultLogger );
|
184
184
|
|
185
185
|
rb_define_method( cSwitch, "run!", switch_run, 0 );
|
186
186
|
rb_define_method( cSwitch, "send_message", switch_send_message, 1 );
|
data/ruby/trema/trema.c
CHANGED
@@ -21,6 +21,7 @@
|
|
21
21
|
#include "barrier-reply.h"
|
22
22
|
#include "barrier-request.h"
|
23
23
|
#include "controller.h"
|
24
|
+
#include "default-logger.h"
|
24
25
|
#include "echo-reply.h"
|
25
26
|
#include "echo-request.h"
|
26
27
|
#include "error.h"
|
@@ -31,7 +32,6 @@
|
|
31
32
|
#include "get-config-reply.h"
|
32
33
|
#include "get-config-request.h"
|
33
34
|
#include "hello.h"
|
34
|
-
#include "logger.h"
|
35
35
|
#include "match.h"
|
36
36
|
#include "openflow-error.h"
|
37
37
|
#include "packet-in.h"
|
@@ -85,6 +85,7 @@ Init_trema() {
|
|
85
85
|
Init_barrier_reply();
|
86
86
|
Init_barrier_request();
|
87
87
|
Init_controller();
|
88
|
+
Init_default_logger();
|
88
89
|
Init_echo_reply();
|
89
90
|
Init_echo_request();
|
90
91
|
Init_error();
|
@@ -95,7 +96,6 @@ Init_trema() {
|
|
95
96
|
Init_get_config_reply();
|
96
97
|
Init_get_config_request();
|
97
98
|
Init_hello();
|
98
|
-
Init_logger();
|
99
99
|
Init_match();
|
100
100
|
Init_openflow_error();
|
101
101
|
Init_packet_in();
|
data/ruby/trema/version.rb
CHANGED
data/src/lib/daemon.c
CHANGED
@@ -26,6 +26,7 @@
|
|
26
26
|
#include <string.h>
|
27
27
|
#include <sys/stat.h>
|
28
28
|
#include <unistd.h>
|
29
|
+
#include <getopt.h>
|
29
30
|
#include "checks.h"
|
30
31
|
#include "log.h"
|
31
32
|
#include "wrapper.h"
|
@@ -290,12 +291,85 @@ read_pid( const char *directory, const char *name ) {
|
|
290
291
|
exe_path[ readsiz ] = '\0';
|
291
292
|
|
292
293
|
char *exe_name = basename( exe_path );
|
293
|
-
if ( strcmp( name, exe_name )
|
294
|
-
|
294
|
+
if ( strcmp( name, exe_name ) == 0 ) {
|
295
|
+
return pid;
|
296
|
+
}
|
297
|
+
|
298
|
+
// check if -n (service_name) option is used
|
299
|
+
sprintf( proc_path, "/proc/%d/cmdline", pid );
|
300
|
+
fd = open( proc_path, O_RDONLY, 0 );
|
301
|
+
if ( fd < 0 ) {
|
302
|
+
warn( "Failed to open %s ( %s [%d] ).", proc_path, strerror( errno ), errno );
|
295
303
|
return -1;
|
296
304
|
}
|
297
305
|
|
298
|
-
|
306
|
+
char *buffer = xcalloc( PATH_MAX + 2, sizeof( char ) );
|
307
|
+
char *write_head = buffer;
|
308
|
+
size_t buffer_left = PATH_MAX;
|
309
|
+
size_t read_byte = 0;
|
310
|
+
while ( ( readsiz = read( fd, write_head, buffer_left ) ) > 0 ) {
|
311
|
+
read_byte += ( size_t ) readsiz;
|
312
|
+
write_head += readsiz;
|
313
|
+
buffer_left = PATH_MAX - read_byte;
|
314
|
+
}
|
315
|
+
close( fd );
|
316
|
+
|
317
|
+
// convert cmdline to argv format
|
318
|
+
size_t argc = 0;
|
319
|
+
char **argv = xcalloc( 1, sizeof( char * ) );
|
320
|
+
|
321
|
+
char *token = buffer;
|
322
|
+
const char *buffer_end = buffer + read_byte;
|
323
|
+
while ( token <= buffer_end ) {
|
324
|
+
size_t token_len = strlen( token );
|
325
|
+
if ( token_len > 0 ) {
|
326
|
+
++argc;
|
327
|
+
char **new_argv = xmalloc( ( argc + 1 ) * sizeof( char * ) );
|
328
|
+
for ( size_t i = 0; i < argc - 1; ++i ) {
|
329
|
+
new_argv[ i ] = argv[ i ];
|
330
|
+
}
|
331
|
+
xfree( argv );
|
332
|
+
argv = new_argv;
|
333
|
+
argv[ argc - 1 ] = token;
|
334
|
+
argv[ argc ] = NULL;
|
335
|
+
}
|
336
|
+
else {
|
337
|
+
if ( *( token + 1 ) == '\0' ) {
|
338
|
+
// "\0\0", end of cmdline
|
339
|
+
break;
|
340
|
+
}
|
341
|
+
}
|
342
|
+
token += token_len + 1;
|
343
|
+
}
|
344
|
+
|
345
|
+
const struct option long_options[] = {
|
346
|
+
{ "name", 1, NULL, 'n' },
|
347
|
+
{ NULL, 0, NULL, 0 },
|
348
|
+
};
|
349
|
+
const char short_options[] = "n:";
|
350
|
+
int c;
|
351
|
+
optind = 0;
|
352
|
+
opterr = 0;
|
353
|
+
const char *service_name = basename( argv[ 0 ] );
|
354
|
+
while ( ( c = getopt_long( ( int )argc, argv, short_options, long_options, NULL ) ) != -1 ){
|
355
|
+
switch ( c ) {
|
356
|
+
case 'n':
|
357
|
+
service_name = optarg;
|
358
|
+
break;
|
359
|
+
}
|
360
|
+
}
|
361
|
+
|
362
|
+
if ( strcmp( name, service_name ) == 0 ) {
|
363
|
+
xfree( argv );
|
364
|
+
xfree( buffer );
|
365
|
+
return pid;
|
366
|
+
}
|
367
|
+
else {
|
368
|
+
warn( "Failed to check process name %s.", name );
|
369
|
+
xfree( argv );
|
370
|
+
xfree( buffer );
|
371
|
+
return -1;
|
372
|
+
}
|
299
373
|
}
|
300
374
|
|
301
375
|
|
@@ -1763,6 +1763,35 @@ delete_openflow_messages( uint64_t datapath_id ) {
|
|
1763
1763
|
}
|
1764
1764
|
|
1765
1765
|
|
1766
|
+
bool
|
1767
|
+
disconnect_switch( uint64_t datapath_id ) {
|
1768
|
+
debug( "Disconnecting a switch ( datapath_id = %#" PRIx64 " ).", datapath_id );
|
1769
|
+
|
1770
|
+
maybe_init_openflow_application_interface();
|
1771
|
+
assert( openflow_application_interface_initialized );
|
1772
|
+
|
1773
|
+
size_t service_name_length = strlen( service_name ) + 1;
|
1774
|
+
size_t length = sizeof( openflow_service_header_t ) + service_name_length;
|
1775
|
+
buffer *buf = alloc_buffer_with_length( length );
|
1776
|
+
openflow_service_header_t *header = append_back_buffer( buf, sizeof( openflow_service_header_t ) );
|
1777
|
+
header->datapath_id = htonll( datapath_id );
|
1778
|
+
header->service_name_length = htons( ( uint16_t ) service_name_length );
|
1779
|
+
char *name = append_back_buffer( buf, service_name_length );
|
1780
|
+
memcpy( name, service_name, service_name_length );
|
1781
|
+
|
1782
|
+
char remote_service_name[ MESSENGER_SERVICE_NAME_LENGTH ];
|
1783
|
+
snprintf( remote_service_name, sizeof( remote_service_name ),
|
1784
|
+
"switch.%#" PRIx64, datapath_id );
|
1785
|
+
|
1786
|
+
bool ret = send_message( remote_service_name, MESSENGER_OPENFLOW_DISCONNECT_REQUEST,
|
1787
|
+
buf->data, buf->length );
|
1788
|
+
|
1789
|
+
free_buffer( buf );
|
1790
|
+
|
1791
|
+
return ret;
|
1792
|
+
}
|
1793
|
+
|
1794
|
+
|
1766
1795
|
/*
|
1767
1796
|
* Local variables:
|
1768
1797
|
* c-basic-offset: 2
|
@@ -341,6 +341,13 @@ bool send_list_switches_request( void *user_data );
|
|
341
341
|
bool delete_openflow_messages( uint64_t datapath_id );
|
342
342
|
|
343
343
|
|
344
|
+
/********************************************************************************
|
345
|
+
* Function for disconnecting a switch
|
346
|
+
********************************************************************************/
|
347
|
+
|
348
|
+
bool disconnect_switch( uint64_t datapath_id );
|
349
|
+
|
350
|
+
|
344
351
|
#endif // OPENFLOW_APPLICATION_INTERFACE_H
|
345
352
|
|
346
353
|
|
data/src/lib/trema.c
CHANGED
@@ -373,7 +373,7 @@ die_unless_initialized() {
|
|
373
373
|
}
|
374
374
|
|
375
375
|
|
376
|
-
|
376
|
+
void
|
377
377
|
finalize_trema() {
|
378
378
|
die_unless_initialized();
|
379
379
|
|
@@ -632,35 +632,28 @@ init_trema( int *argc, char ***argv ) {
|
|
632
632
|
}
|
633
633
|
|
634
634
|
|
635
|
+
static void
|
636
|
+
create_pid_file() {
|
637
|
+
write_pid( get_trema_pid(), get_trema_name() );
|
638
|
+
}
|
639
|
+
|
640
|
+
|
635
641
|
/**
|
636
642
|
* Runs the main loop.
|
637
643
|
*/
|
638
644
|
void
|
639
645
|
start_trema() {
|
640
|
-
start_trema_up();
|
641
|
-
start_event_handler();
|
642
|
-
start_trema_down();
|
643
|
-
}
|
644
|
-
|
645
|
-
|
646
|
-
void
|
647
|
-
start_trema_up() {
|
648
646
|
pthread_mutex_lock( &mutex );
|
649
647
|
|
650
648
|
die_unless_initialized();
|
651
|
-
|
652
|
-
debug( "Starting %s ... ( TREMA_HOME = %s )", get_trema_name(), get_trema_home() );
|
649
|
+
debug( "Starting %s ... (TREMA_HOME = %s)", get_trema_name(), get_trema_home() );
|
653
650
|
|
654
651
|
maybe_daemonize();
|
655
|
-
|
652
|
+
create_pid_file();
|
656
653
|
trema_started = true;
|
657
|
-
|
658
654
|
start_messenger();
|
659
|
-
|
660
|
-
|
655
|
+
start_event_handler();
|
661
656
|
|
662
|
-
void
|
663
|
-
start_trema_down() {
|
664
657
|
finalize_trema();
|
665
658
|
|
666
659
|
pthread_mutex_unlock( &mutex );
|
@@ -723,11 +716,17 @@ get_executable_name() {
|
|
723
716
|
|
724
717
|
|
725
718
|
pid_t
|
726
|
-
|
719
|
+
get_pid_by_trema_name( const char *name ) {
|
727
720
|
return read_pid( get_trema_pid(), name );
|
728
721
|
}
|
729
722
|
|
730
723
|
|
724
|
+
pid_t
|
725
|
+
get_trema_process_from_name( const char *name ) {
|
726
|
+
return get_pid_by_trema_name( name );
|
727
|
+
}
|
728
|
+
|
729
|
+
|
731
730
|
bool
|
732
731
|
terminate_trema_process( pid_t pid ) {
|
733
732
|
assert( pid > 0 );
|
data/src/lib/trema.h
CHANGED
@@ -53,16 +53,16 @@ static const char DEFAULT_DUMP_SERVICE_NAME[] = "dump_service";
|
|
53
53
|
|
54
54
|
void init_trema( int *argc, char ***argv );
|
55
55
|
void start_trema( void );
|
56
|
-
void start_trema_up();
|
57
|
-
void start_trema_down();
|
58
56
|
void stop_trema( void );
|
57
|
+
void finalize_trema( void );
|
59
58
|
void flush( void );
|
60
59
|
const char *get_trema_home( void );
|
61
60
|
const char *get_trema_tmp( void );
|
62
61
|
void set_trema_name( const char *name );
|
63
62
|
const char *get_trema_name( void );
|
64
63
|
const char *get_executable_name( void );
|
65
|
-
pid_t
|
64
|
+
pid_t get_pid_by_trema_name( const char *name );
|
65
|
+
pid_t get_trema_process_from_name( const char *name ) __attribute__ ((deprecated));
|
66
66
|
bool terminate_trema_process( pid_t pid );
|
67
67
|
__attribute__( ( weak ) ) void usage( void );
|
68
68
|
|
@@ -131,7 +131,7 @@ service_recv_from_application( uint16_t message_type, buffer *buf ) {
|
|
131
131
|
uint16_t service_name_length;
|
132
132
|
char *service_name;
|
133
133
|
|
134
|
-
if ( buf->length < sizeof( openflow_service_header_t )
|
134
|
+
if ( buf->length < sizeof( openflow_service_header_t ) ) {
|
135
135
|
error( "Too short openflow application message(%zu).", buf->length );
|
136
136
|
free_buffer( buf );
|
137
137
|
|
data/src/switch_manager/switch.c
CHANGED
@@ -399,7 +399,7 @@ switch_event_recv_featuresreply( struct switch_info *sw_info, uint64_t *dpid ) {
|
|
399
399
|
snprintf( new_service_name, new_service_name_len, "%s%#" PRIx64, SWITCH_MANAGER_PREFIX, sw_info->datapath_id );
|
400
400
|
|
401
401
|
// checking duplicate service
|
402
|
-
pid_t pid =
|
402
|
+
pid_t pid = get_pid_by_trema_name( new_service_name );
|
403
403
|
if ( pid > 0 ) {
|
404
404
|
// duplicated
|
405
405
|
if ( !terminate_trema_process( pid ) ) {
|
@@ -682,7 +682,11 @@ main( int argc, char *argv[] ) {
|
|
682
682
|
error( "Failed to set connected state." );
|
683
683
|
return -1;
|
684
684
|
}
|
685
|
-
flush_secure_channel( &switch_info );
|
685
|
+
ret = flush_secure_channel( &switch_info );
|
686
|
+
if ( ret < 0 ) {
|
687
|
+
error( "Failed to flush secure channel. Terminating %s.", argv[ 0 ] );
|
688
|
+
return -1;
|
689
|
+
}
|
686
690
|
|
687
691
|
start_trema();
|
688
692
|
|
data/trema.gemspec
CHANGED
@@ -26,10 +26,10 @@ Gem::Specification.new do | gem |
|
|
26
26
|
gem.extra_rdoc_files = [ "README.md" ]
|
27
27
|
gem.test_files = `git ls-files -- {spec,features}/*`.split( "\n" )
|
28
28
|
|
29
|
-
gem.add_dependency "bundler"
|
29
|
+
gem.add_dependency "bundler"
|
30
30
|
gem.add_dependency "gli", "~> 2.5.4"
|
31
31
|
gem.add_dependency "rake", "~> 10.0.3"
|
32
|
-
gem.add_dependency "rdoc", "~>
|
32
|
+
gem.add_dependency "rdoc", "~> 4.0.0"
|
33
33
|
end
|
34
34
|
|
35
35
|
|
data/unittests/lib/daemon_test.c
CHANGED
@@ -658,59 +658,6 @@ test_read_pid_fail_if_readlink_fail() {
|
|
658
658
|
}
|
659
659
|
|
660
660
|
|
661
|
-
static void
|
662
|
-
test_read_pid_fail_if_strcmp_fail() {
|
663
|
-
// Test if correctly access.
|
664
|
-
char path[] = "/home/yasuhito/trema/tmp/chess.pid";
|
665
|
-
expect_string( mock_access, pathname, path );
|
666
|
-
expect_value( mock_access, mode, R_OK );
|
667
|
-
will_return( mock_access, 0 );
|
668
|
-
|
669
|
-
// Test if correctly opened.
|
670
|
-
int pid_file_fd = 111;
|
671
|
-
expect_string( mock_open, pathname, path );
|
672
|
-
expect_value( mock_open, flags, O_RDONLY );
|
673
|
-
expect_value( mock_open, mode, 0 );
|
674
|
-
will_return( mock_open, pid_file_fd );
|
675
|
-
|
676
|
-
// Test if correctly read.
|
677
|
-
expect_value( mock_read, fd, pid_file_fd );
|
678
|
-
expect_not_value( mock_read, buf, NULL );
|
679
|
-
expect_value( mock_read, count, 10 - 1 );
|
680
|
-
char valid_pid_string[] = "123\n";
|
681
|
-
pid_t valid_pid = 123;
|
682
|
-
read_buffer = valid_pid_string;
|
683
|
-
read_length = strlen( valid_pid_string );
|
684
|
-
will_return( mock_read, read_length );
|
685
|
-
|
686
|
-
// Test if correctly kill.
|
687
|
-
expect_value( mock_kill, pid, valid_pid );
|
688
|
-
expect_value( mock_kill, sig, 0 );
|
689
|
-
will_return( mock_kill, 0 );
|
690
|
-
|
691
|
-
// Test if correctly close.
|
692
|
-
expect_value( mock_close, fd, pid_file_fd );
|
693
|
-
|
694
|
-
// Test if correctly readlink.
|
695
|
-
char proc_path[] = "/proc/123/exe";
|
696
|
-
expect_string( mock_readlink, path, proc_path );
|
697
|
-
expect_not_value( mock_readlink, buf, NULL );
|
698
|
-
expect_value( mock_readlink, bufsiz, PATH_MAX - 1 );
|
699
|
-
char INVALID_exe_path[] = "/home/yasuhito/trema/bin/chess2";
|
700
|
-
link_buffer = INVALID_exe_path;
|
701
|
-
link_length = strlen( INVALID_exe_path );
|
702
|
-
will_return( mock_readlink, link_length );
|
703
|
-
|
704
|
-
// Test if correctly basename.
|
705
|
-
expect_string( mock_basename, path, INVALID_exe_path );
|
706
|
-
will_return( mock_basename, strdup( "chess2" ) );
|
707
|
-
|
708
|
-
// Go
|
709
|
-
pid_t pid = read_pid( "/home/yasuhito/trema/tmp", "chess" );
|
710
|
-
assert_true( pid == -1 );
|
711
|
-
}
|
712
|
-
|
713
|
-
|
714
661
|
static void
|
715
662
|
test_rename_pid_successed() {
|
716
663
|
// Test if correctly unlink.
|
@@ -781,7 +728,6 @@ main() {
|
|
781
728
|
unit_test( test_read_pid_fail_if_kill_fail_with_ESRCH ),
|
782
729
|
unit_test( test_read_pid_fail_if_kill_fail_with_EPERM ),
|
783
730
|
unit_test( test_read_pid_fail_if_readlink_fail ),
|
784
|
-
unit_test( test_read_pid_fail_if_strcmp_fail ),
|
785
731
|
|
786
732
|
// rename_pid() tests.
|
787
733
|
unit_test( test_rename_pid_successed ),
|
@@ -3476,6 +3476,52 @@ test_delete_openflow_messages_if_clear_send_queue_fails() {
|
|
3476
3476
|
}
|
3477
3477
|
|
3478
3478
|
|
3479
|
+
/********************************************************************************
|
3480
|
+
* disconnect_switch() tests.
|
3481
|
+
********************************************************************************/
|
3482
|
+
|
3483
|
+
static void
|
3484
|
+
test_disconnect_switch() {
|
3485
|
+
size_t expected_length = ( size_t ) ( sizeof( openflow_service_header_t ) + strlen( SERVICE_NAME ) + 1 );
|
3486
|
+
void *expected_data = xcalloc( 1, expected_length );
|
3487
|
+
openflow_service_header_t *header = expected_data;
|
3488
|
+
header->datapath_id = htonll( DATAPATH_ID );
|
3489
|
+
header->service_name_length = htons( ( uint16_t ) ( strlen( SERVICE_NAME ) + 1 ) );
|
3490
|
+
memcpy( ( char * ) expected_data + sizeof( openflow_service_header_t ), SERVICE_NAME, strlen( SERVICE_NAME ) + 1 );
|
3491
|
+
|
3492
|
+
expect_string( mock_send_message, service_name, REMOTE_SERVICE_NAME );
|
3493
|
+
expect_value( mock_send_message, tag32, MESSENGER_OPENFLOW_DISCONNECT_REQUEST );
|
3494
|
+
expect_value( mock_send_message, len, expected_length );
|
3495
|
+
expect_memory( mock_send_message, data, expected_data, expected_length );
|
3496
|
+
will_return( mock_send_message, true );
|
3497
|
+
|
3498
|
+
assert_true( disconnect_switch( DATAPATH_ID ) );
|
3499
|
+
|
3500
|
+
xfree( expected_data );
|
3501
|
+
}
|
3502
|
+
|
3503
|
+
|
3504
|
+
static void
|
3505
|
+
test_disconnect_switch_if_send_message_fails() {
|
3506
|
+
size_t expected_length = ( size_t ) ( sizeof( openflow_service_header_t ) + strlen( SERVICE_NAME ) + 1 );
|
3507
|
+
void *expected_data = xcalloc( 1, expected_length );
|
3508
|
+
openflow_service_header_t *header = expected_data;
|
3509
|
+
header->datapath_id = htonll( DATAPATH_ID );
|
3510
|
+
header->service_name_length = htons( ( uint16_t ) ( strlen( SERVICE_NAME ) + 1 ) );
|
3511
|
+
memcpy( ( char * ) expected_data + sizeof( openflow_service_header_t ), SERVICE_NAME, strlen( SERVICE_NAME ) + 1 );
|
3512
|
+
|
3513
|
+
expect_string( mock_send_message, service_name, REMOTE_SERVICE_NAME );
|
3514
|
+
expect_value( mock_send_message, tag32, MESSENGER_OPENFLOW_DISCONNECT_REQUEST );
|
3515
|
+
expect_value( mock_send_message, len, expected_length );
|
3516
|
+
expect_memory( mock_send_message, data, expected_data, expected_length );
|
3517
|
+
will_return( mock_send_message, false );
|
3518
|
+
|
3519
|
+
assert_false( disconnect_switch( DATAPATH_ID ) );
|
3520
|
+
|
3521
|
+
xfree( expected_data );
|
3522
|
+
}
|
3523
|
+
|
3524
|
+
|
3479
3525
|
/********************************************************************************
|
3480
3526
|
* Run tests.
|
3481
3527
|
********************************************************************************/
|
@@ -3650,6 +3696,10 @@ main() {
|
|
3650
3696
|
// delete_openflow_messages() tests.
|
3651
3697
|
unit_test_setup_teardown( test_delete_openflow_messages, init, cleanup ),
|
3652
3698
|
unit_test_setup_teardown( test_delete_openflow_messages_if_clear_send_queue_fails, init, cleanup ),
|
3699
|
+
|
3700
|
+
// disconnect_switch() tests.
|
3701
|
+
unit_test_setup_teardown( test_disconnect_switch, init, cleanup ),
|
3702
|
+
unit_test_setup_teardown( test_disconnect_switch_if_send_message_fails, init, cleanup ),
|
3653
3703
|
};
|
3654
3704
|
return run_tests( tests );
|
3655
3705
|
}
|
data/unittests/lib/trema_test.c
CHANGED
@@ -833,11 +833,11 @@ test_get_executable_name() {
|
|
833
833
|
|
834
834
|
|
835
835
|
/********************************************************************************
|
836
|
-
*
|
836
|
+
* get_pid_by_trema_name() tests.
|
837
837
|
*******************************************************************************/
|
838
838
|
|
839
839
|
static void
|
840
|
-
|
840
|
+
test_get_pid_by_trema_name() {
|
841
841
|
char NAME[] = "test_name";
|
842
842
|
char TEMP_DIRECTORY[] = "/tmp";
|
843
843
|
char PID_DIRECTORY[] = "/tmp/pid";
|
@@ -848,7 +848,7 @@ test_get_trema_process_from_name() {
|
|
848
848
|
will_return( mock_read_pid, PID );
|
849
849
|
|
850
850
|
// Go
|
851
|
-
pid_t pid =
|
851
|
+
pid_t pid = get_pid_by_trema_name( NAME );
|
852
852
|
assert_true( pid == PID );
|
853
853
|
unset_trema_tmp();
|
854
854
|
}
|
@@ -990,8 +990,8 @@ main() {
|
|
990
990
|
// get_executable_name() test.
|
991
991
|
unit_test_setup_teardown( test_get_executable_name, reset_trema, reset_trema ),
|
992
992
|
|
993
|
-
//
|
994
|
-
unit_test_setup_teardown(
|
993
|
+
// get_pid_by_trema_name() test.
|
994
|
+
unit_test_setup_teardown( test_get_pid_by_trema_name, reset_trema, reset_trema ),
|
995
995
|
|
996
996
|
// terminate_trema_process() test.
|
997
997
|
unit_test_setup_teardown( test_terminate_trema_process_when_was_found, reset_trema, reset_trema ),
|
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: 13
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.3.
|
9
|
+
- 15
|
10
|
+
version: 0.3.15
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Yasuhito Takamiya
|
@@ -15,27 +15,23 @@ autorequire:
|
|
15
15
|
bindir: .
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2013-
|
18
|
+
date: 2013-03-04 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
|
-
prerelease: false
|
22
|
-
name: bundler
|
23
21
|
version_requirements: &id001 !ruby/object:Gem::Requirement
|
24
22
|
none: false
|
25
23
|
requirements:
|
26
|
-
- -
|
24
|
+
- - ">="
|
27
25
|
- !ruby/object:Gem::Version
|
28
|
-
hash:
|
26
|
+
hash: 3
|
29
27
|
segments:
|
30
|
-
-
|
31
|
-
|
32
|
-
|
33
|
-
|
28
|
+
- 0
|
29
|
+
version: "0"
|
30
|
+
name: bundler
|
31
|
+
prerelease: false
|
34
32
|
type: :runtime
|
35
33
|
requirement: *id001
|
36
34
|
- !ruby/object:Gem::Dependency
|
37
|
-
prerelease: false
|
38
|
-
name: gli
|
39
35
|
version_requirements: &id002 !ruby/object:Gem::Requirement
|
40
36
|
none: false
|
41
37
|
requirements:
|
@@ -47,11 +43,11 @@ dependencies:
|
|
47
43
|
- 5
|
48
44
|
- 4
|
49
45
|
version: 2.5.4
|
46
|
+
name: gli
|
47
|
+
prerelease: false
|
50
48
|
type: :runtime
|
51
49
|
requirement: *id002
|
52
50
|
- !ruby/object:Gem::Dependency
|
53
|
-
prerelease: false
|
54
|
-
name: rake
|
55
51
|
version_requirements: &id003 !ruby/object:Gem::Requirement
|
56
52
|
none: false
|
57
53
|
requirements:
|
@@ -63,22 +59,24 @@ dependencies:
|
|
63
59
|
- 0
|
64
60
|
- 3
|
65
61
|
version: 10.0.3
|
62
|
+
name: rake
|
63
|
+
prerelease: false
|
66
64
|
type: :runtime
|
67
65
|
requirement: *id003
|
68
66
|
- !ruby/object:Gem::Dependency
|
69
|
-
prerelease: false
|
70
|
-
name: rdoc
|
71
67
|
version_requirements: &id004 !ruby/object:Gem::Requirement
|
72
68
|
none: false
|
73
69
|
requirements:
|
74
70
|
- - ~>
|
75
71
|
- !ruby/object:Gem::Version
|
76
|
-
hash:
|
72
|
+
hash: 63
|
77
73
|
segments:
|
78
|
-
-
|
79
|
-
-
|
80
|
-
-
|
81
|
-
version:
|
74
|
+
- 4
|
75
|
+
- 0
|
76
|
+
- 0
|
77
|
+
version: 4.0.0
|
78
|
+
name: rdoc
|
79
|
+
prerelease: false
|
82
80
|
type: :runtime
|
83
81
|
requirement: *id004
|
84
82
|
description: Trema is a full-stack, easy-to-use framework for developing OpenFlow controllers in Ruby and C.
|
@@ -108,6 +106,7 @@ files:
|
|
108
106
|
- cruise.rb
|
109
107
|
- features/.nav
|
110
108
|
- features/README.md
|
109
|
+
- features/core/get_pid_by_trema_name.feature
|
111
110
|
- features/core/packetin_filter.feature
|
112
111
|
- features/core/switch_manager.feature
|
113
112
|
- features/core/trema-config.feature
|
@@ -182,6 +181,9 @@ files:
|
|
182
181
|
- ruby/trema/controller.rb
|
183
182
|
- ruby/trema/custom-switch.rb
|
184
183
|
- ruby/trema/daemon.rb
|
184
|
+
- ruby/trema/default-logger.c
|
185
|
+
- ruby/trema/default-logger.h
|
186
|
+
- ruby/trema/default-logger.rb
|
185
187
|
- ruby/trema/desc-stats-reply.rb
|
186
188
|
- ruby/trema/dsl.rb
|
187
189
|
- ruby/trema/dsl/configuration.rb
|
@@ -232,9 +234,6 @@ files:
|
|
232
234
|
- ruby/trema/link.rb
|
233
235
|
- ruby/trema/list-switches-reply.c
|
234
236
|
- ruby/trema/list-switches-reply.h
|
235
|
-
- ruby/trema/logger.c
|
236
|
-
- ruby/trema/logger.h
|
237
|
-
- ruby/trema/logger.rb
|
238
237
|
- ruby/trema/mac.rb
|
239
238
|
- ruby/trema/match.c
|
240
239
|
- ruby/trema/match.h
|
@@ -338,6 +337,7 @@ files:
|
|
338
337
|
- spec/trema/barrier-request_spec.rb
|
339
338
|
- spec/trema/cli_spec.rb
|
340
339
|
- spec/trema/controller_spec.rb
|
340
|
+
- spec/trema/default-logger_spec.rb
|
341
341
|
- spec/trema/dsl/configuration_spec.rb
|
342
342
|
- spec/trema/dsl/link_spec.rb
|
343
343
|
- spec/trema/dsl/run_spec.rb
|
@@ -363,7 +363,6 @@ files:
|
|
363
363
|
- spec/trema/ip_spec.rb
|
364
364
|
- spec/trema/link_spec.rb
|
365
365
|
- spec/trema/list-switches-reply_spec.rb
|
366
|
-
- spec/trema/logger_spec.rb
|
367
366
|
- spec/trema/mac_spec.rb
|
368
367
|
- spec/trema/match_spec.rb
|
369
368
|
- spec/trema/open-vswitch_spec.rb
|