Follow secure coding standards for interactions with the mapper

This patchset updates phosphor-time-manager to follow secure coding
guidelines when interacting with the mapper.  Specifically, it replaces
uses of std::map with std::vector<std::pair<>>, which should net some
small performance wins.  This change also causes time-manager to
properly enumerate each response.

Tested-By:
Built with changeset, and verified via d-feet that
/xyz/openbmc_project/time/host and /xyz/openbmc_project/time/bmc were
present, and verified reading of the "Elapsed" parameter returned the
expected time result.

Change-Id: If4329d533641595cf0b50c4e50e2dda69b299f52
Signed-off-by: Ed Tanous <ed.tanous@intel.com>
2 files changed
tree: 0c1da70f8294c78224cc4431e6eeaea593b563db
  1. test/
  2. xyz/
  3. .gitignore
  4. bmc_epoch.cpp
  5. bmc_epoch.hpp
  6. bmc_time_change_listener.hpp
  7. bootstrap.sh
  8. configure.ac
  9. elog-errors.hpp
  10. epoch_base.cpp
  11. epoch_base.hpp
  12. host_epoch.cpp
  13. host_epoch.hpp
  14. LICENSE
  15. main.cpp
  16. Makefile.am
  17. manager.cpp
  18. manager.hpp
  19. property_change_listener.hpp
  20. README.md
  21. settings.cpp
  22. settings.hpp
  23. types.hpp
  24. utils.cpp
  25. utils.hpp
README.md

Introduction

phosphor-time-manager is the time manager service that implements D-Bus interface xyz/openbmc_project/Time/EpochTime.interface.yaml. The user can get or set the BMC's or HOST's time via this interface.

General usage

The service xyz.openbmc_project.Time.Manager provides two objects on D-Bus:

  • /xyz/openbmc_project/time/bmc
  • /xyz/openbmc_project/time/host

where each object implements interface xyz.openbmc_project.Time.EpochTime.

The user can directly get or set the property Elapsed of the objects to get or set the time. For example on an authenticated session:

  • To get BMC's time:
    ### With busctl on BMC
    busctl get-property xyz.openbmc_project.Time.Manager \
        /xyz/openbmc_project/time/bmc xyz.openbmc_project.Time.EpochTime Elapsed
    
    ### With REST API on remote host
    curl -b cjar -k https://${BMC_IP}/xyz/openbmc_project/time/bmc
    
  • To set HOST's time:
    ### With busctl on BMC
    busctl set-property xyz.openbmc_project.Time.Manager \
        /xyz/openbmc_project/time/host xyz.openbmc_project.Time.EpochTime \
        Elapsed t <value-in-microseconds>
    
    ### With REST API on remote host
    curl -b cjar -k -H "Content-Type: application/json" -X PUT \
        -d '{"data": 1487304700000000}' \
        https://${BMC_IP}/xyz/openbmc_project/time/host/attr/Elapsed
    

Time settings

Getting BMC or HOST time is always allowed, but setting the time may not be allowed depending on the below two settings in the settings manager.

  • TimeSyncMethod
    • NTP: The time is set via NTP server.
    • MANUAL: The time is set manually.
  • TimeOwner
    • BMC: BMC owns the time and can set the time.
    • HOST: Host owns the time and can set the time.
    • SPLIT: BMC and Host own separate time.
    • BOTH: Both BMC and Host can set the time.

A summary of which cases the time can be set on BMC or HOST:

ModeOwnerSet BMC TimeSet Host Time
NTPBMCFail to setNot allowed
NTPHOSTNot allowedNot allowed
NTPSPLITFail to setOK
NTPBOTHFail to setNot allowed
MANUALBMCOKNot allowed
MANUALHOSTNot allowedOK
MANUALSPLITOKOK
MANUALBOTHOKOK
  • To set an NTP server:

    ### With busctl on BMC
    busctl set-property  xyz.openbmc_project.Network \
       /xyz/openbmc_project/network/eth0 \
       xyz.openbmc_project.Network.EthernetInterface NTPServers \
       as 1 "<ntp_server>"
    
    ### With REST API on remote host
    curl -c cjar -b cjar -k -H "Content-Type: application/json" -X  PUT  -d \
        '{"data": ["<ntp_server>"] }' \
        https://${BMC_IP}/xyz/openbmc_project/network/eth0/attr/NTPServers
    
  • To go into NTP mode

    ### With busctl on BMC
    busctl set-property xyz.openbmc_project.Settings \
        /xyz/openbmc_project/time/sync_method xyz.openbmc_project.Time.Synchronization \
        TimeSyncMethod s "xyz.openbmc_project.Time.Synchronization.Method.NTP"
    
    ### With REST API on remote host
    curl -c cjar -b cjar -k -H "Content-Type: application/json" -X  PUT  -d \
        '{"data": "xyz.openbmc_project.Time.Synchronization.Method.NTP" }' \
        https://${BMC_IP}/xyz/openbmc_project/time/sync_method/attr/TimeSyncMethod
    
  • To change owner

    ### With busctl on BMC
    busctl set-property xyz.openbmc_project.Settings \
        /xyz/openbmc_project/time/owner xyz.openbmc_project.Time.Owner \
        TimeOwner s xyz.openbmc_project.Time.Owner.Owners.BMC
    
    ### With REST API on remote host
    curl -c cjar -b cjar -k -H "Content-Type: application/json" -X  PUT  -d \
        '{"data": "xyz.openbmc_project.Time.Owner.Owners.BMC" }' \
        https://${BMC_IP}/xyz/openbmc_project/time/owner/attr/TimeOwner
    

Special note on host on

When the host is on, the changes of the above time mode/owner are not applied but deferred. The changes of the mode/owner are saved to persistent storage.

When the host is off, the saved mode/owner are read from persistent storage and are applied.

Note: A user can set the time mode and owner in the settings daemon at any time, but the time manager applying them is governed by the above condition.