trema 0.3.19 → 0.3.20
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +7 -7
- data/README.md +3 -3
- data/Rakefile +13 -4
- data/cruise.rb +1 -1
- data/features/examples/switch_monitor.feature +2 -0
- data/features/switch_event/C-add_forward_entry.feature +4 -24
- data/features/switch_event/C-delete_forward_entry.feature +3 -18
- data/features/switch_event/C-dump_forward_entries.feature +2 -12
- data/features/switch_event/C-set_forward_entries.feature +2 -12
- data/features/switch_event/add_forward_entry.feature +44 -29
- data/features/switch_event/delete_forward_entry.feature +31 -16
- data/features/switch_event/dump_forward_entries.feature +23 -13
- data/features/switch_event/set_forward_entries.feature +17 -7
- data/features/trema_commands/dump_flows.feature +1 -0
- data/features/trema_commands/reset_stats.feature +1 -0
- data/features/trema_commands/show_stats.feature +1 -0
- data/ruby/trema/features-reply.c +9 -6
- data/ruby/trema/monkey-patch/integer/validators.rb +36 -0
- data/ruby/trema/monkey-patch/integer.rb +2 -0
- data/ruby/trema/packet-in.c +140 -0
- data/ruby/trema/packet-queue.rb +130 -126
- data/ruby/trema/port.c +11 -0
- data/ruby/trema/queue-get-config-reply.c +8 -5
- data/ruby/trema/set-ip-tos.rb +3 -3
- data/ruby/trema/vendor-action.rb +5 -1
- data/ruby/trema/version.rb +1 -1
- data/spec/trema/echo-reply_spec.rb +8 -8
- data/spec/trema/echo-request_spec.rb +1 -1
- data/spec/trema/hello_spec.rb +6 -6
- data/spec/trema/packet-in_spec.rb +131 -0
- data/spec/trema/queue-get-config-reply_spec.rb +1 -1
- data/spec/trema/set-ip-tos_spec.rb +5 -0
- data/spec/trema/vendor-action_spec.rb +5 -0
- data/src/examples/switch_event_config/.gitignore +0 -1
- data/src/examples/switch_event_config/network.conf +2 -0
- data/src/lib/arp.h +3 -1
- data/src/lib/ether.h +1 -0
- data/src/lib/event_forward_interface.c +9 -4
- data/src/lib/openflow_message.c +6 -0
- data/src/lib/openflow_message.h +1 -0
- data/src/lib/packet_info.c +23 -0
- data/src/lib/packet_info.h +5 -0
- data/src/lib/packet_parser.c +8 -3
- data/src/lib/utility.c +13 -13
- data/src/lib/utility.h +15 -0
- data/src/switch_manager/event_forward_entry_manipulation.c +1 -1
- data/src/switch_manager/secure_channel_listener.c +3 -6
- data/src/switch_manager/switch.c +68 -9
- data/trema.gemspec +4 -4
- data/unittests/lib/event_forward_interface_test.c +30 -0
- data/unittests/lib/openflow_message_test.c +19 -0
- data/unittests/lib/packet_info_test.c +16 -0
- data/unittests/lib/packet_parser_test.c +37 -0
- data/unittests/lib/test_packets/rarp_req.cap +0 -0
- metadata +9 -6
@@ -28,7 +28,7 @@ Feature: Ruby methods for setting switch event forwarding entry
|
|
28
28
|
|
29
29
|
@slow_process
|
30
30
|
Scenario Outline: set_forward_entries_to_switch dpid, event_type, trema_names
|
31
|
-
Given a file named "
|
31
|
+
Given a file named "network.conf" with:
|
32
32
|
"""
|
33
33
|
vswitch { datapath_id 0x1 }
|
34
34
|
"""
|
@@ -37,15 +37,20 @@ Feature: Ruby methods for setting switch event forwarding entry
|
|
37
37
|
class SetEntriesToSwitchDaemonTest < Controller
|
38
38
|
include SwitchEvent
|
39
39
|
|
40
|
+
def start
|
41
|
+
@event_type = ARGV[0].delete(":").to_sym
|
42
|
+
@event_type_string = ":#{@event_type.to_s}"
|
43
|
+
end
|
44
|
+
|
40
45
|
def switch_ready datapath_id
|
41
|
-
set_forward_entries_to_switch datapath_id,
|
46
|
+
set_forward_entries_to_switch datapath_id, @event_type, ["SetEntriesToSwitchDaemonTest","Another"] do | success, services |
|
42
47
|
raise "Failed to set forwarding entry to switch" if not success
|
43
|
-
info "Successfully set a forwarding entries of
|
48
|
+
info "Successfully set a forwarding entries of #{@event_type_string} to switch #{datapath_id.to_hex} : #{services.inspect}"
|
44
49
|
end
|
45
50
|
end
|
46
51
|
end
|
47
52
|
"""
|
48
|
-
When I successfully run `trema run ./SetEntriesToSwitchDaemonTest.rb -c
|
53
|
+
When I successfully run `trema run "./SetEntriesToSwitchDaemonTest.rb <event_type>" -c network.conf -d`
|
49
54
|
And wait until "SetEntriesToSwitchDaemonTest" is up
|
50
55
|
And *** sleep 1 ***
|
51
56
|
Then the file "../../tmp/log/SetEntriesToSwitchDaemonTest.log" should contain:
|
@@ -67,16 +72,21 @@ Feature: Ruby methods for setting switch event forwarding entry
|
|
67
72
|
class SetEntriesToSwitchManagerTest < Controller
|
68
73
|
include SwitchEvent
|
69
74
|
|
75
|
+
def start
|
76
|
+
@event_type = ARGV[0].delete(":").to_sym
|
77
|
+
@event_type_string = ":#{@event_type.to_s}"
|
78
|
+
end
|
79
|
+
|
70
80
|
oneshot_timer_event :test_start, 0
|
71
81
|
def test_start
|
72
|
-
set_forward_entries_to_switch_manager
|
82
|
+
set_forward_entries_to_switch_manager @event_type, ["SetEntriesToSwitchManagerTest","Another"] do | success, services |
|
73
83
|
raise "Failed to set forwarding entry to switch manager" if not success
|
74
|
-
info "Successfully set a forwarding entries of
|
84
|
+
info "Successfully set a forwarding entries of #{@event_type_string} to switch manager : #{services.inspect}"
|
75
85
|
end
|
76
86
|
end
|
77
87
|
end
|
78
88
|
"""
|
79
|
-
When I successfully run `trema run ./SetEntriesToSwitchManagerTest.rb -d`
|
89
|
+
When I successfully run `trema run "./SetEntriesToSwitchManagerTest.rb <event_type>" -d`
|
80
90
|
And wait until "SetEntriesToSwitchManagerTest" is up
|
81
91
|
And *** sleep 1 ***
|
82
92
|
Then the file "../../tmp/log/SetEntriesToSwitchManagerTest.log" should contain:
|
@@ -17,6 +17,7 @@ Feature: reset_stats command
|
|
17
17
|
"""
|
18
18
|
And I run `trema run ../../src/examples/learning_switch/learning-switch.rb -c learning_switch.conf -d`
|
19
19
|
And I run `trema send_packets --source host1 --dest host2`
|
20
|
+
And *** sleep 1 ***
|
20
21
|
|
21
22
|
@slow_process
|
22
23
|
Scenario: reset_stats host1
|
data/ruby/trema/features-reply.c
CHANGED
@@ -47,7 +47,7 @@ features_reply_alloc( VALUE klass ) {
|
|
47
47
|
* :n_tables => 1,
|
48
48
|
* :capabilities => 135,
|
49
49
|
* :actions => 2048,
|
50
|
-
* :
|
50
|
+
* :ports => [ port1, port2, ... ]
|
51
51
|
* )
|
52
52
|
* @param [Hash] options
|
53
53
|
* the options to create a message with.
|
@@ -67,7 +67,7 @@ features_reply_alloc( VALUE klass ) {
|
|
67
67
|
* IP address lookup in APR packets.
|
68
68
|
* @option options [Number] :actions
|
69
69
|
* supported actions expressed as a 32-bit bitmap.
|
70
|
-
* @option options [Port] :
|
70
|
+
* @option options [Port] :ports
|
71
71
|
* an array of {Port} objects detailing port description and function.
|
72
72
|
* @return [FeaturesReply]
|
73
73
|
*/
|
@@ -305,14 +305,17 @@ handle_features_reply(
|
|
305
305
|
rb_hash_aset( attributes, ID2SYM( rb_intern( "actions" ) ), UINT2NUM( actions ) );
|
306
306
|
rb_hash_aset( attributes, ID2SYM( rb_intern( "ports" ) ), ports_from( ports ) );
|
307
307
|
|
308
|
-
list_element *tmp_ports = xmalloc( sizeof( list_element ) );
|
309
|
-
memcpy( tmp_ports, ports, sizeof( list_element ) );
|
310
308
|
list_element *physical_ports = xmalloc( sizeof( list_element ) );
|
311
309
|
create_list( &physical_ports );
|
312
|
-
|
310
|
+
if ( ports != NULL ) {
|
311
|
+
// use memcpy() to walk over the const qualifier
|
312
|
+
list_element *tmp_ports = xmalloc( sizeof( list_element ) );
|
313
|
+
memcpy( tmp_ports, ports, sizeof( list_element ) );
|
314
|
+
iterate_list( tmp_ports, append_physical_port, &physical_ports );
|
315
|
+
xfree( tmp_ports );
|
316
|
+
}
|
313
317
|
rb_hash_aset( attributes, ID2SYM( rb_intern( "physical_ports" ) ), ports_from( physical_ports ) );
|
314
318
|
xfree( physical_ports );
|
315
|
-
xfree( tmp_ports );
|
316
319
|
|
317
320
|
VALUE features_reply = rb_funcall( cFeaturesReply, rb_intern( "new" ), 1, attributes );
|
318
321
|
rb_funcall( ( VALUE ) controller, rb_intern( "features_reply" ), 2, ULL2NUM( datapath_id ), features_reply );
|
@@ -0,0 +1,36 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2008-2013 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 MonkeyPatch
|
20
|
+
module Integer
|
21
|
+
module Validators
|
22
|
+
# nw_tos (IP ToS) value consists of 8 bits, of which only the 6 high-order
|
23
|
+
# bits belong to DSCP, the 2 low-order bits must be zero.
|
24
|
+
def valid_nw_tos?
|
25
|
+
unsigned_8bit? and self % 4 == 0
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
### Local variables:
|
33
|
+
### mode: Ruby
|
34
|
+
### coding: utf-8-unix
|
35
|
+
### indent-tabs-mode: nil
|
36
|
+
### End:
|
@@ -18,11 +18,13 @@
|
|
18
18
|
|
19
19
|
require "trema/monkey-patch/integer/base-conversions"
|
20
20
|
require "trema/monkey-patch/integer/ranges"
|
21
|
+
require "trema/monkey-patch/integer/validators"
|
21
22
|
|
22
23
|
|
23
24
|
class Integer
|
24
25
|
include MonkeyPatch::Integer::BaseConversions
|
25
26
|
include MonkeyPatch::Integer::Ranges
|
27
|
+
include MonkeyPatch::Integer::Validators
|
26
28
|
end
|
27
29
|
|
28
30
|
|
data/ruby/trema/packet-in.c
CHANGED
@@ -442,6 +442,137 @@ packet_in_arp_tpa( VALUE self ) {
|
|
442
442
|
}
|
443
443
|
|
444
444
|
|
445
|
+
/*
|
446
|
+
* Is it an RARP packet?
|
447
|
+
*
|
448
|
+
* @return [Boolean] whether the packet is an RARP packet or not.
|
449
|
+
*/
|
450
|
+
static VALUE
|
451
|
+
packet_in_is_rarp( VALUE self ) {
|
452
|
+
if ( ( get_packet_in_info( self )->format & NW_RARP ) ) {
|
453
|
+
return Qtrue;
|
454
|
+
}
|
455
|
+
else {
|
456
|
+
return Qfalse;
|
457
|
+
}
|
458
|
+
}
|
459
|
+
|
460
|
+
|
461
|
+
/*
|
462
|
+
* Is it an RARP request packet?
|
463
|
+
*
|
464
|
+
* @return [Boolean] whether the packet is an RARP request packet or not.
|
465
|
+
*/
|
466
|
+
static VALUE
|
467
|
+
packet_in_is_rarp_request( VALUE self ) {
|
468
|
+
if ( packet_type_rarp_request( get_packet_in( self )->data ) ) {
|
469
|
+
return Qtrue;
|
470
|
+
}
|
471
|
+
else {
|
472
|
+
return Qfalse;
|
473
|
+
}
|
474
|
+
}
|
475
|
+
|
476
|
+
|
477
|
+
/*
|
478
|
+
* Is it an RARP reply packet?
|
479
|
+
*
|
480
|
+
* @return [Boolean] whether the packet is an RARP reply packet or not.
|
481
|
+
*/
|
482
|
+
static VALUE
|
483
|
+
packet_in_is_rarp_reply( VALUE self ) {
|
484
|
+
if ( packet_type_rarp_reply( get_packet_in( self )->data ) ) {
|
485
|
+
return Qtrue;
|
486
|
+
}
|
487
|
+
else {
|
488
|
+
return Qfalse;
|
489
|
+
}
|
490
|
+
}
|
491
|
+
|
492
|
+
|
493
|
+
/*
|
494
|
+
* The RARP operation code.
|
495
|
+
*
|
496
|
+
* @return [Integer] the value of the RARP opcode field.
|
497
|
+
*/
|
498
|
+
static VALUE
|
499
|
+
packet_in_rarp_oper( VALUE self ) {
|
500
|
+
PACKET_IN_RETURN_NUM( NW_RARP, UINT2NUM, arp_ar_op );
|
501
|
+
}
|
502
|
+
|
503
|
+
|
504
|
+
/*
|
505
|
+
* The RARP source hardware address of a packet.
|
506
|
+
*
|
507
|
+
* @return [Trema::Mac, nil]
|
508
|
+
* the value of the RARP source hardware address as a Trema::Mac object or nil
|
509
|
+
* if packet not an RARP.
|
510
|
+
*/
|
511
|
+
static VALUE
|
512
|
+
packet_in_rarp_sha( VALUE self ) {
|
513
|
+
if ( ( get_packet_in_info( self )->format & NW_RARP ) ) {
|
514
|
+
PACKET_IN_RETURN_MAC( arp_sha );
|
515
|
+
}
|
516
|
+
else {
|
517
|
+
return Qnil;
|
518
|
+
}
|
519
|
+
}
|
520
|
+
|
521
|
+
|
522
|
+
/*
|
523
|
+
* The RARP source protocol address of a packet.
|
524
|
+
*
|
525
|
+
* @return [Trema::IP, nil]
|
526
|
+
* the value of RARP source protocol address as a Trema::IP object or nil if
|
527
|
+
* packet is not an RARP.
|
528
|
+
*/
|
529
|
+
static VALUE
|
530
|
+
packet_in_rarp_spa( VALUE self ) {
|
531
|
+
if ( ( get_packet_in_info( self )->format & NW_RARP ) ) {
|
532
|
+
PACKET_IN_RETURN_IP( arp_spa );
|
533
|
+
}
|
534
|
+
else {
|
535
|
+
return Qnil;
|
536
|
+
}
|
537
|
+
}
|
538
|
+
|
539
|
+
|
540
|
+
/*
|
541
|
+
* The RARP target hardware address of a packet.
|
542
|
+
*
|
543
|
+
* @return [Trema::Mac]
|
544
|
+
* the value of RARP target hardware address as a Trema::Mac object or nil if
|
545
|
+
* packet is not an RARP.
|
546
|
+
*/
|
547
|
+
static VALUE
|
548
|
+
packet_in_rarp_tha( VALUE self ) {
|
549
|
+
if ( ( get_packet_in_info( self )->format & NW_RARP ) ) {
|
550
|
+
PACKET_IN_RETURN_MAC( arp_tha );
|
551
|
+
}
|
552
|
+
else {
|
553
|
+
return Qnil;
|
554
|
+
}
|
555
|
+
}
|
556
|
+
|
557
|
+
|
558
|
+
/*
|
559
|
+
* The ARP target protocol address of a packet.
|
560
|
+
*
|
561
|
+
* @return [Trema::IP]
|
562
|
+
* the value of RARP target protocol address as a Trema::IP object or nil if
|
563
|
+
* packet is not an RARP.
|
564
|
+
*/
|
565
|
+
static VALUE
|
566
|
+
packet_in_rarp_tpa( VALUE self ) {
|
567
|
+
if ( ( get_packet_in_info( self )->format & NW_RARP ) ) {
|
568
|
+
PACKET_IN_RETURN_IP( arp_tpa );
|
569
|
+
}
|
570
|
+
else {
|
571
|
+
return Qnil;
|
572
|
+
}
|
573
|
+
}
|
574
|
+
|
575
|
+
|
445
576
|
/*
|
446
577
|
* Is it an IPv4 packet?
|
447
578
|
*
|
@@ -1121,6 +1252,7 @@ Init_packet_in() {
|
|
1121
1252
|
|
1122
1253
|
rb_define_method( cPacketIn, "vtag?", packet_in_is_vtag, 0 );
|
1123
1254
|
rb_define_method( cPacketIn, "arp?", packet_in_is_arp, 0 );
|
1255
|
+
rb_define_method( cPacketIn, "rarp?", packet_in_is_rarp, 0 );
|
1124
1256
|
rb_define_method( cPacketIn, "ipv4?", packet_in_is_ipv4, 0 );
|
1125
1257
|
rb_define_method( cPacketIn, "lldp?", packet_in_is_lldp, 0 );
|
1126
1258
|
rb_define_method( cPacketIn, "icmpv4?", packet_in_is_icmpv4, 0 );
|
@@ -1142,6 +1274,14 @@ Init_packet_in() {
|
|
1142
1274
|
rb_define_method( cPacketIn, "arp_request?", packet_in_is_arp_request, 0 );
|
1143
1275
|
rb_define_method( cPacketIn, "arp_reply?", packet_in_is_arp_reply, 0 );
|
1144
1276
|
|
1277
|
+
rb_define_method( cPacketIn, "rarp_oper", packet_in_rarp_oper, 0 );
|
1278
|
+
rb_define_method( cPacketIn, "rarp_sha", packet_in_rarp_sha, 0 );
|
1279
|
+
rb_define_method( cPacketIn, "rarp_spa", packet_in_rarp_spa, 0 );
|
1280
|
+
rb_define_method( cPacketIn, "rarp_tha", packet_in_rarp_tha, 0 );
|
1281
|
+
rb_define_method( cPacketIn, "rarp_tpa", packet_in_rarp_tpa, 0 );
|
1282
|
+
rb_define_method( cPacketIn, "rarp_request?", packet_in_is_rarp_request, 0 );
|
1283
|
+
rb_define_method( cPacketIn, "rarp_reply?", packet_in_is_rarp_reply, 0 );
|
1284
|
+
|
1145
1285
|
rb_define_method( cPacketIn, "ipv4_version", packet_in_ipv4_version, 0 );
|
1146
1286
|
rb_define_method( cPacketIn, "ipv4_ihl", packet_in_ipv4_ihl, 0 );
|
1147
1287
|
rb_define_method( cPacketIn, "ipv4_tos", packet_in_ipv4_tos, 0 );
|
data/ruby/trema/packet-queue.rb
CHANGED
@@ -15,157 +15,161 @@
|
|
15
15
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
16
16
|
#
|
17
17
|
|
18
|
-
|
19
|
-
class Queue
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
18
|
+
module Trema
|
19
|
+
class Queue
|
20
|
+
class << self
|
21
|
+
#
|
22
|
+
# The {PacketQueue} to append to the list.
|
23
|
+
#
|
24
|
+
attr_accessor :queues
|
25
|
+
end
|
26
26
|
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
28
|
+
# Add queue to list.
|
29
|
+
# @param [PacketQueue] queue a {PacketQueue} instance.
|
30
|
+
def self.append queue
|
31
|
+
@queues ||= []
|
32
|
+
@queues << queue unless @queues.include?(queue)
|
33
|
+
end
|
34
34
|
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
36
|
+
# @return [Array]
|
37
|
+
# an array of {PacketQueue} objects.
|
38
|
+
def self.queues
|
39
|
+
@queues
|
40
|
+
end
|
41
41
|
|
42
42
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
43
|
+
# Iterate over each {PacketQueue} item.
|
44
|
+
# @return [Array] a list of {PacketQueue} items.
|
45
|
+
def self.each &block
|
46
|
+
@queues.each do | each |
|
47
|
+
block.call each
|
48
|
+
end
|
48
49
|
end
|
49
50
|
end
|
50
|
-
end
|
51
51
|
|
52
52
|
|
53
|
-
class PacketQueue
|
54
|
-
|
55
|
-
|
56
|
-
# Minimum datarate guaranteed.
|
57
|
-
OFPQT_MIN_RATE = 1
|
58
|
-
|
59
|
-
|
60
|
-
# Id for the specific queue.
|
61
|
-
# @return [Number] queue_id
|
62
|
-
# the value of attribute queue_id.
|
63
|
-
attr_accessor :queue_id
|
64
|
-
# Queue description's length in bytes.
|
65
|
-
# @return [Number] len
|
66
|
-
# the value of attribute len.
|
67
|
-
attr_accessor :len
|
68
|
-
# List of queue properties.
|
69
|
-
# @return [Array] properties
|
70
|
-
# the value of attribute properties.
|
71
|
-
attr_accessor :properties
|
72
|
-
|
73
|
-
|
74
|
-
# @overload initialize(options={})
|
75
|
-
# @param [Hash] options ths options hash.
|
76
|
-
# @option options [Symbol] :queue_id
|
77
|
-
# id for the specific queue.
|
78
|
-
# @option options [Symbol] :len
|
79
|
-
# queue description's length in bytes.
|
80
|
-
#
|
81
|
-
def initialize options
|
82
|
-
@queue_id = options[ :queue_id ]
|
83
|
-
@len = options[ :len ]
|
84
|
-
@properties = []
|
85
|
-
end
|
53
|
+
class PacketQueue
|
54
|
+
# No property for queue.
|
55
|
+
OFPQT_NONE = 0
|
86
56
|
|
57
|
+
# Minimum datarate guaranteed.
|
58
|
+
OFPQT_MIN_RATE = 1
|
87
59
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
end
|
60
|
+
# Id for the specific queue.
|
61
|
+
# @return [Number] queue_id
|
62
|
+
# the value of attribute queue_id.
|
63
|
+
attr_accessor :queue_id
|
93
64
|
|
65
|
+
# Queue description's length in bytes.
|
66
|
+
# @return [Number] len
|
67
|
+
# the value of attribute len.
|
68
|
+
attr_accessor :len
|
94
69
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
70
|
+
# List of queue properties.
|
71
|
+
# @return [Array] properties
|
72
|
+
# the value of attribute properties.
|
73
|
+
attr_accessor :properties
|
74
|
+
|
75
|
+
|
76
|
+
# @overload initialize(options={})
|
77
|
+
# @param [Hash] options ths options hash.
|
78
|
+
# @option options [Symbol] :queue_id
|
79
|
+
# id for the specific queue.
|
80
|
+
# @option options [Symbol] :len
|
81
|
+
# queue description's length in bytes.
|
82
|
+
#
|
83
|
+
def initialize options
|
84
|
+
@queue_id = options[ :queue_id ]
|
85
|
+
@len = options[ :len ]
|
86
|
+
@properties = []
|
102
87
|
end
|
103
|
-
str
|
104
|
-
end
|
105
|
-
end
|
106
88
|
|
107
89
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
# the value of attribute property.
|
114
|
-
attr_accessor :property
|
115
|
-
# length of property. If >= 8 minimum-rate type queue is defined.
|
116
|
-
# @return [Number]
|
117
|
-
# the value of attribute len.
|
118
|
-
attr_accessor :len
|
119
|
-
|
120
|
-
|
121
|
-
# Each queue is described by a set of properties, each of a specific type and
|
122
|
-
# configuration.
|
123
|
-
# @param [Number] property
|
124
|
-
# property queue id.
|
125
|
-
# @param [Number] len
|
126
|
-
# length in bytes of the property queue.
|
127
|
-
def initialize property, len
|
128
|
-
@property = property
|
129
|
-
@len = len
|
130
|
-
end
|
90
|
+
# @param [MinRateQueue] queue
|
91
|
+
# a property queue {MinRateQueue} object to append to the properties list.
|
92
|
+
def append queue
|
93
|
+
@properties << queue
|
94
|
+
end
|
131
95
|
|
132
96
|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
97
|
+
# @return [String]
|
98
|
+
# text representation of {PacketQueue}'s attributes and all its properties
|
99
|
+
# queue object's attributes.
|
100
|
+
def to_s
|
101
|
+
str = "queue_id: #{@queue_id} len: #{@len} "
|
102
|
+
@properties.each do | each |
|
103
|
+
str += each.to_s
|
104
|
+
end
|
105
|
+
str
|
106
|
+
end
|
137
107
|
end
|
138
|
-
end
|
139
108
|
|
140
109
|
|
141
|
-
class
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
@
|
160
|
-
|
161
|
-
|
110
|
+
class QueueProperty
|
111
|
+
# Property queue id.
|
112
|
+
# For minimum-rate type queue the property value is set to 1, otherwise defaults
|
113
|
+
# to zero.
|
114
|
+
# @return [Number]
|
115
|
+
# the value of attribute property.
|
116
|
+
attr_accessor :property
|
117
|
+
|
118
|
+
# length of property. If >= 8 minimum-rate type queue is defined.
|
119
|
+
# @return [Number]
|
120
|
+
# the value of attribute len.
|
121
|
+
attr_accessor :len
|
122
|
+
|
123
|
+
|
124
|
+
# Each queue is described by a set of properties, each of a specific type and
|
125
|
+
# configuration.
|
126
|
+
# @param [Number] property
|
127
|
+
# property queue id.
|
128
|
+
# @param [Number] len
|
129
|
+
# length in bytes of the property queue.
|
130
|
+
def initialize property, len
|
131
|
+
@property = property
|
132
|
+
@len = len
|
133
|
+
end
|
134
|
+
|
135
|
+
|
136
|
+
# @return [String]
|
137
|
+
# text representation of its attributes (property,len).
|
138
|
+
def to_s
|
139
|
+
"property: #{@property} len: #{@len} "
|
140
|
+
end
|
162
141
|
end
|
163
142
|
|
164
143
|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
144
|
+
class MinRateQueue < QueueProperty
|
145
|
+
# the rate value of the minimum rate queue.
|
146
|
+
# @return [Number]
|
147
|
+
# the value of attribute rate.
|
148
|
+
attr_accessor :rate
|
149
|
+
|
150
|
+
|
151
|
+
# An object that encapsulates the minimum rate queue property description.
|
152
|
+
# @param [Number] property
|
153
|
+
# property queue id.
|
154
|
+
# @param [Number] len
|
155
|
+
# length in bytes of the property queue.
|
156
|
+
# @param [Number] rate
|
157
|
+
# the rate value of the mimimum rate queue.
|
158
|
+
# @param [PacketQueue] packet_queue
|
159
|
+
# A {PacketQueue} instance to use to save the minimum rate queue.
|
160
|
+
def initialize property, len, rate, packet_queue
|
161
|
+
super property, len
|
162
|
+
@rate = rate
|
163
|
+
packet_queue.append self
|
164
|
+
Trema::Queue.append packet_queue
|
165
|
+
end
|
166
|
+
|
167
|
+
|
168
|
+
# @return [String]
|
169
|
+
# text representation of rate prefixed by property and length attributes.
|
170
|
+
def to_s
|
171
|
+
super.to_s + " rate: #{rate} "
|
172
|
+
end
|
169
173
|
end
|
170
174
|
end
|
171
175
|
|
data/ruby/trema/port.c
CHANGED
@@ -305,7 +305,18 @@ Init_port() {
|
|
305
305
|
cPort = rb_define_class_under( mTrema, "Port", rb_cObject );
|
306
306
|
|
307
307
|
rb_define_const( cPort, "OFPPC_PORT_DOWN", INT2NUM( OFPPC_PORT_DOWN ) );
|
308
|
+
rb_define_const( cPort, "OFPPC_NO_STP", INT2NUM( OFPPC_NO_STP ) );
|
309
|
+
rb_define_const( cPort, "OFPPC_NO_RECV", INT2NUM( OFPPC_NO_RECV ) );
|
310
|
+
rb_define_const( cPort, "OFPPC_NO_RECV_STP", INT2NUM( OFPPC_NO_RECV_STP ) );
|
311
|
+
rb_define_const( cPort, "OFPPC_NO_FLOOD", INT2NUM( OFPPC_NO_FLOOD ) );
|
312
|
+
rb_define_const( cPort, "OFPPC_NO_FWD", INT2NUM( OFPPC_NO_FWD ) );
|
313
|
+
rb_define_const( cPort, "OFPPC_NO_PACKET_IN", INT2NUM( OFPPC_NO_PACKET_IN ) );
|
308
314
|
rb_define_const( cPort, "OFPPS_LINK_DOWN", INT2NUM( OFPPS_LINK_DOWN ) );
|
315
|
+
rb_define_const( cPort, "OFPPS_STP_LISTEN", INT2NUM( OFPPS_STP_LISTEN ) );
|
316
|
+
rb_define_const( cPort, "OFPPS_STP_LEARN", INT2NUM( OFPPS_STP_LEARN ) );
|
317
|
+
rb_define_const( cPort, "OFPPS_STP_FORWARD", INT2NUM( OFPPS_STP_FORWARD ) );
|
318
|
+
rb_define_const( cPort, "OFPPS_STP_BLOCK", INT2NUM( OFPPS_STP_BLOCK ) );
|
319
|
+
rb_define_const( cPort, "OFPPS_STP_MASK", INT2NUM( OFPPS_STP_MASK ) );
|
309
320
|
rb_define_const( cPort, "OFPPF_10MB_HD", INT2NUM( OFPPF_10MB_HD ) );
|
310
321
|
rb_define_const( cPort, "OFPPF_10MB_FD", INT2NUM( OFPPF_10MB_FD ) );
|
311
322
|
rb_define_const( cPort, "OFPPF_100MB_HD", INT2NUM( OFPPF_100MB_HD ) );
|