Skip to content

Commit

Permalink
Make file connection stateless
Browse files Browse the repository at this point in the history
Messenger is slightly twisty when it comes to sending connection status callbacks
It will very likely need at the very least a partial refactor to clean it up a
bit. Toxcore shouldn't need void *userdata as deep as is currently does.
  • Loading branch information
Gregory Mullen (grayhatter) committed Aug 24, 2016
1 parent 503d198 commit 5dee222
Show file tree
Hide file tree
Showing 11 changed files with 64 additions and 58 deletions.
6 changes: 3 additions & 3 deletions toxcore/DHT.c
Original file line number Diff line number Diff line change
Expand Up @@ -1847,7 +1847,7 @@ static int send_NATping(DHT *dht, const uint8_t *public_key, uint64_t ping_id, u

/* Handle a received ping request for. */
static int handle_NATping(void *object, IP_Port source, const uint8_t *source_pubkey, const uint8_t *packet,
uint16_t length)
uint16_t length, void *userdata)
{
if (length != sizeof(uint64_t) + 1)
return 1;
Expand Down Expand Up @@ -2127,7 +2127,7 @@ static uint32_t have_nodes_closelist(DHT *dht, Node_format *nodes, uint16_t num)

/* Handle a received hardening packet */
static int handle_hardening(void *object, IP_Port source, const uint8_t *source_pubkey, const uint8_t *packet,
uint16_t length)
uint16_t length, void *userdata)
{
DHT *dht = object;

Expand Down Expand Up @@ -2364,7 +2364,7 @@ static int cryptopacket_handle(void *object, IP_Port source, const uint8_t *pack
if (!dht->cryptopackethandlers[number].function) return 1;

return dht->cryptopackethandlers[number].function(dht->cryptopackethandlers[number].object, source, public_key,
data, len);
data, len, userdata);

} else { /* If request is not for us, try routing it. */
int retval = route_packet(dht, packet + 1, packet, length);
Expand Down
2 changes: 1 addition & 1 deletion toxcore/DHT.h
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ typedef struct {
/*----------------------------------------------------------------------------------*/

typedef int (*cryptopacket_handler_callback)(void *object, IP_Port ip_port, const uint8_t *source_pubkey,
const uint8_t *data, uint16_t len);
const uint8_t *data, uint16_t len, void *userdata);

typedef struct {
cryptopacket_handler_callback function;
Expand Down
6 changes: 3 additions & 3 deletions toxcore/Messenger.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ static int send_offline_packet(Messenger *m, int friendcon_id)
sizeof(packet), 0) != -1;
}

static int handle_status(void *object, int i, uint8_t status);
static int handle_status(void *object, int i, uint8_t status, void *userdata);
static int handle_packet(void *object, int i, uint8_t *temp, uint16_t len, void *userdata);
static int handle_custom_lossy_packet(void *object, int friend_num, const uint8_t *packet, uint16_t length);

Expand Down Expand Up @@ -1882,7 +1882,7 @@ static void check_friend_request_timed_out(Messenger *m, uint32_t i, uint64_t t)
}
}

static int handle_status(void *object, int i, uint8_t status)
static int handle_status(void *object, int i, uint8_t status, void *userdata)
{
Messenger *m = object;

Expand Down Expand Up @@ -2310,7 +2310,7 @@ void do_messenger(Messenger *m, void *userdata)

do_net_crypto(m->net_crypto, userdata);
do_onion_client(m->onion_c);
do_friend_connections(m->fr_c);
do_friend_connections(m->fr_c, userdata);
do_friends(m, userdata);
connection_status_cb(m, userdata);

Expand Down
30 changes: 16 additions & 14 deletions toxcore/friend_connection.c
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,7 @@ static void change_dht_pk(Friend_Connections *fr_c, int friendcon_id, const uint
memcpy(friend_con->dht_temp_pk, dht_public_key, crypto_box_PUBLICKEYBYTES);
}

static int handle_status(void *object, int number, uint8_t status)
static int handle_status(void *object, int number, uint8_t status, void *userdata)
{
Friend_Connections *fr_c = object;
Friend_Conn *friend_con = get_conn(fr_c, number);
Expand Down Expand Up @@ -340,15 +340,15 @@ static int handle_status(void *object, int number, uint8_t status)
for (i = 0; i < MAX_FRIEND_CONNECTION_CALLBACKS; ++i) {
if (friend_con->callbacks[i].status_callback)
friend_con->callbacks[i].status_callback(friend_con->callbacks[i].status_callback_object,
friend_con->callbacks[i].status_callback_id, status);
friend_con->callbacks[i].status_callback_id, status, userdata);
}
}

