trema 0.2.5 → 0.2.6
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/.gitignore +1 -1
- data/Doxyfile +1 -1
- data/Gemfile +18 -6
- data/README.md +112 -5
- data/Rakefile +3 -1
- data/Rantfile +88 -1
- data/bin/trema +248 -0
- data/bin/trema-config +59 -0
- data/cruise.rb +1 -1
- data/features/example.dumper.feature +45 -65
- data/features/example.hello_trema.feature +21 -0
- data/features/example.learning_switch.feature +26 -28
- data/features/example.list_switches.feature +19 -33
- data/features/example.message.echo_reply.feature +10 -10
- data/features/example.message.echo_request.feature +2 -2
- data/features/example.message.features_request.feature +6 -5
- data/features/example.message.hello.feature +47 -13
- data/features/example.message.set_config.feature +4 -4
- data/features/example.message.vendor-action.feature +23 -0
- data/features/example.multi_learning_switch.feature +14 -42
- data/features/example.packet_in.feature +31 -0
- data/features/example.packetin_filter_config.feature +11 -7
- data/features/example.patch_panel.feature +29 -0
- data/features/example.repeater_hub.feature +43 -40
- data/features/example.switch_info.feature +51 -0
- data/features/example.switch_monitor.feature +24 -42
- data/features/packetin_filter.feature +28 -22
- data/features/step_definitions/misc_steps.rb +19 -8
- data/features/step_definitions/send_packets_steps.rb +1 -10
- data/features/step_definitions/stats_steps.rb +4 -4
- data/features/support/env.rb +2 -1
- data/features/support/hooks.rb +35 -2
- data/features/switch_manager.feature +18 -12
- data/features/trema-config.feature +26 -39
- data/features/trema.dump_flows.feature +26 -12
- data/features/trema.help.feature +26 -0
- data/features/trema.kill.feature +39 -41
- data/features/trema.killall.feature +23 -23
- data/features/trema.reset_stats.feature +50 -10
- data/features/trema.run.feature +28 -39
- data/features/trema.send_packets.feature +29 -40
- data/features/trema.show_stats.feature +30 -33
- data/features/trema.up.feature +33 -0
- data/features/trema.version.feature +9 -0
- data/ruby/extconf.rb +7 -0
- data/ruby/trema/aggregate-stats-reply.rb +3 -3
- data/ruby/trema/app.rb +5 -1
- data/ruby/trema/barrier-request.c +55 -30
- data/ruby/trema/cli.rb +8 -8
- data/ruby/trema/command.rb +1 -3
- data/ruby/trema/command/dump_flows.rb +5 -24
- data/ruby/trema/command/kill.rb +31 -36
- data/ruby/trema/command/killall.rb +1 -19
- data/{features/step_definitions/kill_steps.rb → ruby/trema/command/netns.rb} +13 -5
- data/ruby/trema/command/reset_stats.rb +3 -23
- data/ruby/trema/command/ruby.rb +2 -19
- data/ruby/trema/command/run.rb +6 -27
- data/ruby/trema/command/send_packets.rb +6 -90
- data/ruby/trema/command/show_stats.rb +21 -40
- data/ruby/trema/command/up.rb +5 -26
- data/ruby/trema/command/version.rb +1 -5
- data/ruby/trema/controller.c +14 -16
- data/ruby/trema/custom-switch.rb +56 -0
- data/ruby/trema/desc-stats-reply.rb +5 -5
- data/ruby/trema/dsl/configuration.rb +4 -0
- data/{features/step_definitions/up_steps.rb → ruby/trema/dsl/custom-switch.rb} +18 -4
- data/ruby/trema/dsl/netns.rb +78 -0
- data/ruby/trema/dsl/parser.rb +2 -0
- data/ruby/trema/dsl/runner.rb +8 -0
- data/ruby/trema/dsl/syntax.rb +18 -0
- data/ruby/trema/echo-reply.h +2 -2
- data/ruby/trema/echo-request.c +3 -5
- data/ruby/trema/enqueue.rb +2 -2
- data/ruby/trema/error.c +3 -3
- data/ruby/trema/executables.rb +26 -2
- data/ruby/trema/features-request.c +3 -5
- data/ruby/trema/flow-removed.c +6 -6
- data/ruby/trema/flow-stats-reply.rb +6 -8
- data/ruby/trema/flow.rb +12 -1
- data/ruby/trema/get-config-request.c +55 -28
- data/ruby/trema/hello.c +3 -5
- data/ruby/trema/host.rb +8 -0
- data/ruby/trema/list-switches-reply.c +1 -1
- data/ruby/trema/mac.rb +1 -1
- data/ruby/trema/match.c +15 -14
- data/ruby/trema/monkey-patch/module/deprecation.rb +0 -2
- data/ruby/trema/netns.rb +127 -0
- data/ruby/trema/ordered-hash.rb +5 -4
- data/ruby/trema/packet-in.c +136 -113
- data/ruby/trema/packet-queue.rb +9 -9
- data/ruby/trema/packetin-filter.rb +1 -1
- data/ruby/trema/phost.rb +16 -7
- data/ruby/trema/port-mod.c +6 -5
- data/ruby/trema/port-stats-reply.rb +2 -2
- data/ruby/trema/process.rb +29 -0
- data/ruby/trema/queue-stats-reply.rb +2 -4
- data/ruby/trema/send-out-port.rb +5 -3
- data/ruby/trema/set-eth-addr.rb +4 -0
- data/ruby/trema/set-ip-addr.rb +4 -2
- data/ruby/trema/set-ip-dst-addr.rb +2 -1
- data/ruby/trema/set-ip-src-addr.rb +2 -1
- data/ruby/trema/set-ip-tos.rb +3 -2
- data/ruby/trema/set-transport-port.rb +3 -2
- data/ruby/trema/set-vlan-priority.rb +3 -2
- data/ruby/trema/set-vlan-vid.rb +5 -4
- data/ruby/trema/shell/reset_stats.rb +2 -1
- data/ruby/trema/shell/run.rb +1 -1
- data/ruby/trema/shell/send_packets.rb +1 -1
- data/ruby/trema/shell/show_stats.rb +1 -1
- data/ruby/trema/stats-helper.rb +3 -3
- data/ruby/trema/stats-reply.c +26 -17
- data/ruby/trema/stats-request.c +39 -41
- data/ruby/trema/switch-daemon.rb +36 -31
- data/ruby/trema/switch.c +1 -1
- data/ruby/trema/table-stats-reply.rb +1 -1
- data/ruby/trema/timers.rb +13 -13
- data/ruby/trema/trema.c +3 -3
- data/ruby/trema/tremashark.rb +9 -2
- data/ruby/trema/util.rb +39 -15
- data/ruby/trema/vendor-action.rb +8 -3
- data/ruby/trema/vendor-stats-reply.rb +4 -6
- data/ruby/trema/vendor.c +1 -1
- data/ruby/trema/version.rb +1 -1
- data/spec/trema/barrier-request_spec.rb +47 -37
- data/spec/trema/controller_spec.rb +1 -0
- data/spec/trema/dsl/runner_spec.rb +8 -3
- data/spec/trema/dsl/vhost_spec.rb +8 -8
- data/spec/trema/echo-request_spec.rb +1 -0
- data/spec/trema/features-request_spec.rb +1 -0
- data/spec/trema/flow-removed_spec.rb +9 -9
- data/spec/trema/get-config-request_spec.rb +51 -39
- data/spec/trema/match_spec.rb +1 -1
- data/spec/trema/openflow-error_spec.rb +11 -11
- data/spec/trema/packet-out_spec.rb +5 -5
- data/spec/trema/queue-get-config-reply_spec.rb +1 -1
- data/spec/trema/queue-get-config-request_spec.rb +1 -1
- data/spec/trema/set-eth-dst-addr_spec.rb +1 -1
- data/spec/trema/set-eth-src-addr_spec.rb +1 -1
- data/spec/trema/set-ip-dst-addr_spec.rb +1 -0
- data/spec/trema/set-ip-src-addr_spec.rb +1 -0
- data/spec/trema/set-ip-tos_spec.rb +1 -0
- data/spec/trema/set-transport-dst-port_spec.rb +1 -0
- data/spec/trema/set-transport-src-port_spec.rb +1 -0
- data/spec/trema/set-vlan-priority_spec.rb +1 -0
- data/spec/trema/set-vlan-vid_spec.rb +2 -1
- data/spec/trema/stats-reply_spec.rb +38 -36
- data/spec/trema/stats-request_spec.rb +6 -6
- data/spec/trema/strip-vlan-header_spec.rb +1 -0
- data/spec/trema/util_spec.rb +3 -2
- data/spec/trema/vendor-action_spec.rb +9 -8
- data/src/examples/dumper/dumper.c +8 -6
- data/src/examples/dumper/dumper.rb +1 -1
- data/{features/step_definitions/killall_steps.rb → src/examples/hello_trema/hello-trema.rb} +6 -5
- data/src/examples/hello_trema/hello_trema.c +4 -4
- data/src/examples/learning_switch/learning_switch.c +1 -1
- data/src/examples/list_switches/list_switches.c +2 -2
- data/src/examples/match_compare/match-compare.rb +2 -2
- data/src/examples/multi_learning_switch/multi-learning-switch.rb +1 -1
- data/src/examples/multi_learning_switch/multi_learning_switch.c +3 -3
- data/src/examples/openflow_message/README +1 -1
- data/src/examples/openflow_message/echo-request.rb +1 -1
- data/src/examples/openflow_message/features_request.c +21 -21
- data/src/examples/openflow_message/hello.c +1 -3
- data/src/examples/openflow_message/hello.rb +9 -24
- data/src/examples/{hello_trema/hello_trema.rb → openflow_message/vendor-action.rb} +17 -7
- data/src/examples/openflow_message/vendor_action.c +105 -0
- data/src/examples/openflow_switch/hello_switch.c +81 -0
- data/src/examples/packet_in/packet-in.rb +9 -13
- data/src/examples/packetin_filter_config/packetin_filter_config.c +2 -2
- data/src/examples/patch_panel/network.conf +14 -0
- data/src/examples/patch_panel/patch-panel.conf +1 -0
- data/{features/step_definitions/show_stats_steps.rb → src/examples/patch_panel/patch-panel.rb} +29 -13
- data/src/examples/switch_info/{switch_info.rb → switch-info.rb} +2 -2
- data/src/examples/switch_info/switch_info.c +4 -4
- data/src/examples/switch_monitor/switch_monitor.c +3 -3
- data/src/examples/traffic_monitor/counter.c +9 -9
- data/src/examples/traffic_monitor/fdb.c +9 -9
- data/src/lib/arp.h +1 -1
- data/src/lib/buffer.c +4 -3
- data/src/lib/byteorder.c +31 -5
- data/src/lib/byteorder.h +2 -2
- data/src/lib/chibach.c +8 -6
- data/src/lib/daemon.c +29 -3
- data/src/lib/doubly_linked_list.c +6 -1
- data/src/lib/ether.c +1 -1
- data/src/lib/ether.h +1 -1
- data/src/lib/event_handler.c +3 -3
- data/src/lib/hash_table.c +1 -1
- data/src/lib/linked_list.c +50 -2
- data/src/lib/linked_list.h +2 -2
- data/src/lib/log.c +122 -22
- data/src/lib/log.h +13 -9
- data/src/lib/management_interface.c +361 -0
- data/src/lib/management_interface.h +42 -0
- data/src/lib/management_service_interface.c +104 -0
- data/src/lib/management_service_interface.h +136 -0
- data/src/lib/match_table.c +5 -5
- data/src/lib/message_queue.c +5 -3
- data/src/lib/message_queue.h +1 -1
- data/src/lib/messenger.c +73 -39
- data/src/lib/messenger.h +3 -2
- data/src/lib/openflow_application_interface.c +17 -17
- data/src/lib/openflow_message.c +175 -23
- data/src/lib/openflow_message.h +2 -1
- data/src/lib/openflow_switch_interface.c +12 -12
- data/src/lib/packet_parser.c +11 -32
- data/src/lib/packetin_filter_interface.c +5 -5
- data/src/lib/persistent_storage.c +7 -7
- data/src/lib/secure_channel.c +6 -6
- data/src/lib/secure_channel.h +1 -1
- data/src/lib/stat.c +54 -17
- data/src/lib/stat.h +9 -0
- data/src/lib/timer.c +11 -10
- data/src/lib/trema.c +38 -9
- data/src/lib/trema.h +1 -0
- data/src/lib/trema_private.h +6 -0
- data/src/lib/trema_wrapper.c +4 -4
- data/src/lib/trema_wrapper.h +10 -10
- data/src/lib/utility.c +6 -6
- data/src/management/application.c +224 -0
- data/src/management/echo.c +185 -0
- data/src/management/set_logging_level.c +153 -0
- data/src/management/show_stats.c +150 -0
- data/src/management/trema_manager +184 -0
- data/src/packetin_filter/packetin_filter.c +31 -29
- data/src/switch_manager/cookie_table.c +7 -7
- data/src/switch_manager/dpid_table.c +3 -3
- data/src/switch_manager/dpid_table.h +0 -1
- data/src/switch_manager/management_interface.h +0 -1
- data/src/switch_manager/ofpmsg_recv.c +3 -3
- data/src/switch_manager/ofpmsg_recv.h +0 -1
- data/src/switch_manager/ofpmsg_send.c +2 -2
- data/src/switch_manager/ofpmsg_send.h +0 -1
- data/src/switch_manager/secure_channel_listener.c +2 -2
- data/src/switch_manager/secure_channel_receiver.c +2 -2
- data/src/switch_manager/secure_channel_receiver.h +0 -1
- data/src/switch_manager/secure_channel_sender.c +8 -1
- data/src/switch_manager/service_interface.c +5 -4
- data/src/switch_manager/switch.c +79 -53
- data/src/switch_manager/switch_manager.c +24 -22
- data/src/switch_manager/xid_table.c +6 -6
- data/src/switch_manager/xid_table.h +0 -1
- data/src/tremashark/README +4 -3
- data/src/tremashark/packet_capture.c +11 -9
- data/src/tremashark/pcap_queue.c +2 -2
- data/src/tremashark/pcap_queue.h +2 -2
- data/src/tremashark/plugin/packet-trema/Makefile +1 -1
- data/src/tremashark/plugin/packet-trema/Makefile.common +1 -1
- data/src/tremashark/plugin/packet-trema/packet-trema.c +50 -37
- data/src/tremashark/queue.c +5 -4
- data/src/tremashark/queue.h +1 -1
- data/src/tremashark/stdin_relay.c +10 -8
- data/src/tremashark/syslog_relay.c +14 -12
- data/src/tremashark/tremashark.c +15 -18
- data/trema +2 -96
- data/trema-config +2 -52
- data/trema.gemspec +12 -1
- data/unittests/cmockery_trema.h +14 -13
- data/unittests/lib/buffer_test.c +1 -1
- data/unittests/lib/byteorder_test.c +108 -25
- data/unittests/lib/daemon_test.c +141 -5
- data/unittests/lib/doubly_linked_list_test.c +5 -1
- data/unittests/lib/ether_test.c +4 -4
- data/unittests/lib/hash_table_test.c +5 -3
- data/unittests/lib/linked_list_test.c +82 -4
- data/unittests/lib/log_test.c +96 -5
- data/unittests/lib/management_interface_test.c +240 -0
- data/unittests/lib/management_service_interface_test.c +319 -0
- data/unittests/lib/message_queue_test.c +6 -2
- data/unittests/lib/messenger_test.c +167 -2
- data/unittests/lib/openflow_application_interface_test.c +16 -22
- data/unittests/lib/openflow_message_test.c +721 -24
- data/unittests/lib/packet_info_test.c +2 -2
- data/unittests/lib/packet_parser_test.c +15 -16
- data/unittests/lib/packetin_filter_interface_test.c +6 -6
- data/unittests/lib/persistent_storage_test.c +11 -11
- data/unittests/lib/stat_test.c +151 -7
- data/unittests/lib/timer_test.c +1 -1
- data/unittests/lib/trema_private_test.c +2 -2
- data/unittests/lib/trema_test.c +40 -12
- data/unittests/lib/utility_test.c +3 -3
- data/unittests/lib/wrapper_test.c +3 -3
- data/unittests/packetin_filter/packetin_filter_test.c +12 -11
- data/unittests/switch_manager/switch_manager_test.c +29 -22
- metadata +99 -20
- data/features/step_definitions/log_steps.rb +0 -90
- data/features/step_definitions/run_steps.rb +0 -91
- data/features/trema.feature +0 -27
- data/features/tutorial.hello_trema.feature +0 -27
- data/features/tutorial.packet_in.feature +0 -47
- data/features/tutorial.switch_info.feature +0 -55
- data/ruby/trema/command/usage.rb +0 -63
|
@@ -1,8 +1,4 @@
|
|
|
1
1
|
#
|
|
2
|
-
# Dumps packet-in message.
|
|
3
|
-
#
|
|
4
|
-
# Author: Yasuhito Takamiya <yasuhito@gmail.com>
|
|
5
|
-
#
|
|
6
2
|
# Copyright (C) 2008-2012 NEC Corporation
|
|
7
3
|
#
|
|
8
4
|
# This program is free software; you can redistribute it and/or modify
|
|
@@ -20,16 +16,16 @@
|
|
|
20
16
|
#
|
|
21
17
|
|
|
22
18
|
|
|
23
|
-
class
|
|
24
|
-
def packet_in datapath_id,
|
|
25
|
-
|
|
19
|
+
class PacketInDumper < Controller
|
|
20
|
+
def packet_in datapath_id, message
|
|
21
|
+
info "received a packet_in"
|
|
26
22
|
info "datapath_id: #{ datapath_id.to_hex }"
|
|
27
|
-
info "transaction_id: #{
|
|
28
|
-
info "buffer_id: #{
|
|
29
|
-
info "total_len: #{
|
|
30
|
-
info "in_port: #{
|
|
31
|
-
info "reason: #{
|
|
32
|
-
info "data: #{
|
|
23
|
+
info "transaction_id: #{ message.transaction_id.to_hex }"
|
|
24
|
+
info "buffer_id: #{ message.buffer_id.to_hex }"
|
|
25
|
+
info "total_len: #{ message.total_len }"
|
|
26
|
+
info "in_port: #{ message.in_port }"
|
|
27
|
+
info "reason: #{ message.reason.to_hex }"
|
|
28
|
+
info "data: #{ message.data.unpack "H*" }"
|
|
33
29
|
end
|
|
34
30
|
end
|
|
35
31
|
|
|
@@ -62,7 +62,7 @@ dump_and_delete_filters( int status, int n_entries, packetin_filter_entry *entri
|
|
|
62
62
|
dump_filters( status, n_entries, entries, user_data );
|
|
63
63
|
|
|
64
64
|
struct ofp_match *match = user_data;
|
|
65
|
-
char *service_name = xstrdup( get_trema_name() );
|
|
65
|
+
char *service_name = xstrdup( get_trema_name() );
|
|
66
66
|
bool ret = delete_packetin_filter( *match, UINT16_MAX, service_name, true, delete_filter_completed, user_data );
|
|
67
67
|
xfree( service_name );
|
|
68
68
|
if ( ret == false ) {
|
|
@@ -83,7 +83,7 @@ add_filter_completed( int status, void *user_data ) {
|
|
|
83
83
|
info( "A packetin filter was added successfully." );
|
|
84
84
|
|
|
85
85
|
struct ofp_match *match = user_data;
|
|
86
|
-
char *service_name = xstrdup( get_trema_name() );
|
|
86
|
+
char *service_name = xstrdup( get_trema_name() );
|
|
87
87
|
bool ret = dump_packetin_filter( *match, UINT16_MAX, service_name, true, dump_filters, user_data );
|
|
88
88
|
xfree( service_name );
|
|
89
89
|
if ( ret == false ) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1 2
|
data/{features/step_definitions/show_stats_steps.rb → src/examples/patch_panel/patch-panel.rb}
RENAMED
|
@@ -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,21 +16,39 @@
|
|
|
18
16
|
#
|
|
19
17
|
|
|
20
18
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
class PatchPanel < Controller
|
|
20
|
+
def start
|
|
21
|
+
@patch = []
|
|
22
|
+
File.open( "./patch-panel.conf" ).each_line do | each |
|
|
23
|
+
if /^(\d+)\s+(\d+)$/=~ each
|
|
24
|
+
@patch << [ $1.to_i, $2.to_i ]
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
25
28
|
|
|
26
29
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
end
|
|
30
|
+
def switch_ready datapath_id
|
|
31
|
+
@patch.each do | port_a, port_b |
|
|
32
|
+
make_patch datapath_id, port_a, port_b
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
private
|
|
31
38
|
|
|
32
39
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
40
|
+
def make_patch datapath_id, port_a, port_b
|
|
41
|
+
send_flow_mod_add(
|
|
42
|
+
datapath_id,
|
|
43
|
+
:match => Match.new( :in_port => port_a ),
|
|
44
|
+
:actions => SendOutPort.new( port_b )
|
|
45
|
+
)
|
|
46
|
+
send_flow_mod_add(
|
|
47
|
+
datapath_id,
|
|
48
|
+
:match => Match.new( :in_port => port_b ),
|
|
49
|
+
:actions => SendOutPort.new( port_a )
|
|
50
|
+
)
|
|
51
|
+
end
|
|
36
52
|
end
|
|
37
53
|
|
|
38
54
|
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
#
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
class
|
|
23
|
+
class SwitchInfo < Controller
|
|
24
24
|
def switch_ready datapath_id
|
|
25
25
|
send_message datapath_id, FeaturesRequest.new
|
|
26
26
|
end
|
|
@@ -33,7 +33,7 @@ class SwitchInfoController < Controller
|
|
|
33
33
|
info "n_tables: %u" % message.n_tables
|
|
34
34
|
info "capabilities: %u" % message.capabilities
|
|
35
35
|
info "actions: %u" % message.actions
|
|
36
|
-
info "ports: %
|
|
36
|
+
info "#ports: %d" % message.ports.size
|
|
37
37
|
shutdown!
|
|
38
38
|
end
|
|
39
39
|
end
|
|
@@ -48,11 +48,11 @@ handle_features_reply (
|
|
|
48
48
|
UNUSED( user_data );
|
|
49
49
|
|
|
50
50
|
info( "datapath_id: %#" PRIx64, datapath_id );
|
|
51
|
-
info( "transaction_id: %#
|
|
52
|
-
info( "n_buffers: %
|
|
51
|
+
info( "transaction_id: %#" PRIx32 "", transaction_id );
|
|
52
|
+
info( "n_buffers: %" PRIu32 "", n_buffers );
|
|
53
53
|
info( "n_tables: %u", n_tables );
|
|
54
|
-
info( "capabilities: %
|
|
55
|
-
info( "actions: %
|
|
54
|
+
info( "capabilities: %" PRIu32 "", capabilities );
|
|
55
|
+
info( "actions: %" PRIu32 "", actions );
|
|
56
56
|
info( "#ports: %d", list_length_of( phy_ports ) );
|
|
57
57
|
|
|
58
58
|
stop_trema();
|
|
@@ -30,7 +30,7 @@ join( char *result, const list_element *switches ) {
|
|
|
30
30
|
const list_element *element;
|
|
31
31
|
for ( element = switches; element != NULL; element = element->next ) {
|
|
32
32
|
char tmp[ 19 ]; // "0x" + 64bits in hex + '\0'
|
|
33
|
-
snprintf( tmp, sizeof( tmp ), "%#" PRIx64, *
|
|
33
|
+
snprintf( tmp, sizeof( tmp ), "%#" PRIx64, *( uint64_t * ) element->data );
|
|
34
34
|
strcat( result, tmp );
|
|
35
35
|
strcat( result, comma );
|
|
36
36
|
}
|
|
@@ -56,7 +56,7 @@ delete_switches( list_element *switches ) {
|
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
|
|
59
|
-
static void
|
|
59
|
+
static void
|
|
60
60
|
insert_datapath_id( list_element **switches, uint64_t datapath_id ) {
|
|
61
61
|
list_element *element = NULL;
|
|
62
62
|
for ( element = *switches; element != NULL; element = element->next ) {
|
|
@@ -121,7 +121,7 @@ show_switches( void *user_data ) {
|
|
|
121
121
|
char *list = xmalloc( 20 * num_switch + 1 ); // 20 = dpid string (18 chars) + ", "
|
|
122
122
|
list[ 0 ] = '\0';
|
|
123
123
|
join( list, *switches );
|
|
124
|
-
info( "All switches
|
|
124
|
+
info( "All switches = %s", list );
|
|
125
125
|
xfree( list );
|
|
126
126
|
}
|
|
127
127
|
|
|
@@ -32,16 +32,16 @@ create_counter() {
|
|
|
32
32
|
|
|
33
33
|
void
|
|
34
34
|
add_counter( hash_table *db, uint8_t *mac, uint64_t packet_count, uint64_t byte_count ) {
|
|
35
|
-
counter *
|
|
36
|
-
if (
|
|
37
|
-
|
|
38
|
-
memcpy(
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
insert_hash_entry( db,
|
|
35
|
+
counter *entry = lookup_hash_entry( db, mac );
|
|
36
|
+
if ( entry == NULL ) {
|
|
37
|
+
entry = xmalloc( sizeof( counter ) );
|
|
38
|
+
memcpy( entry->mac, mac, ETH_ADDRLEN );
|
|
39
|
+
entry->packet_count = 0;
|
|
40
|
+
entry->byte_count = 0;
|
|
41
|
+
insert_hash_entry( db, entry->mac, entry );
|
|
42
42
|
}
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
entry->packet_count += packet_count;
|
|
44
|
+
entry->byte_count += byte_count;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
|
|
@@ -32,23 +32,23 @@ create_fdb() {
|
|
|
32
32
|
|
|
33
33
|
uint16_t
|
|
34
34
|
lookup_fdb( hash_table *db, uint8_t *mac ) {
|
|
35
|
-
fdb *
|
|
36
|
-
return ( uint16_t ) (
|
|
35
|
+
fdb *entry = lookup_hash_entry( db, mac );
|
|
36
|
+
return ( uint16_t ) ( entry == NULL ? ENTRY_NOT_FOUND_IN_FDB : entry->port_number );
|
|
37
37
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
void
|
|
42
42
|
learn_fdb( hash_table *db, uint8_t *mac, uint16_t port_number ) {
|
|
43
|
-
fdb *
|
|
44
|
-
if (
|
|
45
|
-
|
|
46
|
-
memcpy(
|
|
47
|
-
|
|
48
|
-
insert_hash_entry( db,
|
|
43
|
+
fdb *entry = lookup_hash_entry( db, mac );
|
|
44
|
+
if ( entry == NULL ) {
|
|
45
|
+
entry = xmalloc( sizeof( fdb ) );
|
|
46
|
+
memcpy( entry->mac, mac, ETH_ADDRLEN );
|
|
47
|
+
entry->port_number = port_number;
|
|
48
|
+
insert_hash_entry( db, entry->mac, entry );
|
|
49
49
|
}
|
|
50
50
|
else {
|
|
51
|
-
|
|
51
|
+
entry->port_number = port_number;
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
54
|
|
data/src/lib/arp.h
CHANGED
data/src/lib/buffer.c
CHANGED
|
@@ -191,7 +191,8 @@ append_front_buffer( buffer *buf, size_t length ) {
|
|
|
191
191
|
if ( already_allocated( pbuf, length ) ) {
|
|
192
192
|
memmove( ( char * ) b->data + length, b->data, b->length );
|
|
193
193
|
memset( b->data, 0, length );
|
|
194
|
-
}
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
195
196
|
append_front( pbuf, length );
|
|
196
197
|
}
|
|
197
198
|
b->length += length;
|
|
@@ -235,7 +236,7 @@ append_back_buffer( buffer *buf, size_t length ) {
|
|
|
235
236
|
pthread_mutex_unlock( pbuf->mutex );
|
|
236
237
|
return ( char * ) pbuf->public.data;
|
|
237
238
|
}
|
|
238
|
-
|
|
239
|
+
|
|
239
240
|
if ( !already_allocated( pbuf, length ) ) {
|
|
240
241
|
append_back( pbuf, length );
|
|
241
242
|
}
|
|
@@ -284,7 +285,7 @@ dump_buffer( const buffer *buf, void dump_function( const char *format, ... ) )
|
|
|
284
285
|
pthread_mutex_lock( ( ( const private_buffer * ) buf )->mutex );
|
|
285
286
|
|
|
286
287
|
char *hex = xmalloc( sizeof( char ) * ( buf->length * 2 + 1 ) );
|
|
287
|
-
|
|
288
|
+
uint8_t *datap = buf->data;
|
|
288
289
|
char *hexp = hex;
|
|
289
290
|
for ( unsigned int i = 0; i < buf->length; i++, datap++, hexp += 2 ) {
|
|
290
291
|
snprintf( hexp, 3, "%02x", *datap );
|
data/src/lib/byteorder.c
CHANGED
|
@@ -178,6 +178,19 @@ ntoh_action_enqueue( struct ofp_action_enqueue *dst, const struct ofp_action_enq
|
|
|
178
178
|
}
|
|
179
179
|
|
|
180
180
|
|
|
181
|
+
static void
|
|
182
|
+
copy_action_vendor_body( struct ofp_action_vendor_header *dst, const struct ofp_action_vendor_header *src, size_t body_length ) {
|
|
183
|
+
assert( src != NULL );
|
|
184
|
+
assert( dst != NULL );
|
|
185
|
+
|
|
186
|
+
if ( body_length > 0 ) {
|
|
187
|
+
const void *body_src = ( const char * ) src + sizeof( struct ofp_action_vendor_header );
|
|
188
|
+
void *body_dst = ( char * ) dst + sizeof( struct ofp_action_vendor_header );
|
|
189
|
+
bcopy( body_src, body_dst, body_length );
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
|
|
181
194
|
void
|
|
182
195
|
ntoh_action_vendor( struct ofp_action_vendor_header *dst, const struct ofp_action_vendor_header *src ) {
|
|
183
196
|
assert( src != NULL );
|
|
@@ -186,6 +199,19 @@ ntoh_action_vendor( struct ofp_action_vendor_header *dst, const struct ofp_actio
|
|
|
186
199
|
dst->type = ntohs( src->type );
|
|
187
200
|
dst->len = ntohs( src->len );
|
|
188
201
|
dst->vendor = ntohl( src->vendor );
|
|
202
|
+
copy_action_vendor_body( dst, src, dst->len - sizeof( struct ofp_action_vendor_header ) );
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
void
|
|
207
|
+
hton_action_vendor( struct ofp_action_vendor_header *dst, const struct ofp_action_vendor_header *src ) {
|
|
208
|
+
assert( src != NULL );
|
|
209
|
+
assert( dst != NULL );
|
|
210
|
+
|
|
211
|
+
dst->type = htons( src->type );
|
|
212
|
+
dst->len = htons( src->len );
|
|
213
|
+
dst->vendor = htonl( src->vendor );
|
|
214
|
+
copy_action_vendor_body( dst, src, src->len - sizeof( struct ofp_action_vendor_header ) );
|
|
189
215
|
}
|
|
190
216
|
|
|
191
217
|
|
|
@@ -302,12 +328,12 @@ ntoh_flow_stats( struct ofp_flow_stats *dst, const struct ofp_flow_stats *src )
|
|
|
302
328
|
dst->cookie = ntohll( fs->cookie );
|
|
303
329
|
dst->packet_count = ntohll( fs->packet_count );
|
|
304
330
|
dst->byte_count = ntohll( fs->byte_count );
|
|
305
|
-
|
|
331
|
+
|
|
306
332
|
uint16_t actions_length = ( uint16_t ) ( ntohs( fs->length ) - offsetof( struct ofp_flow_stats, actions ) );
|
|
307
333
|
|
|
308
334
|
struct ofp_action_header *ah_src = fs->actions;
|
|
309
335
|
struct ofp_action_header *ah_dst = dst->actions;
|
|
310
|
-
|
|
336
|
+
|
|
311
337
|
while ( actions_length >= sizeof( struct ofp_action_header ) ) {
|
|
312
338
|
ntoh_action( ah_dst, ah_src );
|
|
313
339
|
actions_length = ( uint16_t ) ( actions_length - ah_dst->len );
|
|
@@ -345,7 +371,7 @@ hton_flow_stats( struct ofp_flow_stats *dst, const struct ofp_flow_stats *src )
|
|
|
345
371
|
|
|
346
372
|
struct ofp_action_header *ah_src = fs->actions;
|
|
347
373
|
struct ofp_action_header *ah_dst = dst->actions;
|
|
348
|
-
|
|
374
|
+
|
|
349
375
|
while ( actions_length >= sizeof( struct ofp_action_header ) ) {
|
|
350
376
|
hton_action( ah_dst, ah_src );
|
|
351
377
|
actions_length = ( uint16_t ) ( actions_length - ah_src->len );
|
|
@@ -433,7 +459,7 @@ ntoh_queue_property( struct ofp_queue_prop_header *dst, const struct ofp_queue_p
|
|
|
433
459
|
|
|
434
460
|
dst->property = ntohs( ph->property );
|
|
435
461
|
dst->len = ntohs( ph->len );
|
|
436
|
-
|
|
462
|
+
|
|
437
463
|
if ( dst->property == OFPQT_MIN_RATE ) {
|
|
438
464
|
struct ofp_queue_prop_min_rate *mr_src = ( struct ofp_queue_prop_min_rate * ) ph;
|
|
439
465
|
struct ofp_queue_prop_min_rate *mr_dst = ( struct ofp_queue_prop_min_rate * ) dst;
|
|
@@ -457,7 +483,7 @@ hton_queue_property( struct ofp_queue_prop_header *dst, const struct ofp_queue_p
|
|
|
457
483
|
|
|
458
484
|
dst->property = htons( ph->property );
|
|
459
485
|
dst->len = htons( ph->len );
|
|
460
|
-
|
|
486
|
+
|
|
461
487
|
if ( src->property == OFPQT_MIN_RATE ) {
|
|
462
488
|
struct ofp_queue_prop_min_rate *mr_src = ( struct ofp_queue_prop_min_rate * ) ph;
|
|
463
489
|
struct ofp_queue_prop_min_rate *mr_dst = ( struct ofp_queue_prop_min_rate * ) dst;
|
data/src/lib/byteorder.h
CHANGED
|
@@ -24,8 +24,8 @@
|
|
|
24
24
|
#define BYTEORDER_H
|
|
25
25
|
|
|
26
26
|
|
|
27
|
-
#include <endian.h>
|
|
28
27
|
#include <byteswap.h>
|
|
28
|
+
#include <endian.h>
|
|
29
29
|
#include <openflow.h>
|
|
30
30
|
|
|
31
31
|
|
|
@@ -72,7 +72,7 @@ void ntoh_action_enqueue( struct ofp_action_enqueue *dst, const struct ofp_actio
|
|
|
72
72
|
#define hton_action_enqueue ntoh_action_enqueue
|
|
73
73
|
|
|
74
74
|
void ntoh_action_vendor( struct ofp_action_vendor_header *dst, const struct ofp_action_vendor_header *src );
|
|
75
|
-
|
|
75
|
+
void hton_action_vendor( struct ofp_action_vendor_header *dst, const struct ofp_action_vendor_header *src );
|
|
76
76
|
|
|
77
77
|
void ntoh_action( struct ofp_action_header *dst, const struct ofp_action_header *src );
|
|
78
78
|
void hton_action( struct ofp_action_header *dst, const struct ofp_action_header *src );
|
data/src/lib/chibach.c
CHANGED
|
@@ -78,12 +78,14 @@ usage() {
|
|
|
78
78
|
printf(
|
|
79
79
|
"Usage: %s [OPTION]...\n"
|
|
80
80
|
"\n"
|
|
81
|
-
" -i, --datapath_id=DATAPATH_ID
|
|
82
|
-
" -c, --controller=IP_ADDR
|
|
83
|
-
" -p, --port=TCP_PORT
|
|
84
|
-
" -d, --daemonize
|
|
85
|
-
" -l, --logging_level=LEVEL
|
|
86
|
-
" -
|
|
81
|
+
" -i, --datapath_id=DATAPATH_ID set datapath id\n"
|
|
82
|
+
" -c, --controller=IP_ADDR set controller host\n"
|
|
83
|
+
" -p, --port=TCP_PORT set controller TCP port\n"
|
|
84
|
+
" -d, --daemonize run in the background\n"
|
|
85
|
+
" -l, --logging_level=LEVEL set logging level\n"
|
|
86
|
+
" -g, --syslog output log messages to syslog\n"
|
|
87
|
+
" -f, --logging_facility=FACILITY set syslog facility\n"
|
|
88
|
+
" -h, --help display this help and exit\n",
|
|
87
89
|
get_chibach_name()
|
|
88
90
|
);
|
|
89
91
|
}
|
data/src/lib/daemon.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
|
|
@@ -125,6 +123,18 @@ extern ssize_t mock_read( int fd, void *buf, size_t count );
|
|
|
125
123
|
#define kill mock_kill
|
|
126
124
|
extern int mock_kill( pid_t pid, int sig );
|
|
127
125
|
|
|
126
|
+
#ifdef readlink
|
|
127
|
+
#undef readlink
|
|
128
|
+
#endif // readlink
|
|
129
|
+
#define readlink mock_readlink
|
|
130
|
+
extern ssize_t mock_readlink( const char *path, char *buf, size_t bufsiz );
|
|
131
|
+
|
|
132
|
+
#ifdef basename
|
|
133
|
+
#undef basename
|
|
134
|
+
#endif // basename
|
|
135
|
+
#define basename mock_basename
|
|
136
|
+
extern char *mock_basename( char *path );
|
|
137
|
+
|
|
128
138
|
#ifdef rename
|
|
129
139
|
#undef rename
|
|
130
140
|
#endif // rename
|
|
@@ -193,7 +203,7 @@ write_pid( const char *directory, const char *name ) {
|
|
|
193
203
|
}
|
|
194
204
|
|
|
195
205
|
char str[ PID_STRING_LENGTH ];
|
|
196
|
-
snprintf( str, sizeof( str ),"%d\n", getpid() );
|
|
206
|
+
snprintf( str, sizeof( str ), "%d\n", getpid() );
|
|
197
207
|
str[ sizeof( str ) - 1 ] = '\0';
|
|
198
208
|
ssize_t ret = write( fd, str, strlen( str ) );
|
|
199
209
|
if ( ret == -1 ) {
|
|
@@ -269,6 +279,22 @@ read_pid( const char *directory, const char *name ) {
|
|
|
269
279
|
return -1;
|
|
270
280
|
}
|
|
271
281
|
|
|
282
|
+
char proc_path[ 32 ];
|
|
283
|
+
char exe_path[ PATH_MAX ];
|
|
284
|
+
sprintf( proc_path, "/proc/%d/exe", pid );
|
|
285
|
+
ssize_t readsiz = readlink( proc_path, exe_path, sizeof( exe_path ) - 1 );
|
|
286
|
+
if ( readsiz == -1 ) {
|
|
287
|
+
warn( "Failed to check process id %d ( %s [%d] ).", pid, strerror( errno ), errno );
|
|
288
|
+
return -1;
|
|
289
|
+
}
|
|
290
|
+
exe_path[ readsiz ] = '\0';
|
|
291
|
+
|
|
292
|
+
char *exe_name = basename( exe_path );
|
|
293
|
+
if ( strcmp( name, exe_name ) != 0 ) {
|
|
294
|
+
warn( "Failed to check process name %s ( %s [%d] ).", name, strerror( errno ), errno );
|
|
295
|
+
return -1;
|
|
296
|
+
}
|
|
297
|
+
|
|
272
298
|
return pid;
|
|
273
299
|
}
|
|
274
300
|
|