func (d *of12Driver) handlePkt(pkt of.Header, c *ofConn) error { pkt12, err := of12.ToHeader12(pkt) if err != nil { return err } switch { case of12.IsEchoRequest(pkt12): return d.handleEchoRequest(of12.NewEchoRequestWithBuf(pkt12.Buf), c) case of12.IsFeaturesReply(pkt12): return d.handleFeaturesReply(of12.NewFeaturesReplyWithBuf(pkt12.Buf), c) case of12.IsPacketIn(pkt12): return d.handlePacketIn(of12.NewPacketInWithBuf(pkt12.Buf), c) case of12.IsErrorMsg(pkt12): return d.handleErrorMsg(of12.NewErrorMsgWithBuf(pkt12.Buf), c) case of12.IsStatsReply(pkt12): return d.handleStatsReply(of12.NewStatsReplyWithBuf(pkt12.Buf), c) case of12.IsRoleReply(pkt12): return d.handleRoleReply(of12.NewRoleReplyWithBuf(pkt12.Buf), c) default: return fmt.Errorf("received unsupported packet: %v", pkt.Type()) } }
func (d *of12Driver) handshake(c *ofConn) error { freq := of12.NewFeaturesRequest() if err := c.WriteHeader(freq.Header); err != nil { return err } c.Flush() glog.V(2).Info("Sent features request to the switch") hdr, err := c.ReadHeader() if err != nil { return err } v12, err := of12.ToHeader12(hdr) if err != nil { return err } frep, err := of12.ToFeaturesReply(v12) if err != nil { return err } glog.Infof("Handshake completed for switch %016x", frep.DatapathId()) glog.Infof("Disabling packet buffers in the switch.") cfg := of12.NewSwitchSetConfig() cfg.SetMissSendLen(0xFFFF) c.WriteHeader(cfg.Header) nodeID := datapathIDToNodeID(frep.DatapathId()) c.node = nom.Node{ ID: nodeID, MACAddr: datapathIDToMACAddr(frep.DatapathId()), Capabilities: []nom.NodeCapability{ nom.CapDriverRole, }, } nomDriver := nom.Driver{ BeeID: c.ctx.ID(), Role: nom.DriverRoleDefault, } c.ctx.Emit(nom.NodeConnected{ Node: c.node, Driver: nomDriver, }) d.ofPorts = make(map[uint32]*nom.Port) d.nomPorts = make(map[nom.UID]uint32) for _, p := range frep.Ports() { if p.PortNo() > uint32(of12.PP_MAX) { continue } name := p.Name() port := nom.Port{ ID: portNoToPortID(p.PortNo()), Name: string(name[:]), MACAddr: p.HwAddr(), Node: c.NodeUID(), } d.ofPorts[p.PortNo()] = &port d.nomPorts[port.UID()] = p.PortNo() glog.Infof("%v added", port) c.ctx.Emit(nom.PortStatusChanged{ Port: port, Driver: nomDriver, }) } return nil }