#include "oplock_break_handler.h"
#include "system/network.h"
#include "lib/util/util_net.h"
+#include "torture/smb2/block.h"
#define BASEDIR "multichanneltestdir"
bool share_is_so;
uint32_t server_capabilities;
struct fsctl_net_iface_info info;
+ uint16_t local_port = 0;
+ bool block_ok = false;
+ bool unblock_ok = false;
if (smbXcli_conn_protocol(transport1->conn) < PROTOCOL_SMB3_00) {
torture_skip(tctx, "SMB 3.X Dialect family required for "
smb2_keepalive(transport2C);
+ local_port = torture_get_local_port_from_transport(transport2C);
+
+ torture_comment(tctx, "transport2C uses tcp port: %d\n", local_port);
+
torture_comment(tctx, "client2 opens fname1 via session 2A\n");
/* 2a opens file1 */
torture_reset_break_info(tctx, &break_info);
+ /* block tcp connection of transport2C */
+ block_ok = torture_block_tcp_transport(tctx, transport2C);
+ torture_assert(tctx, block_ok, "we could not block tcp transport");
+
/*
* 1 opens file2
* batchoplock break?
CHECK_VAL(io2.out.timeout, 0);
}
CHECK_VAL(io2.out.durable_open, false);
- CHECK_VAL(break_info.count, 2);
- CHECK_PTR(break_info.received_transport, transport2C);
+
+ /*
+ * Important: when filtered, Windows will really let the open succeed
+ * and *NOT* send a new oplock break over the remaining channels, thus
+ * the break info count stays at one.
+ */
+
+ CHECK_VAL(break_info.count, 1);
if (h != NULL) {
smb2_util_close(tree1, *h);
}
done:
+ if (block_ok && !unblock_ok) {
+ /* unblock tcp connection of transport2C */
+ unblock_ok = torture_unblock_tcp_transport(tctx, transport2C);
+ }
+
tree1->session = session1;
smb2_util_close(tree1, h_client1_file1);