// These TPKT and X224 wrappers are connected directly to OUT for
// handshake sequence
new ClientTpkt("client_tpkt_ot"),
new ClientX224DataPDU("client_x224_data_ot")
);
// If HyperV VM ID is set, then insert element which will send VM ID as
// first packet of connection, before other packets
if (hyperv) {
// HyperV: pcb SSL credssp cookie x224 main.
link("IN",
// Pre Connection Blob
"pcb",
// Main (will be used after connection seq) or tpkt (to X224)
"server_fastpath >tpkt",
// SSL
"upgrade_to_ssl",
// CredSSP
"client_ntlmssp_nego", "server_ntlmssp_challenge", "client_ntlmssp_auth", "server_ntlmssp_confirm", "client_ntlmssp_finish",
// Cookie
"client_connection_req", "server_connection_conf",
// X224
"client_initial_conference_create");
for (String element : new String[] {"pcb", "client_ntlmssp_nego", "server_ntlmssp_challenge", "client_ntlmssp_auth", "server_ntlmssp_confirm",
"client_ntlmssp_finish"}) {
link(element + " >otout", element + "< OUT");
}
} else {
// RDP: cookie SSL (credssp) x224 main.
link("IN",
// Main or tpkt
"server_fastpath >tpkt",
// Cookie
"client_connection_req", "server_connection_conf",
// SSL
"upgrade_to_ssl");
if (credssp) {
// SSL
link("upgrade_to_ssl",
// CredSSP
"client_ntlmssp_nego", "server_ntlmssp_challenge", "client_ntlmssp_auth", "server_ntlmssp_confirm", "client_ntlmssp_finish",
// X224
"client_initial_conference_create");
for (String element : new String[] {"client_ntlmssp_nego", "server_ntlmssp_challenge", "client_ntlmssp_auth", "server_ntlmssp_confirm",
"client_ntlmssp_finish"}) {
link(element + " >otout", element + "< OUT");
}
} else {
link(
// SSL
"upgrade_to_ssl",
// X224
"client_initial_conference_create");
}
}
link(
// X224
"client_initial_conference_create", "server_initial_conference_create",
"client_erect_domain",
"server_x224_data",
"client_atach_user", "server_atach_user_confirm",
"client_channel_join_rdprdr",
"client_info_req",
"server_valid_client"
);
// Chain for direct handshake responses (without involving of queue)
link("client_x224_data_ot", "client_tpkt_ot", "client_tpkt_ot< OUT");
// Connect one time outputs to client TPKT input
String tpkt_peers[] = new String[] {"client_connection_req", "server_connection_conf", "upgrade_to_ssl", "client_x224_data_ot"};
for (String element : tpkt_peers) {
link(element + " >otout", element + "< client_tpkt_ot");
}
// Connect one time outputs to client X224 input
String x224_peers[] = new String[] {"client_initial_conference_create", "server_initial_conference_create", "client_erect_domain", "client_atach_user",
"server_atach_user_confirm", "client_channel_join_rdprdr", "client_info_req", "server_valid_client"};
for (String element : x224_peers) {
link(element + " >otout", element + "< client_x224_data_ot");
}
//
// Transition
//
add(
// To transfer packets between input threads and output thread.
new Queue("queue"),
// Slow path: MultiChannel Support
new ServerMCSPDU("server_mcs")
);
// Last element of handshake sequence will wake up queue and and socket
// output pull loop, which will switch links, between socket output and
// queue, from push mode to pull mode.
link(HANDSHAKE_END + " >queue", "queue", "OUT");
// Transition from handshake sequence for slow path packets
link(HANDSHAKE_END, "server_mcs");
//
// Main network
//
mouseEventSource = new AwtMouseEventSource("mouse");
keyEventSource = new AwtKeyEventSource("keyboard");
// Subscribe packet sender to various events
canvas.addMouseListener(mouseEventSource);
canvas.addMouseMotionListener(mouseEventSource);
canvas.addKeyListener(keyEventSource);
// Add elements
add(
new ServerIOChannelRouter("server_io_channel", state),
new ServerDemandActivePDU("server_demand_active", screen, state),
new ClientConfirmActivePDU("client_confirm_active", screen, state),
new ServerBitmapUpdate("server_bitmap_update"),
new AwtCanvasAdapter("canvas_adapter", canvas, screen),
new ServerPaletteUpdate("server_palette", screen),
keyEventSource, new AwtRdpKeyboardAdapter("keyboard_adapter"),
mouseEventSource, new AwtRdpMouseAdapter("mouse_adapter"),
// These FastPath, TPKT, and X224 wrappers are connected to queue
new ClientTpkt("client_tpkt_queue"),
new ClientX224DataPDU("client_x224_data_queue"),
new ClientFastPathPDU("client_fastpath_queue"));
// Server packet handlers
link("server_mcs >channel_1003", "server_io_channel");