Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
L
libdap-stream-ch-vpn
Manage
Activity
Members
Labels
Plan
Issues
0
Issue boards
Milestones
Wiki
Code
Merge requests
0
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
cellframe
libdap-stream-ch-vpn
Commits
0eb5fff7
Commit
0eb5fff7
authored
6 years ago
by
Dmitriy A. Gerasimov
Browse files
Options
Downloads
Patches
Plain Diff
[+] Init files
parent
de2ef369
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
dap_stream_ch_vpn.c
+113
-92
113 additions, 92 deletions
dap_stream_ch_vpn.c
with
113 additions
and
92 deletions
dap_stream_ch_vpn.c
+
113
−
92
View file @
0eb5fff7
...
...
@@ -36,30 +36,30 @@
#include
"stream_ch_proc.h"
#include
"stream_ch_pkt.h"
#define LOG_TAG "
ch_sf
"
#define LOG_TAG "
stream_ch_vpn
"
#define
STREAM_SF
_PACKET_OP_CODE_CONNECTED 0x000000a9
#define
STREAM_SF
_PACKET_OP_CODE_CONNECT 0x000000aa
#define
STREAM_SF
_PACKET_OP_CODE_DISCONNECT 0x000000ab
#define
STREAM_SF
_PACKET_OP_CODE_SEND 0x000000ac
#define
STREAM_SF
_PACKET_OP_CODE_RECV 0x000000ad
#define
STREAM_SF
_PACKET_OP_CODE_PROBLEM 0x000000ae
#define
VPN
_PACKET_OP_CODE_CONNECTED 0x000000a9
#define
VPN
_PACKET_OP_CODE_CONNECT 0x000000aa
#define
VPN
_PACKET_OP_CODE_DISCONNECT 0x000000ab
#define
VPN
_PACKET_OP_CODE_SEND 0x000000ac
#define
VPN
_PACKET_OP_CODE_RECV 0x000000ad
#define
VPN
_PACKET_OP_CODE_PROBLEM 0x000000ae
#define
STREAM_SF
_PROBLEM_CODE_NO_FREE_ADDR 0x00000001
#define
STREAM_SF
_PROBLEM_CODE_TUNNEL_DOWN 0x00000002
#define
STREAM_SF
_PROBLEM_CODE_PACKET_LOST 0x00000003
#define
VPN
_PROBLEM_CODE_NO_FREE_ADDR 0x00000001
#define
VPN
_PROBLEM_CODE_TUNNEL_DOWN 0x00000002
#define
VPN
_PROBLEM_CODE_PACKET_LOST 0x00000003
#define
STREAM_SF
_PACKET_OP_CODE_
RAW_L3
0x000000b0
#define
STREAM_SF
_PACKET_OP_CODE_
RAW_L2
0x000000b1
#define
STREAM_SF
_PACKET_OP_CODE_
RAW_L3
_ADDR_REQUEST 0x000000b2
#define
STREAM_SF
_PACKET_OP_CODE_
RAW_L3
_ADDR_REPLY 0x000000b3
#define
VPN
_PACKET_OP_CODE_
VPN_METADATA
0x000000b0
#define
VPN
_PACKET_OP_CODE_
VPN_RESERVED
0x000000b1
#define
VPN
_PACKET_OP_CODE_
VPN
_ADDR_REQUEST 0x000000b2
#define
VPN
_PACKET_OP_CODE_
VPN
_ADDR_REPLY 0x000000b3
#define
STREAM_SF
_PACKET_OP_CODE_
RAW
_SEND 0x000000bc
#define
STREAM_SF
_PACKET_OP_CODE_
RAW
_RECV 0x000000bd
#define
VPN
_PACKET_OP_CODE_
VPN
_SEND 0x000000bc
#define
VPN
_PACKET_OP_CODE_
VPN
_RECV 0x000000bd
#define SF_MAX_EVENTS 256
typedef
struct
ch_
sf
_pkt
{
typedef
struct
ch_
vpn
_pkt
{
struct
{
int
sock_id
;
// Client's socket id
uint32_t
op_code
;
// Operation code
...
...
@@ -84,9 +84,16 @@ typedef struct ch_sf_pkt{
};
}
__attribute__
((
packed
))
header
;
uint8_t
data
[];
// Binary data nested by packet
}
__attribute__
((
packed
))
ch_
sf
_pkt_t
;
}
__attribute__
((
packed
))
ch_
vpn
_pkt_t
;
typedef
struct
ch_sf_socket
{
/**
* @struct ch_vpn_socket_proxy
* @brief Internal data storage for single socket proxy functions. Usualy helpfull for\
* port forwarding or for protecting single application's connection
*
**/
typedef
struct
ch_vpn_socket_proxy
{
int
id
;
int
sock
;
struct
in_addr
client_addr
;
// Used in raw L3 connections
...
...
@@ -94,7 +101,7 @@ typedef struct ch_sf_socket{
stream_ch_t
*
ch
;
bool
signal_to_delete
;
ch_
sf
_pkt_t
*
pkt_out
[
100
];
ch_
vpn
_pkt_t
*
pkt_out
[
100
];
size_t
pkt_out_size
;
uint64_t
bytes_sent
;
...
...
@@ -106,16 +113,23 @@ typedef struct ch_sf_socket{
UT_hash_handle
hh
;
UT_hash_handle
hh2
;
UT_hash_handle
hh_sock
;
}
ch_
sf
_socket_t
;
}
ch_
vpn
_socket_
proxy_
t
;
typedef
struct
ch_sf
/**
* @struct dap_stream_ch_vpn
* @brief Object that creates for every remote channel client
*
*
**/
typedef
struct
dap_stream_ch_vpn
{
pthread_mutex_t
mutex
;
ch_
sf
_socket_t
*
socks
;
ch_
vpn
_socket_
proxy_
t
*
socks
;
int
raw_l3_sock
;
}
ch_sf_t
;
typedef
struct
ch_sf_raw_client
{
//
}
dap_stream_ch_vpn_t
;
typedef
struct
dap_stream_ch_vpn_remote_single
{
//
in_addr_t
addr
;
// pthread_mutex_t mutex;
stream_ch_t
*
ch
;
...
...
@@ -124,9 +138,10 @@ typedef struct ch_sf_raw_client{ //
uint64_t
bytes_recieved
;
UT_hash_handle
hh
;
}
ch_sf_raw_client
_t
;
}
dap_stream_ch_vpn_remote_single
_t
;
typedef
struct
ch_sf_raw_server
{
typedef
struct
vpn_local_network
{
struct
in_addr
client_addr_last
;
struct
in_addr
client_addr_mask
;
struct
in_addr
client_addr_host
;
...
...
@@ -134,16 +149,16 @@ typedef struct ch_sf_raw_server{
int
tun_ctl_fd
;
int
tun_fd
;
struct
ifreq
ifr
;
ch_sf_raw_client
_t
*
clients
;
// Remote clients identified by destination address
dap_stream_ch_vpn_remote_single
_t
*
clients
;
// Remote clients identified by destination address
ch_
sf
_pkt_t
*
pkt_out
[
400
];
ch_
vpn
_pkt_t
*
pkt_out
[
400
];
size_t
pkt_out_size
;
size_t
pkt_out_rindex
;
size_t
pkt_out_windex
;
pthread_mutex_t
pkt_out_mutex
;
pthread_mutex_t
clients_mutex
;
}
ch_sf_raw_server
_t
;
}
vpn_local_network
_t
;
typedef
struct
list_addr_element
{
struct
in_addr
addr
;
...
...
@@ -151,15 +166,15 @@ typedef struct list_addr_element {
}
list_addr_element
;
list_addr_element
*
list_addr_head
=
NULL
;
ch_
sf
_socket_t
*
sf_socks
=
NULL
;
ch_
sf
_socket_t
*
sf_socks_client
=
NULL
;
ch_
vpn
_socket_
proxy_
t
*
sf_socks
=
NULL
;
ch_
vpn
_socket_
proxy_
t
*
sf_socks_client
=
NULL
;
pthread_mutex_t
sf_socks_mutex
;
pthread_cond_t
sf_socks_cond
;
int
sf_socks_epoll_fd
;
pthread_t
sf_socks_pid
;
pthread_t
sf_socks_raw_pid
;
ch_sf_raw_server
_t
*
raw_server
;
vpn_local_network
_t
*
raw_server
;
#define CH_SF(a) ((ch_sf_t *) ((a)->internal) )
...
...
@@ -175,27 +190,33 @@ void ch_sf_packet_out(stream_ch_t* ch , void* arg);
int
ch_sf_raw_write
(
uint8_t
op_code
,
const
void
*
data
,
size_t
data_size
);
void
stream_sf_disconnect
(
ch_
sf
_socket_t
*
sf_sock
);
void
stream_sf_disconnect
(
ch_
vpn
_socket_
proxy_
t
*
sf_sock
);
static
const
char
*
l_vpn_addr
,
*
l_vpn_mask
;
/**
* @brief ch_sf_init
* @return
* @brief ch_sf_init Init actions for VPN stream channel
* @param vpn_addr Zero if only client mode. Address if the node shares its local VPN
* @param vpn_mask Zero if only client mode. Mask if the node shares its local VPN
* @return 0 if everything is okay, lesser then zero if errors
*/
int
ch_sf_init
(
const
char
*
vpn_addr
,
const
char
*
vpn_mask
)
{
l_vpn_addr
=
strdup
(
vpn_addr
);
l_vpn_mask
=
strdup
(
vpn_mask
);
raw_server
=
calloc
(
1
,
sizeof
(
ch_sf_raw_server_t
));
pthread_mutex_init
(
&
raw_server
->
clients_mutex
,
NULL
);
pthread_mutex_init
(
&
raw_server
->
pkt_out_mutex
,
NULL
);
pthread_mutex_init
(
&
sf_socks_mutex
,
NULL
);
pthread_cond_init
(
&
sf_socks_cond
,
NULL
);
pthread_create
(
&
sf_socks_raw_pid
,
NULL
,
ch_sf_thread_raw
,
NULL
);
pthread_create
(
&
sf_socks_pid
,
NULL
,
ch_sf_thread
,
NULL
);
stream_ch_proc_add
(
's'
,
ch_sf_new
,
ch_sf_delete
,
ch_sf_packet_in
,
ch_sf_packet_out
);
if
(
vpn_addr
&&
vpn_mask
)
{
l_vpn_addr
=
strdup
(
vpn_addr
);
l_vpn_mask
=
strdup
(
vpn_mask
);
raw_server
=
calloc
(
1
,
sizeof
(
vpn_local_network_t
));
pthread_mutex_init
(
&
raw_server
->
clients_mutex
,
NULL
);
pthread_mutex_init
(
&
raw_server
->
pkt_out_mutex
,
NULL
);
pthread_mutex_init
(
&
sf_socks_mutex
,
NULL
);
pthread_cond_init
(
&
sf_socks_cond
,
NULL
);
pthread_create
(
&
sf_socks_raw_pid
,
NULL
,
ch_sf_thread_raw
,
NULL
);
pthread_create
(
&
sf_socks_pid
,
NULL
,
ch_sf_thread
,
NULL
);
stream_ch_proc_add
(
's'
,
ch_sf_new
,
ch_sf_delete
,
ch_sf_packet_in
,
ch_sf_packet_out
);
return
0
;
}
return
0
;
}
...
...
@@ -256,8 +277,8 @@ void ch_sf_tun_destroy()
*/
void
ch_sf_new
(
stream_ch_t
*
ch
,
void
*
arg
)
{
ch
->
internal
=
calloc
(
1
,
sizeof
(
ch_sf
_t
));
ch_sf
_t
*
sf
=
CH_SF
(
ch
);
ch
->
internal
=
calloc
(
1
,
sizeof
(
dap_stream_ch_vpn
_t
));
dap_stream_ch_vpn
_t
*
sf
=
CH_SF
(
ch
);
pthread_mutex_init
(
&
sf
->
mutex
,
NULL
);
sf
->
raw_l3_sock
=
socket
(
PF_INET
,
SOCK_RAW
,
IPPROTO_RAW
);
}
...
...
@@ -270,8 +291,8 @@ void ch_sf_new(stream_ch_t* ch , void* arg)
void
ch_sf_delete
(
stream_ch_t
*
ch
,
void
*
arg
)
{
log_it
(
L_DEBUG
,
"ch_sf_delete() for %s"
,
ch
->
stream
->
conn
->
hostaddr
);
ch_
sf
_socket_t
*
cur
,
*
tmp
;
ch_sf_raw_client
_t
*
raw_client
=
0
;
ch_
vpn
_socket_
proxy_
t
*
cur
,
*
tmp
;
dap_stream_ch_vpn_remote_single
_t
*
raw_client
=
0
;
// in_addr_t raw_client_addr = CH_SF(ch)->tun_client_addr.s_addr;
in_addr_t
raw_client_addr
=
ch
->
stream
->
session
->
tun_client_addr
.
s_addr
;
...
...
@@ -310,7 +331,7 @@ void ch_sf_delete(stream_ch_t* ch , void* arg)
}
void
stream_sf_socket_delete
(
ch_
sf
_socket_t
*
sf
)
void
stream_sf_socket_delete
(
ch_
vpn
_socket_
proxy_
t
*
sf
)
{
close
(
sf
->
sock
);
pthread_mutex_destroy
(
&
(
sf
->
mutex
)
);
...
...
@@ -330,9 +351,9 @@ void stream_sf_socket_ready_to_write(stream_ch_t * ch, bool is_ready)
}
ch_
sf
_pkt_t
*
ch_sf_raw_read
()
ch_
vpn
_pkt_t
*
ch_sf_raw_read
()
{
ch_
sf
_pkt_t
*
ret
=
NULL
;
ch_
vpn
_pkt_t
*
ret
=
NULL
;
pthread_mutex_lock
(
&
raw_server
->
pkt_out_mutex
);
if
(
raw_server
->
pkt_out_rindex
==
(
sizeof
(
raw_server
->
pkt_out
)
/
sizeof
(
raw_server
->
pkt_out
[
0
])
)
){
raw_server
->
pkt_out_rindex
=
0
;
// ring the buffer!
...
...
@@ -353,7 +374,7 @@ int ch_sf_raw_write(uint8_t op_code,const void * data, size_t data_size)
if
(
raw_server
->
pkt_out_windex
==
(
sizeof
(
raw_server
->
pkt_out
)
/
sizeof
(
raw_server
->
pkt_out
[
0
])
)
)
raw_server
->
pkt_out_windex
=
0
;
// ring the buffer!
if
(
(
raw_server
->
pkt_out_windex
<
raw_server
->
pkt_out_rindex
)
||
(
raw_server
->
pkt_out_size
==
0
)
){
ch_
sf
_pkt_t
*
pkt
=
(
ch_
sf
_pkt_t
*
)
calloc
(
1
,
data_size
+
sizeof
(
pkt
->
header
));
ch_
vpn
_pkt_t
*
pkt
=
(
ch_
vpn
_pkt_t
*
)
calloc
(
1
,
data_size
+
sizeof
(
pkt
->
header
));
pkt
->
header
.
op_code
=
op_code
;
pkt
->
header
.
sock_id
=
raw_server
->
tun_fd
;
if
(
data_size
>
0
){
...
...
@@ -375,15 +396,15 @@ int ch_sf_raw_write(uint8_t op_code,const void * data, size_t data_size)
}
int
stream_sf_socket_write
(
ch_
sf
_socket_t
*
sf
,
uint8_t
op_code
,
const
void
*
data
,
size_t
data_size
)
int
stream_sf_socket_write
(
ch_
vpn
_socket_
proxy_
t
*
sf
,
uint8_t
op_code
,
const
void
*
data
,
size_t
data_size
)
{
if
(
sf
->
pkt_out_size
<
(
sizeof
(
sf
->
pkt_out
)
/
sizeof
(
sf
->
pkt_out
[
0
])
)
)
{
ch_
sf
_pkt_t
*
pkt
=
(
ch_
sf
_pkt_t
*
)
calloc
(
1
,
data_size
+
sizeof
(
pkt
->
header
));
ch_
vpn
_pkt_t
*
pkt
=
(
ch_
vpn
_pkt_t
*
)
calloc
(
1
,
data_size
+
sizeof
(
pkt
->
header
));
pkt
->
header
.
op_code
=
op_code
;
pkt
->
header
.
sock_id
=
sf
->
id
;
switch
(
op_code
){
case
STREAM_SF
_PACKET_OP_CODE_RECV
:{
case
VPN
_PACKET_OP_CODE_RECV
:{
pkt
->
header
.
op_data
.
data_size
=
data_size
;
memcpy
(
pkt
->
data
,
data
,
data_size
);
}
break
;
...
...
@@ -414,14 +435,14 @@ void ch_sf_packet_in(stream_ch_t* ch , void* arg)
// );
static
bool
client_connected
=
false
;
ch_
sf
_pkt_t
*
sf_pkt
=
(
ch_
sf
_pkt_t
*
)
pkt
->
data
;
ch_
vpn
_pkt_t
*
sf_pkt
=
(
ch_
vpn
_pkt_t
*
)
pkt
->
data
;
int
remote_sock_id
=
sf_pkt
->
header
.
sock_id
;
// log_it(L_DEBUG,"Got SF packet with id %d op_code 0x%02x",remote_sock_id, sf_pkt->header.op_code );
if
(
sf_pkt
->
header
.
op_code
>=
0xb0
){
// Raw packets
switch
(
sf_pkt
->
header
.
op_code
){
case
STREAM_SF
_PACKET_OP_CODE_
RAW_L3
_ADDR_REQUEST
:{
// Client request after L3 connection the new IP address
case
VPN
_PACKET_OP_CODE_
VPN
_ADDR_REQUEST
:{
// Client request after L3 connection the new IP address
log_it
(
L_DEBUG
,
"Got SF packet with id %d op_code 0x%02x"
,
remote_sock_id
,
sf_pkt
->
header
.
op_code
);
struct
in_addr
n_addr
=
{
0
};
...
...
@@ -433,7 +454,7 @@ void ch_sf_packet_in(stream_ch_t* ch , void* arg)
list_addr_element
*
el
;
LL_COUNT
(
list_addr_head
,
el
,
count_free_addr
);
ch_sf_raw_client_t
*
n_client
=
(
ch_sf_raw_client_t
*
)
calloc
(
1
,
sizeof
(
ch_sf_raw_client
_t
));
dap_stream_ch_vpn_remote_single_t
*
n_client
=
(
dap_stream_ch_vpn_remote_single_t
*
)
calloc
(
1
,
sizeof
(
dap_stream_ch_vpn_remote_single
_t
));
n_client
->
ch
=
ch
;
if
(
count_free_addr
>
0
)
...
...
@@ -460,9 +481,9 @@ void ch_sf_packet_in(stream_ch_t* ch , void* arg)
log_it
(
L_INFO
,
"
\t
addr %s"
,
inet_ntoa
(
raw_server
->
client_addr
));
log_it
(
L_INFO
,
"
\t
last_addr %s"
,
inet_ntoa
(
raw_server
->
client_addr_last
));
ch_
sf
_pkt_t
*
pkt_out
=
(
ch_
sf
_pkt_t
*
)
calloc
(
1
,
sizeof
(
pkt_out
->
header
)
+
sizeof
(
n_addr
)
+
sizeof
(
raw_server
->
client_addr_host
));
ch_
vpn
_pkt_t
*
pkt_out
=
(
ch_
vpn
_pkt_t
*
)
calloc
(
1
,
sizeof
(
pkt_out
->
header
)
+
sizeof
(
n_addr
)
+
sizeof
(
raw_server
->
client_addr_host
));
pkt_out
->
header
.
sock_id
=
raw_server
->
tun_fd
;
pkt_out
->
header
.
op_code
=
STREAM_SF
_PACKET_OP_CODE_
RAW_L3
_ADDR_REPLY
;
pkt_out
->
header
.
op_code
=
VPN
_PACKET_OP_CODE_
VPN
_ADDR_REPLY
;
pkt_out
->
header
.
op_data
.
data_size
=
sizeof
(
n_addr
)
+
sizeof
(
raw_server
->
client_addr_host
);
memcpy
(
pkt_out
->
data
,
&
n_addr
,
sizeof
(
n_addr
));
memcpy
(
pkt_out
->
data
+
sizeof
(
n_addr
),
&
raw_server
->
client_addr_host
,
sizeof
(
raw_server
->
client_addr_host
));
...
...
@@ -472,15 +493,15 @@ void ch_sf_packet_in(stream_ch_t* ch , void* arg)
//ch_sf_raw_write(n_addr.s_addr,STREAM_SF_PACKET_OP_CODE_RAW_L3_ADDR_REPLY,&n_addr,sizeof(n_addr));
}
else
{
// All the network is filled with clients, can't lease a new address
log_it
(
L_WARNING
,
"All the network is filled with clients, can't lease a new address"
);
ch_
sf
_pkt_t
*
pkt_out
=
(
ch_
sf
_pkt_t
*
)
calloc
(
1
,
sizeof
(
pkt_out
->
header
));
ch_
vpn
_pkt_t
*
pkt_out
=
(
ch_
vpn
_pkt_t
*
)
calloc
(
1
,
sizeof
(
pkt_out
->
header
));
pkt_out
->
header
.
sock_id
=
raw_server
->
tun_fd
;
pkt_out
->
header
.
op_code
=
STREAM_SF
_PACKET_OP_CODE_PROBLEM
;
pkt_out
->
header
.
op_problem
.
code
=
STREAM_SF
_PROBLEM_CODE_NO_FREE_ADDR
;
pkt_out
->
header
.
op_code
=
VPN
_PACKET_OP_CODE_PROBLEM
;
pkt_out
->
header
.
op_problem
.
code
=
VPN
_PROBLEM_CODE_NO_FREE_ADDR
;
stream_ch_pkt_write
(
ch
,
'd'
,
pkt_out
,
pkt_out
->
header
.
op_data
.
data_size
+
sizeof
(
pkt_out
->
header
));
stream_sf_socket_ready_to_write
(
ch
,
true
);
}
}
break
;
case
STREAM_SF
_PACKET_OP_CODE_
RAW
_SEND
:{
case
VPN
_PACKET_OP_CODE_
VPN
_SEND
:{
struct
in_addr
in_saddr
,
in_daddr
;
in_saddr
.
s_addr
=
((
struct
iphdr
*
)
sf_pkt
->
data
)
->
saddr
;
in_daddr
.
s_addr
=
((
struct
iphdr
*
)
sf_pkt
->
data
)
->
daddr
;
...
...
@@ -499,9 +520,9 @@ void ch_sf_packet_in(stream_ch_t* ch , void* arg)
if
((
ret
=
write
(
raw_server
->
tun_fd
,
sf_pkt
->
data
,
sf_pkt
->
header
.
op_data
.
data_size
))
<
0
){
log_it
(
L_ERROR
,
"write() returned error %d : '%s'"
,
ret
,
strerror
(
errno
));
//log_it(L_ERROR,"raw socket ring buffer overflowed");
ch_
sf
_pkt_t
*
pkt_out
=
(
ch_
sf
_pkt_t
*
)
calloc
(
1
,
sizeof
(
pkt_out
->
header
));
pkt_out
->
header
.
op_code
=
STREAM_SF
_PACKET_OP_CODE_PROBLEM
;
pkt_out
->
header
.
op_problem
.
code
=
STREAM_SF
_PROBLEM_CODE_PACKET_LOST
;
ch_
vpn
_pkt_t
*
pkt_out
=
(
ch_
vpn
_pkt_t
*
)
calloc
(
1
,
sizeof
(
pkt_out
->
header
));
pkt_out
->
header
.
op_code
=
VPN
_PACKET_OP_CODE_PROBLEM
;
pkt_out
->
header
.
op_problem
.
code
=
VPN
_PROBLEM_CODE_PACKET_LOST
;
pkt_out
->
header
.
sock_id
=
raw_server
->
tun_fd
;
stream_ch_pkt_write
(
ch
,
'd'
,
pkt_out
,
pkt_out
->
header
.
op_data
.
data_size
+
sizeof
(
pkt_out
->
header
));
stream_sf_socket_ready_to_write
(
ch
,
true
);
...
...
@@ -515,8 +536,8 @@ void ch_sf_packet_in(stream_ch_t* ch , void* arg)
default:
log_it
(
L_WARNING
,
"Can't process SF type 0x%02x"
,
sf_pkt
->
header
.
op_code
);
}
}
else
{
// All except CONNECT
ch_
sf
_socket_t
*
sf_sock
=
NULL
;
if
(
sf_pkt
->
header
.
op_code
!=
STREAM_SF
_PACKET_OP_CODE_CONNECT
){
ch_
vpn
_socket_
proxy_
t
*
sf_sock
=
NULL
;
if
(
sf_pkt
->
header
.
op_code
!=
VPN
_PACKET_OP_CODE_CONNECT
){
pthread_mutex_lock
(
&
(
CH_SF
(
ch
)
->
mutex
));
// log_it(L_DEBUG,"Looking in hash table with %d",remote_sock_id);
HASH_FIND_INT
(
(
CH_SF
(
ch
)
->
socks
)
,
&
remote_sock_id
,
sf_sock
);
...
...
@@ -525,7 +546,7 @@ void ch_sf_packet_in(stream_ch_t* ch , void* arg)
pthread_mutex_lock
(
&
sf_sock
->
mutex
);
// Unlock it in your case as soon as possible to reduce lock time
sf_sock
->
time_lastused
=
time
(
NULL
);
switch
(
sf_pkt
->
header
.
op_code
){
case
STREAM_SF
_PACKET_OP_CODE_SEND
:{
case
VPN
_PACKET_OP_CODE_SEND
:{
if
(
client_connected
==
false
)
{
log_it
(
L_WARNING
,
"Drop Packet! User not connected!"
);
// Client need send
...
...
@@ -564,7 +585,7 @@ void ch_sf_packet_in(stream_ch_t* ch , void* arg)
log_it
(
L_INFO
,
"Send action from %d sock_id (sf_packet size %lu, ch packet size %lu, have sent %d)"
,
sf_sock
->
id
,
sf_pkt
->
header
.
op_data
.
data_size
,
pkt
->
hdr
.
size
,
ret
);
}
break
;
case
STREAM_SF
_PACKET_OP_CODE_DISCONNECT
:{
case
VPN
_PACKET_OP_CODE_DISCONNECT
:{
log_it
(
L_INFO
,
"Disconnect action from %d sock_id"
,
sf_sock
->
id
);
pthread_mutex_lock
(
&
(
CH_SF
(
ch
)
->
mutex
));
...
...
@@ -623,8 +644,8 @@ void ch_sf_packet_in(stream_ch_t* ch , void* arg)
if
(
connect
(
s
,
(
struct
sockaddr
*
)
&
remote_addr
,
sizeof
(
remote_addr
))
>=
0
){
fcntl
(
s
,
F_SETFL
,
O_NONBLOCK
);
log_it
(
L_INFO
,
"Remote address connected (%s:%u) with sock_id %d"
,
addr_str
,
sf_pkt
->
header
.
op_connect
.
port
,
remote_sock_id
);
ch_
sf
_socket_t
*
sf_sock
=
NULL
;
sf_sock
=
DAP_NEW_Z
(
ch_
sf
_socket_t
);
ch_
vpn
_socket_
proxy_
t
*
sf_sock
=
NULL
;
sf_sock
=
DAP_NEW_Z
(
ch_
vpn
_socket_
proxy_
t
);
sf_sock
->
id
=
remote_sock_id
;
sf_sock
->
sock
=
s
;
sf_sock
->
ch
=
ch
;
...
...
@@ -651,9 +672,9 @@ void ch_sf_packet_in(stream_ch_t* ch , void* arg)
}
else
{
log_it
(
L_NOTICE
,
"Added sock_id %d with sock %d to the epoll fd"
,
remote_sock_id
,
s
);
log_it
(
L_NOTICE
,
"Send Connected packet to User"
);
ch_
sf
_pkt_t
*
pkt_out
=
(
ch_
sf
_pkt_t
*
)
calloc
(
1
,
sizeof
(
pkt_out
->
header
));
ch_
vpn
_pkt_t
*
pkt_out
=
(
ch_
vpn
_pkt_t
*
)
calloc
(
1
,
sizeof
(
pkt_out
->
header
));
pkt_out
->
header
.
sock_id
=
remote_sock_id
;
pkt_out
->
header
.
op_code
=
STREAM_SF
_PACKET_OP_CODE_CONNECTED
;
pkt_out
->
header
.
op_code
=
VPN
_PACKET_OP_CODE_CONNECTED
;
stream_ch_pkt_write
(
ch
,
's'
,
pkt_out
,
pkt_out
->
header
.
op_data
.
data_size
+
sizeof
(
pkt_out
->
header
));
free
(
pkt_out
);
client_connected
=
true
;
...
...
@@ -677,7 +698,7 @@ void ch_sf_packet_in(stream_ch_t* ch , void* arg)
* @brief stream_sf_disconnect
* @param sf
*/
void
stream_sf_disconnect
(
ch_
sf
_socket_t
*
sf_sock
)
void
stream_sf_disconnect
(
ch_
vpn
_socket_
proxy_
t
*
sf_sock
)
{
struct
epoll_event
ev
;
ev
.
data
.
fd
=
sf_sock
->
sock
;
...
...
@@ -691,9 +712,9 @@ void stream_sf_disconnect(ch_sf_socket_t * sf_sock)
}
// Compise signal to disconnect to another side, with special opcode STREAM_SF_PACKET_OP_CODE_DISCONNECT
ch_
sf
_pkt_t
*
pkt_out
;
pkt_out
=
(
ch_
sf
_pkt_t
*
)
calloc
(
1
,
sizeof
(
pkt_out
->
header
)
+
1
);
pkt_out
->
header
.
op_code
=
STREAM_SF
_PACKET_OP_CODE_DISCONNECT
;
ch_
vpn
_pkt_t
*
pkt_out
;
pkt_out
=
(
ch_
vpn
_pkt_t
*
)
calloc
(
1
,
sizeof
(
pkt_out
->
header
)
+
1
);
pkt_out
->
header
.
op_code
=
VPN
_PACKET_OP_CODE_DISCONNECT
;
pkt_out
->
header
.
sock_id
=
sf_sock
->
id
;
sf_sock
->
pkt_out
[
sf_sock
->
pkt_out_size
]
=
pkt_out
;
sf_sock
->
pkt_out_size
++
;
...
...
@@ -734,7 +755,7 @@ void * ch_sf_thread(void * arg)
for
(
n
=
0
;
n
<
nfds
;
++
n
)
{
int
s
=
events
[
n
].
data
.
fd
;
ch_
sf
_socket_t
*
sf
=
NULL
;
ch_
vpn
_socket_
proxy_
t
*
sf
=
NULL
;
pthread_mutex_lock
(
&
sf_socks_mutex
);
HASH_FIND
(
hh_sock
,
sf_socks_client
,
&
s
,
sizeof
(
s
),
sf
);
pthread_mutex_unlock
(
&
sf_socks_mutex
);
...
...
@@ -754,9 +775,9 @@ void * ch_sf_thread(void * arg)
//log_it(L_DEBUG,"recv() returned %d",ret);
if
(
ret
>
0
){
buf_size
=
ret
;
ch_
sf
_pkt_t
*
pout
;
pout
=
sf
->
pkt_out
[
sf
->
pkt_out_size
]
=
(
ch_
sf
_pkt_t
*
)
calloc
(
1
,
buf_size
+
sizeof
(
pout
->
header
));
pout
->
header
.
op_code
=
STREAM_SF
_PACKET_OP_CODE_RECV
;
ch_
vpn
_pkt_t
*
pout
;
pout
=
sf
->
pkt_out
[
sf
->
pkt_out_size
]
=
(
ch_
vpn
_pkt_t
*
)
calloc
(
1
,
buf_size
+
sizeof
(
pout
->
header
));
pout
->
header
.
op_code
=
VPN
_PACKET_OP_CODE_RECV
;
pout
->
header
.
sock_id
=
sf
->
id
;
pout
->
header
.
op_data
.
data_size
=
buf_size
;
memcpy
(
pout
->
data
,
buf
,
buf_size
);
...
...
@@ -829,7 +850,7 @@ void* ch_sf_thread_raw(void *arg)
//
if
(
ret
>
0
){
if
(
FD_ISSET
(
get_select_breaker
(),
&
fds_read_active
)){
// Smth to send
ch_
sf
_pkt_t
*
pkt
=
ch_sf_raw_read
();
ch_
vpn
_pkt_t
*
pkt
=
ch_sf_raw_read
();
if
(
pkt
){
int
write_ret
=
write
(
raw_server
->
tun_fd
,
pkt
->
data
,
pkt
->
header
.
op_data
.
data_size
);
if
(
write_ret
>
0
){
...
...
@@ -863,14 +884,14 @@ void* ch_sf_thread_raw(void *arg)
//log_it(L_DEBUG,"Read IP packet from tun/tap interface daddr=%s saddr=%s total_size = %d "
// ,str_daddr,str_saddr,read_ret);
ch_sf_raw_client
_t
*
raw_client
=
NULL
;
dap_stream_ch_vpn_remote_single
_t
*
raw_client
=
NULL
;
pthread_mutex_lock
(
&
raw_server
->
clients_mutex
);
HASH_FIND_INT
(
raw_server
->
clients
,
&
in_daddr
.
s_addr
,
raw_client
);
// HASH_ADD_INT(CH_SF(ch)->socks, id, sf_sock );
// HASH_DEL(CH_SF(ch)->socks,sf_sock);
if
(
raw_client
){
// Is present in hash table such destination address
ch_
sf
_pkt_t
*
pkt_out
=
(
ch_
sf
_pkt_t
*
)
calloc
(
1
,
sizeof
(
pkt_out
->
header
)
+
read_ret
);
pkt_out
->
header
.
op_code
=
STREAM_SF
_PACKET_OP_CODE_
RAW
_RECV
;
ch_
vpn
_pkt_t
*
pkt_out
=
(
ch_
vpn
_pkt_t
*
)
calloc
(
1
,
sizeof
(
pkt_out
->
header
)
+
read_ret
);
pkt_out
->
header
.
op_code
=
VPN
_PACKET_OP_CODE_
VPN
_RECV
;
pkt_out
->
header
.
sock_id
=
raw_server
->
tun_fd
;
pkt_out
->
header
.
op_data
.
data_size
=
read_ret
;
memcpy
(
pkt_out
->
data
,
tmp_buf
,
read_ret
);
...
...
@@ -905,7 +926,7 @@ void* ch_sf_thread_raw(void *arg)
*/
void
ch_sf_packet_out
(
stream_ch_t
*
ch
,
void
*
arg
)
{
ch_
sf
_socket_t
*
cur
,
*
tmp
;
ch_
vpn
_socket_
proxy_
t
*
cur
,
*
tmp
;
bool
isSmthOut
=
false
;
// log_it(L_DEBUG,"Socket forwarding packet out callback: %u sockets in hashtable", HASH_COUNT(CH_SF(ch)->socks) );
HASH_ITER
(
hh
,
CH_SF
(
ch
)
->
socks
,
cur
,
tmp
)
{
...
...
@@ -915,7 +936,7 @@ void ch_sf_packet_out(stream_ch_t* ch , void* arg)
log_it
(
L_DEBUG
,
"Socket with id %d has %u packets in output buffer"
,
cur
->
id
,
cur
->
pkt_out_size
);
if
(
cur
->
pkt_out_size
){
for
(
i
=
0
;
i
<
cur
->
pkt_out_size
;
i
++
){
ch_
sf
_pkt_t
*
pout
=
cur
->
pkt_out
[
i
];
ch_
vpn
_pkt_t
*
pout
=
cur
->
pkt_out
[
i
];
if
(
pout
)
{
if
(
stream_ch_pkt_write
(
ch
,
'd'
,
pout
,
pout
->
header
.
op_data
.
data_size
+
sizeof
(
pout
->
header
))){
isSmthOut
=
true
;
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment