Amazon Kinesis Webrtc C SDK
IceAgent.c File Reference
#include "../Include_i.h"
Include dependency graph for IceAgent.c:

Macros

#define LOG_CLASS   "IceAgent"
 

Enumerations

enum  SDP_ICE_CANDIDATE_PARSER_STATE {
  SDP_ICE_CANDIDATE_PARSER_STATE_FOUNDATION = 0 , SDP_ICE_CANDIDATE_PARSER_STATE_COMPONENT , SDP_ICE_CANDIDATE_PARSER_STATE_PROTOCOL , SDP_ICE_CANDIDATE_PARSER_STATE_PRIORITY ,
  SDP_ICE_CANDIDATE_PARSER_STATE_IP , SDP_ICE_CANDIDATE_PARSER_STATE_PORT , SDP_ICE_CANDIDATE_PARSER_STATE_TYPE_ID , SDP_ICE_CANDIDATE_PARSER_STATE_TYPE_VAL ,
  SDP_ICE_CANDIDATE_PARSER_STATE_OTHERS
}
 

Functions

STATUS createIceAgent (PCHAR username, PCHAR password, PIceAgentCallbacks pIceAgentCallbacks, PRtcConfiguration pRtcConfiguration, TIMER_QUEUE_HANDLE timerQueueHandle, PConnectionListener pConnectionListener, PIceAgent *ppIceAgent)
 
STATUS freeIceAgent (PIceAgent *ppIceAgent)
 
STATUS iceAgentAddConfig (PIceAgent pIceAgent, PIceConfigInfo pIceConfigInfo)
 
STATUS iceAgentValidateKvsRtcConfig (PKvsRtcConfiguration pKvsRtcConfiguration)
 
STATUS iceAgentReportNewLocalCandidate (PIceAgent pIceAgent, PIceCandidate pIceCandidate)
 
STATUS iceAgentAddRemoteCandidate (PIceAgent pIceAgent, PCHAR pIceCandidateString)
 
STATUS iceAgentInitHostCandidate (PIceAgent pIceAgent)
 
STATUS iceAgentStartAgent (PIceAgent pIceAgent, PCHAR remoteUsername, PCHAR remotePassword, BOOL isControlling)
 
STATUS iceAgentStartGathering (PIceAgent pIceAgent)
 
STATUS iceAgentSendPacket (PIceAgent pIceAgent, PBYTE pBuffer, UINT32 bufferLen)
 
STATUS iceAgentPopulateSdpMediaDescriptionCandidates (PIceAgent pIceAgent, PSdpMediaDescription pSdpMediaDescription, UINT32 attrBufferLen, PUINT32 pIndex)
 
STATUS iceAgentShutdown (PIceAgent pIceAgent)
 
STATUS iceAgentRestart (PIceAgent pIceAgent, PCHAR localIceUfrag, PCHAR localIcePwd)
 
STATUS findCandidateWithIp (PKvsIpAddress pIpAddress, PDoubleList pCandidateList, PIceCandidate *ppIceCandidate)
 
STATUS findCandidateWithSocketConnection (PSocketConnection pSocketConnection, PDoubleList pCandidateList, PIceCandidate *ppIceCandidate)
 
STATUS createIceCandidatePairs (PIceAgent pIceAgent, PIceCandidate pIceCandidate, BOOL isRemoteCandidate)
 
STATUS freeIceCandidatePair (PIceCandidatePair *ppIceCandidatePair)
 
STATUS insertIceCandidatePair (PDoubleList iceCandidatePairs, PIceCandidatePair pIceCandidatePair)
 
STATUS findIceCandidatePairWithLocalSocketConnectionAndRemoteAddr (PIceAgent pIceAgent, PSocketConnection pSocketConnection, PKvsIpAddress pRemoteAddr, BOOL checkPort, PIceCandidatePair *ppIceCandidatePair)
 
STATUS pruneUnconnectedIceCandidatePair (PIceAgent pIceAgent)
 
STATUS iceCandidatePairCheckConnection (PStunPacket pStunBindingRequest, PIceAgent pIceAgent, PIceCandidatePair pIceCandidatePair)
 
STATUS iceAgentSendStunPacket (PStunPacket pStunPacket, PBYTE password, UINT32 passwordLen, PIceAgent pIceAgent, PIceCandidate pLocalCandidate, PKvsIpAddress pDestAddr)
 
STATUS iceAgentStateTransitionTimerCallback (UINT32 timerId, UINT64 currentTime, UINT64 customData)
 
STATUS iceAgentSendSrflxCandidateRequest (PIceAgent pIceAgent)
 
