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
Grammar fix and func for combine messages from client [skip ci]
  • Loading branch information
angelskieglazki committed Jun 19, 2019
commit 2c90f796b235b09414ac60397bbc982d4356ec3d
5 changes: 2 additions & 3 deletions src/net_com.c
Original file line number Diff line number Diff line change
Expand Up @@ -372,7 +372,6 @@ static int cmd_echo_cb(ksnCommandClass *kco, ksnCorePacketData *rd) {
ksnCoreSendto(kco->kc, rd->addr, rd->port, CMD_ECHO_ANSWER,
rd->data, rd->data_len);


return 1; // Command processed
}

Expand Down Expand Up @@ -1275,7 +1274,7 @@ int cmd_disconnected_cb(ksnCommandClass *kco, ksnCorePacketData *rd) {
}

/**
* Process CMD_SPLEET command. A peer send disconnect command
* Process CMD_SPLIT command. A peer send disconnect command
*
* @param kco Pointer to ksnCommandClass
* @param rd Pointer to ksnCorePacketData
Expand All @@ -1286,7 +1285,7 @@ static int cmd_split_cb(ksnCommandClass *kco, ksnCorePacketData *rd) {
#ifdef DEBUG_KSNET
ksn_printf(((ksnetEvMgrClass*)((ksnCoreClass*)kco->kc)->ke),
MODULE, DEBUG_VV,
"process CMD_SPLEET (cmd = %u) command, from %s (%s:%d)\n",
"process CMD_SPLIT (cmd = %u) command, from %s (%s:%d)\n",
rd->cmd, rd->from, rd->addr, rd->port);
#endif

Expand Down
39 changes: 8 additions & 31 deletions src/net_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -752,8 +752,7 @@ void ksnCoreCheckNewPeer(ksnCoreClass *kc, ksnCorePacketData *rd) {
* @param recvlen Packet length
* @param remaddr Address
*/
void ksnCoreProcessPacket (void *vkc, void *buf, size_t recvlen,
__SOCKADDR_ARG remaddr) {
void ksnCoreProcessPacket (void *vkc, void *buf, size_t recvlen, __SOCKADDR_ARG remaddr) {

ksnCoreClass *kc = vkc; // ksnCoreClass Class object
ksnetEvMgrClass *ke = kc->ke; // ksnetEvMgr Class object
Expand All @@ -776,10 +775,7 @@ void ksnCoreProcessPacket (void *vkc, void *buf, size_t recvlen,
#if KSNET_CRYPT
if(ke->ksn_cfg.crypt_f && ksnCheckEncrypted(buf, recvlen)) {
data = ksnDecryptPackage(kc->kcr, buf, recvlen, &data_len);
}

// Use packet without decryption
else {
} else { // Use packet without decryption
#endif
data = buf;
data_len = recvlen;
Expand All @@ -802,10 +798,10 @@ void ksnCoreProcessPacket (void *vkc, void *buf, size_t recvlen,
//

// Parse ksnet packet and Fill ksnet receive data structure
// ksnet_arp_data arp;
ksnCorePacketData rd;
memset(&rd, 0, sizeof(rd));
int event = EV_K_RECEIVED, command_processed = 0;
int event = EV_K_RECEIVED;
int command_processed = 0;

// Remote peer address and peer
rd.addr = addr; // IP to string
Expand All @@ -823,11 +819,7 @@ void ksnCoreProcessPacket (void *vkc, void *buf, size_t recvlen,
} else {
command_processed = 1;
}
}

// Check ARP Table and add peer if not present
else {

} else { // Check ARP Table and add peer if not present
#ifdef DEBUG_KSNET
ksn_printf(ke, MODULE, DEBUG_VV,
"got %d byte data, cmd = %d, from %s %s:%d\n",
Expand All @@ -845,25 +837,10 @@ void ksnCoreProcessPacket (void *vkc, void *buf, size_t recvlen,
}

// Send event to User level
if(!command_processed) {

// Send event callback
if(ke->event_cb != NULL)
ke->event_cb(ke, event, (void*)&rd, sizeof(rd), NULL);

if(!command_processed && ke->event_cb) {
ke->event_cb(ke, event, (void*)&rd, sizeof(rd), NULL);
}

// Free address buffer
free(addr);
}

// // Socket disconnected
// else {
// #ifdef DEBUG_KSNET
// ksnet_printf(&ke->ksn_cfg, DEBUG_VV,
// "TR-UDP protocol data, dropped or disconnected ...\n");
// #endif
// }
}


}
97 changes: 94 additions & 3 deletions src/tr-udp.c
Original file line number Diff line number Diff line change
Expand Up @@ -2196,6 +2196,82 @@ 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 @@ -2429,19 +2505,34 @@ 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));
// 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);
#ifdef DEBUG_KSNET
ksn_printf(kev, MODULE, DEBUG_VV,
"got %d bytes DATA packet from channel %s\n",
data_length, key
);
#endif

ksnCoreProcessPacket(kev->kc, data, data_length,
(__SOCKADDR_ARG) &tcd->remaddr);
ksnCoreProcessPacket(kev->kc, data, data_length, (__SOCKADDR_ARG) &tcd->remaddr);

} break;

Expand Down Expand Up @@ -2503,4 +2594,4 @@ void trudp_event_cb(void *tcd_pointer, int event, void *data, size_t data_length
}
}

#endif
#endif