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
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
*
|
|
2
|
+
* Ruby wrapper class of OpenFlow FlowMod message.
|
|
3
3
|
*
|
|
4
4
|
* Copyright (C) 2008-2012 NEC Corporation
|
|
5
5
|
*
|
|
@@ -18,20 +18,20 @@
|
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
20
|
|
|
21
|
-
#ifndef
|
|
22
|
-
#define
|
|
21
|
+
#ifndef RUBY_FLOW_MOD_H
|
|
22
|
+
#define RUBY_FLOW_MOD_H
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
#include "ruby.h"
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
extern VALUE
|
|
28
|
+
extern VALUE cFlowMod;
|
|
29
29
|
|
|
30
30
|
|
|
31
|
-
void
|
|
31
|
+
void Init_flow_mod( void );
|
|
32
32
|
|
|
33
33
|
|
|
34
|
-
#endif //
|
|
34
|
+
#endif // RUBY_FLOW_MOD_H
|
|
35
35
|
|
|
36
36
|
|
|
37
37
|
/*
|
|
@@ -96,6 +96,7 @@ Init_get_config_request() {
|
|
|
96
96
|
rb_define_alloc_func( cGetConfigRequest, get_config_request_alloc );
|
|
97
97
|
rb_define_method( cGetConfigRequest, "initialize", get_config_request_init, -1 );
|
|
98
98
|
rb_define_method( cGetConfigRequest, "transaction_id", get_config_request_transaction_id, 0 );
|
|
99
|
+
rb_alias( cGetConfigRequest, rb_intern( "xid" ), rb_intern( "transaction_id" ) );
|
|
99
100
|
}
|
|
100
101
|
|
|
101
102
|
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author: Yasuhito Takamiya <yasuhito@gmail.com>
|
|
3
|
+
#
|
|
4
|
+
# Copyright (C) 2008-2012 NEC Corporation
|
|
5
|
+
#
|
|
6
|
+
# This program is free software; you can redistribute it and/or modify
|
|
7
|
+
# it under the terms of the GNU General Public License, version 2, as
|
|
8
|
+
# published by the Free Software Foundation.
|
|
9
|
+
#
|
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
# GNU General Public License for more details.
|
|
14
|
+
#
|
|
15
|
+
# You should have received a copy of the GNU General Public License along
|
|
16
|
+
# with this program; if not, write to the Free Software Foundation, Inc.,
|
|
17
|
+
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
18
|
+
#
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
require "trema/openflow-switch"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
module Trema
|
|
25
|
+
#
|
|
26
|
+
# Hardware switch that supports OpenFlow protocol.
|
|
27
|
+
#
|
|
28
|
+
class HardwareSwitch
|
|
29
|
+
#
|
|
30
|
+
# The name of this switch
|
|
31
|
+
#
|
|
32
|
+
# @example
|
|
33
|
+
# switch.name #=> "My expensive OpenFlow switch"
|
|
34
|
+
#
|
|
35
|
+
# @return [String]
|
|
36
|
+
#
|
|
37
|
+
attr_reader :name
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
#
|
|
41
|
+
# Creates a new HardwareSwitch from {DSL::Switch}
|
|
42
|
+
#
|
|
43
|
+
# @example
|
|
44
|
+
# switch = Trema::HardwareSwitch.new( stanza )
|
|
45
|
+
#
|
|
46
|
+
# @return [HardwareSwitch]
|
|
47
|
+
#
|
|
48
|
+
def initialize stanza
|
|
49
|
+
stanza.validate
|
|
50
|
+
@name = stanza.name
|
|
51
|
+
@stanza = stanza
|
|
52
|
+
OpenflowSwitch.add self
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
#
|
|
57
|
+
# Returns datapath id in long format
|
|
58
|
+
#
|
|
59
|
+
# @example
|
|
60
|
+
# switch.dpid_long #=> "0000000000000abc"
|
|
61
|
+
#
|
|
62
|
+
# @return [String]
|
|
63
|
+
#
|
|
64
|
+
def dpid_long
|
|
65
|
+
@stanza.fetch :dpid_long
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
#
|
|
70
|
+
# Returns datapath id prefixed with "0x"
|
|
71
|
+
#
|
|
72
|
+
# @example
|
|
73
|
+
# switch.dpid_short #=> "0xabc"
|
|
74
|
+
#
|
|
75
|
+
# @return [String]
|
|
76
|
+
#
|
|
77
|
+
def dpid_short
|
|
78
|
+
@stanza.fetch :dpid_short
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
### Local variables:
|
|
85
|
+
### mode: Ruby
|
|
86
|
+
### coding: utf-8-unix
|
|
87
|
+
### indent-tabs-mode: nil
|
|
88
|
+
### End:
|
data/ruby/trema/hello.c
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Author: Yasuhito Takamiya <yasuhito@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,8 +16,9 @@
|
|
|
18
16
|
*/
|
|
19
17
|
|
|
20
18
|
|
|
21
|
-
#include "trema.h"
|
|
22
19
|
#include "ruby.h"
|
|
20
|
+
#include "trema.h"
|
|
21
|
+
#include "trema-ruby-utils.h"
|
|
23
22
|
|
|
24
23
|
|
|
25
24
|
extern VALUE mTrema;
|
|
@@ -36,60 +35,84 @@ hello_alloc( VALUE klass ) {
|
|
|
36
35
|
/*
|
|
37
36
|
* Creates a Hello OpenFlow message.
|
|
38
37
|
*
|
|
39
|
-
* @overload initialize(
|
|
40
|
-
*
|
|
38
|
+
* @overload initialize()
|
|
41
39
|
* @example
|
|
42
40
|
* Hello.new
|
|
43
|
-
* Hello.new( :transaction_id => 123 )
|
|
44
41
|
*
|
|
42
|
+
* @overload initialize(transaction_id)
|
|
43
|
+
* @example
|
|
44
|
+
* Hello.new( 123 )
|
|
45
|
+
* @param [Integer] transaction_id
|
|
46
|
+
* An unsigned 32bit integer number associated with this message.
|
|
47
|
+
*
|
|
48
|
+
* @overload initialize(options)
|
|
49
|
+
* @example
|
|
50
|
+
* Hello.new( :xid => 123 )
|
|
51
|
+
* Hello.new( :transaction_id => 123 )
|
|
45
52
|
* @param [Hash] options
|
|
46
53
|
* the options to create a message with.
|
|
47
|
-
*
|
|
54
|
+
* @option options [Number] :xid
|
|
48
55
|
* @option options [Number] :transaction_id
|
|
49
56
|
* An unsigned 32bit integer number associated with this message.
|
|
50
57
|
* If not specified, an auto-generated value is set.
|
|
51
58
|
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
* @return [Hello]
|
|
56
|
-
* an object that encapsulates the +OPFT_HELLO+ OpenFlow message.
|
|
59
|
+
* @raise [ArgumentError] if transaction ID is not an unsigned 32-bit integer.
|
|
60
|
+
* @raise [TypeError] if argument is not a Integer or a Hash.
|
|
61
|
+
* @return [Hello]
|
|
57
62
|
*/
|
|
58
63
|
static VALUE
|
|
59
64
|
hello_init( int argc, VALUE *argv, VALUE self ) {
|
|
60
|
-
buffer *hello;
|
|
65
|
+
buffer *hello = NULL;
|
|
61
66
|
Data_Get_Struct( self, buffer, hello );
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
if (
|
|
69
|
-
|
|
70
|
-
|
|
67
|
+
VALUE options = Qnil;
|
|
68
|
+
|
|
69
|
+
if ( rb_scan_args( argc, argv, "01", &options ) == 0 ) {
|
|
70
|
+
set_xid( hello, get_transaction_id() );
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
if ( options == Qnil ) {
|
|
74
|
+
set_xid( hello, get_transaction_id() );
|
|
75
|
+
}
|
|
76
|
+
else if ( rb_obj_is_kind_of( options, rb_cInteger ) == Qtrue ) {
|
|
77
|
+
validate_xid( options );
|
|
78
|
+
set_xid( hello, ( uint32_t ) NUM2UINT( options ) );
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
Check_Type( options, T_HASH );
|
|
82
|
+
VALUE tmp = Qnil;
|
|
83
|
+
VALUE xid = Qnil;
|
|
84
|
+
|
|
85
|
+
tmp = rb_hash_aref( options, ID2SYM( rb_intern( "transaction_id" ) ) );
|
|
86
|
+
if ( tmp != Qnil ) {
|
|
87
|
+
xid = tmp;
|
|
88
|
+
}
|
|
89
|
+
tmp = rb_hash_aref( options, ID2SYM( rb_intern( "xid" ) ) );
|
|
90
|
+
if ( tmp != Qnil ) {
|
|
91
|
+
xid = tmp;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if ( xid != Qnil ) {
|
|
95
|
+
validate_xid( xid );
|
|
96
|
+
set_xid( hello, ( uint32_t ) NUM2UINT( xid ) );
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
set_xid( hello, get_transaction_id() );
|
|
71
100
|
}
|
|
72
|
-
xid = ( uint32_t ) NUM2UINT( xid_ruby );
|
|
73
101
|
}
|
|
74
102
|
}
|
|
75
|
-
|
|
103
|
+
|
|
76
104
|
return self;
|
|
77
105
|
}
|
|
78
106
|
|
|
79
107
|
|
|
80
108
|
/*
|
|
81
|
-
*
|
|
82
|
-
* message. Replies use the same id as was in the request to
|
|
83
|
-
* facilitate pairing.
|
|
109
|
+
* Transaction ids, message sequence numbers matching requests to replies.
|
|
84
110
|
*
|
|
85
111
|
* @return [Number] the value of transaction ID.
|
|
86
112
|
*/
|
|
87
113
|
static VALUE
|
|
88
114
|
hello_transaction_id( VALUE self ) {
|
|
89
|
-
|
|
90
|
-
Data_Get_Struct( self, buffer, hello );
|
|
91
|
-
uint32_t xid = ntohl( ( ( struct ofp_header * ) ( hello->data ) )->xid );
|
|
92
|
-
return UINT2NUM( xid );
|
|
115
|
+
return get_xid( self );
|
|
93
116
|
}
|
|
94
117
|
|
|
95
118
|
|
|
@@ -99,6 +122,7 @@ Init_hello() {
|
|
|
99
122
|
rb_define_alloc_func( cHello, hello_alloc );
|
|
100
123
|
rb_define_method( cHello, "initialize", hello_init, -1 );
|
|
101
124
|
rb_define_method( cHello, "transaction_id", hello_transaction_id, 0 );
|
|
125
|
+
rb_alias( cHello, rb_intern( "xid" ), rb_intern( "transaction_id" ) );
|
|
102
126
|
}
|
|
103
127
|
|
|
104
128
|
|
data/ruby/trema/hello.h
CHANGED
data/ruby/trema/ip.rb
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
|
|
@@ -90,6 +88,18 @@ module Trema
|
|
|
90
88
|
def to_i
|
|
91
89
|
@value.to_i
|
|
92
90
|
end
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
#
|
|
94
|
+
# @return [Array]
|
|
95
|
+
# an array of decimal numbers converted from IP address.
|
|
96
|
+
#
|
|
97
|
+
def to_a
|
|
98
|
+
to_s.split( "." ).collect do | each |
|
|
99
|
+
each.to_i
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
alias :to_array :to_a
|
|
93
103
|
end
|
|
94
104
|
end
|
|
95
105
|
|
|
@@ -0,0 +1,29 @@
|
|
|
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
|
+
module Trema
|
|
20
|
+
module Logger
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
### Local variables:
|
|
26
|
+
### mode: Ruby
|
|
27
|
+
### coding: utf-8
|
|
28
|
+
### indent-tabs-mode: nil
|
|
29
|
+
### End:
|
data/ruby/trema/mac.rb
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
#
|
|
2
|
-
# Author: Yasuhito Takamiya <yasuhito@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
|
|
@@ -23,7 +21,7 @@ require "forwardable"
|
|
|
23
21
|
|
|
24
22
|
module Trema
|
|
25
23
|
#
|
|
26
|
-
#
|
|
24
|
+
# Ethernet address class
|
|
27
25
|
#
|
|
28
26
|
class Mac
|
|
29
27
|
extend Forwardable
|
|
@@ -31,18 +29,23 @@ module Trema
|
|
|
31
29
|
|
|
32
30
|
|
|
33
31
|
#
|
|
34
|
-
#
|
|
32
|
+
# Returns an Ethernet address in its numeric presentation.
|
|
33
|
+
#
|
|
34
|
+
# @example
|
|
35
|
+
# Mac.new("11:22:33:44:55:66") #=> 18838586676582
|
|
36
|
+
#
|
|
37
|
+
# @return [Number] the Ethernet address in numeric format
|
|
35
38
|
#
|
|
36
39
|
attr_reader :value
|
|
37
40
|
|
|
38
41
|
|
|
39
42
|
#
|
|
40
|
-
# Creates a {Mac} instance that encapsulates Ethernet
|
|
43
|
+
# Creates a {Mac} instance that encapsulates Ethernet addresses.
|
|
41
44
|
#
|
|
42
45
|
# @overload initialize(value)
|
|
43
46
|
#
|
|
44
47
|
# @param [String,Integer] value
|
|
45
|
-
# the
|
|
48
|
+
# the Ethernet address to set to.
|
|
46
49
|
#
|
|
47
50
|
# @example address as a hexadecimal string
|
|
48
51
|
# Mac.new("11:22:33:44:55:66")
|
|
@@ -51,25 +54,30 @@ module Trema
|
|
|
51
54
|
# Mac.new(0xffffffffffff)
|
|
52
55
|
#
|
|
53
56
|
# @raise [ArgumentError] if invalid format is detected.
|
|
54
|
-
# @raise [
|
|
57
|
+
# @raise [TypeError] if supplied argument is not a String or Integer.
|
|
55
58
|
#
|
|
56
59
|
def initialize value
|
|
57
60
|
case value
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
61
|
+
when String
|
|
62
|
+
@value = create_from( value )
|
|
63
|
+
when Integer
|
|
64
|
+
@value = value
|
|
65
|
+
validate_value_range
|
|
66
|
+
else
|
|
67
|
+
raise TypeError, "Invalid MAC address: #{ value.inspect }"
|
|
64
68
|
end
|
|
65
69
|
@string = string_format
|
|
66
70
|
end
|
|
67
71
|
|
|
68
72
|
|
|
69
73
|
#
|
|
70
|
-
#
|
|
71
|
-
#
|
|
72
|
-
#
|
|
74
|
+
# Returns the Ethernet address as 6 pairs of hexadecimal digits
|
|
75
|
+
# delimited by colons.
|
|
76
|
+
#
|
|
77
|
+
# @example
|
|
78
|
+
# Mac.new(18838586676582).to_s #=> "11:22:33:44:55:66"
|
|
79
|
+
#
|
|
80
|
+
# @return [String] the Ethernet address in String format
|
|
73
81
|
#
|
|
74
82
|
def to_s
|
|
75
83
|
@string
|
|
@@ -77,11 +85,15 @@ module Trema
|
|
|
77
85
|
|
|
78
86
|
|
|
79
87
|
#
|
|
80
|
-
#
|
|
81
|
-
#
|
|
82
|
-
#
|
|
88
|
+
# Returns an array of decimal numbers converted from Ethernet's
|
|
89
|
+
# address string format.
|
|
90
|
+
#
|
|
91
|
+
# @example
|
|
92
|
+
# Mac.new("11:22:33:44:55:66").to_a #=> [ 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 ]
|
|
83
93
|
#
|
|
84
|
-
|
|
94
|
+
# @return [Array] the Ethernet address in Array format
|
|
95
|
+
#
|
|
96
|
+
def to_a
|
|
85
97
|
@string.split( ":" ).collect do | each |
|
|
86
98
|
each.hex
|
|
87
99
|
end
|
|
@@ -89,27 +101,38 @@ module Trema
|
|
|
89
101
|
|
|
90
102
|
|
|
91
103
|
#
|
|
92
|
-
# @
|
|
104
|
+
# @private
|
|
93
105
|
#
|
|
94
106
|
def == other
|
|
95
107
|
@value == other.value
|
|
96
108
|
end
|
|
109
|
+
alias :eql? :==
|
|
97
110
|
|
|
98
111
|
|
|
99
112
|
#
|
|
100
|
-
#
|
|
113
|
+
# Returns true if Ethernet address is a multicast address.
|
|
101
114
|
#
|
|
102
|
-
|
|
103
|
-
|
|
115
|
+
# @example
|
|
116
|
+
# Mac.new("01:00:00:00:00:00").multicast? #=> true
|
|
117
|
+
# Mac.new("00:00:00:00:00:00").multicast? #=> false
|
|
118
|
+
#
|
|
119
|
+
# @return [Boolean] whether the Ethernet address is multicast
|
|
120
|
+
#
|
|
121
|
+
def multicast?
|
|
122
|
+
to_a[ 0 ] & 1 == 1
|
|
104
123
|
end
|
|
105
124
|
|
|
106
125
|
|
|
107
126
|
#
|
|
108
|
-
#
|
|
127
|
+
# Returns true if Ethernet address is a broadcast address.
|
|
109
128
|
#
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
129
|
+
# @example
|
|
130
|
+
# Mac.new("ff:ff:ff:ff:ff:ff").broadcast? #=> true
|
|
131
|
+
#
|
|
132
|
+
# @return [Boolean] whether the Ethernet address is broadcast
|
|
133
|
+
#
|
|
134
|
+
def broadcast?
|
|
135
|
+
to_a.all? { | each | each == 0xff }
|
|
113
136
|
end
|
|
114
137
|
|
|
115
138
|
|
|
@@ -118,21 +141,19 @@ module Trema
|
|
|
118
141
|
################################################################################
|
|
119
142
|
|
|
120
143
|
|
|
121
|
-
def
|
|
144
|
+
def create_from string
|
|
122
145
|
octet_regex = "[0-9a-fA-F][0-9a-fA-F]"
|
|
123
146
|
if /^(#{ octet_regex }:){5}(#{ octet_regex })$/=~ string
|
|
124
|
-
|
|
147
|
+
string.gsub( ":", "" ).hex
|
|
125
148
|
else
|
|
126
|
-
raise %{Invalid MAC address: "#{ string }"}
|
|
149
|
+
raise ArgumentError, %{Invalid MAC address: "#{ string }"}
|
|
127
150
|
end
|
|
128
151
|
end
|
|
129
152
|
|
|
130
153
|
|
|
131
|
-
def
|
|
132
|
-
if
|
|
133
|
-
|
|
134
|
-
else
|
|
135
|
-
raise %{Invalid MAC address: #{ integer }}
|
|
154
|
+
def validate_value_range
|
|
155
|
+
if not ( @value >= 0 and @value <= 0xffffffffffff )
|
|
156
|
+
raise ArgumentError, "Invalid MAC address: #{ @value }"
|
|
136
157
|
end
|
|
137
158
|
end
|
|
138
159
|
|