mirror of
https://github.com/ntop/n2n.git
synced 2024-09-19 16:41:11 +02:00
added supernode version and uptime information to edge management port output (#796)
This commit is contained in:
parent
35ec7336a6
commit
dd41689bb9
|
@ -282,6 +282,10 @@ typedef enum n2n_pc {
|
||||||
#define N2N_ENOSPACE -4
|
#define N2N_ENOSPACE -4
|
||||||
|
|
||||||
|
|
||||||
|
#define N2N_VERSION_STRING_SIZE 20
|
||||||
|
typedef char n2n_version_t[N2N_VERSION_STRING_SIZE];
|
||||||
|
|
||||||
|
|
||||||
typedef struct n2n_ip_subnet {
|
typedef struct n2n_ip_subnet {
|
||||||
uint32_t net_addr; /* Host order IP address. */
|
uint32_t net_addr; /* Host order IP address. */
|
||||||
uint8_t net_bitlen; /* Subnet prefix. */
|
uint8_t net_bitlen; /* Subnet prefix. */
|
||||||
|
@ -411,6 +415,8 @@ typedef struct n2n_PEER_INFO {
|
||||||
n2n_sock_t sock;
|
n2n_sock_t sock;
|
||||||
n2n_sock_t preferred_sock;
|
n2n_sock_t preferred_sock;
|
||||||
SN_SELECTION_CRITERION_DATA_TYPE data;
|
SN_SELECTION_CRITERION_DATA_TYPE data;
|
||||||
|
n2n_version_t version;
|
||||||
|
time_t uptime;
|
||||||
} n2n_PEER_INFO_t;
|
} n2n_PEER_INFO_t;
|
||||||
|
|
||||||
|
|
||||||
|
@ -418,6 +424,7 @@ typedef struct n2n_QUERY_PEER {
|
||||||
n2n_mac_t srcMac;
|
n2n_mac_t srcMac;
|
||||||
n2n_sock_t sock;
|
n2n_sock_t sock;
|
||||||
n2n_mac_t targetMac;
|
n2n_mac_t targetMac;
|
||||||
|
|
||||||
} n2n_QUERY_PEER_t;
|
} n2n_QUERY_PEER_t;
|
||||||
|
|
||||||
typedef struct n2n_buf n2n_buf_t;
|
typedef struct n2n_buf n2n_buf_t;
|
||||||
|
@ -441,6 +448,8 @@ struct peer_info {
|
||||||
uint64_t last_valid_time_stamp;
|
uint64_t last_valid_time_stamp;
|
||||||
char *ip_addr;
|
char *ip_addr;
|
||||||
uint8_t local;
|
uint8_t local;
|
||||||
|
time_t uptime;
|
||||||
|
n2n_version_t version;
|
||||||
|
|
||||||
UT_hash_handle hh; /* makes this structure hashable */
|
UT_hash_handle hh; /* makes this structure hashable */
|
||||||
};
|
};
|
||||||
|
@ -793,6 +802,7 @@ typedef struct n2n_tcp_connection {
|
||||||
|
|
||||||
typedef struct n2n_sn {
|
typedef struct n2n_sn {
|
||||||
time_t start_time; /* Used to measure uptime. */
|
time_t start_time; /* Used to measure uptime. */
|
||||||
|
n2n_version_t version; /* version string sent to edges along with PEER_INFO a.k.a. PONG */
|
||||||
sn_stats_t stats;
|
sn_stats_t stats;
|
||||||
int daemon; /* If non-zero then daemonise. */
|
int daemon; /* If non-zero then daemonise. */
|
||||||
n2n_mac_t mac_addr;
|
n2n_mac_t mac_addr;
|
||||||
|
|
|
@ -1905,9 +1905,9 @@ static void readFromMgmtSocket (n2n_edge_t *eee, int *keep_running) {
|
||||||
"COMMUNITY '%s'\n\n",
|
"COMMUNITY '%s'\n\n",
|
||||||
eee->conf.community_name);
|
eee->conf.community_name);
|
||||||
msg_len += snprintf((char *) (udp_buf + msg_len), (N2N_PKT_BUF_SIZE - msg_len),
|
msg_len += snprintf((char *) (udp_buf + msg_len), (N2N_PKT_BUF_SIZE - msg_len),
|
||||||
" ### | TAP | MAC | EDGE | HINT | LAST SEEN\n");
|
" ### | TAP | MAC | EDGE | HINT | LAST SEEN | VERSION | UPTIME \n\n");
|
||||||
msg_len += snprintf((char *) (udp_buf + msg_len), (N2N_PKT_BUF_SIZE - msg_len),
|
msg_len += snprintf((char *) (udp_buf + msg_len), (N2N_PKT_BUF_SIZE - msg_len),
|
||||||
"================================================================================================\n");
|
"===================================================================================================================================\n");
|
||||||
|
|
||||||
// dump nodes with forwarding through supernodes
|
// dump nodes with forwarding through supernodes
|
||||||
msg_len += snprintf((char *) (udp_buf + msg_len), (N2N_PKT_BUF_SIZE - msg_len),
|
msg_len += snprintf((char *) (udp_buf + msg_len), (N2N_PKT_BUF_SIZE - msg_len),
|
||||||
|
@ -1918,7 +1918,7 @@ static void readFromMgmtSocket (n2n_edge_t *eee, int *keep_running) {
|
||||||
net = htonl(peer->dev_addr.net_addr);
|
net = htonl(peer->dev_addr.net_addr);
|
||||||
snprintf (time_buf, sizeof(time_buf), "%9u", (unsigned int)(now - peer->last_seen));
|
snprintf (time_buf, sizeof(time_buf), "%9u", (unsigned int)(now - peer->last_seen));
|
||||||
msg_len += snprintf((char *) (udp_buf + msg_len), (N2N_PKT_BUF_SIZE - msg_len),
|
msg_len += snprintf((char *) (udp_buf + msg_len), (N2N_PKT_BUF_SIZE - msg_len),
|
||||||
"%4u | %-15s | %-17s | %-21s | %-15s | %9s\n",
|
"%4u | %-15s | %-17s | %-21s | %-15s | %9s | |\n",
|
||||||
++num,
|
++num,
|
||||||
(peer->dev_addr.net_addr == 0) ? "" : inet_ntoa(*(struct in_addr *) &net),
|
(peer->dev_addr.net_addr == 0) ? "" : inet_ntoa(*(struct in_addr *) &net),
|
||||||
(is_null_mac(peer->mac_addr)) ? "" : macaddr_str(mac_buf, peer->mac_addr),
|
(is_null_mac(peer->mac_addr)) ? "" : macaddr_str(mac_buf, peer->mac_addr),
|
||||||
|
@ -1933,7 +1933,7 @@ static void readFromMgmtSocket (n2n_edge_t *eee, int *keep_running) {
|
||||||
|
|
||||||
// dump peer-to-peer nodes
|
// dump peer-to-peer nodes
|
||||||
msg_len += snprintf((char *) (udp_buf + msg_len), (N2N_PKT_BUF_SIZE - msg_len),
|
msg_len += snprintf((char *) (udp_buf + msg_len), (N2N_PKT_BUF_SIZE - msg_len),
|
||||||
"------------------------------------------------------------------------------------------------\n");
|
"-----------------------------------------------------------------------------------------------------------------------------------\n");
|
||||||
msg_len += snprintf((char *) (udp_buf + msg_len), (N2N_PKT_BUF_SIZE - msg_len),
|
msg_len += snprintf((char *) (udp_buf + msg_len), (N2N_PKT_BUF_SIZE - msg_len),
|
||||||
"PEER TO PEER\n");
|
"PEER TO PEER\n");
|
||||||
num = 0;
|
num = 0;
|
||||||
|
@ -1942,7 +1942,7 @@ static void readFromMgmtSocket (n2n_edge_t *eee, int *keep_running) {
|
||||||
net = htonl(peer->dev_addr.net_addr);
|
net = htonl(peer->dev_addr.net_addr);
|
||||||
snprintf (time_buf, sizeof(time_buf), "%9u", (unsigned int)(now - peer->last_seen));
|
snprintf (time_buf, sizeof(time_buf), "%9u", (unsigned int)(now - peer->last_seen));
|
||||||
msg_len += snprintf((char *) (udp_buf + msg_len), (N2N_PKT_BUF_SIZE - msg_len),
|
msg_len += snprintf((char *) (udp_buf + msg_len), (N2N_PKT_BUF_SIZE - msg_len),
|
||||||
"%4u | %-15s | %-17s | %-21s | %-15s | %9s\n",
|
"%4u | %-15s | %-17s | %-21s | %-15s | %9s | |\n",
|
||||||
++num,
|
++num,
|
||||||
(peer->dev_addr.net_addr == 0) ? "" : inet_ntoa(*(struct in_addr *) &net),
|
(peer->dev_addr.net_addr == 0) ? "" : inet_ntoa(*(struct in_addr *) &net),
|
||||||
(is_null_mac(peer->mac_addr)) ? "" : macaddr_str(mac_buf, peer->mac_addr),
|
(is_null_mac(peer->mac_addr)) ? "" : macaddr_str(mac_buf, peer->mac_addr),
|
||||||
|
@ -1957,23 +1957,24 @@ static void readFromMgmtSocket (n2n_edge_t *eee, int *keep_running) {
|
||||||
|
|
||||||
// dump supernodes
|
// dump supernodes
|
||||||
msg_len += snprintf((char *) (udp_buf + msg_len), (N2N_PKT_BUF_SIZE - msg_len),
|
msg_len += snprintf((char *) (udp_buf + msg_len), (N2N_PKT_BUF_SIZE - msg_len),
|
||||||
"------------------------------------------------------------------------------------------------\n");
|
"-----------------------------------------------------------------------------------------------------------------------------------\n");
|
||||||
|
|
||||||
msg_len += snprintf((char *) (udp_buf + msg_len), (N2N_PKT_BUF_SIZE - msg_len),
|
msg_len += snprintf((char *) (udp_buf + msg_len), (N2N_PKT_BUF_SIZE - msg_len),
|
||||||
"SUPERNODES\n");
|
"SUPERNODES\n");
|
||||||
|
|
||||||
HASH_ITER(hh, eee->conf.supernodes, peer, tmpPeer) {
|
HASH_ITER(hh, eee->conf.supernodes, peer, tmpPeer) {
|
||||||
net = htonl(peer->dev_addr.net_addr);
|
net = htonl(peer->dev_addr.net_addr);
|
||||||
snprintf (time_buf, sizeof(time_buf), "%9u", (unsigned int)(now - peer->last_seen));
|
snprintf (time_buf, sizeof(time_buf), "%9u", (unsigned int)(now - peer->last_seen));
|
||||||
msg_len += snprintf((char *) (udp_buf + msg_len), (N2N_PKT_BUF_SIZE - msg_len),
|
msg_len += snprintf((char *) (udp_buf + msg_len), (N2N_PKT_BUF_SIZE - msg_len),
|
||||||
"%4u | %-3s %-11s | %-17s | %-21s | %-15s | %9s\n",
|
"%4u | %-3s %-11s | %-17s | %-21s | %-15s | %9s | %-19s | %10lu\n",
|
||||||
++num,
|
++num,
|
||||||
(peer->purgeable == SN_UNPURGEABLE) ? "-l" : "",
|
(peer->purgeable == SN_UNPURGEABLE) ? "-l" : "",
|
||||||
(peer == eee->curr_sn) ? (eee->sn_wait ? ">>..." : ">>>>>" ) : "",
|
(peer == eee->curr_sn) ? (eee->sn_wait ? ">>..." : ">>>>>" ) : "",
|
||||||
is_null_mac(peer->mac_addr) ? "" : macaddr_str(mac_buf, peer->mac_addr),
|
is_null_mac(peer->mac_addr) ? "" : macaddr_str(mac_buf, peer->mac_addr),
|
||||||
sock_to_cstr(sockbuf, &(peer->sock)),
|
sock_to_cstr(sockbuf, &(peer->sock)),
|
||||||
sn_selection_criterion_str(sel_buf, peer),
|
sn_selection_criterion_str(sel_buf, peer),
|
||||||
(peer->last_seen) ? time_buf : "");
|
(peer->last_seen) ? time_buf : "",
|
||||||
|
peer->version,
|
||||||
|
peer->uptime);
|
||||||
|
|
||||||
sendto(eee->udp_mgmt_sock, udp_buf, msg_len, 0,
|
sendto(eee->udp_mgmt_sock, udp_buf, msg_len, 0,
|
||||||
(struct sockaddr *) &sender_sock, sizeof(struct sockaddr_in));
|
(struct sockaddr *) &sender_sock, sizeof(struct sockaddr_in));
|
||||||
|
@ -1982,7 +1983,7 @@ static void readFromMgmtSocket (n2n_edge_t *eee, int *keep_running) {
|
||||||
|
|
||||||
// further stats
|
// further stats
|
||||||
msg_len += snprintf((char *) (udp_buf + msg_len), (N2N_PKT_BUF_SIZE - msg_len),
|
msg_len += snprintf((char *) (udp_buf + msg_len), (N2N_PKT_BUF_SIZE - msg_len),
|
||||||
"================================================================================================\n");
|
"===================================================================================================================================\n");
|
||||||
|
|
||||||
msg_len += snprintf((char *) (udp_buf + msg_len), (N2N_PKT_BUF_SIZE - msg_len),
|
msg_len += snprintf((char *) (udp_buf + msg_len), (N2N_PKT_BUF_SIZE - msg_len),
|
||||||
"uptime %lu | ",
|
"uptime %lu | ",
|
||||||
|
@ -2797,7 +2798,7 @@ void process_udp (n2n_edge_t *eee, const struct sockaddr_in *sender_sock, const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!is_valid_peer_sock(&pi.sock)) {
|
if((cmn.flags & N2N_FLAGS_SOCKET) && !is_valid_peer_sock(&pi.sock)) {
|
||||||
traceEvent(TRACE_DEBUG, "skip invalid PEER_INFO from %s [%s]",
|
traceEvent(TRACE_DEBUG, "skip invalid PEER_INFO from %s [%s]",
|
||||||
macaddr_str(mac_buf1, pi.mac),
|
macaddr_str(mac_buf1, pi.mac),
|
||||||
sock_to_cstr(sockbuf1, &pi.sock));
|
sock_to_cstr(sockbuf1, &pi.sock));
|
||||||
|
@ -2811,8 +2812,11 @@ void process_udp (n2n_edge_t *eee, const struct sockaddr_in *sender_sock, const
|
||||||
if(scan != NULL) {
|
if(scan != NULL) {
|
||||||
eee->sn_pong = 1;
|
eee->sn_pong = 1;
|
||||||
scan->last_seen = now;
|
scan->last_seen = now;
|
||||||
|
scan->uptime = pi.uptime;
|
||||||
|
memcpy(scan->version, pi.version, sizeof(n2n_version_t));
|
||||||
/* The data type depends on the actual selection strategy that has been chosen. */
|
/* The data type depends on the actual selection strategy that has been chosen. */
|
||||||
sn_selection_criterion_calculate(eee, scan, &pi.data);
|
sn_selection_criterion_calculate(eee, scan, &pi.data);
|
||||||
|
|
||||||
traceEvent(TRACE_INFO, "Rx PONG from supernode %s",
|
traceEvent(TRACE_INFO, "Rx PONG from supernode %s",
|
||||||
macaddr_str(mac_buf1, pi.srcMac));
|
macaddr_str(mac_buf1, pi.srcMac));
|
||||||
|
|
||||||
|
|
|
@ -738,6 +738,7 @@ int sn_init_defaults (n2n_sn_t *sss) {
|
||||||
|
|
||||||
memset(sss, 0, sizeof(n2n_sn_t));
|
memset(sss, 0, sizeof(n2n_sn_t));
|
||||||
|
|
||||||
|
strncpy(sss->version, GIT_RELEASE, sizeof(n2n_version_t) - 1);
|
||||||
sss->daemon = 1; /* By defult run as a daemon. */
|
sss->daemon = 1; /* By defult run as a daemon. */
|
||||||
sss->lport = N2N_SN_LPORT_DEFAULT;
|
sss->lport = N2N_SN_LPORT_DEFAULT;
|
||||||
sss->mport = N2N_SN_MGMT_PORT;
|
sss->mport = N2N_SN_MGMT_PORT;
|
||||||
|
@ -2537,6 +2538,9 @@ static int process_udp (n2n_sn_t * sss,
|
||||||
memcpy(pi.sock.addr.v4, &(sender_sock->sin_addr.s_addr), IPV4_SIZE);
|
memcpy(pi.sock.addr.v4, &(sender_sock->sin_addr.s_addr), IPV4_SIZE);
|
||||||
pi.data = sn_selection_criterion_gather_data(sss);
|
pi.data = sn_selection_criterion_gather_data(sss);
|
||||||
|
|
||||||
|
snprintf(pi.version, sizeof(pi.version), "%s", sss->version);
|
||||||
|
pi.uptime = now - sss->start_time;
|
||||||
|
|
||||||
encode_PEER_INFO(encbuf, &encx, &cmn2, &pi);
|
encode_PEER_INFO(encbuf, &encx, &cmn2, &pi);
|
||||||
|
|
||||||
if(comm) {
|
if(comm) {
|
||||||
|
|
|
@ -70,6 +70,7 @@ static void help (int level) {
|
||||||
"[-m <mac address>] "
|
"[-m <mac address>] "
|
||||||
#endif
|
#endif
|
||||||
"[-M] "
|
"[-M] "
|
||||||
|
"[-V <version text>] "
|
||||||
"\n\n overlay network "
|
"\n\n overlay network "
|
||||||
"[-c <community list file>] "
|
"[-c <community list file>] "
|
||||||
"\n configuration "
|
"\n configuration "
|
||||||
|
@ -120,6 +121,8 @@ static void help (int level) {
|
||||||
#endif
|
#endif
|
||||||
printf(" -M | disable MAC and IP address spoofing protection for all\n"
|
printf(" -M | disable MAC and IP address spoofing protection for all\n"
|
||||||
" | non-username-password-authenticating communities\n");
|
" | non-username-password-authenticating communities\n");
|
||||||
|
printf(" -V <version text> | sends a custom supernode version string of max 19 letters \n"
|
||||||
|
" | length to edges, visible in their management port output\n");
|
||||||
printf ("\n");
|
printf ("\n");
|
||||||
printf (" TAP DEVICE AND OVERLAY NETWORK CONFIGURATION\n");
|
printf (" TAP DEVICE AND OVERLAY NETWORK CONFIGURATION\n");
|
||||||
printf (" --------------------------------------------\n\n");
|
printf (" --------------------------------------------\n\n");
|
||||||
|
@ -290,6 +293,10 @@ static int setOption (int optkey, char *_optarg, n2n_sn_t *sss) {
|
||||||
case 'M': /* override spoofing protection */
|
case 'M': /* override spoofing protection */
|
||||||
sss->override_spoofing_protection = 1;
|
sss->override_spoofing_protection = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'V': /* community file */
|
||||||
|
strncpy(sss->version, _optarg, sizeof(n2n_version_t) - 1); /* mind the \0 terminator */
|
||||||
|
|
||||||
case 'c': /* community file */
|
case 'c': /* community file */
|
||||||
sss->community_file = calloc(1, strlen(_optarg) + 1);
|
sss->community_file = calloc(1, strlen(_optarg) + 1);
|
||||||
if(sss->community_file)
|
if(sss->community_file)
|
||||||
|
@ -342,7 +349,7 @@ static int loadFromCLI (int argc, char * const argv[], n2n_sn_t *sss) {
|
||||||
u_char c;
|
u_char c;
|
||||||
|
|
||||||
while((c = getopt_long(argc, argv,
|
while((c = getopt_long(argc, argv,
|
||||||
"p:l:t:a:c:F:vhM"
|
"p:l:t:a:c:F:vhMV:"
|
||||||
#ifdef SN_MANUAL_MAC
|
#ifdef SN_MANUAL_MAC
|
||||||
"m:"
|
"m:"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -664,6 +664,8 @@ int encode_PEER_INFO (uint8_t *base,
|
||||||
retval += encode_sock(base, idx, &pkt->preferred_sock);
|
retval += encode_sock(base, idx, &pkt->preferred_sock);
|
||||||
}
|
}
|
||||||
retval += encode_buf(base, idx, &pkt->data, sizeof(SN_SELECTION_CRITERION_DATA_TYPE));
|
retval += encode_buf(base, idx, &pkt->data, sizeof(SN_SELECTION_CRITERION_DATA_TYPE));
|
||||||
|
retval += encode_uint32(base, idx, (uint32_t)pkt->uptime);
|
||||||
|
retval += encode_buf(base, idx, pkt->version, sizeof(n2n_version_t));
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
@ -686,6 +688,8 @@ int decode_PEER_INFO (n2n_PEER_INFO_t *pkt,
|
||||||
retval += decode_sock(&pkt->preferred_sock, base, rem, idx);
|
retval += decode_sock(&pkt->preferred_sock, base, rem, idx);
|
||||||
}
|
}
|
||||||
retval += decode_buf((uint8_t*)&pkt->data, sizeof(SN_SELECTION_CRITERION_DATA_TYPE), base, rem, idx);
|
retval += decode_buf((uint8_t*)&pkt->data, sizeof(SN_SELECTION_CRITERION_DATA_TYPE), base, rem, idx);
|
||||||
|
retval += decode_uint32((uint32_t*)&pkt->uptime, base, rem, idx);
|
||||||
|
retval += decode_buf((uint8_t*)pkt->version, sizeof(n2n_version_t), base, rem, idx);
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
11
supernode.1
11
supernode.1
|
@ -26,22 +26,27 @@ Lines starting with a "#" are ignored.
|
||||||
An equal sign ('=') should be used between key and value. Example: -p=7777
|
An equal sign ('=') should be used between key and value. Example: -p=7777
|
||||||
.SH OPTIONS FOR THE UNDERLYING NETWORK CONNECTION
|
.SH OPTIONS FOR THE UNDERLYING NETWORK CONNECTION
|
||||||
.TP
|
.TP
|
||||||
\fB\-p \fR<\fIlocal port\fR>, \fB\-\-local-port\fR=<\fIlocal port\fR>
|
\fB\-p \fR<\fIlocal_port\fR>, \fB\-\-local-port\fR=<\fIlocal_port\fR>
|
||||||
listen on this fixed local UDP port, defaults to 7654
|
listen on this fixed local UDP port, defaults to 7654
|
||||||
.TP
|
.TP
|
||||||
\fB\-F \fR<\fIfed name\fR>
|
\fB\-F \fR<\fIfed_name\fR>
|
||||||
name of the supernode's federation, defaults to '*Federation'
|
name of the supernode's federation, defaults to '*Federation'
|
||||||
.TP
|
.TP
|
||||||
\fB\-l \fR<\fIhost:port\fR>
|
\fB\-l \fR<\fIhost:port\fR>
|
||||||
ip address or name, and port of known supernode
|
ip address or name, and port of known supernode
|
||||||
.TP
|
.TP
|
||||||
\fB\-m \fR<\fImac address\fR>
|
\fB\-m \fR<\fImac_address\fR>
|
||||||
fixed MAC address for the supernode, e.g.
|
fixed MAC address for the supernode, e.g.
|
||||||
'-m 10:20:30:40:50:60', random otherwise
|
'-m 10:20:30:40:50:60', random otherwise
|
||||||
.TP
|
.TP
|
||||||
\fB\-M\fR
|
\fB\-M\fR
|
||||||
disable MAC and IP address spoofing protection for all
|
disable MAC and IP address spoofing protection for all
|
||||||
non-username-password-authenticating communities
|
non-username-password-authenticating communities
|
||||||
|
.TP
|
||||||
|
\fB\-V \fR<\fIversion_string\fR>
|
||||||
|
modify the supernode version string which is distributed to the
|
||||||
|
edges and shown at their management port output, up to 19 characters
|
||||||
|
.TP
|
||||||
.SH TAP DEVICE AND OVERLAY NETWORK CONFIGURATION
|
.SH TAP DEVICE AND OVERLAY NETWORK CONFIGURATION
|
||||||
.TP
|
.TP
|
||||||
\fB\-c \fR<\fIpath\fR>, \fB\-\-communities\fR=<\fIpath\fR>
|
\fB\-c \fR<\fIpath\fR>, \fB\-\-communities\fR=<\fIpath\fR>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user