Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/combine packets from client #61

Merged
merged 7 commits into from
Jun 28, 2019
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Update trudp
  • Loading branch information
angelskieglazki committed Jun 20, 2019
commit 83193d46307509f9c72560d82360b4683280f173
175 changes: 127 additions & 48 deletions src/modules/l0-server.c
Original file line number Diff line number Diff line change
Expand Up @@ -1328,6 +1328,103 @@ inline size_t ksnLNullClientsListLength(teonet_client_data_ar *clients_data) {
clients_data->length * sizeof(clients_data->client_data[0]) : 0;
}

#define BUFFER_SIZE_CLIENT 4096

static ssize_t packetCombineClient(trudpChannelData *tcd, char *data, size_t data_len, ssize_t recieved)
{
ssize_t retval = -1;

if (tcd->last_packet_ptr > 0) {
tcd->read_buffer_ptr -= tcd->last_packet_ptr;
if (tcd->read_buffer_ptr > 0) {
memmove(tcd->read_buffer, (char *)tcd->read_buffer + tcd->last_packet_ptr, (int)tcd->read_buffer_ptr);
}

tcd->last_packet_ptr = 0;
}

if ((size_t) recieved > tcd->read_buffer_size - tcd->read_buffer_ptr) {
tcd->read_buffer_size += data_len;
if (tcd->read_buffer) {
tcd->read_buffer = realloc(tcd->read_buffer, tcd->read_buffer_size);
} else {
tcd->read_buffer = malloc(tcd->read_buffer_size);
}
}

if (recieved > 0) {
memmove((char*)tcd->read_buffer + tcd->read_buffer_ptr, data, recieved);
tcd->read_buffer_ptr += recieved;
}

teoLNullCPacket *packet = (teoLNullCPacket *)tcd->read_buffer;
ssize_t len;

// Process read buffer
if(tcd->read_buffer_ptr - tcd->last_packet_ptr > sizeof(teoLNullCPacket) &&
tcd->read_buffer_ptr - tcd->last_packet_ptr >= (size_t)(len = sizeof(teoLNullCPacket) + packet->peer_name_length + packet->data_length)) {

// Check checksum
uint8_t header_checksum = get_byte_checksum(packet, sizeof(teoLNullCPacket) - sizeof(packet->header_checksum));
uint8_t checksum = get_byte_checksum(packet->peer_name, packet->peer_name_length + packet->data_length);

if(packet->header_checksum == header_checksum && packet->checksum == checksum) {
// Packet has received - return packet size
retval = len;
tcd->last_packet_ptr += len;
} else { // Wrong checksum, wrong packet - drop this packet and return -2
tcd->read_buffer_ptr = 0;
tcd->last_packet_ptr = 0;
retval = -2;
}
}

return retval;
}

ssize_t recvCheck(trudpChannelData *tcd, char *data, ssize_t data_length)
{
return packetCombineClient(tcd, data, BUFFER_SIZE_CLIENT, data_length != -1 ? data_length : 0);
}

