mirror of
https://github.com/irungentoo/toxcore.git
synced 2024-03-22 13:30:51 +08:00
Lossless crypto packets can now be sent without the congestion control applying to them.
This commit is contained in:
parent
411457dc8f
commit
69725e8e74
|
@ -41,7 +41,7 @@
|
||||||
|
|
||||||
static void set_friend_status(Messenger *m, int32_t friendnumber, uint8_t status);
|
static void set_friend_status(Messenger *m, int32_t friendnumber, uint8_t status);
|
||||||
static int write_cryptpacket_id(const Messenger *m, int32_t friendnumber, uint8_t packet_id, const uint8_t *data,
|
static int write_cryptpacket_id(const Messenger *m, int32_t friendnumber, uint8_t packet_id, const uint8_t *data,
|
||||||
uint32_t length);
|
uint32_t length, uint8_t congestion_control);
|
||||||
|
|
||||||
// friend_not_valid determines if the friendnumber passed is valid in the Messenger object
|
// friend_not_valid determines if the friendnumber passed is valid in the Messenger object
|
||||||
static uint8_t friend_not_valid(const Messenger *m, int32_t friendnumber)
|
static uint8_t friend_not_valid(const Messenger *m, int32_t friendnumber)
|
||||||
|
@ -395,7 +395,7 @@ uint32_t m_sendmessage_withid(Messenger *m, int32_t friendnumber, uint32_t theid
|
||||||
theid = htonl(theid);
|
theid = htonl(theid);
|
||||||
memcpy(temp, &theid, sizeof(theid));
|
memcpy(temp, &theid, sizeof(theid));
|
||||||
memcpy(temp + sizeof(theid), message, length);
|
memcpy(temp + sizeof(theid), message, length);
|
||||||
return write_cryptpacket_id(m, friendnumber, PACKET_ID_MESSAGE, temp, sizeof(temp));
|
return write_cryptpacket_id(m, friendnumber, PACKET_ID_MESSAGE, temp, sizeof(temp), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Send an action to an online friend.
|
/* Send an action to an online friend.
|
||||||
|
@ -430,7 +430,7 @@ uint32_t m_sendaction_withid(const Messenger *m, int32_t friendnumber, uint32_t
|
||||||
theid = htonl(theid);
|
theid = htonl(theid);
|
||||||
memcpy(temp, &theid, sizeof(theid));
|
memcpy(temp, &theid, sizeof(theid));
|
||||||
memcpy(temp + sizeof(theid), action, length);
|
memcpy(temp + sizeof(theid), action, length);
|
||||||
return write_cryptpacket_id(m, friendnumber, PACKET_ID_ACTION, temp, sizeof(temp));
|
return write_cryptpacket_id(m, friendnumber, PACKET_ID_ACTION, temp, sizeof(temp), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Send a name packet to friendnumber.
|
/* Send a name packet to friendnumber.
|
||||||
|
@ -441,7 +441,7 @@ static int m_sendname(const Messenger *m, int32_t friendnumber, const uint8_t *n
|
||||||
if (length > MAX_NAME_LENGTH || length == 0)
|
if (length > MAX_NAME_LENGTH || length == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return write_cryptpacket_id(m, friendnumber, PACKET_ID_NICKNAME, name, length);
|
return write_cryptpacket_id(m, friendnumber, PACKET_ID_NICKNAME, name, length, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the name and name_length of a friend.
|
/* Set the name and name_length of a friend.
|
||||||
|
@ -659,23 +659,23 @@ uint8_t m_get_istyping(const Messenger *m, int32_t friendnumber)
|
||||||
|
|
||||||
static int send_statusmessage(const Messenger *m, int32_t friendnumber, const uint8_t *status, uint16_t length)
|
static int send_statusmessage(const Messenger *m, int32_t friendnumber, const uint8_t *status, uint16_t length)
|
||||||
{
|
{
|
||||||
return write_cryptpacket_id(m, friendnumber, PACKET_ID_STATUSMESSAGE, status, length);
|
return write_cryptpacket_id(m, friendnumber, PACKET_ID_STATUSMESSAGE, status, length, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int send_userstatus(const Messenger *m, int32_t friendnumber, uint8_t status)
|
static int send_userstatus(const Messenger *m, int32_t friendnumber, uint8_t status)
|
||||||
{
|
{
|
||||||
return write_cryptpacket_id(m, friendnumber, PACKET_ID_USERSTATUS, &status, sizeof(status));
|
return write_cryptpacket_id(m, friendnumber, PACKET_ID_USERSTATUS, &status, sizeof(status), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int send_user_istyping(const Messenger *m, int32_t friendnumber, uint8_t is_typing)
|
static int send_user_istyping(const Messenger *m, int32_t friendnumber, uint8_t is_typing)
|
||||||
{
|
{
|
||||||
uint8_t typing = is_typing;
|
uint8_t typing = is_typing;
|
||||||
return write_cryptpacket_id(m, friendnumber, PACKET_ID_TYPING, &typing, sizeof(typing));
|
return write_cryptpacket_id(m, friendnumber, PACKET_ID_TYPING, &typing, sizeof(typing), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int send_ping(const Messenger *m, int32_t friendnumber)
|
static int send_ping(const Messenger *m, int32_t friendnumber)
|
||||||
{
|
{
|
||||||
int ret = write_cryptpacket_id(m, friendnumber, PACKET_ID_ALIVE, 0, 0);
|
int ret = write_cryptpacket_id(m, friendnumber, PACKET_ID_ALIVE, 0, 0, 0);
|
||||||
|
|
||||||
if (ret == 1)
|
if (ret == 1)
|
||||||
m->friendlist[friendnumber].ping_lastsent = unix_time();
|
m->friendlist[friendnumber].ping_lastsent = unix_time();
|
||||||
|
@ -692,7 +692,7 @@ static int send_relays(const Messenger *m, int32_t friendnumber)
|
||||||
n = copy_connected_tcp_relays(m->net_crypto, nodes, MAX_SHARED_RELAYS);
|
n = copy_connected_tcp_relays(m->net_crypto, nodes, MAX_SHARED_RELAYS);
|
||||||
length = pack_nodes(data, sizeof(data), nodes, n);
|
length = pack_nodes(data, sizeof(data), nodes, n);
|
||||||
|
|
||||||
int ret = write_cryptpacket_id(m, friendnumber, PACKET_ID_SHARE_RELAYS, data, length);
|
int ret = write_cryptpacket_id(m, friendnumber, PACKET_ID_SHARE_RELAYS, data, length, 0);
|
||||||
|
|
||||||
if (ret == 1)
|
if (ret == 1)
|
||||||
m->friendlist[friendnumber].share_relays_lastsent = unix_time();
|
m->friendlist[friendnumber].share_relays_lastsent = unix_time();
|
||||||
|
@ -842,8 +842,8 @@ void set_friend_status(Messenger *m, int32_t friendnumber, uint8_t status)
|
||||||
m->friendlist[friendnumber].status = status;
|
m->friendlist[friendnumber].status = status;
|
||||||
}
|
}
|
||||||
|
|
||||||
int write_cryptpacket_id(const Messenger *m, int32_t friendnumber, uint8_t packet_id, const uint8_t *data,
|
static int write_cryptpacket_id(const Messenger *m, int32_t friendnumber, uint8_t packet_id, const uint8_t *data,
|
||||||
uint32_t length)
|
uint32_t length, uint8_t congestion_control)
|
||||||
{
|
{
|
||||||
if (friend_not_valid(m, friendnumber))
|
if (friend_not_valid(m, friendnumber))
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -857,7 +857,8 @@ int write_cryptpacket_id(const Messenger *m, int32_t friendnumber, uint8_t packe
|
||||||
if (length != 0)
|
if (length != 0)
|
||||||
memcpy(packet + 1, data, length);
|
memcpy(packet + 1, data, length);
|
||||||
|
|
||||||
return write_cryptpacket(m->net_crypto, m->friendlist[friendnumber].crypt_connection_id, packet, length + 1) != -1;
|
return write_cryptpacket(m->net_crypto, m->friendlist[friendnumber].crypt_connection_id, packet, length + 1,
|
||||||
|
congestion_control) != -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********GROUP CHATS************/
|
/**********GROUP CHATS************/
|
||||||
|
@ -1181,7 +1182,7 @@ int invite_friend(Messenger *m, int32_t friendnumber, int groupnumber)
|
||||||
group_store_friendinvite(m, friendnumber, groupnumber);
|
group_store_friendinvite(m, friendnumber, groupnumber);
|
||||||
|
|
||||||
if (write_cryptpacket_id(m, friendnumber, PACKET_ID_INVITE_GROUPCHAT, m->chats[groupnumber]->self_public_key,
|
if (write_cryptpacket_id(m, friendnumber, PACKET_ID_INVITE_GROUPCHAT, m->chats[groupnumber]->self_public_key,
|
||||||
crypto_box_PUBLICKEYBYTES) == 0)
|
crypto_box_PUBLICKEYBYTES, 0) == 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1214,7 +1215,7 @@ int join_groupchat(Messenger *m, int32_t friendnumber, const uint8_t *friend_gro
|
||||||
id_copy(data, friend_group_public_key);
|
id_copy(data, friend_group_public_key);
|
||||||
id_copy(data + crypto_box_PUBLICKEYBYTES, m->chats[groupnum]->self_public_key);
|
id_copy(data + crypto_box_PUBLICKEYBYTES, m->chats[groupnum]->self_public_key);
|
||||||
|
|
||||||
if (write_cryptpacket_id(m, friendnumber, PACKET_ID_JOIN_GROUPCHAT, data, sizeof(data))) {
|
if (write_cryptpacket_id(m, friendnumber, PACKET_ID_JOIN_GROUPCHAT, data, sizeof(data), 0)) {
|
||||||
chat_bootstrap_nonlazy(m->chats[groupnum], get_friend_ipport(m, friendnumber),
|
chat_bootstrap_nonlazy(m->chats[groupnum], get_friend_ipport(m, friendnumber),
|
||||||
friend_group_public_key); //TODO: check if ip returned is zero?
|
friend_group_public_key); //TODO: check if ip returned is zero?
|
||||||
return groupnum;
|
return groupnum;
|
||||||
|
@ -1376,7 +1377,7 @@ int file_sendrequest(const Messenger *m, int32_t friendnumber, uint8_t filenumbe
|
||||||
memcpy(packet + 1, &filesize, sizeof(filesize));
|
memcpy(packet + 1, &filesize, sizeof(filesize));
|
||||||
memcpy(packet + 1 + sizeof(filesize), filename, filename_length);
|
memcpy(packet + 1 + sizeof(filesize), filename, filename_length);
|
||||||
return write_cryptpacket_id(m, friendnumber, PACKET_ID_FILE_SENDREQUEST, packet,
|
return write_cryptpacket_id(m, friendnumber, PACKET_ID_FILE_SENDREQUEST, packet,
|
||||||
1 + sizeof(filesize) + filename_length);
|
1 + sizeof(filesize) + filename_length, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Send a file send request.
|
/* Send a file send request.
|
||||||
|
@ -1454,7 +1455,7 @@ int file_control(const Messenger *m, int32_t friendnumber, uint8_t send_receive,
|
||||||
memcpy(packet + 3, data, length);
|
memcpy(packet + 3, data, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (write_cryptpacket_id(m, friendnumber, PACKET_ID_FILE_CONTROL, packet, length + 3)) {
|
if (write_cryptpacket_id(m, friendnumber, PACKET_ID_FILE_CONTROL, packet, length + 3, 0)) {
|
||||||
if (send_receive == 1)
|
if (send_receive == 1)
|
||||||
switch (message_id) {
|
switch (message_id) {
|
||||||
case FILECONTROL_ACCEPT:
|
case FILECONTROL_ACCEPT:
|
||||||
|
@ -1524,7 +1525,7 @@ int file_data(const Messenger *m, int32_t friendnumber, uint8_t filenumber, cons
|
||||||
packet[0] = filenumber;
|
packet[0] = filenumber;
|
||||||
memcpy(packet + 1, data, length);
|
memcpy(packet + 1, data, length);
|
||||||
|
|
||||||
if (write_cryptpacket_id(m, friendnumber, PACKET_ID_FILE_DATA, packet, length + 1)) {
|
if (write_cryptpacket_id(m, friendnumber, PACKET_ID_FILE_DATA, packet, length + 1, 1)) {
|
||||||
m->friendlist[friendnumber].file_sending[filenumber].transferred += length;
|
m->friendlist[friendnumber].file_sending[filenumber].transferred += length;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1681,7 +1682,7 @@ void m_callback_msi_packet(Messenger *m, void (*function)(Messenger *m, int32_t,
|
||||||
*/
|
*/
|
||||||
int m_msi_packet(const Messenger *m, int32_t friendnumber, const uint8_t *data, uint16_t length)
|
int m_msi_packet(const Messenger *m, int32_t friendnumber, const uint8_t *data, uint16_t length)
|
||||||
{
|
{
|
||||||
return write_cryptpacket_id(m, friendnumber, PACKET_ID_MSI, data, length);
|
return write_cryptpacket_id(m, friendnumber, PACKET_ID_MSI, data, length, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int handle_custom_lossy_packet(void *object, int friend_num, const uint8_t *packet, uint16_t length)
|
static int handle_custom_lossy_packet(void *object, int friend_num, const uint8_t *packet, uint16_t length)
|
||||||
|
@ -1778,7 +1779,7 @@ int send_custom_lossless_packet(const Messenger *m, int32_t friendnumber, const
|
||||||
if (m->friendlist[friendnumber].crypt_connection_id == -1)
|
if (m->friendlist[friendnumber].crypt_connection_id == -1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return write_cryptpacket(m->net_crypto, m->friendlist[friendnumber].crypt_connection_id, data, length) != -1;
|
return write_cryptpacket(m->net_crypto, m->friendlist[friendnumber].crypt_connection_id, data, length, 1) != -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Function to filter out some friend requests*/
|
/* Function to filter out some friend requests*/
|
||||||
|
@ -2066,7 +2067,7 @@ static int handle_packet(void *object, int i, uint8_t *temp, uint16_t len)
|
||||||
message_terminated[message_length] = 0;
|
message_terminated[message_length] = 0;
|
||||||
|
|
||||||
if (m->friendlist[i].receives_read_receipts) {
|
if (m->friendlist[i].receives_read_receipts) {
|
||||||
write_cryptpacket_id(m, i, PACKET_ID_RECEIPT, message_id, message_id_length);
|
write_cryptpacket_id(m, i, PACKET_ID_RECEIPT, message_id, message_id_length, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m->friend_message)
|
if (m->friend_message)
|
||||||
|
@ -2091,7 +2092,7 @@ static int handle_packet(void *object, int i, uint8_t *temp, uint16_t len)
|
||||||
action_terminated[action_length] = 0;
|
action_terminated[action_length] = 0;
|
||||||
|
|
||||||
if (m->friendlist[i].receives_read_receipts) {
|
if (m->friendlist[i].receives_read_receipts) {
|
||||||
write_cryptpacket_id(m, i, PACKET_ID_RECEIPT, message_id, message_id_length);
|
write_cryptpacket_id(m, i, PACKET_ID_RECEIPT, message_id, message_id_length, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m->friend_action)
|
if (m->friend_action)
|
||||||
|
|
|
@ -777,7 +777,8 @@ static int send_data_packet_helper(Net_Crypto *c, int crypt_connection_id, uint3
|
||||||
/* return -1 if data could not be put in packet queue.
|
/* return -1 if data could not be put in packet queue.
|
||||||
* return positive packet number if data was put into the queue.
|
* return positive packet number if data was put into the queue.
|
||||||
*/
|
*/
|
||||||
static int64_t send_lossless_packet(Net_Crypto *c, int crypt_connection_id, const uint8_t *data, uint32_t length)
|
static int64_t send_lossless_packet(Net_Crypto *c, int crypt_connection_id, const uint8_t *data, uint32_t length,
|
||||||
|
uint8_t congestion_control)
|
||||||
{
|
{
|
||||||
if (length == 0 || length > MAX_CRYPTO_DATA_SIZE)
|
if (length == 0 || length > MAX_CRYPTO_DATA_SIZE)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -796,20 +797,30 @@ static int64_t send_lossless_packet(Net_Crypto *c, int crypt_connection_id, cons
|
||||||
uint32_t packet_num = conn->send_array.buffer_end - 1;
|
uint32_t packet_num = conn->send_array.buffer_end - 1;
|
||||||
int ret = get_data_pointer(&conn->send_array, &dt, packet_num);
|
int ret = get_data_pointer(&conn->send_array, &dt, packet_num);
|
||||||
|
|
||||||
|
uint8_t send_failed = 0;
|
||||||
|
|
||||||
if (ret == 1) {
|
if (ret == 1) {
|
||||||
if (!dt->time) {
|
if (!dt->time) {
|
||||||
if (send_data_packet_helper(c, crypt_connection_id, conn->recv_array.buffer_start, packet_num, dt->data,
|
if (send_data_packet_helper(c, crypt_connection_id, conn->recv_array.buffer_start, packet_num, dt->data,
|
||||||
dt->length) != 0) {
|
dt->length) != 0) {
|
||||||
return -1;
|
if (congestion_control) {
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
send_failed = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
dt->time = temp_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
dt->time = temp_time;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!send_failed) {
|
||||||
|
conn->maximum_speed_reached = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Packet_Data dt;
|
Packet_Data dt;
|
||||||
dt.time = temp_time;
|
dt.time = 0;
|
||||||
dt.length = length;
|
dt.length = length;
|
||||||
memcpy(dt.data, data, length);
|
memcpy(dt.data, data, length);
|
||||||
int64_t packet_num = add_data_end_of_buffer(&conn->send_array, &dt);
|
int64_t packet_num = add_data_end_of_buffer(&conn->send_array, &dt);
|
||||||
|
@ -817,12 +828,17 @@ static int64_t send_lossless_packet(Net_Crypto *c, int crypt_connection_id, cons
|
||||||
if (packet_num == -1)
|
if (packet_num == -1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
if (!congestion_control && conn->maximum_speed_reached) {
|
||||||
|
return packet_num;
|
||||||
|
}
|
||||||
|
|
||||||
conn->maximum_speed_reached = 0;
|
conn->maximum_speed_reached = 0;
|
||||||
|
|
||||||
if (send_data_packet_helper(c, crypt_connection_id, conn->recv_array.buffer_start, packet_num, data, length) != 0) {
|
if (send_data_packet_helper(c, crypt_connection_id, conn->recv_array.buffer_start, packet_num, data, length) == 0) {
|
||||||
Packet_Data *dt1 = NULL;
|
Packet_Data *dt1 = NULL;
|
||||||
get_data_pointer(&conn->send_array, &dt1, packet_num);
|
get_data_pointer(&conn->send_array, &dt1, packet_num);
|
||||||
dt1->time = 0;
|
dt1->time = temp_time;
|
||||||
|
} else {
|
||||||
conn->maximum_speed_reached = 1;
|
conn->maximum_speed_reached = 1;
|
||||||
fprintf(stderr, "send_data_packet failed\n");
|
fprintf(stderr, "send_data_packet failed\n");
|
||||||
}
|
}
|
||||||
|
@ -2438,9 +2454,10 @@ uint32_t crypto_num_free_sendqueue_slots(const Net_Crypto *c, int crypt_connecti
|
||||||
* return -1 if data could not be put in packet queue.
|
* return -1 if data could not be put in packet queue.
|
||||||
* return positive packet number if data was put into the queue.
|
* return positive packet number if data was put into the queue.
|
||||||
*
|
*
|
||||||
* The first byte of data must be in the CRYPTO_RESERVED_PACKETS to PACKET_ID_LOSSY_RANGE_START range.
|
* congestion_control: should congestion control apply to this packet?
|
||||||
*/
|
*/
|
||||||
int64_t write_cryptpacket(Net_Crypto *c, int crypt_connection_id, const uint8_t *data, uint32_t length)
|
int64_t write_cryptpacket(Net_Crypto *c, int crypt_connection_id, const uint8_t *data, uint32_t length,
|
||||||
|
uint8_t congestion_control)
|
||||||
{
|
{
|
||||||
if (length == 0)
|
if (length == 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -2459,16 +2476,19 @@ int64_t write_cryptpacket(Net_Crypto *c, int crypt_connection_id, const uint8_t
|
||||||
if (conn->status != CRYPTO_CONN_ESTABLISHED)
|
if (conn->status != CRYPTO_CONN_ESTABLISHED)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (conn->packets_left == 0)
|
if (congestion_control && conn->packets_left == 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
int64_t ret = send_lossless_packet(c, crypt_connection_id, data, length);
|
int64_t ret = send_lossless_packet(c, crypt_connection_id, data, length, congestion_control);
|
||||||
|
|
||||||
if (ret == -1)
|
if (ret == -1)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
--conn->packets_left;
|
if (congestion_control) {
|
||||||
conn->packets_sent++;
|
--conn->packets_left;
|
||||||
|
conn->packets_sent++;
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -305,8 +305,11 @@ uint32_t crypto_num_free_sendqueue_slots(const Net_Crypto *c, int crypt_connecti
|
||||||
* return positive packet number if data was put into the queue.
|
* return positive packet number if data was put into the queue.
|
||||||
*
|
*
|
||||||
* The first byte of data must be in the CRYPTO_RESERVED_PACKETS to PACKET_ID_LOSSY_RANGE_START range.
|
* The first byte of data must be in the CRYPTO_RESERVED_PACKETS to PACKET_ID_LOSSY_RANGE_START range.
|
||||||
|
*
|
||||||
|
* congestion_control: should congestion control apply to this packet?
|
||||||
*/
|
*/
|
||||||
int64_t write_cryptpacket(Net_Crypto *c, int crypt_connection_id, const uint8_t *data, uint32_t length);
|
int64_t write_cryptpacket(Net_Crypto *c, int crypt_connection_id, const uint8_t *data, uint32_t length,
|
||||||
|
uint8_t congestion_control);
|
||||||
|
|
||||||
/* Check if packet_number was received by the other side.
|
/* Check if packet_number was received by the other side.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue
Block a user