code: func (v *vserver) down(ip seesaw.IP) {
  	ncc := v.engine.ncc
  	if err := ncc.Dial(); err != nil {
  		log.Fatalf("%v: failed to connect to NCC: %v", v, err)
  	}
  	defer ncc.Close()
  
  	// If this is an anycast VIP, withdraw the BGP route.
  	nip := ip.IP()
  	if seesaw.IsAnycast(nip) {
  		if v.engine.config.AnycastEnabled {
  			log.Infof("%v: withdrawing BGP route for %v", v, ip)
  			if err := ncc.BGPWithdrawVIP(nip); err != nil {
  				log.Fatalf("%v: failed to withdraw VIP %v: %v", v, ip, err)
  			}
  		}
  		vip := seesaw.NewVIP(nip, nil)
  		if err := v.engine.lbInterface.DeleteVIP(vip); err != nil {
  			log.Fatalf("%v: failed to remove VIP %v: %v", v, ip, err)
  		}
  		if err := v.engine.lbInterface.DeleteVserver(v.lbVservers[ip], ip.AF()); err != nil {
  			log.Fatalf("%v: failed to delete Vserver: %v", v, err)
  		}
  		delete(v.lbVservers, ip)
  	}
  	// TODO(jsing): Should we delay while the BGP routes propagate?
  
  	delete(v.active, ip)
  	v.updateServices(ip)
  	log.Infof("%v: VIP %v down", v, ip)
  }
docs: // down takes down an IP address for a vserver, then takes down all services
  // for that IP address.