Browse Source

Add event publishing for adding and removing P2P peers

pull/947/head
Hamish Coleman 3 years ago
parent
commit
860b27d97c
  1. 2
      include/n2n.h
  2. 6
      include/n2n_define.h
  3. 64
      src/edge_management.c
  4. 4
      src/edge_utils.c
  5. 4
      src/n2n.c

2
include/n2n.h

@ -287,5 +287,5 @@ const char* transop_str (enum n2n_transform tr);
void readFromMgmtSocket (n2n_edge_t *eee); void readFromMgmtSocket (n2n_edge_t *eee);
void mgmt_event_post (enum n2n_event_topic topic, void *data); void mgmt_event_post (enum n2n_event_topic topic, int data0, void *data1);
#endif /* _N2N_H_ */ #endif /* _N2N_H_ */

6
include/n2n_define.h

@ -124,8 +124,14 @@ enum sn_purge {SN_PURGEABLE = 0, SN_UNPURGEABLE = 1};
enum n2n_event_topic { enum n2n_event_topic {
N2N_EVENT_DEBUG = 0, N2N_EVENT_DEBUG = 0,
N2N_EVENT_TEST = 1, N2N_EVENT_TEST = 1,
N2N_EVENT_PEER = 2,
}; };
#define N2N_EVENT_PEER_PURGE 1
#define N2N_EVENT_PEER_CLEAR 2
#define N2N_EVENT_PEER_DEL_P2P 3
#define N2N_EVENT_PEER_ADD_P2P 4
#define N2N_MGMT_PASSWORD "n2n" /* default password for management port access (so far, json only) */ #define N2N_MGMT_PASSWORD "n2n" /* default password for management port access (so far, json only) */

64
src/edge_management.c

