|
|
|
@ -63,15 +63,20 @@ 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"); |
|
|
|
DEBUG_ERROR(DEBUG_CATEGORY_BGP, "route_bgp_update_my_nodeinfo: invalid args"); |
|
|
|
return -1; |
|
|
|
return -1; |
|
|
|
} |
|
|
|
} |
|
|
|
if (!bgp->local_node) { |
|
|
|
size_t name_len = 0; |
|
|
|
|
|
|
|
if (instance->name[0]) { |
|
|
|
|
|
|
|
name_len = strlen(instance->name); |
|
|
|
|
|
|
|
if (name_len > 63) name_len = 63; |
|
|
|
|
|
|
|
} |
|
|
|
int vc = 0; |
|
|
|
int vc = 0; |
|
|
|
struct CFG_ROUTE_ENTRY* s = instance->config->my_subnets; |
|
|
|
struct CFG_ROUTE_ENTRY* s = instance->config->my_subnets; |
|
|
|
while (s) { |
|
|
|
while (s) { |
|
|
|
if (s->ip.family == AF_INET) vc++; |
|
|
|
if (s->ip.family == AF_INET) vc++; |
|
|
|
s = s->next; |
|
|
|
s = s->next; |
|
|
|
} |
|
|
|
} |
|
|
|
size_t d = vc * sizeof(struct NODEINFO_IPV4_SUBNET); |
|
|
|
size_t dyn = name_len + vc * sizeof(struct NODEINFO_IPV4_SUBNET); |
|
|
|
bgp->local_node = u_calloc(1, sizeof(struct NODEINFO_Q) + d); |
|
|
|
if (!bgp->local_node) { |
|
|
|
|
|
|
|
bgp->local_node = u_calloc(1, sizeof(struct NODEINFO_Q) + dyn); |
|
|
|
if (!bgp->local_node) return -1; |
|
|
|
if (!bgp->local_node) return -1; |
|
|
|
bgp->local_node->node.node_id = htobe64(instance->node_id); |
|
|
|
bgp->local_node->node.node_id = htobe64(instance->node_id); |
|
|
|
bgp->local_node->node.hop_count = 0; |
|
|
|
bgp->local_node->node.hop_count = 0; |
|
|
|
@ -79,14 +84,9 @@ int route_bgp_update_my_nodeinfo(struct UTUN_INSTANCE* instance, struct ROUTE_BG |
|
|
|
bgp->local_node->dirty = 1; |
|
|
|
bgp->local_node->dirty = 1; |
|
|
|
bgp->local_node->last_ver = 1; |
|
|
|
bgp->local_node->last_ver = 1; |
|
|
|
bgp->local_node->node.local_v4_subnets = vc; |
|
|
|
bgp->local_node->node.local_v4_subnets = vc; |
|
|
|
|
|
|
|
bgp->local_node->node.node_name_len = name_len; |
|
|
|
} |
|
|
|
} |
|
|
|
int vc = 0; |
|
|
|
int changed = (vc != (int)bgp->local_node->node.local_v4_subnets) || (name_len != bgp->local_node->node.node_name_len); |
|
|
|
struct CFG_ROUTE_ENTRY* s = instance->config->my_subnets; |
|
|
|
|
|
|
|
while (s) { |
|
|
|
|
|
|
|
if (s->ip.family == AF_INET) vc++; |
|
|
|
|
|
|
|
s = s->next; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
int changed = (vc != (int)bgp->local_node->node.local_v4_subnets); |
|
|
|
|
|
|
|
if (!changed && vc > 0) { |
|
|
|
if (!changed && vc > 0) { |
|
|
|
uint8_t* current = (uint8_t*)&bgp->local_node->node + sizeof(struct NODEINFO); |
|
|
|
uint8_t* current = (uint8_t*)&bgp->local_node->node + sizeof(struct NODEINFO); |
|
|
|
struct NODEINFO_IPV4_SUBNET* ra = (struct NODEINFO_IPV4_SUBNET*)current; |
|
|
|
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; |
|
|
|
uint8_t oldv = bgp->local_node->node.ver; |
|
|
|
bgp->local_node->node.ver = ((oldv + 1) % 255) + 1; |
|
|
|
bgp->local_node->node.ver = ((oldv + 1) % 255) + 1; |
|
|
|
bgp->local_node->node.local_v4_subnets = vc; |
|
|
|
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->dirty = 1; |
|
|
|
bgp->local_node->last_ver = bgp->local_node->node.ver; |
|
|
|
bgp->local_node->last_ver = bgp->local_node->node.ver; |
|
|
|
uint8_t* dp = (uint8_t*)&bgp->local_node->node + sizeof(struct NODEINFO); |
|
|
|
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; |
|
|
|
struct NODEINFO_IPV4_SUBNET* ra = (struct NODEINFO_IPV4_SUBNET*)dp; |
|
|
|
s = instance->config->my_subnets; |
|
|
|
s = instance->config->my_subnets; |
|
|
|
while (s) { |
|
|
|
while (s) { |
|
|
|
|