// Handle switch connected event func (self *OFSwitch) switchConnected() { self.app.SwitchConnected(self) // Send new feature request self.Send(openflow13.NewFeaturesRequest()) // FIXME: This is too fragile. Create a periodic timer // Start the periodic echo request loop self.Send(openflow13.NewEchoRequest()) }
// Handle openflow messages from the switch func (self *OFSwitch) handleMessages(dpid net.HardwareAddr, msg util.Message) { log.Debugf("Received message: %+v, on switch: %s", msg, dpid.String()) switch t := msg.(type) { case *common.Header: switch t.Header().Type { case openflow13.Type_Hello: // Send Hello response h, err := common.NewHello(4) if err != nil { log.Errorf("Error creating hello message") } self.Send(h) case openflow13.Type_EchoRequest: // Send echo reply res := openflow13.NewEchoReply() self.Send(res) case openflow13.Type_EchoReply: // FIXME: This is too fragile. Create a periodic timer // Wait three seconds then send an echo_request message. go func() { <-time.After(time.Second * 3) // Send echo request res := openflow13.NewEchoRequest() self.Send(res) }() case openflow13.Type_FeaturesRequest: case openflow13.Type_GetConfigRequest: case openflow13.Type_BarrierRequest: case openflow13.Type_BarrierReply: } case *openflow13.ErrorMsg: log.Errorf("Received ofp1.3 error msg: %+v", *t) self.stream.Shutdown <- true case *openflow13.VendorHeader: case *openflow13.SwitchFeatures: case *openflow13.SwitchConfig: switch t.Header.Type { case openflow13.Type_GetConfigReply: case openflow13.Type_SetConfig: } case *openflow13.PacketIn: log.Infof("Received packet(ofctrl): %+v", t) // send packet rcvd callback self.app.PacketRcvd(self, (*PacketIn)(t)) case *openflow13.FlowRemoved: case *openflow13.PortStatus: // FIXME: This needs to propagated to the app. case *openflow13.PacketOut: case *openflow13.FlowMod: case *openflow13.PortMod: case *openflow13.MultipartRequest: case *openflow13.MultipartReply: // FIXME: find a way to get multipart resp to app } }