return 0;
}

/* Callback for dht public key changes. */
static void dht_pk_callback(void *object, int32_t number, const uint8_t *dht_public_key)
static void dht_pk_callback(void *object, int32_t number, const uint8_t *dht_public_key, void *userdata)
{
Friend_Connections *fr_c = object;
Friend_Conn *friend_con = get_conn(fr_c, number);
Expand All @@ -365,7 +365,7 @@ static void dht_pk_callback(void *object, int32_t number, const uint8_t *dht_pub
if (friend_con->crypt_connection_id != -1) {
crypto_kill(fr_c->net_crypto, friend_con->crypt_connection_id);
friend_con->crypt_connection_id = -1;
handle_status(object, number, 0); /* Going offline. */
handle_status(object, number, 0, userdata); /* Going offline. */
}

friend_new_connection(fr_c, number);
Expand All @@ -384,8 +384,9 @@ static int handle_packet(void *object, int number, uint8_t *data, uint16_t lengt
return -1;

if (data[0] == PACKET_ID_FRIEND_REQUESTS) {
if (fr_c->fr_request_callback)
fr_c->fr_request_callback(fr_c->fr_request_object, friend_con->real_public_key, data, length);
if (fr_c->fr_request_callback) {
fr_c->fr_request_callback(fr_c->fr_request_object, friend_con->real_public_key, data, length, userdata);
}

return 0;
} else if (data[0] == PACKET_ID_ALIVE) {
Expand Down Expand Up @@ -594,7 +595,8 @@ int get_friendcon_public_keys(uint8_t *real_pk, uint8_t *dht_temp_pk, Friend_Con
*/
void set_dht_temp_pk(Friend_Connections *fr_c, int friendcon_id, const uint8_t *dht_temp_pk)
{
dht_pk_callback(fr_c, friendcon_id, dht_temp_pk);
/* This is probably VERY bad, but group chats are VERY broken, and I'm not willing to fix something I plan to replace */
dht_pk_callback(fr_c, friendcon_id, dht_temp_pk, NULL);
}

/* Set the callbacks for the friend connection.
Expand All @@ -604,10 +606,10 @@ void set_dht_temp_pk(Friend_Connections *fr_c, int friendcon_id, const uint8_t *
* return -1 on failure
*/
int friend_connection_callbacks(Friend_Connections *fr_c, int friendcon_id, unsigned int index,
int (*status_callback)(void *object, int id, uint8_t status), int (*data_callback)(void *object, int id, uint8_t *data,
uint16_t length, void *userdata), int (*lossy_data_callback)(void *object, int id, const uint8_t *data,
uint16_t length), void *object,
int number)
int (*status_callback)(void *object, int id, uint8_t status, void *userdata),
int (*data_callback)(void *object, int id, uint8_t *data, uint16_t len, void *userdata),
int (*lossy_data_callback)(void *object, int id, const uint8_t *data, uint16_t length),
void *object, int number)
{
Friend_Conn *friend_con = get_conn(fr_c, friendcon_id);

Expand Down Expand Up @@ -717,7 +719,7 @@ int kill_friend_connection(Friend_Connections *fr_c, int friendcon_id)
* This function will be called every time a friend request packet is received.
*/
void set_friend_request_callback(Friend_Connections *fr_c, int (*fr_request_callback)(void *, const uint8_t *,
const uint8_t *, uint16_t), void *object)
const uint8_t *, uint16_t, void *), void *object)
{
fr_c->fr_request_callback = fr_request_callback;
fr_c->fr_request_object = object;
Expand Down Expand Up @@ -790,7 +792,7 @@ static void LANdiscovery(Friend_Connections *fr_c)
}

/* main friend_connections loop. */
void do_friend_connections(Friend_Connections *fr_c)
void do_friend_connections(Friend_Connections *fr_c, void *userdata)
{
uint32_t i;
uint64_t temp_time = unix_time();
Expand Down Expand Up @@ -831,7 +833,7 @@ void do_friend_connections(Friend_Connections *fr_c)
/* If we stopped receiving ping packets, kill it. */
crypto_kill(fr_c->net_crypto, friend_con->crypt_connection_id);
friend_con->crypt_connection_id = -1;
handle_status(fr_c, i, 0); /* Going offline. */
handle_status(fr_c, i, 0, userdata); /* Going offline. */
}
}
}
Expand Down
16 changes: 8 additions & 8 deletions toxcore/friend_connection.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ typedef struct {
uint64_t share_relays_lastsent;

struct {
int (*status_callback)(void *object, int id, uint8_t status);
int (*status_callback)(void *object, int id, uint8_t status, void *userdata);
void *status_callback_object;
int status_callback_id;

Expand Down Expand Up @@ -109,7 +109,7 @@ typedef struct {
Friend_Conn *conns;
uint32_t num_cons;

int (*fr_request_callback)(void *object, const uint8_t *source_pubkey, const uint8_t *data, uint16_t len);
int (*fr_request_callback)(void *object, const uint8_t *source_pubkey, const uint8_t *data, uint16_t len, void *userdata);
void *fr_request_object;

uint64_t last_LANdiscovery;
Expand Down Expand Up @@ -158,10 +158,10 @@ int friend_add_tcp_relay(Friend_Connections *fr_c, int friendcon_id, IP_Port ip_
* return -1 on failure
*/
int friend_connection_callbacks(Friend_Connections *fr_c, int friendcon_id, unsigned int index,
int (*status_callback)(void *object, int id, uint8_t status), int (*data_callback)(void *object, int id, uint8_t *data,
uint16_t length, void *userdata), int (*lossy_data_callback)(void *object, int id, const uint8_t *data,
uint16_t length), void *object,
int number);
int (*status_callback)(void *object, int id, uint8_t status, void *userdata),
int (*data_callback)(void *object, int id, uint8_t *data, uint16_t len, void *userdata),
int (*lossy_data_callback)(void *object, int id, const uint8_t *data, uint16_t length),
void *object, int number);

/* return the crypt_connection_id for the connection.
*
Expand Down Expand Up @@ -199,13 +199,13 @@ int send_friend_request_packet(Friend_Connections *fr_c, int friendcon_id, uint3
* This function will be called every time a friend request is received.
*/
void set_friend_request_callback(Friend_Connections *fr_c, int (*fr_request_callback)(void *, const uint8_t *,
const uint8_t *, uint16_t), void *object);
const uint8_t *, uint16_t, void *), void *object);

/* Create new friend_connections instance. */
Friend_Connections *new_friend_connections(Onion_Client *onion_c);

/* main friend_connections loop. */
void do_friend_connections(Friend_Connections *fr_c);
void do_friend_connections(Friend_Connections *fr_c, void *userdata);

/* Free everything related with friend_connections. */
void kill_friend_connections(Friend_Connections *fr_c);
Expand Down
5 changes: 2 additions & 3 deletions toxcore/friend_requests.c
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ int remove_request_received(Friend_Requests *fr, const uint8_t *real_pk)
}


static int friendreq_handlepacket(void *object, const uint8_t *source_pubkey, const uint8_t *packet, uint16_t length)
static int friendreq_handlepacket(void *object, const uint8_t *source_pubkey, const uint8_t *packet, uint16_t length, void *userdata)
{
Friend_Requests *fr = object;

Expand Down Expand Up @@ -133,8 +133,7 @@ static int friendreq_handlepacket(void *object, const uint8_t *source_pubkey, co
memcpy(message, packet + sizeof(fr->nospam), message_len);
message[sizeof(message) - 1] = 0; /* Be sure the message is null terminated. */

(*fr->handle_friendrequest)(fr->handle_friendrequest_object, source_pubkey, message, message_len,
fr->handle_friendrequest_userdata);
(*fr->handle_friendrequest)(fr->handle_friendrequest_object, source_pubkey, message, message_len, userdata);
return 0;
}

Expand Down
2 changes: 1 addition & 1 deletion toxcore/group.c
Original file line number Diff line number Diff line change
Expand Up @@ -598,7 +598,7 @@ static void set_conns_status_groups(Group_Chats *g_c, int friendcon_id, uint8_t
}
}

static int handle_status(void *object, int friendcon_id, uint8_t status)
static int handle_status(void *object, int friendcon_id, uint8_t status, void *userdata)
{
Group_Chats *g_c = object;

Expand Down
26 changes: 15 additions & 11 deletions toxcore/net_crypto.c
Original file line number Diff line number Diff line change
Expand Up @@ -1204,15 +1204,16 @@ static int send_kill_packet(Net_Crypto *c, int crypt_connection_id)
&kill_packet, sizeof(kill_packet));
}

