|
|
|
|
@ -48,13 +48,29 @@ static char* nodeinfo_format(const uint8_t* data, size_t len) {
|
|
|
|
|
struct BGP_NODEINFO_PACKET* pkt = (struct BGP_NODEINFO_PACKET*)data; |
|
|
|
|
struct NODEINFO* ni = &pkt->node; |
|
|
|
|
uint64_t node_id = be64toh(ni->node_id); |
|
|
|
|
char* buf = u_malloc(512); |
|
|
|
|
if (!buf) return NULL; |
|
|
|
|
const uint8_t* dyn = data + sizeof(struct BGP_NODEINFO_PACKET); |
|
|
|
|
size_t name_l = ni->node_name_len; |
|
|
|
|
const char* name_str = (name_l > 0 && len > sizeof(struct BGP_NODEINFO_PACKET) + name_l) ? (const char*)dyn : ""; |
|
|
|
|
snprintf(buf, 512, "NODEINFO: nid=%016llx ver=%u name_len=%u name=%.*s v4socks=%u v6socks=%u v4subs=%u v6subs=%u tranzit=%u hops=%u", |
|
|
|
|
(unsigned long long)node_id, (unsigned)ni->ver, (unsigned)name_l, (int)name_l, name_str, (unsigned)ni->local_v4_sockets, (unsigned)ni->local_v6_sockets, (unsigned)ni->local_v4_subnets, (unsigned)ni->local_v6_subnets, (unsigned)ni->tranzit_nodes, (unsigned)ni->hop_count); |
|
|
|
|
size_t off = 0; |
|
|
|
|
char name_buf[64] = {0}; |
|
|
|
|
size_t nl = ni->node_name_len; |
|
|
|
|
if (nl > 0 && nl < 63 && off + nl < len - sizeof(struct BGP_NODEINFO_PACKET)) { |
|
|
|
|
memcpy(name_buf, dyn + off, nl); off += nl; |
|
|
|
|
} |
|
|
|
|
off += ni->local_v4_sockets * sizeof(struct NODEINFO_IPV4_SOCKET); |
|
|
|
|
off += ni->local_v6_sockets * sizeof(struct NODEINFO_IPV6_SOCKET); |
|
|
|
|
char subs_buf[512] = {0}; |
|
|
|
|
if (ni->local_v4_subnets > 0) { |
|
|
|
|
const struct NODEINFO_IPV4_SUBNET* subs = (const struct NODEINFO_IPV4_SUBNET*)(dyn + off); |
|
|
|
|
size_t sl = 0; |
|
|
|
|
for (uint8_t i = 0; i < ni->local_v4_subnets && sl < 400; i++) { |
|
|
|
|
uint32_t addr = (subs[i].addr[0]<<24)|(subs[i].addr[1]<<16)|(subs[i].addr[2]<<8)|subs[i].addr[3]; |
|
|
|
|
char tmp[64]; snprintf(tmp,sizeof(tmp),"%d.%d.%d.%d/%u ",(addr>>24)&255,(addr>>16)&255,(addr>>8)&255,addr&255,subs[i].prefix_length); |
|
|
|
|
strcat(subs_buf,tmp); sl += strlen(tmp); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
int need = snprintf(NULL,0,"NODEINFO nid=%016llx ver=%u name=\"%s\" v4subs=\"%s\" v4s=%u v6s=%u v4subcnt=%u hop=%u", (unsigned long long)node_id,(unsigned)ni->ver,name_buf,subs_buf,(unsigned)ni->local_v4_sockets,(unsigned)ni->local_v6_sockets,(unsigned)ni->local_v4_subnets,(unsigned)ni->hop_count); |
|
|
|
|
char* buf = u_malloc(need+1); |
|
|
|
|
if (!buf) return NULL; |
|
|
|
|
snprintf(buf,need+1,"NODEINFO nid=%016llx ver=%u name=\"%s\" v4subs=\"%s\" v4s=%u v6s=%u v4subcnt=%u hop=%u", (unsigned long long)node_id,(unsigned)ni->ver,name_buf,subs_buf,(unsigned)ni->local_v4_sockets,(unsigned)ni->local_v6_sockets,(unsigned)ni->local_v4_subnets,(unsigned)ni->hop_count); |
|
|
|
|
return buf; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|