Skip to content

Commit

Permalink
Merge pull request #127 from trema/feature/thread_safe
Browse files Browse the repository at this point in the history
Thread safe.
  • Loading branch information
yasuhito committed Feb 17, 2015
2 parents 7f487d1 + b88d4a3 commit 8905b6b
Show file tree
Hide file tree
Showing 20 changed files with 307 additions and 283 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
@@ -1,6 +1,8 @@
# Changelog

## develop (unreleased)
### Bugs fixed
* [#127](https://github.com/trema/pio/pull/127): Make OpenFlow classes thread safe.


## 0.15.0 (2/12/2015)
Expand Down
14 changes: 6 additions & 8 deletions lib/pio/echo.rb
Expand Up @@ -3,14 +3,12 @@
module Pio
# OpenFlow 1.0 Echo Request and Reply message.
module Echo
# @!parse
# # OpenFlow 1.0 Echo Request message.
# class Request < OpenFlow::Message; end
class Request < OpenFlow::Message.factory(OpenFlow::Type::ECHO_REQUEST); end
# OpenFlow 1.0 Echo Request message.
class Request; end
OpenFlow::Message.factory(Request, OpenFlow::ECHO_REQUEST)

# @!parse
# # OpenFlow 1.0 Echo Reply message.
# class Reply < OpenFlow::Message; end
class Reply < OpenFlow::Message.factory(OpenFlow::Type::ECHO_REPLY); end
# OpenFlow 1.0 Echo Reply message.
class Reply; end
OpenFlow::Message.factory(Reply, OpenFlow::ECHO_REPLY)
end
end
13 changes: 7 additions & 6 deletions lib/pio/features.rb
Expand Up @@ -4,14 +4,13 @@ module Pio
# OpenFlow 1.0 Features Request and Reply message.
class Features
# OpenFlow 1.0 Features Request message.
class Request < OpenFlow::Message.factory(OpenFlow::Type::FEATURES_REQUEST)
end
class Request; end
OpenFlow::Message.factory(Request, OpenFlow::FEATURES_REQUEST)

# OpenFlow 1.0 Features Reply message
class Reply < OpenFlow::Message.factory(OpenFlow::Type::FEATURES_REPLY)
class Reply
# Message body of features reply.
class ReplyBody < BinData::Record
extend Flags
class Body < BinData::Record
extend OpenFlow::Flags

# enum ofp_capabilities
flags_32bit :capabilities,
Expand Down Expand Up @@ -58,7 +57,9 @@ def length
24 + ports.to_binary_s.length
end
end
end

OpenFlow::Message.factory(Reply, OpenFlow::FEATURES_REPLY) do
def_delegators :body, :datapath_id
def_delegator :body, :datapath_id, :dpid
def_delegators :body, :n_buffers
Expand Down
11 changes: 7 additions & 4 deletions lib/pio/flow_mod.rb
@@ -1,9 +1,10 @@
require 'pio/match'
require 'pio/open_flow'

# Base module.
module Pio
# OpenFlow 1.0 flow setup and teardown message.
class FlowMod < OpenFlow::Message.factory(OpenFlow::Type::FLOW_MOD)
# OpenFlow 1.0 Flow Mod message.
class FlowMod
# enum ofp_flow_mod_command
class Command < BinData::Primitive
COMMANDS = {
Expand All @@ -27,7 +28,7 @@ def set(value)
end

# Message body of FlowMod.
class FlowModBody < BinData::Record
class Body < BinData::Record
# Pio::MatchFormat wrapper.
class Match < BinData::Primitive
endian :big
Expand All @@ -43,7 +44,7 @@ def get
end
end

extend Flags
extend OpenFlow::Flags

flags_16bit :flags,
[:send_flow_rem,
Expand Down Expand Up @@ -71,7 +72,9 @@ def length
64 + actions.binary.length
end
end
end

OpenFlow::Message.factory(FlowMod, OpenFlow::FLOW_MOD) do
def_delegators :body, :match
def_delegators :body, :cookie
def_delegators :body, :command
Expand Down
8 changes: 4 additions & 4 deletions lib/pio/hello.rb
@@ -1,8 +1,8 @@
require 'pio/open_flow'

# Base module.
module Pio
# @!parse
# # OpenFlow 1.0 Hello message
# class Hello < OpenFlow::Message; end
class Hello < OpenFlow::Message.factory(Pio::OpenFlow::Type::HELLO); end
# OpenFlow 1.0 Hello message
class Hello; end
OpenFlow::Message.factory(Hello, OpenFlow::HELLO)
end
17 changes: 16 additions & 1 deletion lib/pio/open_flow.rb
@@ -1,7 +1,22 @@
module Pio
# OpenFlow specific types.
module OpenFlow
# OFPT_* constants.
HELLO = 0
ECHO_REQUEST = 2
ECHO_REPLY = 3
FEATURES_REQUEST = 5
FEATURES_REPLY = 6
PACKET_IN = 10
PORT_STATUS = 12
PACKET_OUT = 13
FLOW_MOD = 14
end
end

require 'pio/open_flow/actions'
require 'pio/open_flow/flags'
require 'pio/open_flow/message'
require 'pio/open_flow/open_flow_header'
require 'pio/open_flow/phy_port'
require 'pio/open_flow/port_number'
require 'pio/open_flow/type'
94 changes: 50 additions & 44 deletions lib/pio/open_flow/flags.rb
@@ -1,55 +1,61 @@
# bitmap functions.
# This class smells of :reek:DataClump
module Flags
def flags_32bit(name, flags)
_def_flags name, 32, flags
end
module Pio
module OpenFlow
# bitmap functions.
# This class smells of :reek:DataClump
module Flags
def flags_32bit(name, flags)
_def_flags name, 32, flags
end

def flags_16bit(name, flags)
_def_flags name, 16, flags
end
def flags_16bit(name, flags)
_def_flags name, 16, flags
end

# rubocop:disable MethodLength
# This method smells of :reek:TooManyStatements
def _def_flags(name, size, flags)
flag_value = case flags
when Array
shift = 0
flags.each_with_object({}) do |each, result|
result[each] = 1 << shift
shift += 1
result
end
when Hash
flags
end
# rubocop:disable MethodLength
# This method smells of :reek:TooManyStatements
def _def_flags(name, size, flags)
flag_value = case flags
when Array
shift = 0
flags.each_with_object({}) do |each, result|
result[each] = 1 << shift
shift += 1
result
end
when Hash
flags
end

klass_name = name.to_s.split('_').map(&:capitalize).join
flags_hash = flag_value.inspect
klass_name = name.to_s.split('_').map(&:capitalize).join
flags_hash = flag_value.inspect

code = %{
class #{klass_name} < BinData::Primitive
endian :big
code = %{
class #{klass_name} < BinData::Primitive
endian :big
uint#{size} :#{name}
uint#{size} :#{name}
def get
list = #{flags_hash}
list.each_with_object([]) do |(key, value), result|
result << key if #{name} & value != 0
result
end
end
def get
list = #{flags_hash}
list.each_with_object([]) do |(key, value), result|
result << key if #{name} & value != 0
result
end
end
def set(v)
list = #{flags_hash}
v.each do |each|
fail "Invalid state flag: \#{v}" unless list.keys.include?(each)
def set(v)
list = #{flags_hash}
v.each do |each|
fail "Invalid state flag: \#{v}" unless list.keys.include?(each)
end
self.#{name} = v.empty? ?
0 :
v.map { |each| list[each] }.inject(:|)
end
end
self.#{name} = v.empty? ? 0 : v.map { |each| list[each] }.inject(:|)
end
}
module_eval code
end
}
module_eval code
end
end
end

0 comments on commit 8905b6b

Please sign in to comment.