mirror of
https://github.com/hufrea/byedpi.git
synced 2024-12-22 14:25:44 +00:00
Unify trigger logic
This commit is contained in:
parent
6efcafaf53
commit
315a0a2826
102
extend.c
102
extend.c
@ -26,7 +26,7 @@
|
|||||||
#define KEY_SIZE sizeof(struct sockaddr_ina)
|
#define KEY_SIZE sizeof(struct sockaddr_ina)
|
||||||
|
|
||||||
|
|
||||||
int set_timeout(int fd, unsigned int s)
|
static int set_timeout(int fd, unsigned int s)
|
||||||
{
|
{
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
if (setsockopt(fd, IPPROTO_TCP,
|
if (setsockopt(fd, IPPROTO_TCP,
|
||||||
@ -151,7 +151,7 @@ int socket_mod(int fd, struct sockaddr *dst)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int reconnect(struct poolhd *pool, struct eval *val, int m)
|
static int reconnect(struct poolhd *pool, struct eval *val, int m)
|
||||||
{
|
{
|
||||||
assert(val->flag == FLAG_CONN);
|
assert(val->flag == FLAG_CONN);
|
||||||
|
|
||||||
@ -172,7 +172,7 @@ int reconnect(struct poolhd *pool, struct eval *val, int m)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool check_host(struct mphdr *hosts, char *buffer, ssize_t n)
|
static bool check_host(struct mphdr *hosts, char *buffer, ssize_t n)
|
||||||
{
|
{
|
||||||
char *host = 0;
|
char *host = 0;
|
||||||
int len;
|
int len;
|
||||||
@ -196,7 +196,7 @@ bool check_host(struct mphdr *hosts, char *buffer, ssize_t n)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool check_proto_tcp(int proto, char *buffer, ssize_t n)
|
static bool check_proto_tcp(int proto, char *buffer, ssize_t n)
|
||||||
{
|
{
|
||||||
if (proto & IS_TCP) {
|
if (proto & IS_TCP) {
|
||||||
return 1;
|
return 1;
|
||||||
@ -212,46 +212,8 @@ bool check_proto_tcp(int proto, char *buffer, ssize_t n)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int on_torst(struct poolhd *pool, struct eval *val)
|
|
||||||
{
|
|
||||||
int m = val->pair->attempt + 1;
|
|
||||||
|
|
||||||
bool can_reconn = (
|
|
||||||
val->pair->buff.locked && !val->recv_count
|
|
||||||
);
|
|
||||||
if (can_reconn || params.auto_level > AUTO_NOSAVE) {
|
|
||||||
for (; m < params.dp_count; m++) {
|
|
||||||
struct desync_params *dp = ¶ms.dp[m];
|
|
||||||
if (!dp->detect) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!(dp->detect & DETECT_TORST)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (can_reconn) {
|
|
||||||
return reconnect(pool, val, m);
|
|
||||||
}
|
|
||||||
mode_add_get(
|
|
||||||
(struct sockaddr_ina *)&val->in6, m);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (m >= params.dp_count && m > 1) {
|
|
||||||
mode_add_get(
|
|
||||||
(struct sockaddr_ina *)&val->in6, 0);
|
|
||||||
}
|
|
||||||
struct linger l = { .l_onoff = 1 };
|
|
||||||
if (setsockopt(val->pair->fd, SOL_SOCKET,
|
|
||||||
SO_LINGER, (char *)&l, sizeof(l)) < 0) {
|
|
||||||
uniperror("setsockopt SO_LINGER");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
static int on_trigger(int type, struct poolhd *pool, struct eval *val)
|
||||||
int on_fin(struct poolhd *pool, struct eval *val)
|
|
||||||
{
|
{
|
||||||
int m = val->pair->attempt + 1;
|
int m = val->pair->attempt + 1;
|
||||||
|
|
||||||
@ -261,26 +223,22 @@ int on_fin(struct poolhd *pool, struct eval *val)
|
|||||||
if (!can_reconn && params.auto_level <= AUTO_NOSAVE) {
|
if (!can_reconn && params.auto_level <= AUTO_NOSAVE) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(val->pair->mark && val->round_count <= 1)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
for (; m < params.dp_count; m++) {
|
for (; m < params.dp_count; m++) {
|
||||||
struct desync_params *dp = ¶ms.dp[m];
|
struct desync_params *dp = ¶ms.dp[m];
|
||||||
if (!dp->detect) {
|
if (!dp->detect) {
|
||||||
return -1;
|
break;
|
||||||
}
|
}
|
||||||
if (dp->detect & DETECT_TLS_ERR) {
|
if (!(dp->detect & type)) {
|
||||||
if (can_reconn)
|
continue;
|
||||||
return reconnect(pool, val, m);
|
|
||||||
else {
|
|
||||||
mode_add_get(
|
|
||||||
(struct sockaddr_ina *)&val->in6, m);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (can_reconn) {
|
||||||
|
return reconnect(pool, val, m);
|
||||||
|
}
|
||||||
|
mode_add_get(
|
||||||
|
(struct sockaddr_ina *)&val->in6, m);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if (m > 1) { // delete
|
if (m >= params.dp_count && m > 1) {
|
||||||
mode_add_get(
|
mode_add_get(
|
||||||
(struct sockaddr_ina *)&val->in6, 0);
|
(struct sockaddr_ina *)&val->in6, 0);
|
||||||
}
|
}
|
||||||
@ -288,7 +246,33 @@ int on_fin(struct poolhd *pool, struct eval *val)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int on_response(struct poolhd *pool, struct eval *val,
|
static int on_torst(struct poolhd *pool, struct eval *val)
|
||||||
|
{
|
||||||
|
if (on_trigger(DETECT_TORST, pool, val) == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
struct linger l = { .l_onoff = 1 };
|
||||||
|
if (setsockopt(val->pair->fd, SOL_SOCKET,
|
||||||
|
SO_LINGER, (char *)&l, sizeof(l)) < 0) {
|
||||||
|
uniperror("setsockopt SO_LINGER");
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int on_fin(struct poolhd *pool, struct eval *val)
|
||||||
|
{
|
||||||
|
if (!(val->pair->mark && val->round_count <= 1)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (on_trigger(DETECT_TLS_ERR, pool, val) == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int on_response(struct poolhd *pool, struct eval *val,
|
||||||
char *resp, ssize_t sn)
|
char *resp, ssize_t sn)
|
||||||
{
|
{
|
||||||
int m = val->pair->attempt + 1;
|
int m = val->pair->attempt + 1;
|
||||||
@ -326,7 +310,7 @@ static inline void free_first_req(struct eval *client)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ssize_t on_first_send(struct eval *client, char *buffer, ssize_t n, ssize_t bfsize)
|
static ssize_t on_first_send(struct eval *client, char *buffer, ssize_t n, ssize_t bfsize)
|
||||||
{
|
{
|
||||||
int m = client->attempt;
|
int m = client->attempt;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user