trema 0.2.2.1 → 0.2.3
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.
- data/.gitmodules +3 -0
- data/.travis.yml +13 -0
- data/.yardopts +4 -0
- data/Gemfile +2 -3
- data/README.md +43 -97
- data/Rakefile +60 -4
- data/Rantfile +11 -10
- data/cruise.rb +4 -6
- data/features/example.packetin_filter_config.feature +10 -10
- data/features/example.switch_monitor.feature +14 -2
- data/features/step_definitions/kill_steps.rb +2 -2
- data/features/step_definitions/{off_steps.rb → killall_steps.rb} +2 -2
- data/features/step_definitions/misc_steps.rb +1 -1
- data/features/step_definitions/up_steps.rb +30 -0
- data/features/trema.feature +1 -0
- data/features/trema.run.feature +1 -0
- data/locale/README.ja.md +19 -0
- data/locale/ja/yard.po +3762 -0
- data/locale/yard.pot +3740 -0
- data/ruby/extconf.rb +4 -1
- data/ruby/trema/action-common.c +3 -17
- data/ruby/trema/action-common.h +3 -7
- data/ruby/trema/action.rb +33 -0
- data/ruby/trema/app.rb +1 -1
- data/ruby/trema/barrier-request.c +1 -0
- data/ruby/trema/command/run.rb +13 -9
- data/ruby/trema/command/usage.rb +1 -0
- data/ruby/trema/command/version.rb +1 -1
- data/ruby/trema/controller.c +133 -50
- data/ruby/trema/controller.rb +2 -2
- data/ruby/trema/desc-stats-reply.rb +77 -0
- data/ruby/trema/dsl/configuration.rb +3 -14
- data/ruby/trema/dsl/rswitch.rb +47 -0
- data/ruby/trema/dsl/runner.rb +4 -1
- data/ruby/trema/dsl/syntax.rb +11 -8
- data/ruby/trema/echo-reply.c +59 -45
- data/ruby/trema/echo-reply.h +1 -3
- data/ruby/trema/echo-request.c +49 -71
- data/ruby/trema/echo-request.h +0 -2
- data/ruby/trema/echo.c +99 -0
- data/ruby/trema/{action-enqueue.h → echo.h} +6 -7
- data/ruby/trema/enqueue.rb +87 -0
- data/ruby/trema/error.c +109 -104
- data/ruby/trema/error.h +0 -2
- data/ruby/trema/features-reply.c +89 -35
- data/ruby/trema/features-reply.h +0 -6
- data/ruby/trema/features-request.c +63 -37
- data/ruby/trema/features-request.h +0 -2
- data/ruby/trema/flow-mod.c +149 -0
- data/ruby/trema/{action-output.h → flow-mod.h} +6 -6
- data/ruby/trema/get-config-request.c +1 -0
- data/ruby/trema/hardware-switch.rb +88 -0
- data/ruby/trema/hello.c +55 -31
- data/ruby/trema/hello.h +0 -2
- data/ruby/trema/ip.rb +12 -2
- data/ruby/trema/logger.rb +29 -0
- data/ruby/trema/mac.rb +57 -36
- data/ruby/trema/match.c +7 -9
- data/ruby/trema/monkey-patch/integer/ranges.rb +0 -2
- data/ruby/trema/network-component.rb +1 -1
- data/ruby/trema/open-vswitch.rb +2 -2
- data/ruby/trema/openflow-switch.rb +3 -54
- data/ruby/trema/{packet_in.c → packet-in.c} +262 -175
- data/ruby/trema/{packet_in.h → packet-in.h} +0 -2
- data/ruby/trema/packet-queue.rb +4 -3
- data/ruby/trema/port-mod.c +8 -9
- data/ruby/trema/port-status-add.rb +60 -0
- data/ruby/trema/port-status-delete.rb +60 -0
- data/ruby/trema/port-status-modify.rb +60 -0
- data/ruby/trema/port-status.c +48 -15
- data/ruby/trema/port-status.h +6 -8
- data/ruby/trema/port.c +63 -8
- data/ruby/trema/queue-get-config-request.c +1 -0
- data/ruby/trema/ruby-switch.rb +62 -0
- data/ruby/trema/send-out-port.rb +97 -0
- data/ruby/trema/set-config.c +1 -0
- data/ruby/trema/set-eth-addr.rb +45 -0
- data/ruby/trema/set-eth-dst-addr.rb +54 -0
- data/ruby/trema/set-eth-src-addr.rb +54 -0
- data/ruby/trema/set-ip-addr.rb +47 -0
- data/ruby/trema/set-ip-dst-addr.rb +53 -0
- data/ruby/trema/set-ip-src-addr.rb +52 -0
- data/ruby/trema/set-ip-tos.rb +63 -0
- data/ruby/trema/set-transport-dst-port.rb +53 -0
- data/ruby/trema/set-transport-port.rb +52 -0
- data/ruby/trema/set-transport-src-port.rb +54 -0
- data/ruby/trema/set-vlan-priority.rb +65 -0
- data/ruby/trema/set-vlan-vid.rb +64 -0
- data/ruby/trema/shell/down.rb +1 -1
- data/ruby/trema/shell/link.rb +4 -4
- data/ruby/trema/shell/run.rb +8 -6
- data/ruby/trema/shell/up.rb +3 -3
- data/ruby/trema/stats-reply.c +27 -2
- data/ruby/trema/stats-request.c +64 -23
- data/ruby/trema/strip-vlan-header.rb +41 -0
- data/ruby/trema/switch.c +196 -0
- data/ruby/trema/{action-vendor.h → switch.h} +5 -7
- data/ruby/trema/switch.rb +28 -9
- data/ruby/trema/trema-ruby-utils.c +66 -0
- data/ruby/trema/{action-set-dl-src.h → trema-ruby-utils.h} +9 -11
- data/ruby/trema/trema.c +61 -61
- data/ruby/trema/vendor-action.rb +73 -0
- data/ruby/trema/vendor.c +121 -52
- data/ruby/trema/vendor.h +6 -10
- data/ruby/trema/version.rb +1 -1
- data/spec/spec_helper.rb +1 -1
- data/spec/support/action.rb +52 -0
- data/spec/support/mandatory-option.rb +56 -0
- data/spec/support/openflow-message.rb +91 -7
- data/spec/support/port-status.rb +38 -0
- data/spec/trema/controller_spec.rb +0 -26
- data/spec/trema/dsl/configuration_spec.rb +3 -3
- data/spec/trema/dsl/runner_spec.rb +12 -32
- data/spec/trema/dsl/syntax_spec.rb +2 -11
- data/spec/trema/echo-reply_spec.rb +49 -14
- data/spec/trema/echo-request_spec.rb +86 -34
- data/spec/trema/enqueue_spec.rb +76 -0
- data/spec/trema/error_spec.rb +43 -58
- data/spec/trema/features-reply_spec.rb +58 -24
- data/spec/trema/features-request_spec.rb +54 -28
- data/spec/trema/flow-mod_spec.rb +99 -0
- data/spec/trema/{openflow-switch_spec.rb → hardware-switch_spec.rb} +3 -3
- data/spec/trema/hello_spec.rb +28 -14
- data/spec/trema/ip_spec.rb +54 -0
- data/spec/trema/mac_spec.rb +49 -64
- data/spec/trema/match_spec.rb +1 -1
- data/spec/trema/open-vswitch_spec.rb +7 -7
- data/spec/trema/packet-in_spec.rb +73 -16
- data/spec/trema/port-status-add_spec.rb +32 -0
- data/spec/trema/port-status-delete_spec.rb +32 -0
- data/spec/trema/port-status-modify_spec.rb +71 -0
- data/spec/trema/port-status_spec.rb +5 -76
- data/spec/trema/{action-output_spec.rb → send-out-port_spec.rb} +20 -47
- data/spec/trema/set-eth-dst-addr_spec.rb +75 -0
- data/spec/trema/set-eth-src-addr_spec.rb +72 -0
- data/spec/trema/set-ip-dst-addr_spec.rb +58 -0
- data/spec/trema/set-ip-src-addr_spec.rb +58 -0
- data/spec/trema/set-ip-tos_spec.rb +65 -0
- data/spec/trema/set-transport-dst-port_spec.rb +65 -0
- data/spec/trema/set-transport-src-port_spec.rb +65 -0
- data/spec/trema/set-vlan-priority_spec.rb +65 -0
- data/spec/trema/set-vlan-vid_spec.rb +65 -0
- data/spec/trema/shell/vhost_spec.rb +4 -1
- data/spec/trema/shell/vswitch_spec.rb +11 -11
- data/spec/trema/stats-reply_spec.rb +59 -13
- data/spec/trema/stats-request_spec.rb +6 -0
- data/spec/trema/{action-strip-vlan_spec.rb → strip-vlan-header_spec.rb} +3 -17
- data/spec/trema/switch-daemon_spec.rb +39 -0
- data/spec/trema/vendor-action_spec.rb +81 -0
- data/spec/trema/vendor_spec.rb +76 -0
- data/spec/trema_spec.rb +56 -0
- data/src/examples/dumper/dumper.c +0 -8
- data/src/examples/dumper/dumper.rb +52 -52
- data/src/examples/hello_trema/hello_trema.c +0 -2
- data/src/examples/learning_switch/learning-switch.rb +3 -3
- data/src/examples/multi_learning_switch/multi-learning-switch.rb +3 -3
- data/src/examples/openflow_message/features-request.rb +3 -3
- data/src/examples/packetin_filter_config/utils.c +4 -4
- data/src/examples/repeater_hub/repeater-hub.rb +3 -3
- data/src/examples/switch_info/switch_info.rb +2 -2
- data/src/examples/switch_monitor/switch_monitor.c +1 -1
- data/src/examples/traffic_monitor/traffic-monitor.rb +3 -3
- data/src/lib/arp.h +4 -1
- data/src/lib/chibach.c +391 -0
- data/src/lib/chibach.h +71 -0
- data/src/lib/chibach_private.c +170 -0
- data/src/lib/chibach_private.h +52 -0
- data/src/lib/ether.c +2 -1
- data/src/lib/ether.h +0 -1
- data/src/lib/ipv4.h +13 -14
- data/{ruby/trema/action-set-nw-src.h → src/lib/ipv6.h} +13 -9
- data/src/lib/log.c +161 -58
- data/src/lib/log.h +11 -16
- data/src/lib/messenger.c +36 -1
- data/src/lib/messenger.h +1 -0
- data/src/lib/openflow_application_interface.c +128 -28
- data/src/lib/openflow_application_interface.h +31 -6
- data/src/lib/openflow_message.c +2 -1
- data/src/lib/openflow_service_interface.h +1 -0
- data/src/lib/openflow_switch_interface.c +1380 -0
- data/src/lib/openflow_switch_interface.h +264 -0
- data/src/lib/packet_info.c +94 -11
- data/src/lib/packet_info.h +22 -3
- data/src/lib/packet_parser.c +38 -2
- data/src/lib/secure_channel.c +498 -0
- data/{ruby/trema/vendor-request.h → src/lib/secure_channel.h} +11 -10
- data/src/lib/tcp.h +0 -3
- data/src/lib/trema.c +38 -5
- data/{ruby/trema/action-set-nw-dst.h → src/lib/trema.hpp} +17 -8
- data/src/lib/trema_wrapper.c +5 -0
- data/src/lib/trema_wrapper.h +4 -0
- data/src/lib/utility.c +93 -4
- data/src/lib/utility.h +1 -0
- data/src/lib/wrapper.c +30 -7
- data/src/lib/wrapper.h +2 -0
- data/src/switch_manager/ofpmsg_recv.c +44 -30
- data/src/switch_manager/ofpmsg_send.c +40 -1
- data/src/switch_manager/ofpmsg_send.h +2 -0
- data/src/switch_manager/switch.c +153 -8
- data/src/switch_manager/switch.h +1 -0
- data/src/switch_manager/switchinfo.h +5 -0
- data/src/tremashark/README +2 -2
- data/src/tremashark/plugin/packet-trema/packet-trema.c +1 -0
- data/trema +1 -1
- data/unittests/lib/log_test.c +158 -34
- data/unittests/lib/openflow_application_interface_test.c +252 -69
- data/unittests/lib/openflow_message_test.c +3 -1
- data/unittests/lib/packet_parser_test.c +60 -15
- data/unittests/lib/test_packets/icmp6_echo_rep.cap +0 -0
- data/unittests/lib/test_packets/icmp6_echo_req.cap +0 -0
- data/unittests/lib/trema_test.c +2 -0
- data/unittests/lib/utility_test.c +65 -2
- data/unittests/lib/wrapper_test.c +29 -0
- data/vendor/{README → README.md} +2 -12
- data/vendor/packet-openflow.diff +13 -0
- metadata +86 -53
- data/GPL2 +0 -339
- data/ruby/trema/action-enqueue.c +0 -161
- data/ruby/trema/action-output.c +0 -169
- data/ruby/trema/action-set-dl-dst.c +0 -131
- data/ruby/trema/action-set-dl-dst.h +0 -44
- data/ruby/trema/action-set-dl-src.c +0 -131
- data/ruby/trema/action-set-nw-dst.c +0 -135
- data/ruby/trema/action-set-nw-src.c +0 -140
- data/ruby/trema/action-set-nw-tos.c +0 -124
- data/ruby/trema/action-set-nw-tos.h +0 -42
- data/ruby/trema/action-set-tp-dst.c +0 -122
- data/ruby/trema/action-set-tp-dst.h +0 -42
- data/ruby/trema/action-set-tp-src.c +0 -124
- data/ruby/trema/action-set-tp-src.h +0 -42
- data/ruby/trema/action-set-vlan-pcp.c +0 -128
- data/ruby/trema/action-set-vlan-pcp.h +0 -42
- data/ruby/trema/action-set-vlan-vid.c +0 -125
- data/ruby/trema/action-set-vlan-vid.h +0 -42
- data/ruby/trema/action-strip-vlan.c +0 -81
- data/ruby/trema/action-strip-vlan.h +0 -42
- data/ruby/trema/action-vendor.c +0 -121
- data/ruby/trema/vendor-request.c +0 -193
- data/spec/trema/action-enqueue_spec.rb +0 -100
- data/spec/trema/action-set-dl-dst_spec.rb +0 -95
- data/spec/trema/action-set-dl-src_spec.rb +0 -92
- data/spec/trema/action-set-nw-dst_spec.rb +0 -96
- data/spec/trema/action-set-nw-src_spec.rb +0 -97
- data/spec/trema/action-set-nw-tos_spec.rb +0 -88
- data/spec/trema/action-set-tp-dst_spec.rb +0 -88
- data/spec/trema/action-set-tp-src_spec.rb +0 -88
- data/spec/trema/action-set-vlan-pcp_spec.rb +0 -91
- data/spec/trema/action-set-vlan-vid_spec.rb +0 -91
- data/spec/trema/action-vendor_spec.rb +0 -90
- data/spec/trema/vendor-request_spec.rb +0 -79
data/ruby/trema/echo-request.h
CHANGED
data/ruby/trema/echo.c
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2008-2012 NEC Corporation
|
|
3
|
+
*
|
|
4
|
+
* This program is free software; you can redistribute it and/or modify
|
|
5
|
+
* it under the terms of the GNU General Public License, version 2, as
|
|
6
|
+
* published by the Free Software Foundation.
|
|
7
|
+
*
|
|
8
|
+
* This program is distributed in the hope that it will be useful,
|
|
9
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
10
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
11
|
+
* GNU General Public License for more details.
|
|
12
|
+
*
|
|
13
|
+
* You should have received a copy of the GNU General Public License along
|
|
14
|
+
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
15
|
+
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
#include "ruby.h"
|
|
20
|
+
#include "trema-ruby-utils.h"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
VALUE
|
|
24
|
+
echo_init( int argc, VALUE *argv, VALUE self ) {
|
|
25
|
+
buffer *echo = NULL;
|
|
26
|
+
Data_Get_Struct( self, buffer, echo );
|
|
27
|
+
VALUE options = Qnil;
|
|
28
|
+
|
|
29
|
+
if ( rb_scan_args( argc, argv, "01", &options ) == 0 ) {
|
|
30
|
+
set_xid( echo, get_transaction_id() );
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
if ( options == Qnil ) {
|
|
34
|
+
set_xid( echo, get_transaction_id() );
|
|
35
|
+
}
|
|
36
|
+
else if ( rb_obj_is_kind_of( options, rb_cInteger ) == Qtrue ) {
|
|
37
|
+
validate_xid( options );
|
|
38
|
+
set_xid( echo, ( uint32_t ) NUM2UINT( options ) );
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
Check_Type( options, T_HASH );
|
|
42
|
+
VALUE tmp = Qnil;
|
|
43
|
+
VALUE xid = Qnil;
|
|
44
|
+
|
|
45
|
+
tmp = rb_hash_aref( options, ID2SYM( rb_intern( "transaction_id" ) ) );
|
|
46
|
+
if ( tmp != Qnil ) {
|
|
47
|
+
xid = tmp;
|
|
48
|
+
}
|
|
49
|
+
tmp = rb_hash_aref( options, ID2SYM( rb_intern( "xid" ) ) );
|
|
50
|
+
if ( tmp != Qnil ) {
|
|
51
|
+
xid = tmp;
|
|
52
|
+
}
|
|
53
|
+
if ( xid != Qnil ) {
|
|
54
|
+
validate_xid( xid );
|
|
55
|
+
set_xid( echo, ( uint32_t ) NUM2UINT( xid ) );
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
set_xid( echo, get_transaction_id() );
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
VALUE user_data = rb_hash_aref( options, ID2SYM( rb_intern( "user_data" ) ) );
|
|
62
|
+
if ( user_data != Qnil ) {
|
|
63
|
+
Check_Type( user_data, T_STRING );
|
|
64
|
+
uint16_t length = ( u_int16_t ) RSTRING_LEN( user_data );
|
|
65
|
+
append_back_buffer( echo, length );
|
|
66
|
+
set_length( echo, length );
|
|
67
|
+
memcpy( ( char * ) echo->data + sizeof( struct ofp_header ), RSTRING_PTR( user_data ), length );
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return self;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
VALUE
|
|
77
|
+
echo_transaction_id( VALUE self ) {
|
|
78
|
+
return get_xid( self );
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
VALUE
|
|
83
|
+
echo_user_data( VALUE self ) {
|
|
84
|
+
buffer *echo;
|
|
85
|
+
Data_Get_Struct( self, buffer, echo );
|
|
86
|
+
if ( echo->length > sizeof( struct ofp_header ) ) {
|
|
87
|
+
return rb_str_new( ( char * ) echo->data + sizeof( struct ofp_header ),
|
|
88
|
+
( long ) ( echo->length - sizeof( struct ofp_header ) ) );
|
|
89
|
+
}
|
|
90
|
+
return Qnil;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
/*
|
|
95
|
+
* Local variables:
|
|
96
|
+
* c-basic-offset: 2
|
|
97
|
+
* indent-tabs-mode: nil
|
|
98
|
+
* End:
|
|
99
|
+
*/
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Author: Nick Karanatsios <nickkaranatsios@gmail.com>
|
|
3
|
-
*
|
|
4
2
|
* Copyright (C) 2008-2012 NEC Corporation
|
|
5
3
|
*
|
|
6
4
|
* This program is free software; you can redistribute it and/or modify
|
|
@@ -18,18 +16,19 @@
|
|
|
18
16
|
*/
|
|
19
17
|
|
|
20
18
|
|
|
21
|
-
#ifndef
|
|
22
|
-
#define
|
|
19
|
+
#ifndef ECHO_H
|
|
20
|
+
#define ECHO_H
|
|
23
21
|
|
|
24
22
|
|
|
25
23
|
#include "ruby.h"
|
|
26
24
|
|
|
27
25
|
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
VALUE echo_init( int argc, VALUE *argv, VALUE self );
|
|
27
|
+
VALUE echo_transaction_id( VALUE self );
|
|
28
|
+
VALUE echo_user_data( VALUE self );
|
|
30
29
|
|
|
31
30
|
|
|
32
|
-
#endif //
|
|
31
|
+
#endif // ECHO_H
|
|
33
32
|
|
|
34
33
|
|
|
35
34
|
/*
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (C) 2008-2012 NEC Corporation
|
|
3
|
+
#
|
|
4
|
+
# This program is free software; you can redistribute it and/or modify
|
|
5
|
+
# it under the terms of the GNU General Public License, version 2, as
|
|
6
|
+
# published by the Free Software Foundation.
|
|
7
|
+
#
|
|
8
|
+
# This program is distributed in the hope that it will be useful,
|
|
9
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
10
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
11
|
+
# GNU General Public License for more details.
|
|
12
|
+
#
|
|
13
|
+
# You should have received a copy of the GNU General Public License along
|
|
14
|
+
# with this program; if not, write to the Free Software Foundation, Inc.,
|
|
15
|
+
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
require "trema/action"
|
|
20
|
+
require "trema/monkey-patch/integer"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
module Trema
|
|
24
|
+
#
|
|
25
|
+
# An action to enqueue the packet on the specified queue attached to
|
|
26
|
+
# a port.
|
|
27
|
+
#
|
|
28
|
+
class Enqueue < Action
|
|
29
|
+
attr_reader :port_number
|
|
30
|
+
attr_reader :queue_id
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
#
|
|
34
|
+
# Creates an action to enqueue the packet on the specified queue
|
|
35
|
+
# attached to a port. When a queue is configured the user can
|
|
36
|
+
# associate a flow with this action to forward a packet through
|
|
37
|
+
# the specific queue in that port.
|
|
38
|
+
#
|
|
39
|
+
# @example
|
|
40
|
+
# Enqueue.new( :port_number => 1, :queue_id => 2 )
|
|
41
|
+
#
|
|
42
|
+
# @param [Hash] options
|
|
43
|
+
# the options hash to create this action class instance with.
|
|
44
|
+
#
|
|
45
|
+
# @option options [Number] :port_number
|
|
46
|
+
# the port the queue is attached to.
|
|
47
|
+
#
|
|
48
|
+
# @option options [Number] :queue_id
|
|
49
|
+
# the configured queue. Currently only minimum rate queues provided.
|
|
50
|
+
#
|
|
51
|
+
# @raise [TypeError] if options is not a Hash.
|
|
52
|
+
# @raise [ArgumentError] if both port_number and queue_id arguments not supplied.
|
|
53
|
+
# @raise [ArgumentError] if port_number is not an unsigned 16-bit integer.
|
|
54
|
+
# @raise [ArgumentError] if queue id is not an unsigned 32-bit integer.
|
|
55
|
+
#
|
|
56
|
+
def initialize options
|
|
57
|
+
if options.is_a?( Hash )
|
|
58
|
+
@port_number = options[ :port_number ]
|
|
59
|
+
@queue_id = options[ :queue_id ]
|
|
60
|
+
if @port_number.nil?
|
|
61
|
+
raise ArgumentError, "Port number is a mandatory option"
|
|
62
|
+
end
|
|
63
|
+
if not @port_number.unsigned_16bit?
|
|
64
|
+
raise ArgumentError, "Port number must be an unsigned 16-bit integer"
|
|
65
|
+
end
|
|
66
|
+
if @queue_id.nil?
|
|
67
|
+
raise ArgumentError, "Queue ID is a mandatory option"
|
|
68
|
+
end
|
|
69
|
+
if not @queue_id.unsigned_32bit?
|
|
70
|
+
raise ArgumentError, "Queue ID must be an unsigned 32-bit integer"
|
|
71
|
+
end
|
|
72
|
+
else
|
|
73
|
+
raise "Invalid option"
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
ActionEnqueue = Enqueue
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
### Local variables:
|
|
84
|
+
### mode: Ruby
|
|
85
|
+
### coding: utf-8-unix
|
|
86
|
+
### indent-tabs-mode: nil
|
|
87
|
+
### End:
|
data/ruby/trema/error.c
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Author: Nick Karanatsios <nickkaranatsios@gmail.com>
|
|
3
|
-
*
|
|
4
2
|
* Copyright (C) 2008-2012 NEC Corporation
|
|
5
3
|
*
|
|
6
4
|
* This program is free software; you can redistribute it and/or modify
|
|
@@ -18,111 +16,116 @@
|
|
|
18
16
|
*/
|
|
19
17
|
|
|
20
18
|
|
|
21
|
-
#include "trema.h"
|
|
22
19
|
#include "ruby.h"
|
|
20
|
+
#include "trema-ruby-utils.h"
|
|
21
|
+
#include "trema.h"
|
|
23
22
|
|
|
24
23
|
|
|
25
24
|
extern VALUE mTrema;
|
|
26
25
|
VALUE cError;
|
|
27
26
|
|
|
28
27
|
|
|
28
|
+
static VALUE
|
|
29
|
+
error_alloc( VALUE klass ) {
|
|
30
|
+
buffer *error = create_error( 0, 0, 0, NULL );
|
|
31
|
+
return Data_Wrap_Struct( klass, NULL, free_buffer, error );
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
|
|
29
35
|
/*
|
|
30
|
-
* @overload initialize(options
|
|
36
|
+
* @overload initialize(options)
|
|
31
37
|
* @example
|
|
32
38
|
* Error.new(
|
|
33
|
-
* :type =>
|
|
34
|
-
* :code =>
|
|
39
|
+
* :type => OFPET_BAD_REQUEST,
|
|
40
|
+
* :code => OFPBRC_BAD_TYPE,
|
|
35
41
|
* )
|
|
36
42
|
* Error.new(
|
|
37
|
-
* :type =>
|
|
38
|
-
* :code =>
|
|
43
|
+
* :type => OFPET_BAD_REQUEST,
|
|
44
|
+
* :code => OFPBRC_BAD_TYPE,
|
|
39
45
|
* :transcation_id => 123
|
|
40
46
|
* )
|
|
41
47
|
* Error.new(
|
|
42
|
-
* :type =>
|
|
43
|
-
* :code =>
|
|
48
|
+
* :type => OFPET_BAD_REQUEST,
|
|
49
|
+
* :code => OFPBRC_BAD_TYPE,
|
|
44
50
|
* :transcation_id => 123
|
|
45
|
-
* :
|
|
51
|
+
* :data => "Error!!"
|
|
46
52
|
* )
|
|
47
|
-
*
|
|
48
|
-
* @param [Hash] options
|
|
53
|
+
* @param [Hash] options
|
|
49
54
|
* the options to create a message with.
|
|
50
|
-
*
|
|
51
55
|
* @option options [Number] :type
|
|
52
56
|
* a command or action that failed.
|
|
53
|
-
*
|
|
54
57
|
* @option options [Number] :code
|
|
55
58
|
* the reason of the failed type error.
|
|
56
|
-
*
|
|
59
|
+
* @option options [String] :data
|
|
60
|
+
* a more user friendly explanation of the error. Defaults to nil
|
|
61
|
+
* if not specified.
|
|
62
|
+
* @option options [Number] :xid
|
|
57
63
|
* @option options [Number] :transaction_id
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
* @option options [String] :user_data
|
|
62
|
-
* a more user friendly explanation of the error. Defaults to nil if not
|
|
63
|
-
* specified.
|
|
64
|
-
*
|
|
65
|
-
* @raise [ArgumentError] if transaction_id is not an unsigned 32bit integer.
|
|
64
|
+
* An unsigned 32bit integer number associated with this message.
|
|
65
|
+
* If not specified, an auto-generated value is set.
|
|
66
|
+
* @raise [ArgumentError] if transaction ID is not an unsigned 32bit integer.
|
|
66
67
|
* @raise [ArgumentError] if type and code are not supplied.
|
|
67
68
|
* @raise [ArgumentError] if user data is not a string.
|
|
68
69
|
* @raise [TypeError] if options is not a hash.
|
|
69
|
-
*
|
|
70
70
|
* @return [Error]
|
|
71
|
-
* an object that encapsulates the +OFPT_ERROR+ OpenFlow message.
|
|
72
71
|
*/
|
|
73
72
|
static VALUE
|
|
74
|
-
|
|
75
|
-
buffer *
|
|
76
|
-
|
|
77
|
-
uint16_t type;
|
|
78
|
-
uint16_t code;
|
|
73
|
+
error_init( int argc, VALUE *argv, VALUE self ) {
|
|
74
|
+
buffer *error = NULL;
|
|
75
|
+
Data_Get_Struct( self, buffer, error );
|
|
79
76
|
VALUE options;
|
|
80
77
|
|
|
81
78
|
if ( rb_scan_args( argc, argv, "01", &options ) == 1 ) {
|
|
82
79
|
Check_Type( options, T_HASH );
|
|
83
|
-
VALUE
|
|
84
|
-
|
|
85
|
-
|
|
80
|
+
VALUE tmp = Qnil;
|
|
81
|
+
|
|
82
|
+
tmp = rb_hash_aref( options, ID2SYM( rb_intern( "type" ) ) );
|
|
83
|
+
if ( tmp != Qnil ) {
|
|
84
|
+
( ( struct ofp_error_msg * ) error->data )->type = htons( ( uint16_t ) NUM2UINT( tmp ) );
|
|
86
85
|
}
|
|
87
86
|
else {
|
|
88
87
|
rb_raise( rb_eArgError, "Type is a mandatory option" );
|
|
89
88
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
89
|
+
|
|
90
|
+
tmp = rb_hash_aref( options, ID2SYM( rb_intern( "code" ) ) );
|
|
91
|
+
if ( tmp != Qnil ) {
|
|
92
|
+
( ( struct ofp_error_msg * ) error->data )->code = htons( ( uint16_t ) NUM2UINT( tmp ) );
|
|
93
93
|
}
|
|
94
94
|
else {
|
|
95
95
|
rb_raise( rb_eArgError, "Code is a mandatory option" );
|
|
96
96
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
97
|
+
|
|
98
|
+
VALUE xid = Qnil;
|
|
99
|
+
tmp = rb_hash_aref( options, ID2SYM( rb_intern( "transaction_id" ) ) );
|
|
100
|
+
if ( tmp != Qnil ) {
|
|
101
|
+
xid = tmp;
|
|
102
|
+
}
|
|
103
|
+
tmp = rb_hash_aref( options, ID2SYM( rb_intern( "xid" ) ) );
|
|
104
|
+
if ( tmp != Qnil ) {
|
|
105
|
+
xid = tmp;
|
|
106
|
+
}
|
|
107
|
+
if ( xid != Qnil ) {
|
|
108
|
+
validate_xid( xid );
|
|
109
|
+
set_xid( error, ( uint32_t ) NUM2UINT( xid ) );
|
|
103
110
|
}
|
|
104
111
|
else {
|
|
105
|
-
|
|
112
|
+
set_xid( error, get_transaction_id() );
|
|
106
113
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
data =
|
|
114
|
-
|
|
115
|
-
memcpy( p, RSTRING_PTR( user_data ), length );
|
|
114
|
+
|
|
115
|
+
VALUE data = rb_hash_aref( options, ID2SYM( rb_intern( "data" ) ) );
|
|
116
|
+
if ( data != Qnil ) {
|
|
117
|
+
Check_Type( data, T_STRING );
|
|
118
|
+
uint16_t length = ( u_int16_t ) RSTRING_LEN( data );
|
|
119
|
+
append_back_buffer( error, length );
|
|
120
|
+
( ( struct ofp_header * ) ( error->data ) )->length = htons( ( uint16_t ) ( offsetof( struct ofp_error_msg, data ) + length ) );
|
|
121
|
+
memcpy( ( char * ) error->data + offsetof( struct ofp_error_msg, data ), RSTRING_PTR( data ), length );
|
|
116
122
|
}
|
|
117
123
|
}
|
|
118
124
|
else {
|
|
119
125
|
rb_raise( rb_eArgError, "Type and code are mandatory options" );
|
|
120
126
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
free_buffer( data );
|
|
124
|
-
}
|
|
125
|
-
return Data_Wrap_Struct( klass, NULL, free_buffer, error );
|
|
127
|
+
|
|
128
|
+
return self;
|
|
126
129
|
}
|
|
127
130
|
|
|
128
131
|
|
|
@@ -154,7 +157,7 @@ error_transaction_id( VALUE self ) {
|
|
|
154
157
|
* @return [nil] user data payload is not set.
|
|
155
158
|
*/
|
|
156
159
|
static VALUE
|
|
157
|
-
|
|
160
|
+
error_data( VALUE self ) {
|
|
158
161
|
struct ofp_error_msg *error = get_error( self );
|
|
159
162
|
long length = ( long ) ( ntohs( error->header.length ) - sizeof( struct ofp_error_msg ) );
|
|
160
163
|
if ( length > 0 ) {
|
|
@@ -192,54 +195,56 @@ error_code( VALUE self ) {
|
|
|
192
195
|
|
|
193
196
|
void
|
|
194
197
|
Init_error() {
|
|
198
|
+
rb_define_const( mTrema, "OFPET_HELLO_FAILED", INT2NUM( OFPET_HELLO_FAILED ) );
|
|
199
|
+
rb_define_const( mTrema, "OFPHFC_INCOMPATIBLE", INT2NUM( OFPHFC_INCOMPATIBLE ) );
|
|
200
|
+
rb_define_const( mTrema, "OFPHFC_EPERM", INT2NUM( OFPHFC_EPERM ) );
|
|
201
|
+
|
|
202
|
+
rb_define_const( mTrema, "OFPET_BAD_REQUEST", INT2NUM( OFPET_BAD_REQUEST ) );
|
|
203
|
+
rb_define_const( mTrema, "OFPBRC_BAD_VERSION", INT2NUM( OFPBRC_BAD_VERSION ) );
|
|
204
|
+
rb_define_const( mTrema, "OFPBRC_BAD_TYPE", INT2NUM( OFPBRC_BAD_TYPE ) );
|
|
205
|
+
rb_define_const( mTrema, "OFPBRC_BAD_STAT", INT2NUM( OFPBRC_BAD_STAT ) );
|
|
206
|
+
rb_define_const( mTrema, "OFPBRC_BAD_VENDOR", INT2NUM( OFPBRC_BAD_VENDOR ) );
|
|
207
|
+
rb_define_const( mTrema, "OFPBRC_BAD_SUBTYPE", INT2NUM( OFPBRC_BAD_SUBTYPE ) );
|
|
208
|
+
rb_define_const( mTrema, "OFPBRC_EPERM", INT2NUM( OFPBRC_EPERM ) );
|
|
209
|
+
rb_define_const( mTrema, "OFPBRC_BAD_LEN", INT2NUM( OFPBRC_BAD_LEN ) );
|
|
210
|
+
rb_define_const( mTrema, "OFPBRC_BUFFER_EMPTY", INT2NUM( OFPBRC_BUFFER_EMPTY ) );
|
|
211
|
+
rb_define_const( mTrema, "OFPBRC_BUFFER_UNKNOWN", INT2NUM( OFPBRC_BUFFER_UNKNOWN ) );
|
|
212
|
+
|
|
213
|
+
rb_define_const( mTrema, "OFPET_BAD_ACTION", INT2NUM( OFPET_BAD_ACTION ) );
|
|
214
|
+
rb_define_const( mTrema, "OFPBAC_BAD_TYPE", INT2NUM( OFPBAC_BAD_TYPE ) );
|
|
215
|
+
rb_define_const( mTrema, "OFPBAC_BAD_LEN", INT2NUM( OFPBAC_BAD_LEN ) );
|
|
216
|
+
rb_define_const( mTrema, "OFPBAC_BAD_VENDOR", INT2NUM( OFPBAC_BAD_VENDOR ) );
|
|
217
|
+
rb_define_const( mTrema, "OFPBAC_BAD_VENDOR_TYPE", INT2NUM( OFPBAC_BAD_VENDOR_TYPE ) );
|
|
218
|
+
rb_define_const( mTrema, "OFPBAC_BAD_OUT_PORT", INT2NUM( OFPBAC_BAD_OUT_PORT ) );
|
|
219
|
+
rb_define_const( mTrema, "OFPBAC_BAD_ARGUMENT", INT2NUM( OFPBAC_BAD_ARGUMENT ) );
|
|
220
|
+
rb_define_const( mTrema, "OFPBAC_EPERM", INT2NUM( OFPBAC_EPERM ) );
|
|
221
|
+
rb_define_const( mTrema, "OFPBAC_TOO_MANY", INT2NUM( OFPBAC_TOO_MANY ) );
|
|
222
|
+
rb_define_const( mTrema, "OFPBAC_BAD_QUEUE", INT2NUM( OFPBAC_BAD_QUEUE ) );
|
|
223
|
+
|
|
224
|
+
rb_define_const( mTrema, "OFPET_FLOW_MOD_FAILED", INT2NUM( OFPET_FLOW_MOD_FAILED ) );
|
|
225
|
+
rb_define_const( mTrema, "OFPFMFC_ALL_TABLES_FULL", INT2NUM( OFPFMFC_ALL_TABLES_FULL ) );
|
|
226
|
+
rb_define_const( mTrema, "OFPFMFC_OVERLAP", INT2NUM( OFPFMFC_OVERLAP ) );
|
|
227
|
+
rb_define_const( mTrema, "OFPFMFC_EPERM", INT2NUM( OFPFMFC_EPERM ) );
|
|
228
|
+
rb_define_const( mTrema, "OFPFMFC_BAD_EMERG_TIMEOUT", INT2NUM( OFPFMFC_BAD_EMERG_TIMEOUT ) );
|
|
229
|
+
rb_define_const( mTrema, "OFPFMFC_BAD_COMMAND", INT2NUM( OFPFMFC_BAD_COMMAND ) );
|
|
230
|
+
rb_define_const( mTrema, "OFPFMFC_UNSUPPORTED", INT2NUM( OFPFMFC_UNSUPPORTED ) );
|
|
231
|
+
|
|
232
|
+
rb_define_const( mTrema, "OFPET_PORT_MOD_FAILED", INT2NUM( OFPET_PORT_MOD_FAILED ) );
|
|
233
|
+
rb_define_const( mTrema, "OFPPMFC_BAD_PORT", INT2NUM( OFPPMFC_BAD_PORT ) );
|
|
234
|
+
rb_define_const( mTrema, "OFPPMFC_BAD_HW_ADDR", INT2NUM( OFPPMFC_BAD_HW_ADDR ) );
|
|
235
|
+
|
|
236
|
+
rb_define_const( mTrema, "OFPET_QUEUE_OP_FAILED", INT2NUM( OFPET_QUEUE_OP_FAILED ) );
|
|
237
|
+
rb_define_const( mTrema, "OFPQOFC_BAD_PORT", INT2NUM(OFPQOFC_BAD_PORT));
|
|
238
|
+
rb_define_const( mTrema, "OFPQOFC_BAD_QUEUE", INT2NUM(OFPQOFC_BAD_QUEUE));
|
|
239
|
+
rb_define_const( mTrema, "OFPQOFC_EPERM", INT2NUM(OFPQOFC_EPERM));
|
|
240
|
+
|
|
195
241
|
cError = rb_define_class_under( mTrema, "Error", rb_cObject );
|
|
196
|
-
rb_define_singleton_method( cError, "new", error_new, -1 );
|
|
197
|
-
rb_define_const( cError, "OFPET_HELLO_FAILED", INT2NUM( OFPET_HELLO_FAILED ) );
|
|
198
|
-
rb_define_const( cError, "OFPET_BAD_REQUEST", INT2NUM( OFPET_BAD_REQUEST ) );
|
|
199
|
-
rb_define_const( cError, "OFPET_BAD_ACTION", INT2NUM( OFPET_BAD_ACTION ) );
|
|
200
|
-
rb_define_const( cError, "OFPET_FLOW_MOD_FAILED", INT2NUM( OFPET_FLOW_MOD_FAILED ) );
|
|
201
|
-
rb_define_const( cError, "OFPET_PORT_MOD_FAILED", INT2NUM( OFPET_PORT_MOD_FAILED ) );
|
|
202
|
-
rb_define_const( cError, "OFPET_QUEUE_OP_FAILED", INT2NUM( OFPET_QUEUE_OP_FAILED ) );
|
|
203
|
-
|
|
204
|
-
rb_define_const( cError, "OFPHFC_INCOMPATIBLE", INT2NUM( OFPHFC_INCOMPATIBLE ) );
|
|
205
|
-
rb_define_const( cError, "OFPHFC_EPERM", INT2NUM( OFPHFC_EPERM ) );
|
|
206
|
-
|
|
207
|
-
rb_define_const( cError, "OFPBRC_BAD_VERSION", INT2NUM( OFPBRC_BAD_VERSION ) );
|
|
208
|
-
rb_define_const( cError, "OFPBRC_BAD_TYPE", INT2NUM( OFPBRC_BAD_TYPE ) );
|
|
209
|
-
rb_define_const( cError, "OFPBRC_BAD_STAT", INT2NUM( OFPBRC_BAD_STAT ) );
|
|
210
|
-
rb_define_const( cError, "OFPBRC_BAD_VENDOR", INT2NUM( OFPBRC_BAD_VENDOR ) );
|
|
211
|
-
rb_define_const( cError, "OFPBRC_BAD_SUBTYPE", INT2NUM( OFPBRC_BAD_SUBTYPE ) );
|
|
212
|
-
rb_define_const( cError, "OFPBRC_EPERM", INT2NUM( OFPBRC_EPERM ) );
|
|
213
|
-
rb_define_const( cError, "OFPBRC_BAD_LEN", INT2NUM( OFPBRC_BAD_LEN ) );
|
|
214
|
-
rb_define_const( cError, "OFPBRC_BUFFER_EMPTY", INT2NUM( OFPBRC_BUFFER_EMPTY ) );
|
|
215
|
-
rb_define_const( cError, "OFPBRC_BUFFER_UNKNOWN", INT2NUM( OFPBRC_BUFFER_UNKNOWN ) );
|
|
216
|
-
|
|
217
|
-
rb_define_const( cError, "OFPBAC_BAD_TYPE", INT2NUM( OFPBAC_BAD_TYPE ) );
|
|
218
|
-
rb_define_const( cError, "OFPBAC_BAD_LEN", INT2NUM( OFPBAC_BAD_LEN ) );
|
|
219
|
-
rb_define_const( cError, "OFPBAC_BAD_VENDOR", INT2NUM( OFPBAC_BAD_VENDOR ) );
|
|
220
|
-
rb_define_const( cError, "OFPBAC_BAD_VENDOR_TYPE", INT2NUM( OFPBAC_BAD_VENDOR_TYPE ) );
|
|
221
|
-
rb_define_const( cError, "OFPBAC_BAD_OUT_PORT", INT2NUM( OFPBAC_BAD_OUT_PORT ) );
|
|
222
|
-
rb_define_const( cError, "OFPBAC_BAD_ARGUMENT", INT2NUM( OFPBAC_BAD_ARGUMENT ) );
|
|
223
|
-
rb_define_const( cError, "OFPBAC_EPERM", INT2NUM( OFPBAC_EPERM ) );
|
|
224
|
-
rb_define_const( cError, "OFPBAC_TOO_MANY", INT2NUM( OFPBAC_TOO_MANY ) );
|
|
225
|
-
rb_define_const( cError, "OFPBAC_BAD_QUEUE", INT2NUM( OFPBAC_BAD_QUEUE ) );
|
|
226
|
-
|
|
227
|
-
rb_define_const( cError, "OFPFMFC_ALL_TABLES_FULL", INT2NUM( OFPFMFC_ALL_TABLES_FULL ) );
|
|
228
|
-
rb_define_const( cError, "OFPFMFC_OVERLAP", INT2NUM( OFPFMFC_OVERLAP ) );
|
|
229
|
-
rb_define_const( cError, "OFPFMFC_EPERM", INT2NUM( OFPFMFC_EPERM ) );
|
|
230
|
-
rb_define_const( cError, "OFPFMFC_BAD_EMERG_TIMEOUT", INT2NUM( OFPFMFC_BAD_EMERG_TIMEOUT ) );
|
|
231
|
-
rb_define_const( cError, "OFPFMFC_BAD_COMMAND", INT2NUM( OFPFMFC_BAD_COMMAND ) );
|
|
232
|
-
rb_define_const( cError, "OFPFMFC_UNSUPPORTED", INT2NUM( OFPFMFC_UNSUPPORTED ) );
|
|
233
|
-
|
|
234
|
-
rb_define_const( cError, "OFPPMFC_BAD_PORT", INT2NUM( OFPPMFC_BAD_PORT ) );
|
|
235
|
-
rb_define_const( cError, "OFPPMFC_BAD_HW_ADDR", INT2NUM( OFPPMFC_BAD_HW_ADDR ) );
|
|
236
|
-
|
|
237
|
-
rb_define_const( cError, "OFPQOFC_BAD_PORT", INT2NUM(OFPQOFC_BAD_PORT));
|
|
238
|
-
rb_define_const( cError, "OFPQOFC_BAD_QUEUE", INT2NUM(OFPQOFC_BAD_QUEUE));
|
|
239
|
-
rb_define_const( cError, "OFPQOFC_EPERM", INT2NUM(OFPQOFC_EPERM));
|
|
240
242
|
|
|
243
|
+
rb_define_alloc_func( cError, error_alloc );
|
|
244
|
+
rb_define_method( cError, "initialize", error_init, -1 );
|
|
241
245
|
rb_define_method( cError, "transaction_id", error_transaction_id, 0 );
|
|
242
|
-
|
|
246
|
+
rb_alias( cError, rb_intern( "xid" ), rb_intern( "transaction_id" ) );
|
|
247
|
+
rb_define_method( cError, "data", error_data, 0 );
|
|
243
248
|
rb_define_method( cError, "error_type", error_type, 0 );
|
|
244
249
|
rb_define_method( cError, "code", error_code, 0 );
|
|
245
250
|
}
|