Browse Source

Purge idle communities

pull/128/head
emanuele-f 6 years ago
parent
commit
1d03f9ba59
  1. 40
      sn.c

40
sn.c

@ -129,7 +129,7 @@ static uint16_t reg_lifetime(n2n_sn_t * sss) {
* supernode. */ * supernode. */
static int update_edge(n2n_sn_t * sss, static int update_edge(n2n_sn_t * sss,
const n2n_mac_t edgeMac, const n2n_mac_t edgeMac,
struct sn_community *community, struct sn_community *comm,
const n2n_sock_t * sender_sock, const n2n_sock_t * sender_sock,
time_t now) { time_t now) {
macstr_t mac_buf; macstr_t mac_buf;
@ -140,28 +140,28 @@ static int update_edge(n2n_sn_t * sss,
macaddr_str(mac_buf, edgeMac), macaddr_str(mac_buf, edgeMac),
sock_to_cstr(sockbuf, sender_sock)); sock_to_cstr(sockbuf, sender_sock));
HASH_FIND_PEER(community->edges, edgeMac, scan); HASH_FIND_PEER(comm->edges, edgeMac, scan);
if(NULL == scan) { if(NULL == scan) {
/* Not known */ /* Not known */
scan = (struct peer_info*)calloc(1, sizeof(struct peer_info)); /* deallocated in purge_expired_registrations */ scan = (struct peer_info*)calloc(1, sizeof(struct peer_info)); /* deallocated in purge_expired_registrations */
memcpy(scan->community_name, community->community, sizeof(n2n_community_t)); memcpy(scan->community_name, comm->community, sizeof(n2n_community_t));
memcpy(&(scan->mac_addr), edgeMac, sizeof(n2n_mac_t)); memcpy(&(scan->mac_addr), edgeMac, sizeof(n2n_mac_t));
memcpy(&(scan->sock), sender_sock, sizeof(n2n_sock_t)); memcpy(&(scan->sock), sender_sock, sizeof(n2n_sock_t));
HASH_ADD_PEER(community->edges, scan); HASH_ADD_PEER(comm->edges, scan);
traceEvent(TRACE_INFO, "update_edge created %s ==> %s", traceEvent(TRACE_INFO, "update_edge created %s ==> %s",
macaddr_str(mac_buf, edgeMac), macaddr_str(mac_buf, edgeMac),
sock_to_cstr(sockbuf, sender_sock)); sock_to_cstr(sockbuf, sender_sock));
} else { } else {
/* Known */ /* Known */
if((0 != memcmp(community, scan->community_name, sizeof(n2n_community_t))) || if((0 != memcmp(comm, scan->community_name, sizeof(n2n_community_t))) ||
(!sock_equal(sender_sock, &(scan->sock)))) (!sock_equal(sender_sock, &(scan->sock))))
{ {
memcpy(scan->community_name, community, sizeof(n2n_community_t)); memcpy(scan->community_name, comm, sizeof(n2n_community_t));
memcpy(&(scan->sock), sender_sock, sizeof(n2n_sock_t)); memcpy(&(scan->sock), sender_sock, sizeof(n2n_sock_t));
traceEvent(TRACE_INFO, "update_edge updated %s ==> %s", traceEvent(TRACE_INFO, "update_edge updated %s ==> %s",
@ -623,14 +623,14 @@ static int process_udp(n2n_sn_t * sss,
n2n_common_t cmn2; n2n_common_t cmn2;
uint8_t ackbuf[N2N_SN_PKTBUF_SIZE]; uint8_t ackbuf[N2N_SN_PKTBUF_SIZE];
size_t encx=0; size_t encx=0;
struct sn_community *community; struct sn_community *comm;
/* Edge requesting registration with us. */ /* Edge requesting registration with us. */
sss->stats.last_reg_super=now; sss->stats.last_reg_super=now;
++(sss->stats.reg_super); ++(sss->stats.reg_super);
decode_REGISTER_SUPER(&reg, &cmn, udp_buf, &rem, &idx); decode_REGISTER_SUPER(&reg, &cmn, udp_buf, &rem, &idx);
HASH_FIND_COMMUNITY(sss->communities, (char*)cmn.community, community); HASH_FIND_COMMUNITY(sss->communities, (char*)cmn.community, comm);
/* /*
Before we move any further, we need to check if the requested Before we move any further, we need to check if the requested
@ -638,19 +638,19 @@ static int process_udp(n2n_sn_t * sss,
not report any message back to the edge to hide the supernode not report any message back to the edge to hide the supernode
existance (better from the security standpoint) existance (better from the security standpoint)
*/ */
if(!community && !sss->lock_communities) { if(!comm && !sss->lock_communities) {
community = calloc(1, sizeof(struct sn_community)); comm = calloc(1, sizeof(struct sn_community));
if(community) { if(comm) {
strncpy(community->community, (char*)cmn.community, N2N_COMMUNITY_SIZE-1); strncpy(comm->community, (char*)cmn.community, N2N_COMMUNITY_SIZE-1);
community->community[N2N_COMMUNITY_SIZE-1] = '\0'; comm->community[N2N_COMMUNITY_SIZE-1] = '\0';
HASH_ADD_STR(sss->communities, community, community); HASH_ADD_STR(sss->communities, community, comm);
traceEvent(TRACE_INFO, "New community: %s", community->community); traceEvent(TRACE_INFO, "New community: %s", comm->community);
} }
} }
if(community) { if(comm) {
cmn2.ttl = N2N_DEFAULT_TTL; cmn2.ttl = N2N_DEFAULT_TTL;
cmn2.pc = n2n_register_super_ack; cmn2.pc = n2n_register_super_ack;
cmn2.flags = N2N_FLAGS_SOCKET | N2N_FLAGS_FROM_SUPERNODE; cmn2.flags = N2N_FLAGS_SOCKET | N2N_FLAGS_FROM_SUPERNODE;
@ -671,7 +671,7 @@ static int process_udp(n2n_sn_t * sss,
macaddr_str(mac_buf, reg.edgeMac), macaddr_str(mac_buf, reg.edgeMac),
sock_to_cstr(sockbuf, &(ack.sock))); sock_to_cstr(sockbuf, &(ack.sock)));
update_edge(sss, reg.edgeMac, community, &(ack.sock), now); update_edge(sss, reg.edgeMac, comm, &(ack.sock), now);
encode_REGISTER_SUPER_ACK(ackbuf, &encx, &cmn2, &ack); encode_REGISTER_SUPER_ACK(ackbuf, &encx, &cmn2, &ack);
@ -1111,6 +1111,12 @@ static int run_loop(n2n_sn_t * sss) {
HASH_ITER(hh, sss->communities, comm, tmp) { HASH_ITER(hh, sss->communities, comm, tmp) {
purge_expired_registrations( &comm->edges, &last_purge_edges ); purge_expired_registrations( &comm->edges, &last_purge_edges );
if(comm->edges == NULL) {
traceEvent(TRACE_INFO, "Purging idle community %s", comm->community);
HASH_DEL(sss->communities, comm);
free(comm);
}
} }
} /* while */ } /* while */

Loading…
Cancel
Save