int processCmd(ksnLNullClass *kl, ksnCorePacketData *rd, teoLNullCPacket *cp)
{
int retval = 0;
switch(cp->cmd) {

// Login packet
case 0: {
if(cp->peer_name_length == 1 && !cp->peer_name[0] && cp->data_length) {
int fd = kl->fd_trudp++;
ksnLNullClientRegister(kl, fd, rd);
// Add fd to tr-udp channel data
trudpChannelData *tcd = trudpGetChannelAddr(kev->kc->ku, rd->addr, rd->port, 0);
if(tcd) tcd->fd = fd;
retval = 1;
}
} break;

// Process other L0 packets
default: {
// Process other L0 TR-UDP packets
// Send packet to peer
size_t vl;
trudpChannelData *tcd = trudpGetChannelAddr(kev->kc->ku, rd->addr, rd->port, 0);
if(tcd) {
ksnLNullData* kld = pblMapGet(kl->map, &tcd->fd, sizeof(tcd->fd), &vl);
if(kld != NULL && kld->name != NULL) {
kld->last_time = ksnetEvMgrGetTime(kl->ke);
ksnLNullSendFromL0(kl, cp, kld->name, kld->name_length);
} else {
trudp_ChannelSendReset(tcd);
}
}
retval = 1;
} break;
}

return retval;
}
/**
* Check and process L0 packet received through TR-UDP
*
Expand All @@ -1345,14 +1442,10 @@ int ksnLNulltrudpCheckPaket(ksnLNullClass *kl, ksnCorePacketData *rd) {
if(rd->data_len == cp->data_length + cp->peer_name_length + sizeof(teoLNullCPacket))
{
// Check packet checksum
uint8_t header_checksum = get_byte_checksum(cp,
sizeof(teoLNullCPacket) -
sizeof(cp->header_checksum));
uint8_t checksum = get_byte_checksum(cp->peer_name,
cp->peer_name_length + cp->data_length);
uint8_t header_checksum = get_byte_checksum(cp, sizeof(teoLNullCPacket) - sizeof(cp->header_checksum));
uint8_t checksum = get_byte_checksum(cp->peer_name, cp->peer_name_length + cp->data_length);

if(cp->header_checksum == header_checksum &&
cp->checksum == checksum) {
if(cp->header_checksum == header_checksum && cp->checksum == checksum) {

#ifdef DEBUG_KSNET
ksn_printf(kev, MODULE, DEBUG_VV,
Expand All @@ -1363,50 +1456,36 @@ int ksnLNulltrudpCheckPaket(ksnLNullClass *kl, ksnCorePacketData *rd) {
(char*)(cp->peer_name + cp->peer_name_length));
#endif

switch(cp->cmd) {

// Login packet
case 0: {
if(cp->peer_name_length == 1 && !cp->peer_name[0] && cp->data_length) {
int fd = kl->fd_trudp++;
ksnLNullClientRegister(kl, fd, rd);
// Add fd to tr-udp channel data
trudpChannelData *tcd = trudpGetChannelAddr(kev->kc->ku, rd->addr, rd->port, 0);
if(tcd) tcd->fd = fd;
retval = 1;
}
} break;
retval = processCmd(kl, rd, cp);

// Process other L0 packets
default: {
// Process other L0 TR-UDP packets
// Send packet to peer
size_t vl;
trudpChannelData *tcd = trudpGetChannelAddr(kev->kc->ku, rd->addr, rd->port, 0);
if(tcd) {
ksnLNullData* kld = pblMapGet(kl->map, &tcd->fd, sizeof(tcd->fd), &vl);
if(kld != NULL && kld->name != NULL) {
kld->last_time = ksnetEvMgrGetTime(kl->ke);
ksnLNullSendFromL0(kl, cp, kld->name, kld->name_length);
}
else {
trudp_ChannelSendReset(tcd);
}
}
retval = 1;
} break;
}
}
} else {
trudpChannelData *tcd = trudpGetChannelAddr(kev->kc->ku, rd->addr, rd->port, 0);
ssize_t rc = recvCheck(tcd, rd->data, rd->data_len);
if (!(rc > 0)) {
#ifdef DEBUG_KSNET
ksn_printf(kev, MODULE, DEBUG_VV,
"Wait next part of large packet %d\n",
rd->data_len
);
#endif
return 1;
}

void *l_data = tcd->read_buffer;
teoLNullCPacket *cp = trudpPacketGetData(trudpPacketGetPacket(l_data));
#ifdef DEBUG_KSNET
ksn_printf(kev, MODULE, DEBUG_VV,
"got Large TR-UDP packet, from: %s:%d, cmd: %u, to peer: %s, data: %s\n",
rd->addr, rd->port,
(unsigned)cp->cmd,
(char*) cp->peer_name,
(char*)(cp->peer_name + cp->peer_name_length));
#endif

retval = processCmd(kl, rd, cp);
}
// \TODO shell it message added ?
// else {
// #ifdef DEBUG_KSNET
// ksn_puts(kev, MODULE, DEBUG_VV,
// "got undefined TR-UDP packet"
// );
// #endif
// }


return retval;
}

Expand Down
2 changes: 1 addition & 1 deletion src/net_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,7 @@ int ksnCoreBind(ksnCoreClass *kc) {
* @param data Pointer to data
* @param data_len Data size
*
* @return Return 0 if success; -1 if data length is too lage (more than 32319)
* @return Return 0 if success; -1 if data length is too lage (more than MAX_PACKET_LEN)
*/
int ksnCoreSendto(ksnCoreClass *kc, char *addr, int port, uint8_t cmd,
void *data, size_t data_len) {
Expand Down
107 changes: 16 additions & 91 deletions src/tr-udp.c
Original file line number Diff line number Diff line change
Expand Up @@ -2196,81 +2196,6 @@ void trudp_process_receive(trudpData *td, void *data, size_t data_length) {
}
}

#define BUFFER_SIZE_CLIENT 4096

