mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 14:48:21 +00:00

Looked like a possible race condition in how the test was structured: an endpoint sees its peer got lost and likewise exits immediately before having a chance to process events the peer had sent just before exiting. Fix is to reverse which endpoint initiates the termination sequence so we can be sure we see the required events.
117 lines
2.9 KiB
Text
117 lines
2.9 KiB
Text
# @TEST-PORT: BROKER_PORT
|
|
# @TEST-EXEC: btest-bg-run recv "bro -b ../recv.zeek >recv.out"
|
|
# @TEST-EXEC: btest-bg-run send "bro -b -r $TRACES/smtp.trace --pseudo-realtime ../send.zeek >send.out"
|
|
|
|
# @TEST-EXEC: btest-bg-wait 20
|
|
# @TEST-EXEC: btest-diff recv/recv.out
|
|
# @TEST-EXEC: btest-diff send/send.out
|
|
|
|
@TEST-START-FILE send.zeek
|
|
|
|
@load base/protocols/conn
|
|
@load base/frameworks/openflow
|
|
|
|
redef exit_only_after_terminate = T;
|
|
|
|
global of_controller: OpenFlow::Controller;
|
|
|
|
event zeek_init()
|
|
{
|
|
suspend_processing();
|
|
of_controller = OpenFlow::broker_new("broker1", 127.0.0.1, to_port(getenv("BROKER_PORT")), "bro/openflow", 42);
|
|
}
|
|
|
|
event Broker::peer_added(endpoint: Broker::EndpointInfo, msg: string)
|
|
{
|
|
print "Broker peer added", endpoint$network$address, endpoint$network$bound_port == to_port(getenv("BROKER_PORT"));
|
|
}
|
|
|
|
event Broker::peer_lost(endpoint: Broker::EndpointInfo, msg: string)
|
|
{
|
|
terminate();
|
|
}
|
|
|
|
event OpenFlow::controller_activated(name: string, controller: OpenFlow::Controller)
|
|
{
|
|
continue_processing();
|
|
OpenFlow::flow_clear(of_controller);
|
|
OpenFlow::flow_mod(of_controller, [], [$cookie=OpenFlow::generate_cookie(1), $command=OpenFlow::OFPFC_ADD, $actions=[$out_ports=vector(3, 7)]]);
|
|
}
|
|
|
|
event connection_established(c: connection)
|
|
{
|
|
print "connection established";
|
|
local match = OpenFlow::match_conn(c$id);
|
|
local match_rev = OpenFlow::match_conn(c$id, T);
|
|
|
|
local flow_mod: OpenFlow::ofp_flow_mod = [
|
|
$cookie=OpenFlow::generate_cookie(42),
|
|
$command=OpenFlow::OFPFC_ADD,
|
|
$idle_timeout=30,
|
|
$priority=5
|
|
];
|
|
|
|
OpenFlow::flow_mod(of_controller, match, flow_mod);
|
|
OpenFlow::flow_mod(of_controller, match_rev, flow_mod);
|
|
}
|
|
|
|
global msg_count: count = 0;
|
|
|
|
function got_message()
|
|
{
|
|
++msg_count;
|
|
|
|
if ( msg_count == 6 )
|
|
terminate();
|
|
}
|
|
|
|
event OpenFlow::flow_mod_success(name: string, match: OpenFlow::ofp_match, flow_mod: OpenFlow::ofp_flow_mod, msg: string)
|
|
{
|
|
print "Flow_mod_success";
|
|
got_message();
|
|
}
|
|
|
|
event OpenFlow::flow_mod_failure(name: string, match: OpenFlow::ofp_match, flow_mod: OpenFlow::ofp_flow_mod, msg: string)
|
|
{
|
|
print "Flow_mod_failure";
|
|
got_message();
|
|
}
|
|
|
|
@TEST-END-FILE
|
|
|
|
@TEST-START-FILE recv.zeek
|
|
|
|
@load base/frameworks/openflow
|
|
|
|
redef exit_only_after_terminate = T;
|
|
|
|
event zeek_init()
|
|
{
|
|
Broker::subscribe("bro/openflow");
|
|
Broker::listen("127.0.0.1", to_port(getenv("BROKER_PORT")));
|
|
}
|
|
|
|
event Broker::peer_added(endpoint: Broker::EndpointInfo, msg: string)
|
|
{
|
|
print "Broker peer added";
|
|
}
|
|
|
|
event Broker::peer_lost(endpoint: Broker::EndpointInfo, msg: string)
|
|
{
|
|
terminate();
|
|
}
|
|
|
|
event OpenFlow::broker_flow_mod(name: string, dpid: count, match: OpenFlow::ofp_match, flow_mod: OpenFlow::ofp_flow_mod)
|
|
{
|
|
print "got flow_mod", dpid, match, flow_mod;
|
|
Broker::publish("bro/openflow", OpenFlow::flow_mod_success, name, match, flow_mod, "");
|
|
Broker::publish("bro/openflow", OpenFlow::flow_mod_failure, name, match, flow_mod, "");
|
|
}
|
|
|
|
event OpenFlow::broker_flow_clear(name: string, dpid: count)
|
|
{
|
|
print "flow_clear", dpid;
|
|
}
|
|
|
|
@TEST-END-FILE
|
|
|