static void connection_kill(Net_Crypto *c, int crypt_connection_id)
static void connection_kill(Net_Crypto *c, int crypt_connection_id, void *userdata)
{
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);

if (conn == 0)
return;

if (conn->connection_status_callback) {
conn->connection_status_callback(conn->connection_status_callback_object, conn->connection_status_callback_id, 0);
conn->connection_status_callback(conn->connection_status_callback_object, conn->connection_status_callback_id, 0,
userdata);
}

crypto_kill(c, crypt_connection_id);
Expand Down Expand Up @@ -1272,7 +1273,7 @@ static int handle_data_packet_helper(Net_Crypto *c, int crypt_connection_id, con
}

if (real_data[0] == PACKET_ID_KILL) {
connection_kill(c, crypt_connection_id);
connection_kill(c, crypt_connection_id, userdata);
return 0;
}

Expand All @@ -1281,7 +1282,8 @@ static int handle_data_packet_helper(Net_Crypto *c, int crypt_connection_id, con
conn->status = CRYPTO_CONN_ESTABLISHED;

if (conn->connection_status_callback)
conn->connection_status_callback(conn->connection_status_callback_object, conn->connection_status_callback_id, 1);
conn->connection_status_callback(conn->connection_status_callback_object, conn->connection_status_callback_id, 1,
userdata);
}