static ssize_t packetCombineClient(trudpChannelData *tcd, char *data, size_t data_len,
ssize_t recieved)
{
ssize_t retval = -1;

if (tcd->last_packet_ptr > 0) {
tcd->read_buffer_ptr -= tcd->last_packet_ptr;
if (tcd->read_buffer_ptr > 0) {
memmove(tcd->read_buffer, (char *)tcd->read_buffer + tcd->last_packet_ptr, (int)tcd->read_buffer_ptr);
}

tcd->last_packet_ptr = 0;
}

if ((size_t) recieved > tcd->read_buffer_size - tcd->read_buffer_ptr) {
tcd->read_buffer_size += data_len;
if (tcd->read_buffer) {
tcd->read_buffer = realloc(tcd->read_buffer, tcd->read_buffer_size);
} else {
tcd->read_buffer = malloc(tcd->read_buffer_size);
}
}

if (recieved > 0) {
memmove((char*)tcd->read_buffer + tcd->read_buffer_ptr, data, recieved);
tcd->read_buffer_ptr += recieved;
}

teoLNullCPacket *packet = (teoLNullCPacket *)tcd->read_buffer;
ssize_t len;

// Process read buffer
if(tcd->read_buffer_ptr - tcd->last_packet_ptr > sizeof(teoLNullCPacket) &&
tcd->read_buffer_ptr - tcd->last_packet_ptr >= (size_t)(len = sizeof(teoLNullCPacket) + packet->peer_name_length + packet->data_length)) {

// Check checksum
uint8_t header_checksum = get_byte_checksum(packet, sizeof(teoLNullCPacket) - sizeof(packet->header_checksum));
uint8_t checksum = get_byte_checksum(packet->peer_name, packet->peer_name_length + packet->data_length);

if(packet->header_checksum == header_checksum && packet->checksum == checksum) {

// Packet has received - return packet size
retval = len;
tcd->last_packet_ptr += len;

//#ifdef DEBUG_MSG
// printf("L0 Server: Identify packet %" PRId32 " bytes length ...\n",
// (int)retval);
//#endif
} else { // Wrong checksum, wrong packet - drop this packet and return -2
tcd->read_buffer_ptr = 0;
tcd->last_packet_ptr = 0;
retval = -2;

//#ifdef DEBUG_MSG
// printf("L0 Client: Wrong packet %" PRId32 " bytes length; dropped ...\n",
// (int)len);
//#endif
}
} else {
//#ifdef DEBUG_MSG
// printf("L0 Client: Wait next part of packet, now it has %" PRId32 " bytes ...\n",
// (int)kld->read_buffer_ptr);
//#endif
}

return retval;
}

ssize_t recvCheck(trudpChannelData *tcd, char *data, ssize_t data_length)
{
return packetCombineClient(tcd, data, BUFFER_SIZE_CLIENT, data_length != -1 ? data_length : 0);
}

/**
* TR-UDP event callback
Expand Down Expand Up @@ -2505,26 +2430,26 @@ void trudp_event_cb(void *tcd_pointer, int event, void *data, size_t data_length
// @param user_data NULL
case GOT_DATA: {

uint32_t id = trudpPacketGetId(trudpPacketGetPacket(data));
size_t length = trudpPacketGetPacketLength(trudpPacketGetPacket(data));
// uint32_t id = trudpPacketGetId(trudpPacketGetPacket(data));
// size_t length = trudpPacketGetPacketLength(trudpPacketGetPacket(data));
// Process package
const trudpData *td = TD(tcd); // used in kev macro
const char *key = trudpChannelMakeKey(tcd);

ssize_t rc = recvCheck(tcd, data, data_length);
if (!(rc > 0)) {
#ifdef DEBUG_KSNET
ksn_printf(kev, MODULE, DEBUG_VV,
"%d !!!!!!!!!!!!!!!!!!!\n",
data_length
);
#endif
break;
}
data_length = rc;
data = tcd->read_buffer;
//teoLNullCPacket *cp = trudpPacketGetData(trudpPacketGetPacket(data));
//printf("!!!!!!!!!!!!!!!!!!!!!!!!!!got %d byte data at channel %s [%.3f(%.3f) ms], id=%u, peer: %s, cmd: %d, data length: %d,data: %s\n", length, key, (double)tcd->triptime / 1000.0, (double)tcd->triptimeMiddle / 1000.0, id, cp->peer_name, cp->cmd, cp->data_length, cp->peer_name + cp->peer_name_length);
// ssize_t rc = recvCheck(tcd, data, data_length);
// if (!(rc > 0)) {
// #ifdef DEBUG_KSNET
// ksn_printf(kev, MODULE, DEBUG_VV,
// "%d !!!!!!!!!!!!!!!!!!!\n",
// data_length
// );
// #endif
// break;
// }
// data_length = rc;
// data = tcd->read_buffer;
// //teoLNullCPacket *cp = trudpPacketGetData(trudpPacketGetPacket(data));
// //printf("!!!!!!!!!!!!!!!!!!!!!!!!!!got %d byte data at channel %s [%.3f(%.3f) ms], id=%u, peer: %s, cmd: %d, data length: %d,data: %s\n", length, key, (double)tcd->triptime / 1000.0, (double)tcd->triptimeMiddle / 1000.0, id, cp->peer_name, cp->cmd, cp->data_length, cp->peer_name + cp->peer_name_length);
#ifdef DEBUG_KSNET
ksn_printf(kev, MODULE, DEBUG_VV,
"got %d bytes DATA packet from channel %s\n",
Expand Down