STATUS iceAgentCheckCandidatePairConnection (PIceAgent pIceAgent)
 
STATUS iceAgentSendKeepAliveTimerCallback (UINT32 timerId, UINT64 currentTime, UINT64 customData)
 
STATUS iceAgentGatherCandidateTimerCallback (UINT32 timerId, UINT64 currentTime, UINT64 customData)
 
STATUS iceAgentSendCandidateNomination (PIceAgent pIceAgent)
 
STATUS iceAgentInitSrflxCandidate (PIceAgent pIceAgent)
 
STATUS iceAgentInitRelayCandidates (PIceAgent pIceAgent)
 
STATUS turnStateFailedFn (PSocketConnection pSocketConnection, UINT64 data)
 
STATUS iceAgentInitRelayCandidate (PIceAgent pIceAgent, UINT32 iceServerIndex, KVS_SOCKET_PROTOCOL protocol)
 
STATUS iceAgentCheckConnectionStateSetup (PIceAgent pIceAgent)
 
STATUS updateCandidateStats (PIceAgent pIceAgent, BOOL isRemote)
 
STATUS updateSelectedLocalRemoteCandidateStats (PIceAgent pIceAgent)
 
STATUS iceAgentConnectedStateSetup (PIceAgent pIceAgent)
 
STATUS iceAgentNominatingStateSetup (PIceAgent pIceAgent)
 
STATUS iceAgentReadyStateSetup (PIceAgent pIceAgent)
 
STATUS iceAgentNominateCandidatePair (PIceAgent pIceAgent)
 
STATUS iceAgentInvalidateCandidatePair (PIceAgent pIceAgent)
 
STATUS incomingRelayedDataHandler (UINT64 customData, PSocketConnection pSocketConnection, PBYTE pBuffer, UINT32 bufferLen, PKvsIpAddress pSrc, PKvsIpAddress pDest)
 
STATUS incomingDataHandler (UINT64 customData, PSocketConnection pSocketConnection, PBYTE pBuffer, UINT32 bufferLen, PKvsIpAddress pSrc, PKvsIpAddress pDest)
 
STATUS iceCandidateSerialize (PIceCandidate pIceCandidate, PCHAR pOutputData, PUINT32 pOutputLength)
 
STATUS handleStunPacket (PIceAgent pIceAgent, PBYTE pBuffer, UINT32 bufferLen, PSocketConnection pSocketConnection, PKvsIpAddress pSrcAddr, PKvsIpAddress pDestAddr)
 
STATUS iceAgentCheckPeerReflexiveCandidate (PIceAgent pIceAgent, PKvsIpAddress pIpAddress, UINT32 priority, BOOL isRemote, PSocketConnection pSocketConnection)
 
STATUS iceAgentFatalError (PIceAgent pIceAgent, STATUS errorStatus)
 
VOID iceAgentLogNewCandidate (PIceCandidate pIceCandidate)
 
STATUS updateCandidateAddress (PIceCandidate pIceCandidate, PKvsIpAddress pIpAddr)
 
UINT32 computeCandidatePriority (PIceCandidate pIceCandidate)
 
UINT64 computeCandidatePairPriority (PIceCandidatePair pIceCandidatePair, BOOL isLocalControlling)
 
PCHAR iceAgentGetCandidateTypeStr (ICE_CANDIDATE_TYPE candidateType)
 
UINT64 iceAgentGetCurrentTime (UINT64 customData)
 
STATUS getIceAgentStats (PIceAgent pIceAgent, PKvsIceAgentMetrics pKvsIceAgentMetrics)
 

Variables

StateMachineState ICE_AGENT_STATE_MACHINE_STATES []
 
UINT32 ICE_AGENT_STATE_MACHINE_STATE_COUNT
 

Macro Definition Documentation

◆ LOG_CLASS

#define LOG_CLASS   "IceAgent"

Ice Agent APIs

Enumeration Type Documentation

◆ SDP_ICE_CANDIDATE_PARSER_STATE

Enumerator
SDP_ICE_CANDIDATE_PARSER_STATE_FOUNDATION 
SDP_ICE_CANDIDATE_PARSER_STATE_COMPONENT 
SDP_ICE_CANDIDATE_PARSER_STATE_PROTOCOL 
SDP_ICE_CANDIDATE_PARSER_STATE_PRIORITY 
SDP_ICE_CANDIDATE_PARSER_STATE_IP 
SDP_ICE_CANDIDATE_PARSER_STATE_PORT 
SDP_ICE_CANDIDATE_PARSER_STATE_TYPE_ID 
SDP_ICE_CANDIDATE_PARSER_STATE_TYPE_VAL 
SDP_ICE_CANDIDATE_PARSER_STATE_OTHERS 