if (real_data[0] == PACKET_ID_REQUEST) {
Expand Down Expand Up @@ -1414,7 +1416,7 @@ static int handle_packet_connection(Net_Crypto *c, int crypt_connection_id, cons
conn->status = CRYPTO_CONN_NOT_CONFIRMED;
} else {
if (conn->dht_pk_callback)
conn->dht_pk_callback(conn->dht_pk_callback_object, conn->dht_pk_callback_number, dht_public_key);
conn->dht_pk_callback(conn->dht_pk_callback_object, conn->dht_pk_callback_number, dht_public_key, userdata);
}

} else {
Expand Down Expand Up @@ -1633,7 +1635,9 @@ static int handle_new_connection_handshake(Net_Crypto *c, IP_Port source, const
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);

if (public_key_cmp(n_c.dht_public_key, conn->dht_public_key) != 0) {
connection_kill(c, crypt_connection_id);
connection_kill(c, crypt_connection_id, NULL);
/* In this case it's safe to pass NULL back to connection_kill() because in no sane scenario will we ever
* be already connected to our own DHT public_key */
} else {
int ret = -1;

Expand Down Expand Up @@ -1980,7 +1984,7 @@ static void do_tcp(Net_Crypto *c, void *userdata)
* return 0 on success.
*/
int connection_status_handler(const Net_Crypto *c, int crypt_connection_id,
int (*connection_status_callback)(void *object, int id, uint8_t status), void *object, int id)
int (*connection_status_callback)(void *object, int id, uint8_t status, void *userdata), void *object, int id)
{
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);

Expand Down Expand Up @@ -2049,7 +2053,7 @@ int connection_lossy_data_handler(Net_Crypto *c, int crypt_connection_id,
* return 0 on success.
*/
int nc_dht_pk_callback(Net_Crypto *c, int crypt_connection_id, void (*function)(void *data, int32_t number,
const uint8_t *dht_public_key), void *object, uint32_t number)
const uint8_t *dht_public_key, void *userdata), void *object, uint32_t number)
{
Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);

