func (r *session) OnFeaturesReply(f openflow.Factory, w trans.Writer, v openflow.FeaturesReply) error { r.log.Debug(fmt.Sprintf("Session: FEATURES_REPLY (DPID=%v, NumBufs=%v, NumTables=%v)", v.DPID(), v.NumBuffers(), v.NumTables())) if !r.negotiated { return errNotNegotiated } dpid := strconv.FormatUint(v.DPID(), 10) // Already connected device? if r.finder.Device(dpid) != nil { return errors.New("duplicated device DPID (aux. connection is not supported yet)") } r.device.setID(dpid) // We assume a device is up after setting its DPID if err := r.listener.OnDeviceUp(r.finder, r.device); err != nil { return err } r.watcher.DeviceAdded(r.device) features := Features{ DPID: v.DPID(), NumBuffers: v.NumBuffers(), NumTables: v.NumTables(), } r.device.setFeatures(features) return r.handler.OnFeaturesReply(f, w, v) }