@ -98,34 +98,63 @@ size_t gen_json_1str (strbuf_t *buf, char *tag, char *_type, char *key, char *va
val); val);
} }
static void send_json_1str (mgmt_req_t *req, strbuf_t *buf, char *_type, char *key, char *val) { size_t gen_json_1uint (strbuf_t *buf, char *tag, char *_type, char *key, unsigned int val) {
size_t msg_len = gen_json_1str(buf, req->tag, _type, key, val); return snprintf(buf->str, buf->size,
send_reply(req, buf, msg_len);
}
static void send_json_1uint (mgmt_req_t *req, strbuf_t *buf, char *_type, char *key, unsigned int val) {
size_t msg_len = snprintf(buf->str, buf->size,
"{" "{"
"\"_tag\":\"%s\"," "\"_tag\":\"%s\","
"\"_type\":\"%s\"," "\"_type\":\"%s\","
"\"%s\":%u}\n", "\"%s\":%u}\n",
req->tag, tag,
_type, _type,
key, key,
val); val);
}
static void send_json_1str (mgmt_req_t *req, strbuf_t *buf, char *_type, char *key, char *val) {
size_t msg_len = gen_json_1str(buf, req->tag, _type, key, val);
send_reply(req, buf, msg_len);
}
static void send_json_1uint (mgmt_req_t *req, strbuf_t *buf, char *_type, char *key, unsigned int val) {
size_t msg_len = gen_json_1uint(buf, req->tag, _type, key, val);
send_reply(req, buf, msg_len); send_reply(req, buf, msg_len);
} }
size_t event_debug (strbuf_t *buf, char *tag, void *data) { size_t event_debug (strbuf_t *buf, char *tag, int data0, void *data1) {
traceEvent(TRACE_DEBUG, "Unexpected call to event_debug"); traceEvent(TRACE_DEBUG, "Unexpected call to event_debug");
return 0; return 0;
} }
size_t event_test (strbuf_t *buf, char *tag, void *data) { size_t event_test (strbuf_t *buf, char *tag, int data0, void *data1) {
size_t msg_len = gen_json_1str(buf, tag, "event", "test", (char *)data); size_t msg_len = gen_json_1str(buf, tag, "event", "test", (char *)data1);
return msg_len; return msg_len;
} }
size_t event_peer (strbuf_t *buf, char *tag, int data0, void *data1) {
int action = data0;
struct peer_info *peer = (struct peer_info *)data1;
macstr_t mac_buf;
n2n_sock_str_t sockbuf;
/*
* Just the peer_info bits that are needed for lookup (maccaddr) or
* firewall and routing (sockaddr)
* If needed, other details can be fetched via the edges method call.
*/
return snprintf(buf->str, buf->size,
"{"
"\"_tag\":\"%s\","
"\"_type\":\"event\","
"\"action\":%i,"
"\"macaddr\":\"%s\","
"\"sockaddr\":\"%s\"}\n",
tag,
action,
(is_null_mac(peer->mac_addr)) ? "" : macaddr_str(mac_buf, peer->mac_addr),
sock_to_cstr(sockbuf, &(peer->sock)));
}
static void mgmt_error (mgmt_req_t *req, strbuf_t *buf, char *msg) { static void mgmt_error (mgmt_req_t *req, strbuf_t *buf, char *msg) {
send_json_1str(req, buf, "error", "error", msg); send_json_1str(req, buf, "error", "error", msg);
} }
@ -328,7 +357,7 @@ static void mgmt_packetstats (mgmt_req_t *req, strbuf_t *buf, char *argv0, char
static void mgmt_post_test (mgmt_req_t *req, strbuf_t *buf, char *argv0, char *argv) { static void mgmt_post_test (mgmt_req_t *req, strbuf_t *buf, char *argv0, char *argv) {
send_json_1str(req, buf, "row", "sending", "test"); send_json_1str(req, buf, "row", "sending", "test");
mgmt_event_post (N2N_EVENT_TEST, argv); mgmt_event_post (N2N_EVENT_TEST, -1, argv);
} }
static void mgmt_unimplemented (mgmt_req_t *req, strbuf_t *buf, char *argv0, char *argv) { static void mgmt_unimplemented (mgmt_req_t *req, strbuf_t *buf, char *argv0, char *argv) {
@ -359,24 +388,29 @@ static const mgmt_handler_t mgmt_handlers[] = {
static mgmt_req_t mgmt_event_subscribers[] = { static mgmt_req_t mgmt_event_subscribers[] = {
[N2N_EVENT_DEBUG] = { .eee = NULL, .type = N2N_MGMT_UNKNOWN, .tag = "\0" }, [N2N_EVENT_DEBUG] = { .eee = NULL, .type = N2N_MGMT_UNKNOWN, .tag = "\0" },
[N2N_EVENT_TEST] = { .eee = NULL, .type = N2N_MGMT_UNKNOWN, .tag = "\0" }, [N2N_EVENT_TEST] = { .eee = NULL, .type = N2N_MGMT_UNKNOWN, .tag = "\0" },
[N2N_EVENT_PEER] = { .eee = NULL, .type = N2N_MGMT_UNKNOWN, .tag = "\0" },
}; };
/* Map topic number to function */ /* Map topic number to function */
static const size_t (*mgmt_events[])(strbuf_t *buf, char *tag, void *data) = { static const size_t (*mgmt_events[])(strbuf_t *buf, char *tag, int data0, void *data1) = {
[N2N_EVENT_DEBUG] = event_debug, [N2N_EVENT_DEBUG] = event_debug,
[N2N_EVENT_TEST] = event_test, [N2N_EVENT_TEST] = event_test,
[N2N_EVENT_PEER] = event_peer,
}; };
/* Allow help and subscriptions to use topic name */ /* Allow help and subscriptions to use topic name */
static const mgmt_events_t mgmt_event_names[] = { static const mgmt_events_t mgmt_event_names[] = {
{ .cmd = "debug", .topic = N2N_EVENT_DEBUG, .help = "All events - for event debugging"}, { .cmd = "debug", .topic = N2N_EVENT_DEBUG, .help = "All events - for event debugging"},
{ .cmd = "test", .topic = N2N_EVENT_TEST, .help = "Used only by post.test"}, { .cmd = "test", .topic = N2N_EVENT_TEST, .help = "Used only by post.test"},
{ .cmd = "peer", .topic = N2N_EVENT_PEER, .help = "Changes to peer list"},
}; };
void mgmt_event_post (enum n2n_event_topic topic, void *data) { void mgmt_event_post (enum n2n_event_topic topic, int data0, void *data1) {
mgmt_req_t *debug = &mgmt_event_subscribers[N2N_EVENT_DEBUG]; mgmt_req_t *debug = &mgmt_event_subscribers[N2N_EVENT_DEBUG];
mgmt_req_t *sub = &mgmt_event_subscribers[topic]; mgmt_req_t *sub = &mgmt_event_subscribers[topic];
traceEvent(TRACE_DEBUG, "post topic=%i data0=%i", topic, data0);
if( sub->type != N2N_MGMT_SUB && debug->type != N2N_MGMT_SUB) { if( sub->type != N2N_MGMT_SUB && debug->type != N2N_MGMT_SUB) {
// If neither of this topic or the debug topic have a subscriber // If neither of this topic or the debug topic have a subscriber
// then we dont need to do any work // then we dont need to do any work
@ -394,7 +428,7 @@ void mgmt_event_post (enum n2n_event_topic topic, void *data) {
tag = debug->tag; tag = debug->tag;
} }
size_t msg_len = mgmt_events[topic](buf, tag, data); size_t msg_len = mgmt_events[topic](buf, tag, data0, data1);
if (sub->type == N2N_MGMT_SUB) { if (sub->type == N2N_MGMT_SUB) {
send_reply(sub, buf, msg_len); send_reply(sub, buf, msg_len);

4
src/edge_utils.c

@ -811,6 +811,7 @@ static void peer_set_p2p_confirmed (n2n_edge_t * eee,
scan_tmp = find_peer_by_sock(peer, eee->known_peers); scan_tmp = find_peer_by_sock(peer, eee->known_peers);
if(scan_tmp != NULL) { if(scan_tmp != NULL) {
HASH_DEL(eee->known_peers, scan_tmp); HASH_DEL(eee->known_peers, scan_tmp);
mgmt_event_post(N2N_EVENT_PEER,N2N_EVENT_PEER_DEL_P2P,scan);
free(scan); free(scan);
scan = scan_tmp; scan = scan_tmp;
memcpy(scan->mac_addr, mac, sizeof(n2n_mac_t)); memcpy(scan->mac_addr, mac, sizeof(n2n_mac_t));
@ -828,6 +829,7 @@ static void peer_set_p2p_confirmed (n2n_edge_t * eee,
HASH_ADD_PEER(eee->known_peers, scan); HASH_ADD_PEER(eee->known_peers, scan);
scan->last_p2p = now; scan->last_p2p = now;
mgmt_event_post(N2N_EVENT_PEER,N2N_EVENT_PEER_ADD_P2P,scan);
traceEvent(TRACE_DEBUG, "p2p connection established: %s [%s]", traceEvent(TRACE_DEBUG, "p2p connection established: %s [%s]",
macaddr_str(mac_buf, mac), macaddr_str(mac_buf, mac),
@ -994,6 +996,7 @@ static void check_known_peer_sock_change (n2n_edge_t *eee,
sock_to_cstr(sockbuf2, peer)); sock_to_cstr(sockbuf2, peer));
/* The peer has changed public socket. It can no longer be assumed to be reachable. */ /* The peer has changed public socket. It can no longer be assumed to be reachable. */
HASH_DEL(eee->known_peers, scan); HASH_DEL(eee->known_peers, scan);
mgmt_event_post(N2N_EVENT_PEER,N2N_EVENT_PEER_DEL_P2P,scan);
free(scan); free(scan);
register_with_new_peer(eee, from_supernode, via_multicast, mac, dev_addr, dev_desc, peer); register_with_new_peer(eee, from_supernode, via_multicast, mac, dev_addr, dev_desc, peer);
@ -1880,6 +1883,7 @@ static int find_peer_destination (n2n_edge_t * eee,
* since the peer address may have changed. */ * since the peer address may have changed. */
traceEvent(TRACE_DEBUG, "refreshing idle known peer"); traceEvent(TRACE_DEBUG, "refreshing idle known peer");
HASH_DEL(eee->known_peers, scan); HASH_DEL(eee->known_peers, scan);
mgmt_event_post(N2N_EVENT_PEER,N2N_EVENT_PEER_DEL_P2P,scan);
free(scan); free(scan);
/* NOTE: registration will be performed upon the receival of the next response packet */ /* NOTE: registration will be performed upon the receival of the next response packet */
} else { } else {

4
src/n2n.c

@ -636,6 +636,8 @@ size_t purge_peer_list (struct peer_info **peer_list,
} }
} }
HASH_DEL(*peer_list, scan); HASH_DEL(*peer_list, scan);
mgmt_event_post(N2N_EVENT_PEER,N2N_EVENT_PEER_PURGE,scan);
/* FIXME: generates events for more than just p2p */
retval++; retval++;
free(scan); free(scan);
} }
@ -652,6 +654,8 @@ size_t clear_peer_list (struct peer_info ** peer_list) {
HASH_ITER(hh, *peer_list, scan, tmp) { HASH_ITER(hh, *peer_list, scan, tmp) {
HASH_DEL(*peer_list, scan); HASH_DEL(*peer_list, scan);
mgmt_event_post(N2N_EVENT_PEER,N2N_EVENT_PEER_CLEAR,scan);
/* FIXME: generates events for more than just p2p */
retval++; retval++;
free(scan); free(scan);
} }

Loading…
Cancel
Save