diff --git a/code/lspgen/src/lspgen.c b/code/lspgen/src/lspgen.c index 1027ed1a..533dac2b 100644 --- a/code/lspgen/src/lspgen.c +++ b/code/lspgen/src/lspgen.c @@ -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; diff --git a/code/lspgen/src/lspgen_forest.c b/code/lspgen/src/lspgen_forest.c index 85f8b33d..13401296 100644 --- a/code/lspgen/src/lspgen_forest.c +++ b/code/lspgen/src/lspgen_forest.c @@ -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); - } } } diff --git a/code/lspgen/src/lspgen_lsdb.h b/code/lspgen/src/lspgen_lsdb.h index 5af91600..2f13dd2e 100644 --- a/code/lspgen/src/lspgen_lsdb.h +++ b/code/lspgen/src/lspgen_lsdb.h @@ -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;