blob: 0399f9989560683b1c809858c8570daa0a76a1b8 [file] [log] [blame]
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* Copyright 2014-2018 (c) Fraunhofer IOSB (Author: Julius Pfrommer)
* Copyright 2014, 2017 (c) Florian Palm
* Copyright 2015-2016 (c) Sten GrĂ¼ner
* Copyright 2015 (c) Chris Iatrou
* Copyright 2015-2016 (c) Oleksiy Vasylyev
* Copyright 2016-2017 (c) Stefan Profanter, fortiss GmbH
* Copyright 2017 (c) Julian Grothoff
*/
#ifndef UA_DISCOVERY_MANAGER_H_
#define UA_DISCOVERY_MANAGER_H_
#include <open62541/server.h>
#include "open62541_queue.h"
_UA_BEGIN_DECLS
#ifdef UA_ENABLE_DISCOVERY
typedef struct registeredServer_list_entry {
#if UA_MULTITHREADING >= 200
UA_DelayedCallback delayedCleanup;
#endif
LIST_ENTRY(registeredServer_list_entry) pointers;
UA_RegisteredServer registeredServer;
UA_DateTime lastSeen;
} registeredServer_list_entry;
struct PeriodicServerRegisterCallback {
UA_UInt64 id;
UA_Double this_interval;
UA_Double default_interval;
UA_Boolean registered;
struct UA_Client* client;
char* discovery_server_url;
};
typedef struct periodicServerRegisterCallback_entry {
#if UA_MULTITHREADING >= 200
UA_DelayedCallback delayedCleanup;
#endif
LIST_ENTRY(periodicServerRegisterCallback_entry) pointers;
struct PeriodicServerRegisterCallback *callback;
} periodicServerRegisterCallback_entry;
#ifdef UA_ENABLE_DISCOVERY_MULTICAST
#include "mdnsd/libmdnsd/mdnsd.h"
/**
* TXT record:
* [servername]-[hostname]._opcua-tcp._tcp.local. TXT path=/ caps=NA,DA,...
*
* A/AAAA record for all ip addresses:
* [servername]-[hostname]._opcua-tcp._tcp.local. A [ip].
* [hostname]. A [ip].
*/
typedef struct serverOnNetwork_list_entry {
#if UA_MULTITHREADING >= 200
UA_DelayedCallback delayedCleanup;
#endif
LIST_ENTRY(serverOnNetwork_list_entry) pointers;
UA_ServerOnNetwork serverOnNetwork;
UA_DateTime created;
UA_DateTime lastSeen;
UA_Boolean txtSet;
UA_Boolean srvSet;
char* pathTmp;
} serverOnNetwork_list_entry;
#define SERVER_ON_NETWORK_HASH_PRIME 1009
typedef struct serverOnNetwork_hash_entry {
serverOnNetwork_list_entry* entry;
struct serverOnNetwork_hash_entry* next;
} serverOnNetwork_hash_entry;
#endif
typedef struct {
LIST_HEAD(, periodicServerRegisterCallback_entry) periodicServerRegisterCallbacks;
LIST_HEAD(, registeredServer_list_entry) registeredServers;
size_t registeredServersSize;
UA_Server_registerServerCallback registerServerCallback;
void* registerServerCallbackData;
# ifdef UA_ENABLE_DISCOVERY_MULTICAST
mdns_daemon_t *mdnsDaemon;
UA_SOCKET mdnsSocket;
UA_Boolean mdnsMainSrvAdded;
LIST_HEAD(, serverOnNetwork_list_entry) serverOnNetwork;
size_t serverOnNetworkSize;
UA_UInt32 serverOnNetworkRecordIdCounter;
UA_DateTime serverOnNetworkRecordIdLastReset;
/* hash mapping domain name to serverOnNetwork list entry */
struct serverOnNetwork_hash_entry* serverOnNetworkHash[SERVER_ON_NETWORK_HASH_PRIME];
UA_Server_serverOnNetworkCallback serverOnNetworkCallback;
void* serverOnNetworkCallbackData;
#if UA_MULTITHREADING >= 200
pthread_t mdnsThread;
UA_Boolean mdnsRunning;
# endif
# endif /* UA_ENABLE_DISCOVERY_MULTICAST */
} UA_DiscoveryManager;
void UA_DiscoveryManager_init(UA_DiscoveryManager *dm, UA_Server *server);
void UA_DiscoveryManager_deleteMembers(UA_DiscoveryManager *dm, UA_Server *server);
/* Checks if a registration timed out and removes that registration.
* Should be called periodically in main loop */
void UA_Discovery_cleanupTimedOut(UA_Server *server, UA_DateTime nowMonotonic);
#ifdef UA_ENABLE_DISCOVERY_MULTICAST
void
UA_Server_updateMdnsForDiscoveryUrl(UA_Server *server, const UA_String *serverName,
const UA_MdnsDiscoveryConfiguration *mdnsConfig,
const UA_String *discoveryUrl,
UA_Boolean isOnline, UA_Boolean updateTxt);
void mdns_record_received(const struct resource *r, void *data);
void mdns_create_txt(UA_Server *server, const char *fullServiceDomain,
const char *path, const UA_String *capabilites,
const size_t capabilitiesSize,
void (*conflict)(char *host, int type, void *arg));
void mdns_set_address_record(UA_Server *server,
const char *fullServiceDomain,
const char *localDomain);
mdns_record_t *
mdns_find_record(mdns_daemon_t *mdnsDaemon, unsigned short type,
const char *host, const char *rdname);
void startMulticastDiscoveryServer(UA_Server *server);
void stopMulticastDiscoveryServer(UA_Server *server);
UA_StatusCode
iterateMulticastDiscoveryServer(UA_Server* server, UA_DateTime *nextRepeat,
UA_Boolean processIn);
typedef enum {
UA_DISCOVERY_TCP, /* OPC UA TCP mapping */
UA_DISCOVERY_TLS /* OPC UA HTTPS mapping */
} UA_DiscoveryProtocol;
/* Send a multicast probe to find any other OPC UA server on the network through mDNS. */
UA_StatusCode
UA_Discovery_multicastQuery(UA_Server* server);
UA_StatusCode
UA_Discovery_addRecord(UA_Server *server, const UA_String *servername,
const UA_String *hostname, UA_UInt16 port,
const UA_String *path, const UA_DiscoveryProtocol protocol,
UA_Boolean createTxt, const UA_String* capabilites,
const size_t capabilitiesSize);
UA_StatusCode
UA_Discovery_removeRecord(UA_Server *server, const UA_String *servername,
const UA_String *hostname, UA_UInt16 port,
UA_Boolean removeTxt);
#endif /* UA_ENABLE_DISCOVERY_MULTICAST */
#endif /* UA_ENABLE_DISCOVERY */
_UA_END_DECLS
#endif /* UA_DISCOVERY_MANAGER_H_ */