1
0
mirror of https://github.com/rtbrick/bngblaster.git synced 2024-05-06 15:54:57 +00:00

add support for link-multiplier

This commit is contained in:
Hannes Gredler
2023-11-02 09:23:35 +00:00
parent 16a8ffe639
commit 0403695ae6
3 changed files with 55 additions and 35 deletions

View File

@@ -53,6 +53,7 @@ static struct option long_options[] = {
{"ipv6-node-prefix", required_argument, NULL, 'N'},
{"ipv4-external-prefix", required_argument, NULL, 'x'},
{"ipv6-external-prefix", required_argument, NULL, 'X'},
{"link-multiplier", required_argument, NULL, 'u'},
{"lsp-lifetime", required_argument, NULL, 'M'},
{"no-ipv4", no_argument, NULL, 'z'},
{"no-ipv6", no_argument, NULL, 'Z'},
@@ -946,6 +947,8 @@ lspgen_init_ctx(struct lsdb_ctx_ *ctx)
ctx->seed = 0x74522142; /* RtB! */
ctx->lsp_lifetime = 65535;
ctx->link_multiplier = 1;
/* ipv4 link prefix */
inet_pton(AF_INET, "172.16.0.0", &ctx->ipv4_link_prefix.address);
ctx->ipv4_link_prefix.len = 31;
@@ -1052,6 +1055,9 @@ lspgen_log_ctx(struct lsdb_ctx_ *ctx)
LOG(NORMAL, " Authentication-key %s, Authentication-type %s\n",
ctx->authentication_key, val2key(auth_type_names, ctx->authentication_type));
}
if (ctx->link_multiplier) {
LOG(NORMAL, " Link-multiplier %u\n", ctx->link_multiplier);
}
if (!ctx->no_ipv4) {
end_prefix4 = lspgen_compute_end_prefix4(&ctx->ipv4_node_prefix, ctx->num_nodes);
LOG(NORMAL, " IPv4 Node Base Prefix %s, End Prefix %s, %u prefixes\n",
@@ -1254,7 +1260,7 @@ main(int argc, char *argv[])
* Parse options.
*/
idx = 0;
while ((opt = getopt_long(argc, argv, "vha:c:C:e:f:g:Gl:L:m:M:n:K:N:p:P:q:Qr:s:S:t:T:V:w:x:X:yzZ",
while ((opt = getopt_long(argc, argv, "vha:c:C:e:f:g:Gl:L:m:M:n:K:N:p:P:q:Qr:s:S:t:T:u:V:w:x:X:yzZ",
long_options, &idx)) != -1) {
switch (opt) {
case 'v':
@@ -1330,7 +1336,14 @@ main(int argc, char *argv[])
/* logging */
log_enable(optarg);
break;
case 'c':
case 'u':
ctx->link_multiplier = strtol(optarg, NULL, 10);
if (ctx->link_multiplier > 200) {
ctx->link_multiplier = 200;
LOG(ERROR, "Set link-multiplier to maximum %u\n", ctx->link_multiplier);
}
break;
case 'c':
ctx->num_nodes = strtol(optarg, NULL, 10);
if (ctx->num_nodes < 5) {
ctx->num_nodes = 5;

View File

@@ -79,6 +79,7 @@ print_graph(lsdb_ctx_t *ctx, int v, int e, int *adj_matrix)
struct lsdb_node_ *local_node, *remote_node;
char node_name[32];
int i, j, index;
uint32_t link_index;
unsigned int root = 0;
__uint128_t addr;
@@ -122,41 +123,46 @@ print_graph(lsdb_ctx_t *ctx, int v, int e, int *adj_matrix)
node_template.node_name = node_name;
remote_node = lsdb_add_node(ctx, &node_template);
/*
* Add outgoing link.
*/
link_template.link_metric = weights[adj_matrix[index]];
addr = lspgen_load_addr((uint8_t*)&ctx->ipv4_node_prefix.address, sizeof(ipv4addr_t)) + i - 1;
if (ctx->protocol_id == PROTO_ISIS) {
lspgen_store_bcd_addr(addr, link_template.key.local_node_id, 4);
} else if (ctx->protocol_id == PROTO_OSPF2 || ctx->protocol_id == PROTO_OSPF3) {
lspgen_store_addr(addr, link_template.key.local_node_id, 4);
}
addr = lspgen_load_addr((uint8_t*)&ctx->ipv4_node_prefix.address, sizeof(ipv4addr_t)) + j - 1;
if (ctx->protocol_id == PROTO_ISIS) {
lspgen_store_bcd_addr(addr, link_template.key.remote_node_id, 4);
} else if (ctx->protocol_id == PROTO_OSPF2 || ctx->protocol_id == PROTO_OSPF3) {
lspgen_store_addr(addr, link_template.key.remote_node_id, 4);
}
lsdb_add_link(ctx, local_node, &link_template);
for (link_index = 0; link_index < ctx->link_multiplier; link_index++) {
/*
* Add incoming link.
*/
addr = lspgen_load_addr((uint8_t*)&ctx->ipv4_node_prefix.address, sizeof(ipv4addr_t)) + j - 1;
if (ctx->protocol_id == PROTO_ISIS) {
lspgen_store_bcd_addr(addr, link_template.key.local_node_id, 4);
} else if (ctx->protocol_id == PROTO_OSPF2 || ctx->protocol_id == PROTO_OSPF3) {
lspgen_store_addr(addr, link_template.key.local_node_id, 4);
/*
* Add outgoing link.
*/
link_template.link_metric = weights[adj_matrix[index]];
addr = lspgen_load_addr((uint8_t*)&ctx->ipv4_node_prefix.address, sizeof(ipv4addr_t)) + i - 1;
if (ctx->protocol_id == PROTO_ISIS) {
lspgen_store_bcd_addr(addr, link_template.key.local_node_id, 4);
} else if (ctx->protocol_id == PROTO_OSPF2 || ctx->protocol_id == PROTO_OSPF3) {
lspgen_store_addr(addr, link_template.key.local_node_id, 4);
}
addr = lspgen_load_addr((uint8_t*)&ctx->ipv4_node_prefix.address, sizeof(ipv4addr_t)) + j - 1;
if (ctx->protocol_id == PROTO_ISIS) {
lspgen_store_bcd_addr(addr, link_template.key.remote_node_id, 4);
} else if (ctx->protocol_id == PROTO_OSPF2 || ctx->protocol_id == PROTO_OSPF3) {
lspgen_store_addr(addr, link_template.key.remote_node_id, 4);
}
lspgen_store_addr(link_index, link_template.key.local_link_id, 4);
lsdb_add_link(ctx, local_node, &link_template);
/*
* Add incoming link.
*/
addr = lspgen_load_addr((uint8_t*)&ctx->ipv4_node_prefix.address, sizeof(ipv4addr_t)) + j - 1;
if (ctx->protocol_id == PROTO_ISIS) {
lspgen_store_bcd_addr(addr, link_template.key.local_node_id, 4);
} else if (ctx->protocol_id == PROTO_OSPF2 || ctx->protocol_id == PROTO_OSPF3) {
lspgen_store_addr(addr, link_template.key.local_node_id, 4);
}
addr = lspgen_load_addr((uint8_t*)&ctx->ipv4_node_prefix.address, sizeof(ipv4addr_t)) + i - 1;
if (ctx->protocol_id == PROTO_ISIS) {
lspgen_store_bcd_addr(addr, link_template.key.remote_node_id, 4);
} else if (ctx->protocol_id == PROTO_OSPF2 || ctx->protocol_id == PROTO_OSPF3) {
lspgen_store_addr(addr, link_template.key.remote_node_id, 4);
}
lspgen_store_addr(link_index, link_template.key.local_link_id, 4);
lsdb_add_link(ctx, remote_node, &link_template);
}
}
addr = lspgen_load_addr((uint8_t*)&ctx->ipv4_node_prefix.address, sizeof(ipv4addr_t)) + i - 1;
if (ctx->protocol_id == PROTO_ISIS) {
lspgen_store_bcd_addr(addr, link_template.key.remote_node_id, 4);
} else if (ctx->protocol_id == PROTO_OSPF2 || ctx->protocol_id == PROTO_OSPF3) {
lspgen_store_addr(addr, link_template.key.remote_node_id, 4);
}
lsdb_add_link(ctx, remote_node, &link_template);
}
}
}

View File

@@ -80,6 +80,7 @@ typedef struct lsdb_ctx_
struct lsdb_node_id_ connector[3];
uint32_t num_connector;
uint32_t num_ext; /* number of external prefixes */
uint32_t link_multiplier; /* parallel links */
bool no_sr;
bool no_ipv4;
bool no_ipv6;