lib/trema/switch.rb in trema-0.5.1 vs lib/trema/switch.rb in trema-0.6.0

- old
+ new

@@ -1,10 +1,14 @@ require 'pio' module Trema # OpenFlow switch. class Switch + attr_reader :error_message + + class InitError < StandardError; end + include Pio OPENFLOW_HEADER_LENGTH = 8 def initialize(socket) @@ -33,54 +37,49 @@ end private def exchange_hello_messages - fail 'Failed to exchange Hello messages' unless read.is_a?(Hello) write Hello.new + expect_receiving Hello end def exchange_echo_messages write Echo::Request.new - loop do - message = read - if message.is_a?(Echo::Reply) - break - else - handle_early message 'Failed to exchange Echo messages' - end - end + expect_receiving Echo::Reply end def exchange_features_messages write Features::Request.new + @features_reply = expect_receiving(Features::Reply) + end + + # rubocop:disable MethodLength + def expect_receiving(expected_message_klass) loop do message = read - if message.is_a?(Features::Reply) - @features_reply = message - break + case message + when expected_message_klass + return message + when Echo::Request + write Echo::Reply.new(xid: message.xid) + when PacketIn, PortStatus # , FlowRemoved (not implemented yet) + return + when OpenFlow10::Error::HelloFailed, OpenFlow13::Error::HelloFailed + @error_message = message + fail InitError, message.description else - handle_early message 'Failed to exchange Features messages' + fail "Failed to receive #{expected_message_klass} message" end end end + # rubocop:enable MethodLength - def handle_early(message, fail_message) - case message - when Echo::Request - write Echo::Reply.new xid: message.xid - when PacketIn, FlowRemoved, PortStatus - return - else - fail fail_message - end - end - def read_openflow_binary header_binary = drain(OPENFLOW_HEADER_LENGTH) header = OpenFlowHeaderParser.read(header_binary) - body_binary = drain(header.message_length - OPENFLOW_HEADER_LENGTH) - fail if (header_binary + body_binary).length != header.message_length + body_binary = drain(header.length - OPENFLOW_HEADER_LENGTH) + fail if (header_binary + body_binary).length != header.length header_binary + body_binary end def drain(length) buffer = ''