func (r *session) OnPortStatus(f openflow.Factory, w trans.Writer, v openflow.PortStatus) error { r.log.Debug("Session: PORT_STATUS is received") if !r.negotiated { return errNotNegotiated } port := v.Port() r.log.Debug(fmt.Sprintf("Session: Device=%v, PortNum=%v, AdminUp=%v, LinkUp=%v", r.device.ID(), port.Number(), !port.IsPortDown(), !port.IsLinkDown())) r.updatePort(v) // Send port event up := !port.IsPortDown() && !port.IsLinkDown() r.sendPortEvent(port.Number(), up) // Is this an enabled port? if up && r.device.isValid() { // Send LLDP to update network topology if err := sendLLDP(r.device.ID(), f, w, port); err != nil { return err } } else { // Send port removed event p := r.device.Port(port.Number()) if p != nil { r.watcher.PortRemoved(p) } } return r.handler.OnPortStatus(f, w, v) }
func (r *session) updatePort(v openflow.PortStatus) { port := v.Port() switch v.Version() { case openflow.OF10_VERSION: if port.Number() > of10.OFPP_MAX { return } case openflow.OF13_VERSION: if port.Number() > of13.OFPP_MAX { return } default: panic("unsupported OpenFlow version") } r.device.updatePort(port.Number(), port) }