/* This function called for every Voltaire node in fabric It could be optimized so, but time overhead is very small and its only diag.util */ static void fill_chassis_record(Node *node) { Port *port; Node *remnode = 0; ChassisRecord *ch = 0; if (node->chrecord) /* somehow this node has already been passed */ return; if (!(node->chrecord = calloc(1, sizeof(ChassisRecord)))) IBPANIC("out of mem"); ch = node->chrecord; /* node is router only in case of using unique lid */ /* (which is lid of chassis router port) */ /* in such case node->ports is actually a requested port... */ if (is_router(node) && is_spine(node->ports->remoteport->node)) get_router_slot(node, node->ports->remoteport); else if (is_spine(node)) { for (port = node->ports; port; port = port->next) { if (!port->remoteport) continue; remnode = port->remoteport->node; if (remnode->type != SWITCH_NODE) { if (!remnode->chrecord) get_router_slot(remnode, port); continue; } if (!ch->chassistype) /* we assume here that remoteport belongs to line */ get_sfb_slot(node, port->remoteport); /* we could break here, but need to find if more routers connected */ } } else if (is_line(node)) { for (port = node->ports; port; port = port->next) { if (port->portnum > 12) continue; if (!port->remoteport) continue; /* we assume here that remoteport belongs to spine */ get_slb_slot(ch, port->remoteport); break; } } return; }
/* This function called for every Voltaire node in fabric It could be optimized so, but time overhead is very small and its only diag.util */ static int fill_voltaire_chassis_record(ibnd_node_t * node) { int p = 0; ibnd_port_t *port; ibnd_node_t *remnode = 0; if (node->ch_found) /* somehow this node has already been passed */ return 0; node->ch_found = 1; /* node is router only in case of using unique lid */ /* (which is lid of chassis router port) */ /* in such case node->ports is actually a requested port... */ if (is_router(node)) /* find the remote node */ for (p = 1; p <= node->numports; p++) { port = node->ports[p]; if (port && is_spine(port->remoteport->node)) get_router_slot(node, port->remoteport); } else if (is_spine(node)) { int is_4700x2 = is_spine_4700x2(node); for (p = 1; p <= node->numports; p++) { port = node->ports[p]; if (!port || !port->remoteport) continue; /* * Skip ISR4700 double density fabric boards ports 19-36 * as they are chassis external ports */ if (is_4700x2 && (port->portnum > 18)) continue; remnode = port->remoteport->node; if (remnode->type != IB_NODE_SWITCH) { if (!remnode->ch_found) get_router_slot(remnode, port); continue; } if (!node->ch_type) /* we assume here that remoteport belongs to line */ get_sfb_slot(node, port->remoteport); /* we could break here, but need to find if more routers connected */ } } else if (is_line(node)) { int is_4700_line = is_line_4700(node); for (p = 1; p <= node->numports; p++) { port = node->ports[p]; if (!port || !port->remoteport) continue; if ((is_4700_line && (port->portnum > 18)) || (!is_4700_line && (port->portnum > 12))) continue; /* we assume here that remoteport belongs to spine */ get_slb_slot(node, port->remoteport); break; } } /* for each port of this node, map external ports */ for (p = 1; p <= node->numports; p++) { port = node->ports[p]; if (!port) continue; voltaire_portmap(port); } return 0; }