static void process_N (struct isis_spftree *spftree, enum vertextype vtype, void *id, u_int16_t dist, u_int16_t depth, struct isis_adjacency *adj, int family) { struct isis_vertex *vertex; #ifdef EXTREME_DEBUG u_char buff[255]; #endif /* C.2.6 b) */ if (dist > MAX_PATH_METRIC) return; /* c) */ vertex = isis_find_vertex (spftree->paths, id, vtype); if (vertex) { #ifdef EXTREME_DEBUG zlog_debug ("ISIS-Spf: process_N %s %s dist %d already found from PATH", vtype2string (vtype), vid2string (vertex, buff), dist); #endif /* EXTREME_DEBUG */ assert (dist >= vertex->d_N); return; } vertex = isis_find_vertex (spftree->tents, id, vtype); /* d) */ if (vertex) { /* 1) */ #ifdef EXTREME_DEBUG zlog_debug ("ISIS-Spf: process_N %s %s dist %d", vtype2string (vtype), vid2string (vertex, buff), dist); #endif /* EXTREME_DEBUG */ if (vertex->d_N == dist) { if (adj) listnode_add (vertex->Adj_N, adj); /* 2) */ if (listcount (vertex->Adj_N) > ISIS_MAX_PATH_SPLITS) remove_excess_adjs (vertex->Adj_N); /* 3) */ return; } else if (vertex->d_N < dist) { return; /* 4) */ } else { listnode_delete (spftree->tents, vertex); } } isis_spf_add2tent (spftree, vtype, id, adj, dist, depth, family); return; }
/* * Add this IS to the root of SPT */ static struct isis_vertex * isis_spf_add_root (struct isis_spftree *spftree, int level, u_char *sysid) { struct isis_vertex *vertex; struct isis_lsp *lsp; #ifdef EXTREME_DEBUG u_char buff[BUFSIZ]; #endif /* EXTREME_DEBUG */ lsp = isis_root_system_lsp (spftree->area, level, sysid); if (lsp == NULL) zlog_warn ("ISIS-Spf: could not find own l%d LSP!", level); if (!spftree->area->oldmetric) vertex = isis_vertex_new (sysid, VTYPE_NONPSEUDO_TE_IS); else vertex = isis_vertex_new (sysid, VTYPE_NONPSEUDO_IS); listnode_add (spftree->paths, vertex); #ifdef EXTREME_DEBUG zlog_debug ("ISIS-Spf: added this IS %s %s depth %d dist %d to PATHS", vtype2string (vertex->type), vid2string (vertex, buff), vertex->depth, vertex->d_N); #endif /* EXTREME_DEBUG */ return vertex; }
/** * Prints variant information. */ void Variant::print() { std::cerr << "type : " << vtype2string(type) << "\n"; std::cerr << "\n"; if (h!=NULL && v!=NULL) bcf_print_liten(h, v); std::cerr << "chrom : " << chrom << "\n"; std::cerr << "rid : " << rid << "\n"; std::cerr << "beg1 : " << beg1 << "\n"; std::cerr << "end1 : " << end1 << "\n"; std::cerr << "motif: " << vntr.motif << "\n"; std::cerr << "rlen : " << vntr.motif.size() << "\n"; for (int32_t i=0; i<alleles.size(); ++i) { std::cerr << "\tallele: " << i << "\n"; std::cerr << "\t type: " << vtype2string(alleles[i].type) << "\n"; std::cerr << "\t diff: " << alleles[i].diff << "\n"; std::cerr << "\t alen: " << alleles[i].alen << "\n"; std::cerr << "\t dlen: " << alleles[i].dlen << "\n"; } };
/* * Add this IS to the root of SPT */ static void isis_spf_add_self (struct isis_spftree *spftree, struct isis_area *area, int level) { struct isis_vertex *vertex; struct isis_lsp *lsp; u_char lspid[ISIS_SYS_ID_LEN + 2]; #ifdef EXTREME_DEBUG u_char buff[BUFSIZ]; #endif /* EXTREME_DEBUG */ memcpy (lspid, isis->sysid, ISIS_SYS_ID_LEN); LSP_PSEUDO_ID (lspid) = 0; LSP_FRAGMENT (lspid) = 0; lsp = lsp_search (lspid, area->lspdb[level - 1]); if (lsp == NULL) zlog_warn ("ISIS-Spf: could not find own l%d LSP!", level); if (!area->oldmetric) vertex = isis_vertex_new (isis->sysid, VTYPE_NONPSEUDO_TE_IS); else vertex = isis_vertex_new (isis->sysid, VTYPE_NONPSEUDO_IS); vertex->lsp = lsp; listnode_add (spftree->paths, vertex); #ifdef EXTREME_DEBUG zlog_debug ("ISIS-Spf: added this IS %s %s depth %d dist %d to PATHS", vtype2string (vertex->type), vid2string (vertex, buff), vertex->depth, vertex->d_N); #endif /* EXTREME_DEBUG */ return; }
/* * Add a vertex to TENT sorted by cost and by vertextype on tie break situation */ static struct isis_vertex * isis_spf_add2tent (struct isis_spftree *spftree, enum vertextype vtype, void *id, struct isis_adjacency *adj, u_int32_t cost, int depth, int family) { struct isis_vertex *vertex, *v; struct listnode *node; #ifdef EXTREME_DEBUG u_char buff[BUFSIZ]; #endif vertex = isis_vertex_new (id, vtype); vertex->d_N = cost; vertex->depth = depth; if (adj) listnode_add (vertex->Adj_N, adj); #ifdef EXTREME_DEBUG zlog_debug ("ISIS-Spf: add to TENT %s %s depth %d dist %d", vtype2string (vertex->type), vid2string (vertex, buff), vertex->depth, vertex->d_N); #endif /* EXTREME_DEBUG */ listnode_add (spftree->tents, vertex); if (list_isempty (spftree->tents)) { listnode_add (spftree->tents, vertex); return vertex; } /* XXX: This cant use the standard ALL_LIST_ELEMENT macro */ for (node = listhead (spftree->tents); node; node = listnextnode (node)) { v = listgetdata (node); if (v->d_N > vertex->d_N) { list_add_node_prev (spftree->tents, node, vertex); break; } else if (v->d_N == vertex->d_N) { /* Tie break, add according to type */ while (v && v->d_N == vertex->d_N && v->type > vertex->type) { if (v->type > vertex->type) { break; } /* XXX: this seems dubious, node is the loop iterator */ node = listnextnode (node); (node) ? (v = listgetdata (node)) : (v = NULL); } list_add_node_prev (spftree->tents, node, vertex); break; } else if (node->next == NULL) { list_add_node_next (spftree->tents, node, vertex); break; } } return vertex; }
listnode_add (vertex->parents, parent); if (listnode_lookup (parent->children, vertex) == NULL) listnode_add (parent->children, vertex); } if (parent && parent->Adj_N && listcount(parent->Adj_N) > 0) { for (ALL_LIST_ELEMENTS_RO (parent->Adj_N, node, parent_adj)) listnode_add (vertex->Adj_N, parent_adj); } else if (adj) { listnode_add (vertex->Adj_N, adj); } #ifdef EXTREME_DEBUG zlog_debug ("ISIS-Spf: add to TENT %s %s %s depth %d dist %d adjcount %d", print_sys_hostname (vertex->N.id), vtype2string (vertex->type), vid2string (vertex, buff), vertex->depth, vertex->d_N, listcount(vertex->Adj_N)); #endif /* EXTREME_DEBUG */ if (list_isempty (spftree->tents)) { listnode_add (spftree->tents, vertex); return vertex; } /* XXX: This cant use the standard ALL_LIST_ELEMENTS macro */ for (node = listhead (spftree->tents); node; node = listnextnode (node)) { v = listgetdata (node); if (v->d_N > vertex->d_N) {