Documentation ¶
Index ¶
- Constants
- type AsicdClient
- type AuthenticationType
- type BFDServer
- func (server *BFDServer) AdminDownBfdSession(sessionMgmt BfdSessionMgmt) error
- func (server *BFDServer) AdminDownPerLinkBfdSessions(DestIp string) error
- func (server *BFDServer) AdminUpBfdSession(sessionMgmt BfdSessionMgmt) error
- func (server *BFDServer) AdminUpPerLinkBfdSessions(DestIp string) error
- func (server *BFDServer) BuildLagPropertyMap() error
- func (server *BFDServer) BuildPortPropertyMap() error
- func (server *BFDServer) ConnectToServers(paramsFile string)
- func (server *BFDServer) ConvertBfdAuthTypeStrToVal(authType string) AuthenticationType
- func (server *BFDServer) ConvertBfdAuthTypeValToStr(authType AuthenticationType) string
- func (server *BFDServer) ConvertBfdSessionDiagValToStr(diag BfdDiagnostic) string
- func (server *BFDServer) ConvertBfdSessionStateValToStr(state BfdSessionState) string
- func (server *BFDServer) CreateASICdSubscriber()
- func (server *BFDServer) CreateBfdSession(sessionMgmt BfdSessionMgmt) (*BfdSession, error)
- func (server *BFDServer) CreateRIBdSubscriber()
- func (server *BFDServer) DeleteBfdSession(sessionMgmt BfdSessionMgmt) error
- func (server *BFDServer) DeletePerLinkSessions(DestIp string, Protocol bfddCommonDefs.BfdSessionOwner, ForceDel bool) error
- func (server *BFDServer) DispatchReceivedBfdPacket(ipAddr string, bfdPacket *BfdControlPacket) error
- func (server *BFDServer) FindBfdSession(DestIp string) (sessionId int32, found bool)
- func (server *BFDServer) FindBfdSessionContainingAddr(DestIp string) (sessionId int32, found bool)
- func (server *BFDServer) GetBfdGlobalState() *GlobalState
- func (server *BFDServer) GetBfdSessionParamState(paramName string) (*SessionParamState, bool)
- func (server *BFDServer) GetBfdSessionState(ipAddr string) (*SessionState, bool)
- func (server *BFDServer) GetBulkBfdSessionParamStates(idx int, cnt int) (int, int, []SessionParamState)
- func (server *BFDServer) GetBulkBfdSessionStates(idx int, cnt int) (int, int, []SessionState)
- func (server *BFDServer) GetIfIndexFromDestIp(DestIp string) (int32, string, error)
- func (server *BFDServer) GetNewSessionId() int32
- func (server *BFDServer) GetTxJitter() int32
- func (server *BFDServer) HandleNextHopChange(DestIp string, IfIndex int32, Reachable bool) error
- func (server *BFDServer) InitPublisher(pub_str string) (pub *nanomsg.PubSocket)
- func (server *BFDServer) InitServer(paramFile string)
- func (server *BFDServer) NewBfdSession(DestIp string, ParamName string, Interface string, ...) *BfdSession
- func (server *BFDServer) NewNormalBfdSession(Interface string, LocalIp string, DestIp string, ParamName string, ...) *BfdSession
- func (server *BFDServer) NewPerLinkBfdSessions(IfIndex int32, LocalIp string, DestIp string, ParamName string, ...) error
- func (server *BFDServer) PublishSessionNotifications()
- func (server *BFDServer) ResetBfdSession(sessionId int32) error
- func (server *BFDServer) SendAdminDownToAllNeighbors() error
- func (server *BFDServer) SendAdminUpToAllNeighbors() error
- func (server *BFDServer) SendDeleteToAllSessions() error
- func (server *BFDServer) SessionDeleteHandler(session *BfdSession, Protocol bfddCommonDefs.BfdSessionOwner, ForceDel bool) error
- func (server *BFDServer) SigHandler(dbHdl *dbutils.DBUtil)
- func (server *BFDServer) StartBfdSesionServer() error
- func (server *BFDServer) StartBfdSessionRxTx() error
- func (server *BFDServer) StartServer(paramFile string, dbHdl *dbutils.DBUtil)
- func (server *BFDServer) StartSessionHandler() error
- func (server *BFDServer) StartSessionRetryHandler() error
- func (server *BFDServer) UpdateBfdSessionsUsingParam(paramName string) error
- type BfdAuthHeader
- type BfdControlPacket
- type BfdDiagnostic
- type BfdGlobal
- type BfdSession
- func (session *BfdSession) ApplyTxJitter() int32
- func (session *BfdSession) AuthenticateReceivedControlPacket(bfdPacket *BfdControlPacket) bool
- func (session *BfdSession) CanProcessBfdControlPacket(bfdPacket *BfdControlPacket) bool
- func (session *BfdSession) CheckAnyRemoteParamChanged(bfdPacket *BfdControlPacket) error
- func (session *BfdSession) CheckIfAnyProtocolRegistered() bool
- func (session *BfdSession) EventHandler(event BfdSessionEvent) error
- func (session *BfdSession) GetBfdSessionNotification() bool
- func (session *BfdSession) HandleSessionTimeout()
- func (session *BfdSession) InitiatePollSequence() error
- func (session *BfdSession) IsSessionActive() bool
- func (session *BfdSession) LocalAdminDown() error
- func (session *BfdSession) MoveToDownState() error
- func (session *BfdSession) MoveToInitState() error
- func (session *BfdSession) MoveToUpState() error
- func (session *BfdSession) NeedBfdPacketUpdate() bool
- func (session *BfdSession) ProcessBfdPacket(bfdPacket *BfdControlPacket) error
- func (session *BfdSession) ProcessPollSequence(bfdPacket *BfdControlPacket) error
- func (session *BfdSession) RemoteAdminDown() error
- func (session *BfdSession) RemoteChangedDemandMode(bfdPacket *BfdControlPacket) error
- func (session *BfdSession) ResetLocalSessionParams() error
- func (session *BfdSession) ResetRemoteSessionParams() error
- func (session *BfdSession) SendBfdNotification() error
- func (session *BfdSession) SendPeriodicControlPackets()
- func (session *BfdSession) StartBfdSession() error
- func (session *BfdSession) StartPerLinkSessionClient(bfdServer *BFDServer) error
- func (session *BfdSession) StartPerLinkSessionServer(bfdServer *BFDServer) error
- func (session *BfdSession) StartSessionClient(server *BFDServer) error
- func (session *BfdSession) StartSessionServer() error
- func (session *BfdSession) StopBfdSession() error
- func (session *BfdSession) UpdateBfdSessionControlPacket() error
- type BfdSessionEvent
- type BfdSessionMgmt
- type BfdSessionParam
- type BfdSessionState
- type ClientJson
- type GlobalConfig
- type GlobalState
- type LagProperty
- type PortProperty
- type RecvedBfdPacket
- type RibdClient
- type SessionConfig
- type SessionParamConfig
- type SessionParamState
- type SessionState
- type VlanProperty
Constants ¶
const ( DEFAULT_BFD_VERSION = 1 DEFAULT_DETECT_MULTI = 3 DEFAULT_DESIRED_MIN_TX_INTERVAL = 250000 DEFAULT_REQUIRED_MIN_RX_INTERVAL = 250000 DEFAULT_REQUIRED_MIN_ECHO_RX_INTERVAL = 0 DEFAULT_CONTROL_PACKET_LEN = 24 DEST_PORT = 3784 SRC_PORT = 49152 DEST_PORT_LAG = 6784 SRC_PORT_LAG = 49153 STARTUP_TX_INTERVAL = 2000000 STARTUP_RX_INTERVAL = 2000000 TX_JITTER = 10 //Timer will be running at 0 to 10% less than TX_INTERVAL )
Constants
const ( BFD_MP = 0x01 // Multipoint BFD_DEMAND = 0x02 // Demand mode BFD_AUTH_PRESENT = 0x04 // Authentication present BFD_CP_INDEPENDENT = 0x08 // Control plane independent BFD_FINAL = 0x10 // Final message, response to Poll BFD_POLL = 0x20 // Poll message )
Flags in BFD Control packet
const ( PACKET_QUEUE_SIZE = 128 MAX_NUM_SESSIONS = 1024 )
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type AsicdClient ¶
type AsicdClient struct { ipcutils.IPCClientBase ClientHdl *asicdServices.ASICDServicesClient }
type AuthenticationType ¶
type AuthenticationType uint8
const ( BFD_AUTH_TYPE_RESERVED AuthenticationType = 0 // Reserved BFD_AUTH_TYPE_SIMPLE AuthenticationType = 1 // Simple Password BFD_AUTH_TYPE_KEYED_MD5 AuthenticationType = 2 // Keyed MD5 BFD_AUTH_TYPE_METICULOUS_MD5 AuthenticationType = 3 // Meticulous Keyed MD5 BFD_AUTH_TYPE_KEYED_SHA1 AuthenticationType = 4 // Keyed SHA1 BFD_AUTH_TYPE_METICULOUS_SHA1 AuthenticationType = 5 // Meticulous Keyed SHA1 )
type BFDServer ¶
type BFDServer struct { ServerStartedCh chan bool GlobalConfigCh chan GlobalConfig CreateSessionCh chan BfdSessionMgmt DeleteSessionCh chan BfdSessionMgmt AdminUpSessionCh chan BfdSessionMgmt AdminDownSessionCh chan BfdSessionMgmt ResetSessionCh chan int32 SessionConfigCh chan SessionConfig CreatedSessionCh chan int32 FailedSessionClientCh chan int32 BfdPacketRecvCh chan RecvedBfdPacket SessionParamConfigCh chan SessionParamConfig SessionParamDeleteCh chan string // contains filtered or unexported fields }
func NewBFDServer ¶
func (*BFDServer) AdminDownBfdSession ¶
func (server *BFDServer) AdminDownBfdSession(sessionMgmt BfdSessionMgmt) error
AdminDownBfdSession ceases the session.
func (*BFDServer) AdminDownPerLinkBfdSessions ¶
func (*BFDServer) AdminUpBfdSession ¶
func (server *BFDServer) AdminUpBfdSession(sessionMgmt BfdSessionMgmt) error
AdminUpBfdSession ceases the session.
func (*BFDServer) AdminUpPerLinkBfdSessions ¶
func (*BFDServer) BuildLagPropertyMap ¶
func (*BFDServer) BuildPortPropertyMap ¶
func (*BFDServer) ConnectToServers ¶
func (*BFDServer) ConvertBfdAuthTypeStrToVal ¶
func (server *BFDServer) ConvertBfdAuthTypeStrToVal(authType string) AuthenticationType
func (*BFDServer) ConvertBfdAuthTypeValToStr ¶
func (server *BFDServer) ConvertBfdAuthTypeValToStr(authType AuthenticationType) string
func (*BFDServer) ConvertBfdSessionDiagValToStr ¶
func (server *BFDServer) ConvertBfdSessionDiagValToStr(diag BfdDiagnostic) string
func (*BFDServer) ConvertBfdSessionStateValToStr ¶
func (server *BFDServer) ConvertBfdSessionStateValToStr(state BfdSessionState) string
func (*BFDServer) CreateASICdSubscriber ¶
func (server *BFDServer) CreateASICdSubscriber()
func (*BFDServer) CreateBfdSession ¶
func (server *BFDServer) CreateBfdSession(sessionMgmt BfdSessionMgmt) (*BfdSession, error)
CreateBfdSession initializes a session and starts cpntrol packets exchange. This function is called when a protocol registers with BFD to monitor a destination IP.
func (*BFDServer) CreateRIBdSubscriber ¶
func (server *BFDServer) CreateRIBdSubscriber()
func (*BFDServer) DeleteBfdSession ¶
func (server *BFDServer) DeleteBfdSession(sessionMgmt BfdSessionMgmt) error
DeleteBfdSession ceases the session. A session down control packet is sent to BFD neighbor before deleting the session. This function is called when a protocol decides to stop monitoring the destination IP.
func (*BFDServer) DeletePerLinkSessions ¶
func (server *BFDServer) DeletePerLinkSessions(DestIp string, Protocol bfddCommonDefs.BfdSessionOwner, ForceDel bool) error
func (*BFDServer) DispatchReceivedBfdPacket ¶
func (server *BFDServer) DispatchReceivedBfdPacket(ipAddr string, bfdPacket *BfdControlPacket) error
func (*BFDServer) FindBfdSession ¶
func (*BFDServer) FindBfdSessionContainingAddr ¶
func (*BFDServer) GetBfdGlobalState ¶
func (server *BFDServer) GetBfdGlobalState() *GlobalState
func (*BFDServer) GetBfdSessionParamState ¶
func (server *BFDServer) GetBfdSessionParamState(paramName string) (*SessionParamState, bool)
func (*BFDServer) GetBfdSessionState ¶
func (server *BFDServer) GetBfdSessionState(ipAddr string) (*SessionState, bool)
func (*BFDServer) GetBulkBfdSessionParamStates ¶
func (*BFDServer) GetBulkBfdSessionStates ¶
func (*BFDServer) GetIfIndexFromDestIp ¶
func (*BFDServer) GetNewSessionId ¶
func (*BFDServer) GetTxJitter ¶
func (*BFDServer) HandleNextHopChange ¶
This function handles NextHop change from RIB. A Poll control packet will be sent to BFD neighbor and expect a Final control packet.
func (*BFDServer) InitPublisher ¶
func (*BFDServer) InitServer ¶
func (*BFDServer) NewBfdSession ¶
func (server *BFDServer) NewBfdSession(DestIp string, ParamName string, Interface string, Protocol bfddCommonDefs.BfdSessionOwner, PerLink bool) *BfdSession
func (*BFDServer) NewNormalBfdSession ¶
func (server *BFDServer) NewNormalBfdSession(Interface string, LocalIp string, DestIp string, ParamName string, PerLink bool, Protocol bfddCommonDefs.BfdSessionOwner) *BfdSession
func (*BFDServer) NewPerLinkBfdSessions ¶
func (server *BFDServer) NewPerLinkBfdSessions(IfIndex int32, LocalIp string, DestIp string, ParamName string, Protocol bfddCommonDefs.BfdSessionOwner) error
func (*BFDServer) PublishSessionNotifications ¶
func (server *BFDServer) PublishSessionNotifications()
func (*BFDServer) ResetBfdSession ¶
func (*BFDServer) SendAdminDownToAllNeighbors ¶
func (*BFDServer) SendAdminUpToAllNeighbors ¶
func (*BFDServer) SendDeleteToAllSessions ¶
func (*BFDServer) SessionDeleteHandler ¶
func (server *BFDServer) SessionDeleteHandler(session *BfdSession, Protocol bfddCommonDefs.BfdSessionOwner, ForceDel bool) error
func (*BFDServer) SigHandler ¶
func (*BFDServer) StartBfdSesionServer ¶
func (*BFDServer) StartBfdSessionRxTx ¶
func (*BFDServer) StartServer ¶
func (*BFDServer) StartSessionHandler ¶
func (*BFDServer) StartSessionRetryHandler ¶
func (*BFDServer) UpdateBfdSessionsUsingParam ¶
type BfdAuthHeader ¶
type BfdAuthHeader struct { Type AuthenticationType AuthKeyID uint8 SequenceNumber uint32 AuthData []byte }
type BfdControlPacket ¶
type BfdControlPacket struct { Version uint8 Diagnostic BfdDiagnostic State BfdSessionState Poll bool Final bool ControlPlaneIndependent bool AuthPresent bool Demand bool Multipoint bool // Must always be false DetectMult uint8 MyDiscriminator uint32 YourDiscriminator uint32 DesiredMinTxInterval time.Duration RequiredMinRxInterval time.Duration RequiredMinEchoRxInterval time.Duration AuthHeader *BfdAuthHeader }
func DecodeBfdControlPacket ¶
func DecodeBfdControlPacket(data []byte) (*BfdControlPacket, error)
* Decode the control packet
func NewBfdControlPacketDefault ¶
func NewBfdControlPacketDefault() *BfdControlPacket
func (*BfdControlPacket) CreateBfdControlPacket ¶
func (p *BfdControlPacket) CreateBfdControlPacket() ([]byte, error)
* Create a control packet
type BfdDiagnostic ¶
type BfdDiagnostic int
const ( DIAG_NONE BfdDiagnostic = 0 // No Diagnostic DIAG_TIME_EXPIRED BfdDiagnostic = 1 // Control Detection Time Expired DIAG_ECHO_FAILED BfdDiagnostic = 2 // Echo Function Failed DIAG_NEIGHBOR_SIGNAL_DOWN BfdDiagnostic = 3 // Neighbor Signaled Session Down DIAG_FORWARD_PLANE_RESET BfdDiagnostic = 4 // Forwarding Plane Reset DIAG_PATH_DOWN BfdDiagnostic = 5 // Path Down DIAG_CONCAT_PATH_DOWN BfdDiagnostic = 6 // Concatenated Path Down DIAG_ADMIN_DOWN BfdDiagnostic = 7 // Administratively Down DIAG_REV_CONCAT_PATH_DOWN BfdDiagnostic = 8 // Reverse Concatenated Path Down )
type BfdGlobal ¶
type BfdGlobal struct { Vrf string Enabled bool NumSessions uint32 Sessions map[int32]*BfdSession SessionsIdSlice []int32 SessionsByIp map[string]*BfdSession InactiveSessionsIdSlice []int32 NumSessionParams uint32 SessionParams map[string]*BfdSessionParam NumUpSessions uint32 NumDownSessions uint32 NumAdminDownSessions uint32 }
type BfdSession ¶
type BfdSession struct { TxTimeoutCh chan int32 SessionTimeoutCh chan int32 ReceivedPacketCh chan *BfdControlPacket SessionStopClientCh chan bool SessionStopServerCh chan bool // contains filtered or unexported fields }
func (*BfdSession) ApplyTxJitter ¶
func (session *BfdSession) ApplyTxJitter() int32
func (*BfdSession) AuthenticateReceivedControlPacket ¶
func (session *BfdSession) AuthenticateReceivedControlPacket(bfdPacket *BfdControlPacket) bool
func (*BfdSession) CanProcessBfdControlPacket ¶
func (session *BfdSession) CanProcessBfdControlPacket(bfdPacket *BfdControlPacket) bool
func (*BfdSession) CheckAnyRemoteParamChanged ¶
func (session *BfdSession) CheckAnyRemoteParamChanged(bfdPacket *BfdControlPacket) error
func (*BfdSession) CheckIfAnyProtocolRegistered ¶
func (session *BfdSession) CheckIfAnyProtocolRegistered() bool
func (*BfdSession) EventHandler ¶
func (session *BfdSession) EventHandler(event BfdSessionEvent) error
State Machine +--+ | | UP, TIMER | V DOWN +------+ INIT +------------| |------------+ | | DOWN | | | +-------->| |<--------+ | | | +------+ | | | | | | | | | | | | DOWN,| | | |TIMER TIMER| | V | | V +------+ +------+ +----| | | |----+ DOWN| | INIT |--------------------->| UP | |INIT, UP +--->| | INIT, UP | |<---+ +------+ +------+
EventHandler is called after receiving a BFD packet from remote.
func (*BfdSession) GetBfdSessionNotification ¶
func (session *BfdSession) GetBfdSessionNotification() bool
func (*BfdSession) HandleSessionTimeout ¶
func (session *BfdSession) HandleSessionTimeout()
func (*BfdSession) InitiatePollSequence ¶
func (session *BfdSession) InitiatePollSequence() error
func (*BfdSession) IsSessionActive ¶
func (session *BfdSession) IsSessionActive() bool
func (*BfdSession) LocalAdminDown ¶
func (session *BfdSession) LocalAdminDown() error
func (*BfdSession) MoveToDownState ¶
func (session *BfdSession) MoveToDownState() error
func (*BfdSession) MoveToInitState ¶
func (session *BfdSession) MoveToInitState() error
func (*BfdSession) MoveToUpState ¶
func (session *BfdSession) MoveToUpState() error
func (*BfdSession) NeedBfdPacketUpdate ¶
func (session *BfdSession) NeedBfdPacketUpdate() bool
func (*BfdSession) ProcessBfdPacket ¶
func (session *BfdSession) ProcessBfdPacket(bfdPacket *BfdControlPacket) error
func (*BfdSession) ProcessPollSequence ¶
func (session *BfdSession) ProcessPollSequence(bfdPacket *BfdControlPacket) error
func (*BfdSession) RemoteAdminDown ¶
func (session *BfdSession) RemoteAdminDown() error
func (*BfdSession) RemoteChangedDemandMode ¶
func (session *BfdSession) RemoteChangedDemandMode(bfdPacket *BfdControlPacket) error
func (*BfdSession) ResetLocalSessionParams ¶
func (session *BfdSession) ResetLocalSessionParams() error
func (*BfdSession) ResetRemoteSessionParams ¶
func (session *BfdSession) ResetRemoteSessionParams() error
func (*BfdSession) SendBfdNotification ¶
func (session *BfdSession) SendBfdNotification() error
func (*BfdSession) SendPeriodicControlPackets ¶
func (session *BfdSession) SendPeriodicControlPackets()
func (*BfdSession) StartBfdSession ¶
func (session *BfdSession) StartBfdSession() error
Restart session that was stopped earlier due to global Bfd disable.
func (*BfdSession) StartPerLinkSessionClient ¶
func (session *BfdSession) StartPerLinkSessionClient(bfdServer *BFDServer) error
func (*BfdSession) StartPerLinkSessionServer ¶
func (session *BfdSession) StartPerLinkSessionServer(bfdServer *BFDServer) error
func (*BfdSession) StartSessionClient ¶
func (session *BfdSession) StartSessionClient(server *BFDServer) error
func (*BfdSession) StartSessionServer ¶
func (session *BfdSession) StartSessionServer() error
func (*BfdSession) StopBfdSession ¶
func (session *BfdSession) StopBfdSession() error
Stop session as Bfd is disabled globally. Do not delete
func (*BfdSession) UpdateBfdSessionControlPacket ¶
func (session *BfdSession) UpdateBfdSessionControlPacket() error
type BfdSessionEvent ¶
type BfdSessionEvent int
const ( REMOTE_DOWN BfdSessionEvent = 1 REMOTE_INIT BfdSessionEvent = 2 REMOTE_UP BfdSessionEvent = 3 TIMEOUT BfdSessionEvent = 4 ADMIN_DOWN BfdSessionEvent = 5 ADMIN_UP BfdSessionEvent = 6 REMOTE_ADMIN_DOWN BfdSessionEvent = 7 )
type BfdSessionMgmt ¶
type BfdSessionMgmt struct { DestIp string ParamName string Interface string Protocol bfddCommonDefs.BfdSessionOwner PerLink bool ForceDel bool }
type BfdSessionParam ¶
type BfdSessionParam struct {
// contains filtered or unexported fields
}
type BfdSessionState ¶
type BfdSessionState int
const ( STATE_ADMIN_DOWN BfdSessionState = 0 STATE_DOWN BfdSessionState = 1 STATE_INIT BfdSessionState = 2 STATE_UP BfdSessionState = 3 )
type ClientJson ¶
type GlobalConfig ¶
type GlobalState ¶
type LagProperty ¶
type LagProperty struct {
Links []int32
}
type PortProperty ¶
type RecvedBfdPacket ¶
type RibdClient ¶
type RibdClient struct { ipcutils.IPCClientBase ClientHdl *ribd.RIBDServicesClient }
type SessionConfig ¶
type SessionConfig struct { DestIp string ParamName string Interface string PerLink bool Protocol bfddCommonDefs.BfdSessionOwner Operation bfddCommonDefs.BfdSessionOperation }
type SessionParamConfig ¶
type SessionParamState ¶
type SessionParamState struct { Name string NumSessions int32 LocalMultiplier int32 DesiredMinTxInterval int32 RequiredMinRxInterval int32 RequiredMinEchoRxInterval int32 DemandEnabled bool AuthenticationEnabled bool AuthenticationType AuthenticationType AuthenticationKeyId int32 AuthenticationData string }
type SessionState ¶
type SessionState struct { IpAddr string LocalAddr string SessionId int32 ParamName string Interface string InterfaceSpecific bool PerLinkSession bool LocalMacAddr net.HardwareAddr RemoteMacAddr net.HardwareAddr RegisteredProtocols []bool SessionState BfdSessionState RemoteSessionState BfdSessionState LocalDiscriminator uint32 RemoteDiscriminator uint32 LocalDiagType BfdDiagnostic DesiredMinTxInterval int32 RequiredMinRxInterval int32 RemoteMinRxInterval int32 DetectionMultiplier int32 RemoteDetectionMultiplier int32 DemandMode bool RemoteDemandMode bool AuthType AuthenticationType AuthSeqKnown bool ReceivedAuthSeq uint32 SentAuthSeq uint32 NumTxPackets uint32 NumRxPackets uint32 ToDownCount uint32 ToUpCount uint32 UpTime time.Time }