Expand Down Expand Up @@ -2649,7 +2653,7 @@ Net_Crypto *new_net_crypto(DHT *dht, TCP_Proxy_Info *proxy_info)
return temp;
}

static void kill_timedout(Net_Crypto *c)
static void kill_timedout(Net_Crypto *c, void *userdata)
{
uint32_t i;
//uint64_t temp_time = current_time_monotonic();
Expand All @@ -2668,7 +2672,7 @@ static void kill_timedout(Net_Crypto *c)
if (conn->temp_packet_num_sent < MAX_NUM_SENDPACKET_TRIES)
continue;

connection_kill(c, i);
connection_kill(c, i, userdata);

}

Expand All @@ -2689,7 +2693,7 @@ uint32_t crypto_run_interval(const Net_Crypto *c)
void do_net_crypto(Net_Crypto *c, void *userdata)
{
unix_time_update();
kill_timedout(c);
kill_timedout(c, userdata);
do_tcp(c, userdata);
send_crypto_packets(c);
}
Expand Down
8 changes: 4 additions & 4 deletions toxcore/net_crypto.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ typedef struct {
Packets_Array send_array;
Packets_Array recv_array;

int (*connection_status_callback)(void *object, int id, uint8_t status);
int (*connection_status_callback)(void *object, int id, uint8_t status, void *userdata);
void *connection_status_callback_object;
int connection_status_callback_id;

Expand Down Expand Up @@ -173,7 +173,7 @@ typedef struct {

pthread_mutex_t mutex;

void (*dht_pk_callback)(void *data, int32_t number, const uint8_t *dht_public_key);
void (*dht_pk_callback)(void *data, int32_t number, const uint8_t *dht_public_key, void *userdata);
void *dht_pk_callback_object;
uint32_t dht_pk_callback_number;
} Crypto_Connection;
Expand Down Expand Up @@ -261,7 +261,7 @@ int set_direct_ip_port(Net_Crypto *c, int crypt_connection_id, IP_Port ip_port,
* return 0 on success.
*/
int connection_status_handler(const Net_Crypto *c, int crypt_connection_id,
int (*connection_status_callback)(void *object, int id, uint8_t status), void *object, int id);
int (*connection_status_callback)(void *object, int id, uint8_t status, void *userdata), void *object, int id);

/* Set function to be called when connection with crypt_connection_id receives a lossless data packet of length.
*
Expand Down Expand Up @@ -298,7 +298,7 @@ int connection_lossy_data_handler(Net_Crypto *c, int crypt_connection_id,
* return 0 on success.
*/
int nc_dht_pk_callback(Net_Crypto *c, int crypt_connection_id, void (*function)(void *data, int32_t number,
const uint8_t *dht_public_key), void *object, uint32_t number);
const uint8_t *dht_public_key, void *userdata), void *object, uint32_t number);

/* returns the number of packet slots left in the sendbuffer.
* return 0 if failure.
Expand Down
Loading

0 comments on commit 5dee222

Please sign in to comment.