ruby/trema/barrier-request.c in trema-0.2.5 vs ruby/trema/barrier-request.c in trema-0.2.6
- old
+ new
@@ -1,8 +1,6 @@
/*
- * Author: Nick Karanatsios <nickkaranatsios@gmail.com>
- *
* Copyright (C) 2008-2012 NEC Corporation
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2, as
* published by the Free Software Foundation.
@@ -16,12 +14,11 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#include "trema.h"
-#include "ruby.h"
+#include "trema-ruby-utils.h"
extern VALUE mTrema;
VALUE cBarrierRequest;
@@ -35,46 +32,77 @@
/*
* A barrier request message could be sent to ensure that an operation
* completed successfully signaled with the reception of a barrier reply message.
*
- * @overload initialize(options={})
- * @example
+ * @overload initialize()
+ * @example
* BarrierRequest.new
- * BarrierRequest.new( :transaction_id => 123 )
*
+ * @overload initialize(transaction_id)
+ * @example
+ * BarrierRequest.new( 123 )
+ * @param [Integer] transaction_id
+ * An unsigned 32-bit integer number associated with this message.
+ *
+ * @overload initialize(options)
+ * @example
+ * BarrierRequest.new( :xid => 123 )
+ * BarrierRequest.new( :transaction_id => 123 )
* @param [Hash] options
* the options to create a message with.
- *
+ * @option options [Number] :xid an alias to transaction_id.
* @option options [Number] :transaction_id
- * an unsigned 32-bit integer number associated with this message.
+ * An unsigned 32-bit integer number associated with this message.
* If not specified, an auto-generated value is set.
*
- * @raise [ArgumentError] if transaction_id is not an unsigned 32-bit integer.
- * @raise [TypeError] if options is not a hash.
- *
- * @return [BarrierRequest]
- * an object that encapsulates the +OPFT_BARRIER_REQUEST+ OpenFlow message.
+ * @raise [ArgumentError] if transaction ID is not an unsigned 32-bit integer.
+ * @raise [TypeError] if argument is not a Integer or a Hash.
+ * @return [BarrierRequest]
+ * an object that encapsulates the +OPFT_BARRIER_REQUEST+ OpenFlow message.
*/
static VALUE
barrier_request_init( int argc, VALUE *argv, VALUE self ) {
- buffer *barrier_request;
+ buffer *barrier_request = NULL;
Data_Get_Struct( self, buffer, barrier_request );
- uint32_t xid = get_transaction_id();
- VALUE options;
+ VALUE options = Qnil;
- if ( rb_scan_args( argc, argv, "01", &options ) == 1 ) {
- Check_Type( options, T_HASH );
- VALUE xid_ruby;
- if ( ( xid_ruby = rb_hash_aref( options, ID2SYM( rb_intern( "transaction_id" ) ) ) ) != Qnil ) {
- if ( rb_funcall( xid_ruby, rb_intern( "unsigned_32bit?" ), 0 ) == Qfalse ) {
- rb_raise( rb_eArgError, "Transaction ID must be an unsigned 32-bit integer" );
+ if ( rb_scan_args( argc, argv, "01", &options ) == 0 ) {
+ set_xid( barrier_request, get_transaction_id() );
+ }
+ else {
+ if ( options == Qnil ) {
+ set_xid( barrier_request, get_transaction_id() );
+ }
+ else if ( rb_obj_is_kind_of( options, rb_cInteger ) == Qtrue ) {
+ validate_xid( options );
+ set_xid( barrier_request, ( uint32_t ) NUM2UINT( options ) );
+ }
+ else {
+ Check_Type( options, T_HASH );
+ VALUE tmp = Qnil;
+ VALUE xid = Qnil;
+
+ tmp = rb_hash_aref( options, ID2SYM( rb_intern( "transaction_id" ) ) );
+ if ( tmp != Qnil ) {
+ xid = tmp;
}
- xid = ( uint32_t ) NUM2UINT( xid_ruby );
+ tmp = rb_hash_aref( options, ID2SYM( rb_intern( "xid" ) ) );
+ if ( tmp != Qnil ) {
+ xid = tmp;
+ }
+
+ if ( xid != Qnil ) {
+ validate_xid( xid );
+ set_xid( barrier_request, ( uint32_t ) NUM2UINT( xid ) );
+ }
+ else {
+ set_xid( barrier_request, get_transaction_id() );
+ }
}
}
- ( ( struct ofp_header * ) ( barrier_request->data ) )->xid = htonl( xid );
+
return self;
}
/*
@@ -82,13 +110,10 @@
*
* @return [Number] the value of transaction id.
*/
static VALUE
barrier_request_transaction_id( VALUE self ) {
- buffer *barrier_request;
- Data_Get_Struct( self, buffer, barrier_request );
- uint32_t xid = ntohl( ( ( struct ofp_header * ) ( barrier_request->data ) )->xid );
- return UINT2NUM( xid );
+ return get_xid( self );
}
void
Init_barrier_request() {