func (d *Driver) Rcv(m beehive.Msg, ctx beehive.RcvContext) error { if m.NoReply() { return nil } q, ok := m.Data().(StatQuery) if !ok { return nil } s, ok := d.switches[q.Switch] if !ok { return fmt.Errorf("No switch stored in the driver: %+v", s) } for i, f := range s.Flows { f.Bytes += uint64(rand.Intn(maxSpike)) s.Flows[i] = f glog.V(2).Infof("Emitting stat result for %+v", f) ctx.Emit(StatResult{q, f.Flow, f.Bytes}) } d.switches[q.Switch] = s return nil }
func (h *UpdateHandler) Rcv(m beehive.Msg, ctx beehive.RcvContext) error { if m.NoReply() { return nil } u := m.Data().(MatrixUpdate) glog.Infof("Received matrix update: %+v", u) ctx.Emit(FlowMod{Switch: u.Switch}) return nil }
func (p *pinger) Rcv(msg bh.Msg, ctx bh.RcvContext) error { dict := ctx.Dict(PingPongDict) data := msg.Data() switch data := data.(type) { case ping: fmt.Printf("Rx Ping %d %v->%v\n", data.Seq, msg.From(), ctx.ID()) time.Sleep(300 * time.Millisecond) v, err := dict.Get("ping") var p ping if err == nil { p = v.(ping) } if data != p { return fmt.Errorf("Invalid ping: ping=%d, want=%d", data.Seq, p.Seq) } p.Seq += 1 dict.Put("ping", p) fmt.Printf("Ping stored to %v\n", p.Seq) if !msg.NoReply() { fmt.Printf("Tx Pong %d @ %v\n", data.pong().Seq, ctx.ID()) ctx.Emit(data.pong()) } case pong: fmt.Printf("Rx Pong %d %v->%v\n", data.Seq, msg.From(), ctx.ID()) time.Sleep(300 * time.Millisecond) dict := ctx.Dict(PingPongDict) v, err := dict.Get("pong") var p pong if err == nil { p = v.(pong) } if data != p { return fmt.Errorf("Invalid pong: pong=%d, want=%d", data.Seq, p.Seq) } p.Seq += 1 dict.Put("pong", p) fmt.Printf("Pong stored to %v\n", p.Seq) fmt.Printf("Tx Ping %d @ %v\n", data.ping().Seq, ctx.ID()) ctx.Emit(data.ping()) } return nil }
func (s *SwitchJoinHandler) Rcv(m beehive.Msg, ctx beehive.RcvContext) error { if m.NoReply() { return nil } joined := m.Data().(SwitchJoined) matrix := ctx.Dict(matrixDict) key := joined.Switch.Key() _, err := matrix.Get(key) if err != nil { return fmt.Errorf("Switch already exists in matrix: %+v", joined) } sw := make(SwitchStats) matrix.Put(key, sw) s.poller.query <- StatQuery{joined.Switch} glog.Infof("Switch joined: %+v", joined) return nil }