11#ifndef QKD_KEY_MANAGER_SYSTEM_APPLICATION_H
12#define QKD_KEY_MANAGER_SYSTEM_APPLICATION_H
14#include "ns3/address.h"
15#include "ns3/application.h"
16#include "ns3/event-id.h"
18#include "ns3/data-rate.h"
19#include "ns3/traced-callback.h"
20#include "ns3/random-variable-stream.h"
21#include "ns3/inet-socket-address.h"
22#include "ns3/qkd-graph.h"
23#include "ns3/q-buffer.h"
24#include "ns3/s-buffer.h"
25#include "ns3/qkd-control.h"
26#include "ns3/qkd-encryptor.h"
28#include "ns3/qkd-location-register.h"
29#include "ns3/qkd-location-register-entry.h"
30#include "ns3/qkd-graph-manager.h"
34#include <unordered_map>
49class QKDLocationRegisterEntry;
335 return std::hash<uint32_t>()(
a.GetIpv4().Get());
849 std::vector<std::string>
ReadUri(std::string s);
864 std::string srcSaeId, std::string dstSaeId,
a polymophic address class
The base class for all ns3 applications.
An identifier for simulation events.
The basic class to represent both HTTP requests and responses.
static bool IsMatchingType(const Address &address)
static InetSocketAddress ConvertFrom(const Address &address)
Returns an InetSocketAddress which corresponds to the input Address.
Ipv4 addresses are stored in host order in this class.
Smart pointer class similar to boost::intrusive_ptr.
QKDNetSim implements Key Management System(KMS) as an application that listens on TCP port 80.
void ProcessRegisterResponse(HTTPMessage header, Ptr< Socket > socket)
uint32_t GetMaxKeyPerRequest()
Get maximum number of keys per request(ETSI QKD 014)
uint32_t m_port
Local port to bind to.
void HandlePeerCloseKMSs(Ptr< Socket > socket)
Handle an connection close.
void ProcessFillRequest(HTTPMessage headerIn, std::string resource, Ptr< Socket > socket)
void ProcessFillResponse(HTTPMessage headerIn, Ipv4Address from)
static TypeId GetTypeId()
Get the type ID.
void DataSend(Ptr< Socket >, uint32_t)
Ptr< QKDKMSQueueLogic > m_queueLogic
KMS Queue Logic for ETSI 004 QoS handling.
void SendToSocketPairKMS(Ptr< Socket > socket, Ptr< Packet > packet)
Send packet to the pair socket.
uint32_t m_maxSBufferSizeInBits
RequestType
Request types.
@ ETSI_QKD_014_GET_KEY
Integer equivalent = 1.
@ ETSI_QKD_014_GET_KEY_WITH_KEY_IDS
Integer equivalent = 2.
@ ETSI_QKD_004_OPEN_CONNECT
@ ETSI_QKD_014_GET_STATUS
Integer equivalent = 0.
void HandleAccept(Ptr< Socket > s, const Address &from)
Handle an incoming connection.
void StopApplication() override
Stop KMS Application.
nlohmann::json Check014GetKeyRequest(uint32_t number, uint32_t size, Ptr< SBuffer > buffer)
Validate request and probe ability to fullfil valid request.
std::map< std::string, Association004 > m_associations004
Ptr< Socket > GetSendSocketKMS(Ipv4Address kmsDstAddress)
Obtain send socket.
Ptr< QCenController > m_cen_controller
Asigned Q centralized controler for routing!
std::map< uint32_t, Ipv4Address > m_peerAddressTable
IP address of peer KM nodes.
uint32_t GetTotalRx() const
Get the total amount of bytes received.
void ScheduleReleaseAssociation(Time t, std::string action, std::string ksid, std::string surplusKeyId, uint32_t syncIndex)
void HttpKMSAddQuery(Ipv4Address dstKms, HttpQuery request)
remember HTTP request made to peer KMS
void ProcessRegisterRequest(HTTPMessage header, std::string ksid, Ptr< Socket > socket)
void SetId(UUID id)
Set key manager ID.
Ipv4Address GetDestinationKmsAddress(Ptr< Socket > socket)
std::string PacketToString(Ptr< Packet > packet)
Convert packet to string.
void HandleAcceptKMSs(Ptr< Socket > s, const Address &from)
Handle an incoming connection.
std::vector< Ptr< QBuffer > > m_qbuffersVector
The list of QBuffers is necessary for plotting.
std::map< Ipv4Address, std::pair< Ptr< Socket >, Ptr< Socket > > > m_socketPairsKMS
we do not know which KMS is going to initialize new TCP connection to peer KMS.
uint32_t m_totalRx
Total bytes received.
void ProcessPacketKMSs(HTTPMessage header, Ptr< Packet > packet, Ptr< Socket > socket)
QKD key manager system application process the request peer KMS, and complete certain actions to resp...
void ConnectionSucceeded(Ptr< Socket > socket)
@toDo:following functions
void ProcessRequestKMS(HTTPMessage header, Ptr< Socket > socket)
std::map< Ptr< Socket >, Ptr< Packet > > m_packetQueues
Buffering unsend messages due to connection problems.
nlohmann::json CreateKeyContainer(std::vector< Ptr< QKDKey > > keys)
Create key container data structure described in ETSI014 document.
void StartSBufferClients(uint32_t dstKmNodeId)
Start s-buffers control – monitoring.
std::map< uint32_t, uint32_t > m_link_states
Notified link states!
void SetId(std::string id)
Set key manager ID.
std::string GetAddressString(Ipv4Address address)
Get address as string.
void NewAppRequest(std::string ksid)
Make NEW_APP request to peer KMS.
void HttpKMSCompleteQuery(Ipv4Address dstKms)
remove mapped HTTP response from query
void ProcessPPRequest(HTTPMessage header, Ptr< Packet > packet, Ptr< Socket > socket)
TracedCallback< Ptr< const Packet >, const Address & > m_rxTrace
Traced Callback: received packets, source address.
void ProcessResponseKMS(HTTPMessage header, Ptr< Packet > packet, Ptr< Socket > socket)
void Fill(uint32_t dstKmNodeId, std::string direction, uint32_t amount)
Fill s-buffer.
void SetSocket(std::string type, Ptr< Socket > socket)
Set sink socket.
Ptr< Socket > GetSocket() const
Get sink socket.
static uint32_t nKMS
number of created KMSs - static value
void SetPeerKmAddress(uint32_t dstKmNodeId, Ipv4Address dstKmAddress)
Set peer KM node address.
Ptr< QBuffer > GetQBuffer(uint32_t remoteKmNodeId, std::string type="ns3::QBuffer")
Get q-buffer established with remote key manager.
void HttpProxyRequestAdd(HttpQuery query)
Save query.
void RegisterRequest(std::string ksid)
QKDKeyManagerSystemApplication::RequestType FetchRequestType(std::string s)
Get request type.
HttpQuery GetProxyQuery(std::string reqId)
Get saved query.
std::multimap< std::string, Ptr< Socket > > m_http004App
void SBufferClientCheck(uint32_t dstKmNodeId)
check s-buffer levels
void ProcessCloseRequest(std::string ksid, HTTPMessage header, Ptr< Socket > socket)
void DataSendKMSs(Ptr< Socket >, uint32_t)
void SetCenController(Ptr< QCenController > controller)
Ipv4Address GetAddress()
Get local address.
void HandleReadKMSs(Ptr< Socket > socket)
Handle a packet received by the KMS from KMS.
void HandlePeerError(Ptr< Socket > socket)
Handle an connection error.
std::string GenerateUUID()
Generate UUID.
void SetNode(Ptr< Node > n)
Set node.
Ptr< QCenController > GetCenController()
void ProcessRelayResponse(HTTPMessage headerIn)
Process key relay response.
void HandlePeerClose(Ptr< Socket > socket)
Handle an connection close.
Ipv4Address GetPeerKmAddress(uint32_t dstKmNodeId)
TracedCallback< Ptr< const Packet >, const Address & > m_rxTraceKMSs
Ptr< QKDEncryptor > m_encryptor
std::string GetId()
Get key menager ID.
void RemoveProxyQuery(std::string reqId)
Remove proxy query when processed.
std::map< std::string, uint32_t > m_qkdmodules
QKD modules and KM node ID they connect to.
Ptr< QKDControl > GetController()
Get QKDN controller object.
void PacketReceivedKMSs(const Ptr< Packet > &p, const Address &from, Ptr< Socket > socket)
Assemble byte stream to extract HTTPMessage.
std::map< uint32_t, Ptr< QBuffer > > m_qbuffers
Q-buffers for every QKD connection.
Ptr< SBuffer > GetSBuffer(uint32_t dstKmNodeId, std::string type)
void ProcessSKeyCreateResponse(HTTPMessage header, Ptr< Socket > socket)
process transform response
void ProcessGetKey004Request(std::string ksid, HTTPMessage header, Ptr< Socket > socket)
uint32_t m_minSBufferSizeInBits
std::unordered_map< std::string, HttpQuery > m_httpProxyRequests
TracedCallback< const uint32_t &, const uint32_t &, const uint32_t &, const uint32_t & > m_keyConsumedRelay
void ProcessOpenConnectRequest(HTTPMessage header, Ptr< Socket > socket)
void ProcessNewAppResponse(HTTPMessage header, Ptr< Socket > socket)
Ptr< Socket > GetSocketFromHttp004AppQuery(std::string saeId)
Ptr< Node > GetNode()
Get node.
void CreateQBuffer(uint32_t dstId, Ptr< QBuffer > bufferConf)
Create Q buffer shared with remote key manager node.
void SetAddress(Ipv4Address address)
Set local address.
void Relay(uint32_t dstKmNodeId, uint32_t amount)
Start key relay function.
void ProcessKMSCloseRequest(HTTPMessage header, Ptr< Socket > socket, std::string ksid)
process close request from peer KMS
RequestType HttpQueryMethod(Ipv4Address dstKms)
obtain method_type to map the HTTP response
uint32_t m_thrSBufferSizeInBits
void ProcessRelayRequest(HTTPMessage headerIn, Ptr< Socket > socket)
Process key relay request.
uint32_t m_maxKeyPerRequest
void ProcessKMSCloseResponse(HTTPMessage header, Ptr< Socket > socket)
process close response from peer KMS
TracedCallback< const std::string &, const std::string &, const uint32_t & > m_keyServedTrace
void DoDispose() override
Destructor implementation.
void AddKeyToAssociationDedicatedStore(std::string ksid, Ptr< QKDKey > key)
Add key to dedicated key store corresponding to association identified with KSID.
uint32_t GetPort() const
Get local port.
void HandlePeerErrorKMSs(Ptr< Socket > socket)
Handle an connection error.
std::string CreateKeyStreamSession(std::string srcSaeId, std::string dstSaeId, QKDKeyManagerSystemApplication::QoS inQos, std::string ksid)
Create a new assocation.
void UpdateLinkState(uint32_t dstKmNodeId)
Check the QKD link state to given destination.
std::map< uint32_t, Ptr< SBuffer > > m_keys_dec
LOCAL S-buffers for the inbound point-to-poit usage.
void SetController(Ptr< QKDControl > controller)
Assign QKDN controller.
~QKDKeyManagerSystemApplication() override
QKDKeyManagerSystemApplication destructor.
void SendToSocketPair(Ptr< Socket > socket, Ptr< Packet > packet)
Send packet to the pair socket.
void Http004AppQuery(std::string saeId, Ptr< Socket > socket)
std::vector< std::string > ReadUri(std::string s)
Read parameters from URI.
Ptr< SBuffer > CreateRelaySBuffer(uint32_t srcNodeId, uint32_t dstNodeId, std::string description)
Help function to create relay SBuffers.
Ptr< Socket > m_sinkSocket
uint32_t m_totalRxKMSs
Total bytes received between KMSs.
void StartApplication() override
Start KMS Application.
void HandleRead(Ptr< Socket > socket)
Handle a packet received by the KMS application.
TracedCallback< const uint32_t &, const uint32_t &, const uint32_t & > m_keyWasteRelay
void SetPort(uint32_t port)
Set local port.
void ProcessSKeyCreateRequest(HTTPMessage header, Ptr< Socket > socket)
process transform request
std::map< std::string, EventId > m_scheduledChecks
void ReadJsonQos(QKDKeyManagerSystemApplication::QoS &inQos, nlohmann::json jOpenConnectRequest)
Read the parameters from the JSON OPEN_CONNECT structure!
std::unordered_map< Address, Ptr< Packet >, AddressHash > m_bufferKMS
Buffer for received packets(TCP segmentation)
Ptr< QKDControl > m_controller
Asigned QKDN controller.
std::map< uint32_t, Ptr< SBuffer > > m_keys_enc
LOCAL S-buffers for the outbound point-to-point usage.
TracedCallback< const std::string &, const std::string &, const uint32_t & > m_qkdKeyGeneratedTrace
TracedCallback< const uint32_t &, const uint32_t &, const uint32_t & > m_keyConsumedLink
void ProcessNewAppRequest(HTTPMessage header, Ptr< Socket > socket)
void EstablishKMLinkSockets(Ipv4Address remoteKmAddress)
Create sink socket to listen requests exchanged between KMSs.
void Http004AppQueryComplete(std::string saeId)
void RegisterQKDModule(uint32_t dstId, std::string moduleId)
Registers a QKD module in key manager.
std::map< Ipv4Address, std::vector< HttpQuery > > m_httpRequestsQueryKMS
void PacketReceived(const Ptr< Packet > &p, const Address &from, Ptr< Socket > socket)
Assemble byte stream to extract HTTPMessage.
TracedCallback< Ptr< const Packet > > m_txTraceKMSs
void ReleaseAssociation(std::string ksid, std::string surplusKeyId, uint32_t syncIndex)
release key stream association
void ConnectionFailedKMSs(Ptr< Socket > socket)
std::vector< Ptr< QBuffer > > GetQBuffersVector()
Get all QBuffers created on the KMS.
void ConnectionFailed(Ptr< Socket > socket)
EventId m_closeSocketEvent
void ProcessRequest(HTTPMessage header, Ptr< Packet > packet, Ptr< Socket > socket)
QKD key manager system application process the request from QKDApp, and complete certain actions to r...
void ScheduleCheckEtsi004Association(Time t, std::string action, std::string ksid)
schedule next event in an attempt to fill association buffer
TracedCallback< Ptr< const Packet > > m_txTrace
std::string GenerateRandomString(const int len, const uint32_t seed=0)
Generate random string with given length.
void ConnectionSucceededKMSs(Ptr< Socket > socket)
std::unordered_map< Address, Ptr< Packet >, AddressHash > m_buffer
Buffer for received packets(TCP segmentation)
void CheckEtsi004Association(std::string ksid)
Check the state of a single assocation.
void CheckSocketsKMS(Ipv4Address dstSaeId)
Prepare send socket to communicate with peer KMS Application.
QKDKeyManagerSystemApplication()
QKDKeyManagerSystemApplication constructor.
Ipv4Address m_local
Local address to bind to.
Simulation virtual time values and global simulation resolution.
Forward calls to a chain of Callback.
a unique identifier for an interface.
Universally unique identifier(UUID)
#define NS_ABORT_IF(cond)
Abnormal program termination if a condition is true.
Ptr< T > Create(Ts &&... args)
Create class instances by constructors with varying numbers of arguments and return them by Ptr.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Hashing for the Address class.
size_t operator()(const Address &x) const
operator()
Ptr< SBuffer > stre_buffer
std::string destination_sae
Ipv4Address prev_hop_address
std::string surplus_key_ID
std::vector< std::string > keyIds