Function Documentation

◆ computeCandidatePairPriority()

UINT64 computeCandidatePairPriority ( PIceCandidatePair  pIceCandidatePair,
BOOL  isLocalControlling 
)
Here is the caller graph for this function:

◆ computeCandidatePriority()

UINT32 computeCandidatePriority ( PIceCandidate  pIceCandidate)
Here is the caller graph for this function:

◆ createIceAgent()

STATUS createIceAgent ( PCHAR  username,
PCHAR  password,
PIceAgentCallbacks  pIceAgentCallbacks,
PRtcConfiguration  pRtcConfiguration,
TIMER_QUEUE_HANDLE  timerQueueHandle,
PConnectionListener  pConnectionListener,
PIceAgent ppIceAgent 
)

allocate the IceAgent struct and store username and password

Parameters
-PCHAR - IN - username
-PCHAR - IN - password
-PIceAgentCallbacks - IN - callback for inbound packets
-PRtcConfiguration - IN - RtcConfig
-PIceAgent* - OUT - the created IceAgent struct
Returns
- STATUS - status of execution
Here is the call graph for this function:
Here is the caller graph for this function:

◆ createIceCandidatePairs()

STATUS createIceCandidatePairs ( PIceAgent  pIceAgent,
PIceCandidate  pIceCandidate,
BOOL  isRemoteCandidate 
)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ findCandidateWithIp()

STATUS findCandidateWithIp ( PKvsIpAddress  pIpAddress,
PDoubleList  pCandidateList,
PIceCandidate ppIceCandidate 
)
Here is the caller graph for this function:

◆ findCandidateWithSocketConnection()

STATUS findCandidateWithSocketConnection ( PSocketConnection  pSocketConnection,
PDoubleList  pCandidateList,
PIceCandidate ppIceCandidate 
)
Here is the caller graph for this function:

◆ findIceCandidatePairWithLocalSocketConnectionAndRemoteAddr()

STATUS findIceCandidatePairWithLocalSocketConnectionAndRemoteAddr ( PIceAgent  pIceAgent,
PSocketConnection  pSocketConnection,
PKvsIpAddress  pRemoteAddr,
BOOL  checkPort,
PIceCandidatePair ppIceCandidatePair 
)
Here is the caller graph for this function:

◆ freeIceAgent()

STATUS freeIceAgent ( PIceAgent ppIceAgent)

Not thread-safe

Parameters
ppIceAgent
Returns
Here is the call graph for this function:
Here is the caller graph for this function:

◆ freeIceCandidatePair()

STATUS freeIceCandidatePair ( PIceCandidatePair ppIceCandidatePair)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ getIceAgentStats()

STATUS getIceAgentStats ( PIceAgent  pIceAgent,
PKvsIceAgentMetrics  pKvsIceAgentMetrics 
)
Here is the caller graph for this function:

◆ handleStunPacket()

STATUS handleStunPacket ( PIceAgent  pIceAgent,
PBYTE  pBuffer,
UINT32  bufferLen,
PSocketConnection  pSocketConnection,
PKvsIpAddress  pSrcAddr,
PKvsIpAddress  pDestAddr 
)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentAddConfig()

STATUS iceAgentAddConfig ( PIceAgent  pIceAgent,
PIceConfigInfo  pIceConfigInfo 
)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentAddRemoteCandidate()

STATUS iceAgentAddRemoteCandidate ( PIceAgent  pIceAgent,
PCHAR  pIceCandidateString 
)

if PIceCandidate doesnt exist already in remoteCandidates, create a copy and add to remoteCandidates

Parameters
-PIceAgent - IN - IceAgent object
-PIceCandidate - IN - new remote candidate to add
Returns
- STATUS - status of execution
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentCheckCandidatePairConnection()

STATUS iceAgentCheckCandidatePairConnection ( PIceAgent  pIceAgent)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentCheckConnectionStateSetup()

STATUS iceAgentCheckConnectionStateSetup ( PIceAgent  pIceAgent)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentCheckPeerReflexiveCandidate()

STATUS iceAgentCheckPeerReflexiveCandidate ( PIceAgent  pIceAgent,
PKvsIpAddress  pIpAddress,
UINT32  priority,
BOOL  isRemote,
PSocketConnection  pSocketConnection 
)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentConnectedStateSetup()

STATUS iceAgentConnectedStateSetup ( PIceAgent  pIceAgent)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentFatalError()

STATUS iceAgentFatalError ( PIceAgent  pIceAgent,
STATUS  errorStatus 
)
Here is the caller graph for this function:

