trema 0.2.6 → 0.2.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -35,7 +35,7 @@ module Trema
35
35
  $use_tremashark = true
36
36
  end
37
37
 
38
- cleanup_current_session
38
+ need_cleanup = ( not running? )
39
39
 
40
40
  if $run_as_daemon
41
41
  Trema::DSL::Runner.new( load_config ).daemonize
@@ -45,7 +45,7 @@ module Trema
45
45
  rescue SystemExit
46
46
  # This is OK
47
47
  ensure
48
- cleanup_current_session
48
+ cleanup_current_session if need_cleanup
49
49
  end
50
50
  end
51
51
  end
@@ -488,7 +488,7 @@ controller_send_packet_out( int argc, VALUE *argv, VALUE self ) {
488
488
  VALUE opt_data = rb_hash_aref( options, ID2SYM( rb_intern( "data" ) ) );
489
489
  if ( opt_data != Qnil ) {
490
490
  Check_Type( opt_data, T_STRING );
491
- uint16_t length = ( u_int16_t ) RSTRING_LEN( opt_data );
491
+ uint16_t length = ( uint16_t ) RSTRING_LEN( opt_data );
492
492
  allocated_data = alloc_buffer_with_length( length );
493
493
  memcpy( append_back_buffer( allocated_data, length ), RSTRING_PTR( opt_data ), length );
494
494
  data = allocated_data;
@@ -44,6 +44,9 @@ module Trema
44
44
 
45
45
 
46
46
  def maybe_run_switch_manager
47
+ # FIXME
48
+ return if FileTest.exists? File.join( Trema.pid, "switch_manager.pid" )
49
+
47
50
  switch_manager =
48
51
  if @context.switch_manager and @context.apps.values.size > 0
49
52
  last_app = @context.apps.values.last.name
data/ruby/trema/echo.c CHANGED
@@ -61,9 +61,9 @@ echo_init( int argc, VALUE *argv, VALUE self ) {
61
61
  VALUE user_data = rb_hash_aref( options, ID2SYM( rb_intern( "user_data" ) ) );
62
62
  if ( user_data != Qnil ) {
63
63
  Check_Type( user_data, T_STRING );
64
- uint16_t length = ( u_int16_t ) RSTRING_LEN( user_data );
64
+ uint16_t length = ( uint16_t ) RSTRING_LEN( user_data );
65
65
  append_back_buffer( echo, length );
66
- set_length( echo, length );
66
+ set_length( echo, ( uint16_t ) ( sizeof( struct ofp_header ) + length ) );
67
67
  memcpy( ( char * ) echo->data + sizeof( struct ofp_header ), RSTRING_PTR( user_data ), length );
68
68
  }
69
69
  }
data/ruby/trema/error.c CHANGED
@@ -115,7 +115,7 @@ error_init( int argc, VALUE *argv, VALUE self ) {
115
115
  VALUE data = rb_hash_aref( options, ID2SYM( rb_intern( "data" ) ) );
116
116
  if ( data != Qnil ) {
117
117
  Check_Type( data, T_STRING );
118
- uint16_t length = ( u_int16_t ) RSTRING_LEN( data );
118
+ uint16_t length = ( uint16_t ) RSTRING_LEN( data );
119
119
  append_back_buffer( error, length );
120
120
  ( ( struct ofp_header * ) ( error->data ) )->length = htons( ( uint16_t ) ( offsetof( struct ofp_error_msg, data ) + length ) );
121
121
  memcpy( ( char * ) error->data + offsetof( struct ofp_error_msg, data ), RSTRING_PTR( data ), length );
@@ -91,12 +91,12 @@ features_reply_init( VALUE self, VALUE options ) {
91
91
  rb_raise( rb_eArgError, ":transaction_id is a mandatory option" );
92
92
  }
93
93
  }
94
- features_reply->header.xid = htonl( NUM2UINT( tmp ) );
94
+ features_reply->header.xid = htonl( ( uint32_t ) NUM2UINT( tmp ) );
95
95
 
96
96
  features_reply->n_buffers = 0;
97
97
  tmp = rb_hash_aref( options, ID2SYM( rb_intern( "n_buffers" ) ) );
98
98
  if ( tmp != Qnil ) {
99
- features_reply->n_buffers = htonl( NUM2UINT( tmp ) );
99
+ features_reply->n_buffers = htonl( ( uint32_t ) NUM2UINT( tmp ) );
100
100
  }
101
101
 
102
102
  features_reply->n_tables = 1;
@@ -108,13 +108,13 @@ features_reply_init( VALUE self, VALUE options ) {
108
108
  features_reply->capabilities = 0;
109
109
  tmp = rb_hash_aref( options, ID2SYM( rb_intern( "capabilities" ) ) );
110
110
  if ( tmp != Qnil ) {
111
- features_reply->capabilities = htonl( NUM2UINT( tmp ) );
111
+ features_reply->capabilities = htonl( ( uint32_t ) NUM2UINT( tmp ) );
112
112
  }
113
113
 
114
114
  features_reply->actions = htonl( 1 << OFPAT_OUTPUT );
115
115
  tmp = rb_hash_aref( options, ID2SYM( rb_intern( "actions" ) ) );
116
116
  if ( tmp != Qnil ) {
117
- features_reply->actions = htonl( NUM2UINT( tmp ) );
117
+ features_reply->actions = htonl( ( uint32_t ) NUM2UINT( tmp ) );
118
118
  }
119
119
 
120
120
  // TODO: ports
@@ -49,25 +49,62 @@ VALUE cPacketIn;
49
49
  }
50
50
 
51
51
 
52
+ typedef struct rb_packet_in {
53
+ packet_in packet_in;
54
+ buffer *data;
55
+ } rb_packet_in;
56
+
57
+
58
+ static void
59
+ packet_in_free( rb_packet_in *_packet_in ) {
60
+ free_buffer( _packet_in->data );
61
+ xfree( _packet_in );
62
+ }
63
+
64
+
52
65
  static VALUE
53
66
  packet_in_alloc( VALUE klass ) {
54
- packet_in *_packet_in = xmalloc( sizeof( packet_in ) );
55
- return Data_Wrap_Struct( klass, 0, xfree, _packet_in );
67
+ rb_packet_in *_packet_in = xmalloc( sizeof( rb_packet_in ) );
68
+ memset( &_packet_in->packet_in, 0, sizeof( packet_in ) );
69
+ _packet_in->data = alloc_buffer_with_length( 1 );
70
+ parse_packet( _packet_in->data );
71
+ _packet_in->packet_in.data = _packet_in->data;
72
+ return Data_Wrap_Struct( klass, 0, packet_in_free, _packet_in );
73
+ }
74
+
75
+
76
+ static VALUE
77
+ packet_in_init_copy( VALUE self, VALUE orig ) {
78
+ if ( self == orig ) {
79
+ return self;
80
+ }
81
+
82
+ rb_packet_in *self_pin, *orig_pin;
83
+ Data_Get_Struct( self, rb_packet_in, self_pin );
84
+ Data_Get_Struct( self, rb_packet_in, orig_pin );
85
+
86
+ memcpy( &self_pin->packet_in, &orig_pin->packet_in, sizeof( packet_in ) );
87
+ free_buffer( self_pin->data );
88
+ self_pin->data = duplicate_buffer( orig_pin->data );
89
+ parse_packet( self_pin->data );
90
+ self_pin->packet_in.data = self_pin->data;
91
+
92
+ return self;
56
93
  }
57
94
 
58
95
 
59
96
  static packet_in *
60
97
  get_packet_in( VALUE self ) {
61
- packet_in *cpacket;
62
- Data_Get_Struct( self, packet_in, cpacket );
63
- return cpacket;
98
+ rb_packet_in *cpacket;
99
+ Data_Get_Struct( self, rb_packet_in, cpacket );
100
+ return &cpacket->packet_in;
64
101
  }
65
102
 
66
103
 
67
104
  static packet_info *
68
105
  get_packet_in_info( VALUE self ) {
69
- packet_in *cpacket;
70
- Data_Get_Struct( self, packet_in, cpacket );
106
+ rb_packet_in *cpacket;
107
+ Data_Get_Struct( self, rb_packet_in, cpacket );
71
108
  return ( packet_info * ) cpacket->data->user_data;
72
109
  }
73
110
 
@@ -1046,6 +1083,8 @@ Init_packet_in() {
1046
1083
  cPacketIn = rb_define_class_under( mTrema, "PacketIn", rb_cObject );
1047
1084
  rb_define_alloc_func( cPacketIn, packet_in_alloc );
1048
1085
 
1086
+ rb_define_method( cPacketIn, "initialize_copy", packet_in_init_copy, 1 );
1087
+
1049
1088
  rb_define_method( cPacketIn, "datapath_id", packet_in_datapath_id, 0 );
1050
1089
  rb_define_method( cPacketIn, "transaction_id", packet_in_transaction_id, 0 );
1051
1090
  rb_define_method( cPacketIn, "buffer_id", packet_in_buffer_id, 0 );
@@ -1142,9 +1181,13 @@ handle_packet_in( uint64_t datapath_id, packet_in message ) {
1142
1181
  }
1143
1182
 
1144
1183
  VALUE r_message = rb_funcall( cPacketIn, rb_intern( "new" ), 0 );
1145
- packet_in *tmp = NULL;
1146
- Data_Get_Struct( r_message, packet_in, tmp );
1147
- memcpy( tmp, &message, sizeof( packet_in ) );
1184
+ rb_packet_in *tmp = NULL;
1185
+ Data_Get_Struct( r_message, rb_packet_in, tmp );
1186
+ memcpy( &tmp->packet_in, &message, sizeof( packet_in ) );
1187
+ free_buffer( tmp->data );
1188
+ tmp->data = duplicate_buffer( message.data );
1189
+ parse_packet( tmp->data );
1190
+ tmp->packet_in.data = tmp->data;
1148
1191
 
1149
1192
  rb_funcall( controller, rb_intern( "packet_in" ), 2, ULL2NUM( datapath_id ), r_message );
1150
1193
  }
@@ -37,7 +37,7 @@ get_xid( VALUE self ) {
37
37
 
38
38
  void
39
39
  set_length( const buffer *openflow_message, uint16_t length ) {
40
- ( ( struct ofp_header * ) ( openflow_message->data ) )->length = htons( ( uint16_t ) ( sizeof( struct ofp_header ) + length ) );
40
+ ( ( struct ofp_header * ) ( openflow_message->data ) )->length = htons( length );
41
41
  }
42
42
 
43
43
 
data/ruby/trema/util.rb CHANGED
@@ -75,6 +75,11 @@ EOF
75
75
  end
76
76
 
77
77
 
78
+ def running?
79
+ FileTest.exists? Trema::DSL::Context::PATH
80
+ end
81
+
82
+
78
83
  def cleanup_current_session
79
84
  begin
80
85
  cleanup Trema::DSL::Context.load_current
data/ruby/trema/vendor.c CHANGED
@@ -110,7 +110,7 @@ vendor_init( int argc, VALUE *argv, VALUE self ) {
110
110
  Check_Type( tmp, T_ARRAY );
111
111
  uint16_t length = ( uint16_t ) RARRAY_LEN( tmp );
112
112
  append_back_buffer( vendor, length );
113
- set_length( vendor, length );
113
+ set_length( vendor, ( uint16_t ) ( sizeof( struct ofp_vendor_header ) + length ) );
114
114
  uint8_t *data = ( uint8_t * ) ( ( char * ) vendor->data + sizeof( struct ofp_vendor_header ) );
115
115
  int i;
116
116
  for ( i = 0; i < length; i++ ) {
@@ -165,7 +165,7 @@ vendor_data( VALUE self ) {
165
165
  if ( length > 0 ) {
166
166
  VALUE data_array = rb_ary_new2( length );
167
167
  uint8_t *data = ( uint8_t * ) ( ( char * ) vendor->data + sizeof( struct ofp_vendor_header ) );
168
- int i;
168
+ long i;
169
169
  for ( i = 0; i < length; i++ ) {
170
170
  rb_ary_push( data_array, INT2FIX( data[ i ] ) );
171
171
  }
@@ -205,8 +205,13 @@ handle_vendor(
205
205
  rb_hash_aset( attributes, ID2SYM( rb_intern( "transaction_id" ) ), UINT2NUM( transaction_id ) );
206
206
  rb_hash_aset( attributes, ID2SYM( rb_intern( "vendor" ) ), UINT2NUM( vendor ) );
207
207
 
208
- if ( data->length ) {
209
- rb_hash_aset( attributes, ID2SYM( rb_intern( "data" ) ), rb_str_new( data->data, ( long ) data->length ) );
208
+ if ( data != NULL && data->length > 0 ) {
209
+ VALUE data_array = rb_ary_new2( ( long ) data->length );
210
+ long i;
211
+ for ( i = 0; i < data->length; i++ ) {
212
+ rb_ary_push( data_array, INT2FIX( ( ( uint8_t * ) data->data)[ i ] ) );
213
+ }
214
+ rb_hash_aset( attributes, ID2SYM( rb_intern( "data" ) ), data_array );
210
215
  }
211
216
  VALUE vendor_r = rb_funcall( cVendor, rb_intern( "new" ), 1, attributes );
212
217
  rb_funcall( controller, rb_intern( "vendor" ), 2, ULL2NUM( datapath_id ), vendor_r );
@@ -17,7 +17,7 @@
17
17
 
18
18
 
19
19
  module Trema
20
- VERSION = "0.2.6"
20
+ VERSION = "0.2.7"
21
21
  end
22
22
 
23
23
 
@@ -2752,7 +2752,7 @@ validate_port_stats_reply( const buffer *message ) {
2752
2752
  assert( message != NULL );
2753
2753
 
2754
2754
  ret = validate_header( message, OFPT_STATS_REPLY,
2755
- offsetof( struct ofp_stats_reply, body ) + sizeof( struct ofp_port_stats ),
2755
+ offsetof( struct ofp_stats_reply, body ),
2756
2756
  UINT16_MAX );
2757
2757
  if ( ret < 0 ) {
2758
2758
  return ret;
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: 27
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 6
10
- version: 0.2.6
9
+ - 7
10
+ version: 0.2.7
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-26 00:00:00 Z
18
+ date: 2012-12-27 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  prerelease: false