1
This commit is contained in:
1 parent
b9f8930d1c
commit
5184181695
2 files changed
+44
-23
No files matched your search
+22
-6
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+22
-17
@@ -63,22 +63,10 @@ int route_bgp_update_my_nodeinfo(struct UTUN_INSTANCE* instance, struct ROUTE_BG
|
||||
DEBUG_ERROR(DEBUG_CATEGORY_BGP, "route_bgp_update_my_nodeinfo: invalid args");
|
||||
return -1;
|
||||
}
|
||||
if (!bgp->local_node) {
|
||||
int vc = 0;
|
||||
struct CFG_ROUTE_ENTRY* s = instance->config->my_subnets;
|
||||
while (s) {
|
||||
if (s->ip.family == AF_INET) vc++;
|
||||
s = s->next;
|
||||
}
|
||||
size_t d = vc * sizeof(struct NODEINFO_IPV4_SUBNET);
|
||||
bgp->local_node = u_calloc(1, sizeof(struct NODEINFO_Q) + d);
|
||||
if (!bgp->local_node) return -1;
|
||||
bgp->local_node->node.node_id = htobe64(instance->node_id);
|
||||
bgp->local_node->node.hop_count = 0;
|
||||
bgp->local_node->node.ver = 1;
|
||||
bgp->local_node->dirty = 1;
|
||||
bgp->local_node->last_ver = 1;
|
||||
bgp->local_node->node.local_v4_subnets = vc;
|
||||
size_t name_len = 0;
|
||||
if (instance->name[0]) {
|
||||
name_len = strlen(instance->name);
|
||||
if (name_len > 63) name_len = 63;
|
||||
}
|
||||
int vc = 0;
|
||||
struct CFG_ROUTE_ENTRY* s = instance->config->my_subnets;
|
||||
@@ -86,7 +74,19 @@ int route_bgp_update_my_nodeinfo(struct UTUN_INSTANCE* instance, struct ROUTE_BG
|
||||
if (s->ip.family == AF_INET) vc++;
|
||||
s = s->next;
|
||||
}
|
||||
int changed = (vc != (int)bgp->local_node->node.local_v4_subnets);
|
||||
size_t dyn = name_len + vc * sizeof(struct NODEINFO_IPV4_SUBNET);
|
||||
if (!bgp->local_node) {
|
||||
bgp->local_node = u_calloc(1, sizeof(struct NODEINFO_Q) + dyn);
|
||||
if (!bgp->local_node) return -1;
|
||||
bgp->local_node->node.node_id = htobe64(instance->node_id);
|
||||
bgp->local_node->node.hop_count = 0;
|
||||
bgp->local_node->node.ver = 1;
|
||||
bgp->local_node->dirty = 1;
|
||||
bgp->local_node->last_ver = 1;
|
||||
bgp->local_node->node.local_v4_subnets = vc;
|
||||
bgp->local_node->node.node_name_len = name_len;
|
||||
}
|
||||
int changed = (vc != (int)bgp->local_node->node.local_v4_subnets) || (name_len != bgp->local_node->node.node_name_len);
|
||||
if (!changed && vc > 0) {
|
||||
uint8_t* current = (uint8_t*)&bgp->local_node->node + sizeof(struct NODEINFO);
|
||||
struct NODEINFO_IPV4_SUBNET* ra = (struct NODEINFO_IPV4_SUBNET*)current;
|
||||
@@ -108,9 +108,14 @@ int route_bgp_update_my_nodeinfo(struct UTUN_INSTANCE* instance, struct ROUTE_BG
|
||||
uint8_t oldv = bgp->local_node->node.ver;
|
||||
bgp->local_node->node.ver = ((oldv + 1) % 255) + 1;
|
||||
bgp->local_node->node.local_v4_subnets = vc;
|
||||
bgp->local_node->node.node_name_len = name_len;
|
||||
bgp->local_node->dirty = 1;
|
||||
bgp->local_node->last_ver = bgp->local_node->node.ver;
|
||||
uint8_t* dp = (uint8_t*)&bgp->local_node->node + sizeof(struct NODEINFO);
|
||||
if (name_len) {
|
||||
memcpy(dp, instance->name, name_len);
|
||||
dp += name_len;
|
||||
}
|
||||
struct NODEINFO_IPV4_SUBNET* ra = (struct NODEINFO_IPV4_SUBNET*)dp;
|
||||
s = instance->config->my_subnets;
|
||||
while (s) {
|
||||
|
||||
Reference in new issue
Block a user