◆ iceAgentGatherCandidateTimerCallback()

STATUS iceAgentGatherCandidateTimerCallback ( UINT32  timerId,
UINT64  currentTime,
UINT64  customData 
)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentGetCandidateTypeStr()

PCHAR iceAgentGetCandidateTypeStr ( ICE_CANDIDATE_TYPE  candidateType)
Here is the caller graph for this function:

◆ iceAgentGetCurrentTime()

UINT64 iceAgentGetCurrentTime ( UINT64  customData)
Here is the caller graph for this function:

◆ iceAgentInitHostCandidate()

STATUS iceAgentInitHostCandidate ( PIceAgent  pIceAgent)

gather local ip addresses and create a udp port. If port creation succeeded then create a new candidate and store it in localCandidates. Ips that are already a local candidate will not be added again.

Parameters
-PIceAgent - IN - IceAgent object
Returns
- STATUS - status of execution
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentInitRelayCandidate()

STATUS iceAgentInitRelayCandidate ( PIceAgent  pIceAgent,
UINT32  iceServerIndex,
KVS_SOCKET_PROTOCOL  protocol 
)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentInitRelayCandidates()

STATUS iceAgentInitRelayCandidates ( PIceAgent  pIceAgent)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentInitSrflxCandidate()

STATUS iceAgentInitSrflxCandidate ( PIceAgent  pIceAgent)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentInvalidateCandidatePair()

STATUS iceAgentInvalidateCandidatePair ( PIceAgent  pIceAgent)
Here is the caller graph for this function:

◆ iceAgentLogNewCandidate()

VOID iceAgentLogNewCandidate ( PIceCandidate  pIceCandidate)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentNominateCandidatePair()

STATUS iceAgentNominateCandidatePair ( PIceAgent  pIceAgent)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentNominatingStateSetup()

STATUS iceAgentNominatingStateSetup ( PIceAgent  pIceAgent)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentPopulateSdpMediaDescriptionCandidates()

STATUS iceAgentPopulateSdpMediaDescriptionCandidates ( PIceAgent  pIceAgent,
PSdpMediaDescription  pSdpMediaDescription,
UINT32  attrBufferLen,
PUINT32  pIndex 
)

Starting from given index, fillout PSdpMediaDescription->sdpAttributes with serialize local candidate strings.

Parameters
-PIceAgent - IN - IceAgent object
-PSdpMediaDescription - IN - PSdpMediaDescription object whose sdpAttributes will be filled with local candidate strings
-UINT32 - IN - buffer length of pSdpMediaDescription->sdpAttributes[index].attributeValue
-PUINT32 - IN - starting index in sdpAttributes
Returns
- STATUS - status of execution
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentReadyStateSetup()

STATUS iceAgentReadyStateSetup ( PIceAgent  pIceAgent)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentReportNewLocalCandidate()

STATUS iceAgentReportNewLocalCandidate ( PIceAgent  pIceAgent,
PIceCandidate  pIceCandidate 
)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentRestart()

STATUS iceAgentRestart ( PIceAgent  pIceAgent,
PCHAR  localIceUfrag,
PCHAR  localIcePwd 
)

Restart IceAgent. IceAgent is reset back to the same state when it was first created. Once iceAgentRestart() return, call iceAgentStartGathering() to start gathering and call iceAgentStartAgent() to give iceAgent the new remote uFrag and uPwd. While Ice is restarting, iceAgentSendPacket can still be called to send data if a connected pair exists.

Parameters
-PIceAgent - IN - IceAgent object
-PCHAR - IN - new local uFrag
-PCHAR - IN - new local uPwd
Returns
- STATUS - status of execution
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentSendCandidateNomination()

STATUS iceAgentSendCandidateNomination ( PIceAgent  pIceAgent)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentSendKeepAliveTimerCallback()

STATUS iceAgentSendKeepAliveTimerCallback ( UINT32  timerId,
UINT64  currentTime,
UINT64  customData 
)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentSendPacket()

STATUS iceAgentSendPacket ( PIceAgent  pIceAgent,
PBYTE  pBuffer,
UINT32  bufferLen 
)

Send data through selected connection. PIceAgent has to be in ICE_AGENT_CONNECTION_STATE_CONNECTED state.

Parameters
-PIceAgent - IN - IceAgent object
-PBYTE - IN - buffer storing the data to be sent
-UINT32 - IN - length of data
Returns
- STATUS - status of execution
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentSendSrflxCandidateRequest()

STATUS iceAgentSendSrflxCandidateRequest ( PIceAgent  pIceAgent)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentSendStunPacket()

