trema/trema-edge

View on GitHub
ruby/trema/messages.c

Summary

Maintainability
Test Coverage
/*
 * Copyright (C) 2008-2013 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.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * 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 "hash-util.h"
#include "messages/hello.h"
#include "messages/echo-request.h"
#include "messages/features-request.h"
#include "messages/get-config-request.h"
#include "messages/set-config.h"
#include "messages/flow-mod.h"
#include "messages/group-mod.h"
#include "messages/flow-multipart-request.h"
#include "messages/desc-multipart-request.h"
#include "messages/aggregate-multipart-request.h"
#include "messages/table-multipart-request.h"
#include "messages/port-multipart-request.h"
#include "messages/port-desc-multipart-request.h"
#include "messages/table-features-multipart-request.h"
#include "messages/group-multipart-request.h"
#include "messages/group-desc-multipart-request.h"
#include "messages/group-features-multipart-request.h"
#include "messages/port-desc-multipart-request.h"
#include "messages/queue-multipart-request.h"
#include "messages/meter-multipart-request.h"
#include "messages/meter-config-multipart-request.h"
#include "messages/meter-features-multipart-request.h"
#include "messages/experimenter-multipart-request.h"
#include "messages/barrier-request.h"


extern VALUE mTrema;
VALUE mMessages;


static uint64_t
datapath_id( VALUE options ) {
  VALUE r_dpid = HASH_REF( options, datapath_id );
  return NUM2ULL( r_dpid );
}


#define PACK_MSG( type, self, options )      \
  do {                                       \
    buffer *msg = pack_##type( options );    \
    send_msg( datapath_id( options ), msg ); \
    return self;                             \
  } while( 0 )


static void
send_msg( uint64_t datapath_id, buffer *msg ) {
  send_openflow_message( datapath_id, msg );
  free_buffer( msg );
}


static VALUE
next_xid( VALUE self ) {
  UNUSED( self );
  return UINT2NUM( get_transaction_id() );
}


static VALUE
pack_hello_msg( VALUE self, VALUE options ) {
  PACK_MSG( hello, self, options );
}


static VALUE
pack_echo_request_msg( VALUE self, VALUE options ) {
  PACK_MSG( echo_request, self, options );
}


static VALUE
pack_features_request_msg( VALUE self, VALUE options ) {
  PACK_MSG( features_request, self, options );
}


static VALUE
pack_get_config_request_msg( VALUE self, VALUE options ) {
  PACK_MSG( get_config_request, self, options );
}


static VALUE
pack_set_config_msg( VALUE self, VALUE options ) {
  PACK_MSG( set_config, self, options );
}


static VALUE
pack_flow_mod_msg( VALUE self, VALUE options ) {
  PACK_MSG( flow_mod, self, options );
}


static VALUE
pack_group_mod_msg( VALUE self, VALUE options ) {
  PACK_MSG( group_mod, self, options );
}


static VALUE
pack_flow_multipart_request_msg( VALUE self, VALUE options ) {
  PACK_MSG( flow_multipart_request, self, options );
}


static VALUE
pack_desc_multipart_request_msg( VALUE self, VALUE options ) {
  PACK_MSG( desc_multipart_request, self, options );
}


static VALUE
pack_aggregate_multipart_request_msg( VALUE self, VALUE options ) {
  PACK_MSG( aggregate_multipart_request, self, options );
}


static VALUE
pack_table_multipart_request_msg( VALUE self, VALUE options ) {
  PACK_MSG( table_multipart_request, self, options );
}


static VALUE
pack_port_multipart_request_msg( VALUE self, VALUE options ) {
  PACK_MSG( port_multipart_request, self, options );
}


static VALUE
pack_port_desc_multipart_request_msg( VALUE self, VALUE options ) {
  PACK_MSG( port_desc_multipart_request, self, options );
}


static VALUE
pack_table_features_multipart_request_msg( VALUE self, VALUE options ) {
  PACK_MSG( table_features_multipart_request, self, options );
}


static VALUE
pack_group_multipart_request_msg( VALUE self, VALUE options ) {
  PACK_MSG( group_multipart_request, self, options );
}


static VALUE
pack_group_desc_multipart_request_msg( VALUE self, VALUE options ) {
  PACK_MSG( group_desc_multipart_request, self, options );
}


static VALUE
pack_group_features_multipart_request_msg( VALUE self, VALUE options ) {
  PACK_MSG( group_features_multipart_request, self, options );
}


static VALUE
pack_queue_multipart_request_msg( VALUE self, VALUE options ) {
  PACK_MSG( queue_multipart_request, self, options );
}


static VALUE
pack_meter_multipart_request_msg( VALUE self, VALUE options ) {
  PACK_MSG( meter_multipart_request, self, options );
}


static VALUE
pack_meter_config_multipart_request_msg( VALUE self, VALUE options ) {
  PACK_MSG( meter_config_multipart_request, self, options );
}


static VALUE
pack_meter_features_multipart_request_msg( VALUE self, VALUE options ) {
  PACK_MSG( meter_features_multipart_request, self, options );
}


static VALUE
pack_experimenter_multipart_request_msg( VALUE self, VALUE options ) {
  PACK_MSG( experimenter_multipart_request, self, options );
}


static VALUE
pack_barrier_request_msg( VALUE self, VALUE options ) {
  PACK_MSG( barrier_request, self, options );
}


void
Init_messages( void ) {
  mMessages = rb_define_module_under( mTrema, "Messages" );
  rb_define_module_function( mMessages, "next_xid", next_xid, 0 );
  rb_define_module_function( mMessages, "pack_hello_msg", pack_hello_msg, 1 );
  rb_define_module_function( mMessages, "pack_echo_request_msg", pack_echo_request_msg, 1 );
  rb_define_module_function( mMessages, "pack_features_request_msg", pack_features_request_msg, 1 );
  rb_define_module_function( mMessages, "pack_get_config_request_msg", pack_get_config_request_msg, 1 );
  rb_define_module_function( mMessages, "pack_set_config_msg", pack_set_config_msg, 1 );
  rb_define_module_function( mMessages, "pack_flow_mod_msg", pack_flow_mod_msg, 1 );
  rb_define_module_function( mMessages, "pack_group_mod_msg", pack_group_mod_msg, 1 );
  rb_define_module_function( mMessages, "pack_flow_multipart_request_msg", pack_flow_multipart_request_msg, 1 );
  rb_define_module_function( mMessages, "pack_desc_multipart_request_msg", pack_desc_multipart_request_msg, 1 );
  rb_define_module_function( mMessages, "pack_aggregate_multipart_request_msg", pack_aggregate_multipart_request_msg, 1 );
  rb_define_module_function( mMessages, "pack_table_multipart_request_msg", pack_table_multipart_request_msg, 1 );
  rb_define_module_function( mMessages, "pack_port_multipart_request_msg", pack_port_multipart_request_msg, 1 );
  rb_define_module_function( mMessages, "pack_port_desc_multipart_request_msg", pack_port_desc_multipart_request_msg, 1 );
  rb_define_module_function( mMessages, "pack_table_features_multipart_request_msg", pack_table_features_multipart_request_msg, 1 );
  rb_define_module_function( mMessages, "pack_group_multipart_request_msg", pack_group_multipart_request_msg, 1 );
  rb_define_module_function( mMessages, "pack_group_desc_multipart_request_msg", pack_group_desc_multipart_request_msg, 1 );
  rb_define_module_function( mMessages, "pack_group_features_multipart_request_msg", pack_group_features_multipart_request_msg, 1 );
  rb_define_module_function( mMessages, "pack_queue_multipart_request_msg", pack_queue_multipart_request_msg, 1 );
  rb_define_module_function( mMessages, "pack_meter_multipart_request_msg", pack_meter_multipart_request_msg, 1 );
  rb_define_module_function( mMessages, "pack_meter_config_multipart_request_msg", pack_meter_config_multipart_request_msg, 1 );
  rb_define_module_function( mMessages, "pack_meter_features_multipart_request_msg", pack_meter_features_multipart_request_msg, 1 );
  rb_define_module_function( mMessages, "pack_experimenter_multipart_request_msg", pack_experimenter_multipart_request_msg, 1 );
  rb_define_module_function( mMessages, "pack_barrier_request_msg", pack_barrier_request_msg, 1 );

  rb_require( "trema/messages" );
}


/*
 * Local variables:
 * c-basic-offset: 2
 * indent-tabs-mode: nil
 * End:
 */