void BcmPort::init(bool warmBoot) { bool up = false; if (warmBoot) { // Get port status from HW on warm boot. // All ports are initially down on a cold boot. int linkStatus; opennsl_port_link_status_get(unit_, port_, &linkStatus); up = (linkStatus == OPENNSL_PORT_LINK_STATUS_UP); } else { // In open source code, we don't have any guarantees for the // state of the port at startup. Bringing them down guarantees // that things are in a known state. // // We should only be doing this on cold boot, since warm booting // should be initializing the state for us. auto rv = opennsl_port_enable_set(unit_, port_, false); bcmCheckError(rv, "failed to set port to known state: ", port_); } // Notify platform port of initial state/speed getPlatformPort()->linkSpeedChanged(getSpeed()); getPlatformPort()->linkStatusChanged(up, isEnabled()); enableLinkscan(); }
void BcmPort::init(bool warmBoot) { bool up = false; if (warmBoot) { // Get port status from HW on warm boot. // All ports are initially down on a cold boot. int linkStatus; opennsl_port_link_status_get(unit_, port_, &linkStatus); up = (linkStatus == OPENNSL_PORT_LINK_STATUS_UP); } else { // In open source code, we don't have any guarantees for the // state of the port at startup. Bringing them down guarantees // that things are in a known state. // // We should only be doing this on cold boot, since warm booting // should be initializing the state for us. auto rv = opennsl_port_enable_set(unit_, port_, false); bcmCheckError(rv, "failed to set port to known state: ", port_); } setPortStatus(up); // Linkscan should be enabled if the port is enabled already auto linkscan = isEnabled() ? OPENNSL_LINKSCAN_MODE_SW : OPENNSL_LINKSCAN_MODE_NONE; auto rv = opennsl_linkscan_mode_set(unit_, port_, linkscan); bcmCheckError(rv, "failed to set initial linkscan mode on port ", port_); }
void BcmPort::disable(const std::shared_ptr<Port>& swPort) { if (!isEnabled()) { // Already disabled return; } auto pbmp = getPbmp(); for (auto entry : swPort->getVlans()) { auto rv = opennsl_vlan_port_remove(unit_, entry.first, pbmp); bcmCheckError(rv, "failed to remove disabled port ", swPort->getID(), " from VLAN ", entry.first); } // Disable packet and byte counter statistic collection. auto rv = opennsl_port_stat_enable_set(unit_, gport_, false); bcmCheckError(rv, "Unexpected error disabling counter DMA on port ", swPort->getID()); // Disable linkscan rv = opennsl_linkscan_mode_set(unit_, port_, OPENNSL_LINKSCAN_MODE_NONE); bcmCheckError(rv, "Failed to disable linkscan on port ", swPort->getID()); rv = opennsl_port_enable_set(unit_, port_, false); bcmCheckError(rv, "failed to disable port ", swPort->getID()); }
void BcmPort::enable(const std::shared_ptr<Port>& swPort) { if (isEnabled()) { // Port is already enabled, don't need to do anything return; } auto pbmp = getPbmp(); opennsl_pbmp_t emptyPortList; OPENNSL_PBMP_CLEAR(emptyPortList); int rv; for (auto entry : swPort->getVlans()) { if (!entry.second.tagged) { rv = opennsl_vlan_port_add(unit_, entry.first, pbmp, pbmp); } else { rv = opennsl_vlan_port_add(unit_, entry.first, pbmp, emptyPortList); } bcmCheckError(rv, "failed to add enabled port ", swPort->getID(), " to VLAN ", entry.first); } // Drop packets to/from this port that are tagged with a VLAN that this // port isn't a member of. rv = opennsl_port_vlan_member_set(unit_, port_, OPENNSL_PORT_VLAN_MEMBER_INGRESS | OPENNSL_PORT_VLAN_MEMBER_EGRESS); bcmCheckError(rv, "failed to set VLAN filtering on port ", swPort->getID()); // Set the speed and ingress vlan before enabling program(swPort); // Enable packet and byte counter statistic collection. rv = opennsl_port_stat_enable_set(unit_, gport_, true); if (rv != OPENNSL_E_EXISTS) { // Don't throw an error if counter collection is already enabled bcmCheckError(rv, "Unexpected error enabling counter DMA on port ", swPort->getID()); } // Enable linkscan rv = opennsl_linkscan_mode_set(unit_, port_, OPENNSL_LINKSCAN_MODE_SW); bcmCheckError(rv, "Failed to enable linkscan on port ", swPort->getID()); rv = opennsl_port_enable_set(unit_, port_, true); bcmCheckError(rv, "failed to enable port ", swPort->getID()); }