STATUS iceAgentSendStunPacket ( PStunPacket  pStunPacket,
PBYTE  password,
UINT32  passwordLen,
PIceAgent  pIceAgent,
PIceCandidate  pLocalCandidate,
PKvsIpAddress  pDestAddr 
)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentShutdown()

STATUS iceAgentShutdown ( PIceAgent  pIceAgent)

Start shutdown sequence for IceAgent. Once the function returns Ice will not deliver anymore data and IceAgent is ready to be freed. User should stop calling iceAgentSendPacket after iceAgentShutdown returns. iceAgentShutdown is idempotent.

Parameters
-PIceAgent - IN - IceAgent object
Returns
- STATUS - status of execution
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentStartAgent()

STATUS iceAgentStartAgent ( PIceAgent  pIceAgent,
PCHAR  remoteUsername,
PCHAR  remotePassword,
BOOL  isControlling 
)

Initiates stun communication with remote candidates.

Parameters
-PIceAgent - IN - IceAgent object
-PCHAR - IN - remote username
-PCHAR - IN - remote password
-BOOL - IN - is controlling agent
Returns
- STATUS - status of execution
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentStartGathering()

STATUS iceAgentStartGathering ( PIceAgent  pIceAgent)

Initiates candidate gathering

Parameters
-PIceAgent - IN - IceAgent object
Returns
- STATUS - status of execution
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentStateTransitionTimerCallback()

STATUS iceAgentStateTransitionTimerCallback ( UINT32  timerId,
UINT64  currentTime,
UINT64  customData 
)

timer queue callbacks are interlocked by time queue lock.

Parameters
timerId- timer queue task id
currentTime
customData- custom data passed to timer queue when task was added
Returns
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceAgentValidateKvsRtcConfig()

STATUS iceAgentValidateKvsRtcConfig ( PKvsRtcConfiguration  pKvsRtcConfiguration)
Here is the caller graph for this function:

◆ iceCandidatePairCheckConnection()

STATUS iceCandidatePairCheckConnection ( PStunPacket  pStunBindingRequest,
PIceAgent  pIceAgent,
PIceCandidatePair  pIceCandidatePair 
)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iceCandidateSerialize()

STATUS iceCandidateSerialize ( PIceCandidate  pIceCandidate,
PCHAR  pOutputData,
PUINT32  pOutputLength 
)

Serialize a candidate for Trickle ICE or exchange via SDP

Parameters
-PIceAgent - IN - IceAgent object
-PCHAR - OUT - Destination buffer
-UINT32 - OUT - Size of destination buffer
Returns
- STATUS - status of execution
Here is the call graph for this function:
Here is the caller graph for this function:

◆ incomingDataHandler()

STATUS incomingDataHandler ( UINT64  customData,
PSocketConnection  pSocketConnection,
PBYTE  pBuffer,
UINT32  bufferLen,
PKvsIpAddress  pSrc,
PKvsIpAddress  pDest 
)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ incomingRelayedDataHandler()

STATUS incomingRelayedDataHandler ( UINT64  customData,
PSocketConnection  pSocketConnection,
PBYTE  pBuffer,
UINT32  bufferLen,
PKvsIpAddress  pSrc,
PKvsIpAddress  pDest 
)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ insertIceCandidatePair()

STATUS insertIceCandidatePair ( PDoubleList  iceCandidatePairs,
PIceCandidatePair  pIceCandidatePair 
)
Here is the caller graph for this function:

◆ pruneUnconnectedIceCandidatePair()

STATUS pruneUnconnectedIceCandidatePair ( PIceAgent  pIceAgent)
Here is the call graph for this function:

◆ turnStateFailedFn()

STATUS turnStateFailedFn ( PSocketConnection  pSocketConnection,
UINT64  data 
)
Here is the caller graph for this function:

◆ updateCandidateAddress()

STATUS updateCandidateAddress ( PIceCandidate  pIceCandidate,
PKvsIpAddress  pIpAddr 
)
Here is the caller graph for this function:

◆ updateCandidateStats()

STATUS updateCandidateStats ( PIceAgent  pIceAgent,
BOOL  isRemote 
)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ updateSelectedLocalRemoteCandidateStats()

STATUS updateSelectedLocalRemoteCandidateStats ( PIceAgent  pIceAgent)
Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ ICE_AGENT_STATE_MACHINE_STATE_COUNT

UINT32 ICE_AGENT_STATE_MACHINE_STATE_COUNT
extern

◆ ICE_AGENT_STATE_MACHINE_STATES

StateMachineState ICE_AGENT_STATE_MACHINE_STATES[]
extern

Static definitions of the states