You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
285 lines
8.6 KiB
C
285 lines
8.6 KiB
C
/*
|
|
* iso_connection_parameters.h
|
|
*
|
|
* Copyright 2013-2018 Michael Zillgith
|
|
*
|
|
* This file is part of libIEC61850.
|
|
*
|
|
* libIEC61850 is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* libIEC61850 is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with libIEC61850. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* See COPYING file for the complete license text.
|
|
*/
|
|
|
|
#ifndef ISO_CONNECTION_PARAMETERS_H_
|
|
#define ISO_CONNECTION_PARAMETERS_H_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include "tls_config.h"
|
|
|
|
/**
|
|
* \addtogroup mms_client_api_group
|
|
*/
|
|
/**@{*/
|
|
|
|
|
|
/**
|
|
* \brief authentication mechanism used by AcseAuthenticator
|
|
*/
|
|
typedef enum
|
|
{
|
|
/** Neither ACSE nor TLS authentication used */
|
|
ACSE_AUTH_NONE = 0,
|
|
|
|
/** Use ACSE password for client authentication */
|
|
ACSE_AUTH_PASSWORD = 1,
|
|
|
|
/** Use ACSE certificate for client authentication */
|
|
ACSE_AUTH_CERTIFICATE = 2,
|
|
|
|
/** Use TLS certificate for client authentication */
|
|
ACSE_AUTH_TLS = 3
|
|
} AcseAuthenticationMechanism;
|
|
|
|
|
|
typedef struct sAcseAuthenticationParameter* AcseAuthenticationParameter;
|
|
|
|
struct sAcseAuthenticationParameter
|
|
{
|
|
AcseAuthenticationMechanism mechanism;
|
|
|
|
union
|
|
{
|
|
struct
|
|
{
|
|
uint8_t* octetString;
|
|
int passwordLength;
|
|
} password; /* for mechanism = ACSE_AUTH_PASSWORD */
|
|
|
|
struct
|
|
{
|
|
uint8_t* buf;
|
|
int length;
|
|
} certificate; /* for mechanism = ACSE_AUTH_CERTIFICATE or ACSE_AUTH_TLS */
|
|
|
|
} value;
|
|
};
|
|
|
|
LIB61850_API AcseAuthenticationParameter
|
|
AcseAuthenticationParameter_create(void);
|
|
|
|
LIB61850_API void
|
|
AcseAuthenticationParameter_destroy(AcseAuthenticationParameter self);
|
|
|
|
LIB61850_API void
|
|
AcseAuthenticationParameter_setAuthMechanism(AcseAuthenticationParameter self, AcseAuthenticationMechanism mechanism);
|
|
|
|
LIB61850_API void
|
|
AcseAuthenticationParameter_setPassword(AcseAuthenticationParameter self, char* password);
|
|
|
|
|
|
/**
|
|
* \brief Callback function to authenticate a client
|
|
*
|
|
* \param parameter user provided parameter - set when user registers the authenticator
|
|
* \param authParameter the authentication parameters provided by the client
|
|
* \param securityToken pointer where to store an application specific security token - can be ignored if not used.
|
|
* \param appReference ISO application reference (ap-title + ae-qualifier)
|
|
*
|
|
* \return true if client connection is accepted, false otherwise
|
|
*/
|
|
typedef bool
|
|
(*AcseAuthenticator)(void* parameter, AcseAuthenticationParameter authParameter, void** securityToken, IsoApplicationReference* appReference);
|
|
|
|
/**
|
|
* \brief COTP T selector
|
|
*
|
|
* To not use T SEL set size to 0.
|
|
*/
|
|
typedef struct {
|
|
uint8_t size; /** 0 .. 4 - 0 means T-selector is not present */
|
|
uint8_t value[4]; /** T-selector value */
|
|
} TSelector;
|
|
|
|
/**
|
|
* \brief OSI session selector
|
|
*
|
|
* To not use S SEL set size to 0
|
|
*/
|
|
typedef struct {
|
|
uint8_t size; /** 0 .. 16 - 0 means S-selector is not present */
|
|
uint8_t value[16]; /** S-selector value */
|
|
} SSelector;
|
|
|
|
/**
|
|
* \brief OSI presentation (P) selector
|
|
*
|
|
* To not use P SEL set size to 0
|
|
*/
|
|
typedef struct {
|
|
uint8_t size; /** 0 .. 16 - 0 means P-selector is not present */
|
|
uint8_t value[16]; /** P-selector value */
|
|
} PSelector;
|
|
|
|
struct sIsoConnectionParameters
|
|
{
|
|
AcseAuthenticationParameter acseAuthParameter;
|
|
|
|
#if (CONFIG_MMS_SUPPORT_TLS == 1)
|
|
TLSConfiguration tlsConfiguration;
|
|
#endif
|
|
|
|
const char* hostname;
|
|
int tcpPort;
|
|
|
|
uint8_t remoteApTitle[10];
|
|
int remoteApTitleLen;
|
|
int remoteAEQualifier;
|
|
PSelector remotePSelector;
|
|
SSelector remoteSSelector;
|
|
TSelector remoteTSelector;
|
|
|
|
|
|
uint8_t localApTitle[10];
|
|
int localApTitleLen;
|
|
int localAEQualifier;
|
|
PSelector localPSelector;
|
|
SSelector localSSelector;
|
|
TSelector localTSelector;
|
|
|
|
};
|
|
|
|
typedef struct sIsoConnectionParameters* IsoConnectionParameters;
|
|
|
|
/**
|
|
* \brief create a new IsoConnectionParameters instance (FOR LIBRARY INTERNAL USE)
|
|
*
|
|
* NOTE: This function used internally by the MMS client library. When using the MMS or IEC 61850 API
|
|
* there should be no reason for the user to call this function.
|
|
*
|
|
* \return new IsoConnectionParameters instance
|
|
*/
|
|
LIB61850_API IsoConnectionParameters
|
|
IsoConnectionParameters_create(void);
|
|
|
|
/**
|
|
* \brief Destroy an IsoConnectionParameters instance (FOR LIBRARY INTERNAL USE)
|
|
*
|
|
* NOTE: This function used internally by the MMS client library. When using the MMS or IEC 61850 API
|
|
* there should be no reason for the user to call this function.
|
|
*
|
|
* \param self the IsoConnectionParameters instance
|
|
*/
|
|
LIB61850_API void
|
|
IsoConnectionParameters_destroy(IsoConnectionParameters self);
|
|
|
|
|
|
LIB61850_API void
|
|
IsoConnectionParameters_setTlsConfiguration(IsoConnectionParameters self, TLSConfiguration tlsConfig);
|
|
|
|
/**
|
|
* \brief set the authentication parameter
|
|
*
|
|
* This will set the authentication parameter and activates authentication.
|
|
*
|
|
* \param self the IsoConnectionParameters instance
|
|
* \param acseAuthParameter
|
|
*/
|
|
LIB61850_API void
|
|
IsoConnectionParameters_setAcseAuthenticationParameter(IsoConnectionParameters self,
|
|
AcseAuthenticationParameter acseAuthParameter);
|
|
|
|
/**
|
|
* \brief Set TCP parameters (FOR LIBRARY INTERNAL USE)
|
|
*
|
|
* NOTE: This function used internally by the MMS client library. When using the MMS or IEC 61850 API
|
|
* there should be no reason for the user to call this function
|
|
*
|
|
* \param self the IsoConnectionParameters instance
|
|
* \param hostname the hostname of IP address if the server
|
|
* \param tcpPort the TCP port number of the server
|
|
*/
|
|
LIB61850_API void
|
|
IsoConnectionParameters_setTcpParameters(IsoConnectionParameters self, const char* hostname, int tcpPort);
|
|
|
|
/**
|
|
* \brief set the remote AP-Title and AE-Qualifier
|
|
*
|
|
* Calling this function is optional and not recommended. If not called the default
|
|
* parameters are used.
|
|
* If apTitle is NULL the parameter the AP-Title and AE-Qualifier will not be transmitted.
|
|
* This seems to be required by some server devices.
|
|
*
|
|
* \param self the IsoConnectionParameters instance
|
|
* \param apTitle the AP-Title OID as string.
|
|
* \param aeQualifier the AP-qualifier
|
|
*/
|
|
LIB61850_API void
|
|
IsoConnectionParameters_setRemoteApTitle(IsoConnectionParameters self, const char* apTitle, int aeQualifier);
|
|
|
|
/**
|
|
* \brief set remote addresses for the lower layers
|
|
*
|
|
* This function can be used to set the addresses for the lower layer protocols (presentation, session, and transport
|
|
* layer). Calling this function is optional and not recommended. If not called the default
|
|
* parameters are used.
|
|
*
|
|
* \param self the IsoConnectionParameters instance
|
|
* \param pSelector the P-Selector (presentation layer address)
|
|
* \param sSelector the S-Selector (session layer address)
|
|
* \param tSelector the T-Selector (ISO transport layer address)
|
|
*/
|
|
LIB61850_API void
|
|
IsoConnectionParameters_setRemoteAddresses(IsoConnectionParameters self, PSelector pSelector, SSelector sSelector, TSelector tSelector);
|
|
|
|
/**
|
|
* \brief set the local AP-Title and AE-Qualifier
|
|
*
|
|
* Calling this function is optional and not recommended. If not called the default
|
|
* parameters are used.
|
|
* If apTitle is NULL the parameter the AP-Title and AE-Qualifier will not be transmitted.
|
|
* This seems to be required by some server devices.
|
|
*
|
|
* \param self the IsoConnectionParameters instance
|
|
* \param apTitle the AP-Title OID as string.
|
|
* \param aeQualifier the AP-qualifier
|
|
*/
|
|
LIB61850_API void
|
|
IsoConnectionParameters_setLocalApTitle(IsoConnectionParameters self, const char* apTitle, int aeQualifier);
|
|
|
|
/**
|
|
* \brief set local addresses for the lower layers
|
|
*
|
|
* This function can be used to set the addresses for the lower layer protocols (presentation, session, and transport
|
|
* layer). Calling this function is optional and not recommended. If not called the default
|
|
* parameters are used.
|
|
*
|
|
* \param self the IsoConnectionParameters instance
|
|
* \param pSelector the P-Selector (presentation layer address)
|
|
* \param sSelector the S-Selector (session layer address)
|
|
* \param tSelector the T-Selector (ISO transport layer address)
|
|
*/
|
|
LIB61850_API void
|
|
IsoConnectionParameters_setLocalAddresses(IsoConnectionParameters self, PSelector pSelector, SSelector sSelector, TSelector tSelector);
|
|
|
|
/**@}*/
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ISO_CONNECTION_PARAMETERS_H_ */
|