add broker output plugin for openflow (at the moment we more or less

just send the flow_mod event along - there still is no feedback) and add
a testcase for it.

Also fix a few other small problems.
This commit is contained in:
Johanna Amann 2015-04-20 16:05:27 -07:00
parent 1fb7f5121e
commit a403dbd83e
9 changed files with 195 additions and 15 deletions

View file

@ -1,2 +1,3 @@
@load ./ryu
@load ./log
@load ./broker

View file

@ -0,0 +1,64 @@
@load base/frameworks/openflow
module OpenFlow;
export {
redef enum Plugin += {
BROKER,
};
## Broker controller constructor.
##
## host: Controller ip.
##
## host_port: Controller listen port.
##
## dpid: OpenFlow switch datapath id.
##
## Returns: OpenFlow::Controller record
global broker_new: function(host: addr, host_port: port, dpid: count): OpenFlow::Controller;
redef record ControllerState += {
## Controller ip.
broker_host: addr &optional;
## Controller listen port.
broker_port: port &optional;
## OpenFlow switch datapath id.
broker_dpid: count &optional;
};
global broker_flow_mod: event(dpid: count, match: ofp_match, flow_mod: ofp_flow_mod);
global broker_flow_clear: event(dpid: count);
}
function broker_describe(state: ControllerState): string
{
return fmt("Broker Plugin - %s:%d - DPID: %d", state$broker_host, state$broker_port, state$broker_dpid);
}
function broker_flow_mod_fun(state: ControllerState, match: ofp_match, flow_mod: OpenFlow::ofp_flow_mod): bool
{
event OpenFlow::broker_flow_mod(state$broker_dpid, match, flow_mod);
return T;
}
function broker_flow_clear_fun(state: OpenFlow::ControllerState): bool
{
event OpenFlow::broker_flow_clear(state$broker_dpid);
return T;
}
# broker controller constructor
function broker_new(host: addr, host_port: port, dpid: count): OpenFlow::Controller
{
BrokerComm::enable();
BrokerComm::auto_event("bro/event/openflow", broker_flow_mod);
BrokerComm::auto_event("bro/event/openflow", broker_flow_clear);
BrokerComm::connect(cat(host), host_port, 1sec);
return [$state=[$broker_host=host, $broker_port=host_port, $broker_dpid=dpid, $_plugin=OpenFlow::BROKER],
$flow_mod=broker_flow_mod_fun, $flow_clear=broker_flow_clear_fun, $describe=broker_describe];
}

View file

@ -1,16 +1,18 @@
##! OpenFlow module that outputs flow-modification commands
##! to a Bro log file.
module OpenFlow;
@load base/frameworks/openflow
@load base/frameworks/logging
module OpenFlow;
export {
redef enum Plugin += {
LOG,
OFLOG,
};
redef enum Log::ID += { LOG };
## Log controller constructor.
##
## dpid: OpenFlow switch datapath id.
@ -42,12 +44,12 @@ export {
event bro_init() &priority=5
{
Log::create_stream(LOG, [$columns=Info, $ev=log_openflow, $path="openflow"]);
Log::create_stream(OpenFlow::LOG, [$columns=Info, $ev=log_openflow, $path="openflow"]);
}
function log_flow_mod(state: ControllerState, match: ofp_match, flow_mod: OpenFlow::ofp_flow_mod): bool
{
Log::write(LOG, [$ts=network_time(), $dpid=state$log_dpid, $match=match, $flow_mod=flow_mod]);
Log::write(OpenFlow::LOG, [$ts=network_time(), $dpid=state$log_dpid, $match=match, $flow_mod=flow_mod]);
return T;
}

View file

@ -149,7 +149,7 @@ function ryu_flow_mod(state: OpenFlow::ControllerState, match: ofp_match, flow_m
return T;
}
function ryu_flow_clear(state: OpenFlow::ControllerState): bool
function ryu_flow_clear(state: OpenFlow::ControllerState): bool
{
local url=cat("http://", cat(state$ryu_host), ":", cat(state$ryu_port), RYU_FLOWENTRY_PATH, "clear", "/", state$ryu_dpid);