def _handle_HostEvent (self, event):
    entry = event.entry
    if event.move:
      log.warn('cannot handle moving hosts (%s)' % entry)
      return
    host = core.topology.getEntityByID(entry.macaddr)
    if host is None:
      host = Host(entry.macaddr)
      core.topology.addEntity(host)
      if core.Outband.t.mac(entry.macaddr):
        host.dpid = core.Outband.t.mac(entry.macaddr).dpid
      else:
        log.debug('mac not found %s' % entry.macaddr)
        val = 0
        for i, v in enumerate(entry.macaddr.toTuple()):
          val += (256 ** (5 - i)) * v
        host.dpid = val

    sw = core.topology.getEntityByID(entry.dpid)
    if sw is None:
      log.warn('unknown host (%s)' % entry.dpid)
      return
    if event.entry.port not in sw.ports:
      log.warn('unknown port (%s, %s)' % (entry.dpid, entry.port))
      return
    if event.join:
      log.debug('join (%s %s)' % (sw, host.id))
      sw.ports[entry.port].addEntity(host, single=True)
    else:
      log.debug('leave (%s %s)' % (sw, host.id))
      sw.ports[entry.port].entities.discard(host)
    def __init__(self, macAddr, ofp, ipAddr = None):
        if not macAddr:
            raise AssertionError("ScnOpenFlowHost should have a Mac address")

        Host.__init__(self)
        EventMixin.__init__(self)
        self.macAddr = macAddr
        self.ipAddr = ipAddr
        self.ofp = ofp
        log.debug("ScnOpenFlowHost :%s", str(self))