#include <stdbool.h>
#include "core/or/or.h"
#define BTRACK_ORCONN_PRIVATE
#include "core/or/orconn_event.h"
#include "feature/control/btrack_orconn.h"
#include "feature/control/btrack_orconn_cevent.h"
#include "feature/control/control_events.h"
static bool bto_first_orconn = false;
static bool
using_pt(const bt_orconn_t *bto)
{
return bto->proxy_type == PROXY_PLUGGABLE;
}
static bool
using_proxy(const bt_orconn_t *bto)
{
switch (bto->proxy_type) {
case PROXY_CONNECT:
case PROXY_SOCKS4:
case PROXY_SOCKS5:
case PROXY_HAPROXY:
return true;
default:
return false;
}
}
void
bto_cevent_anyconn(const bt_orconn_t *bto)
{
switch (bto->state) {
case OR_CONN_STATE_CONNECTING:
if (using_pt(bto))
control_event_bootstrap(BOOTSTRAP_STATUS_CONN_PT, 0);
else if (using_proxy(bto))
control_event_bootstrap(BOOTSTRAP_STATUS_CONN_PROXY, 0);
else
control_event_bootstrap(BOOTSTRAP_STATUS_CONN, 0);
break;
case OR_CONN_STATE_PROXY_HANDSHAKING:
if (using_pt(bto))
control_event_bootstrap(BOOTSTRAP_STATUS_CONN_DONE_PT, 0);
else if (using_proxy(bto))
control_event_bootstrap(BOOTSTRAP_STATUS_CONN_DONE_PROXY, 0);
break;
case OR_CONN_STATE_TLS_HANDSHAKING:
control_event_bootstrap(BOOTSTRAP_STATUS_CONN_DONE, 0);
break;
case OR_CONN_STATE_TLS_CLIENT_RENEGOTIATING:
case OR_CONN_STATE_OR_HANDSHAKING_V2:
case OR_CONN_STATE_OR_HANDSHAKING_V3:
control_event_bootstrap(BOOTSTRAP_STATUS_HANDSHAKE, 0);
break;
case OR_CONN_STATE_OPEN:
control_event_bootstrap(BOOTSTRAP_STATUS_HANDSHAKE_DONE, 0);
control_event_boot_first_orconn();
bto_first_orconn = true;
break;
default:
break;
}
}
void
bto_cevent_apconn(const bt_orconn_t *bto)
{
if (!bto_first_orconn)
return;
switch (bto->state) {
case OR_CONN_STATE_CONNECTING:
if (using_pt(bto))
control_event_bootstrap(BOOTSTRAP_STATUS_AP_CONN_PT, 0);
else if (using_proxy(bto))
control_event_bootstrap(BOOTSTRAP_STATUS_AP_CONN_PROXY, 0);
else
control_event_bootstrap(BOOTSTRAP_STATUS_AP_CONN, 0);
break;
case OR_CONN_STATE_PROXY_HANDSHAKING:
if (using_pt(bto))
control_event_bootstrap(BOOTSTRAP_STATUS_AP_CONN_DONE_PT, 0);
else if (using_proxy(bto))
control_event_bootstrap(BOOTSTRAP_STATUS_AP_CONN_DONE_PROXY, 0);
break;
case OR_CONN_STATE_TLS_HANDSHAKING:
control_event_bootstrap(BOOTSTRAP_STATUS_AP_CONN_DONE, 0);
break;
case OR_CONN_STATE_TLS_CLIENT_RENEGOTIATING:
case OR_CONN_STATE_OR_HANDSHAKING_V2:
case OR_CONN_STATE_OR_HANDSHAKING_V3:
control_event_bootstrap(BOOTSTRAP_STATUS_AP_HANDSHAKE, 0);
break;
case OR_CONN_STATE_OPEN:
control_event_bootstrap(BOOTSTRAP_STATUS_AP_HANDSHAKE_DONE, 0);
break;
default:
break;
}
}
void
bto_cevent_reset(void)
{
bto_first_orconn = false;
}