12#include "ns3/address.h"
13#include "ns3/address-utils.h"
15#include "ns3/inet-socket-address.h"
16#include "ns3/inet6-socket-address.h"
18#include "ns3/socket.h"
19#include "ns3/udp-socket-factory.h"
20#include "ns3/tcp-socket-factory.h"
21#include "ns3/simulator.h"
22#include "ns3/socket-factory.h"
23#include "ns3/packet.h"
24#include "ns3/trace-source-accessor.h"
38 .SetGroupName(
"Applications")
40 .AddAttribute(
"Protocol",
"The type of protocol to use.",
44 .AddAttribute(
"LengthOfAuthenticationTag",
45 "The default length of the authentication tag",
49 .AddAttribute(
"EncryptionType",
50 "The type of encryption to be used(0-unencrypted, 1-OTP, 2-AES)",
54 .AddAttribute(
"AuthenticationType",
55 "The type of authentication to be used(0-unauthenticated, 1-VMAC, 2-MD5, 3-SHA1)",
59 .AddAttribute(
"AESLifetime",
60 "Lifetime of AES key expressed in number of packets",
64 .AddAttribute(
"UseCrypto",
65 "Should crypto functions be performed(0-No, 1-Yes)",
69 .AddAttribute(
"LengthOfKeyBufferForEncryption",
70 "How many keys to store in local buffer of QKDApp004 for encryption?",
74 .AddAttribute(
"LengthOfKeyBufferForAuthentication",
75 "How many keys to store in local buffer of QKDApp004 for authentication?",
79 .AddAttribute(
"SocketToKMSHoldTime",
"How long(seconds) should QKDApp004 wait to close socket to KMS after receiving REST response?",
84 .AddTraceSource(
"Tx",
"A new packet is created and is sent",
86 "ns3::Packet::TracedCallback")
87 .AddTraceSource(
"TxSig",
"A new signaling packet is created and is sent",
89 "ns3::Packet::TracedCallback")
90 .AddTraceSource(
"TxKMS",
"A new packet is created and is sent to local KMS",
92 "ns3::Packet::TracedCallback")
93 .AddTraceSource(
"Rx",
"A new packet is received",
95 "ns3::Packet::TracedCallback")
96 .AddTraceSource(
"RxSig",
"A new signaling packet is received",
98 "ns3::Packet::TracedCallback")
99 .AddTraceSource(
"RxKMS",
"A new packet is received from local KMS",
101 "ns3::Packet::TracedCallback")
102 .AddTraceSource(
"StateTransition",
103 "Trace fired upon every QKDApp state transition.",
105 "ns3::Application::StateTransitionCallback")
106 .AddTraceSource(
"PacketEncrypted",
107 "The change trance for currenly ecrypted packet",
109 "ns3::QKDCrypto::PacketEncrypted")
110 .AddTraceSource(
"PacketDecrypted",
111 "The change trance for currenly decrypted packet",
113 "ns3::QKDCrypto::PacketDecrypted")
114 .AddTraceSource(
"PacketAuthenticated",
115 "The change trance for currenly authenticated packet",
117 "ns3::QKDCrypto::PacketAuthenticated")
118 .AddTraceSource(
"PacketDeAuthenticated",
119 "The change trance for currenly deauthenticated packet",
121 "ns3::QKDCrypto::PacketDeAuthenticated")
122 .AddTraceSource(
"Mx",
"Missed send packet call",
124 "ns3::Packet::TracedCallback")
142 : m_signalingSocketApp(nullptr),
143 m_dataSocketApp(nullptr),
144 m_socketToKMS(nullptr),
654 while((packet = socket->RecvFrom(from))){
655 if(packet->GetSize() == 0)
659 << packet <<
"PACKETID: " << packet->GetUid()
660 <<
" of size: " << packet->GetSize()
665 <<
"s packet from KMS received "
666 << packet->GetSize() <<
" bytes from "
719 while (buffer->GetSize() > 0) {
721 std::string
bufferStr(buffer->GetSize(),
'\0');
728 NS_LOG_DEBUG(
"[DEBUG] Fragmented or incomplete HTTP message. Awaiting more data.");
737 NS_LOG_DEBUG(
"[DEBUG] Detected fragmented or invalid HTTP message. Waiting for more data...");
748 NS_LOG_DEBUG(
"[DEBUG] Processed HTTP message, UID: " << p->GetUid());
749 NS_LOG_DEBUG(
"[DEBUG] Remaining buffer size: " << buffer->GetSize());
760 while((packet = socket->RecvFrom(from))){
761 if(packet->GetSize() == 0)
765 <<
"PACKETID: " << packet->GetUid()
766 <<
" of size: " << packet->GetSize()
770 <<
"s packet from APP pair received "
771 << packet->GetSize() <<
" bytes from "
797 buffer->PeekHeader(header);
800 while(buffer->GetSize() >= header.
GetLength())
802 NS_LOG_DEBUG(
"Removing packet of size " << header.
GetLength() <<
" from buffer of size " << buffer->GetSize());
812 buffer->PeekHeader(header);
828 while((packet = socket->RecvFrom(from))){
829 if(packet->GetSize() == 0)
833 <<
"PACKETID: " << packet->GetUid()
834 <<
" of size: " << packet->GetSize()
838 <<
"s signaling packet from APP pair received "
839 << packet->GetSize() <<
" bytes from "
861 if (buffer->GetSize() == 0)
865 std::string
payload(buffer->GetSize(),
'\0');
866 buffer->CopyData(
reinterpret_cast<uint8_t*
>(&
payload[0]), buffer->GetSize());
871 buffer->GetSize() <
request.GetSize() ||
872 request.GetStatusMessage() ==
"Undefined")
874 NS_LOG_FUNCTION(
this <<
"Incomplete/fragmented HTTP message, waiting for more data.");
885 NS_LOG_DEBUG(
"Remaining in buffer: " << buffer->GetSize());
1013 <<
"allowed values are(0-unencrypted, 1-OTP, 2-AES)");
1016 <<
"allowed values are(0-unauthenticated, 1-VMAC, 3-SHA2)");
1019 <<
"the value must be positive");
1022 <<
"the value must be larger than packet size " <<
m_packetSize);
1058 else NS_LOG_WARN(
"QKDApp004 found null m_socketToKMS to close in StopApplication");
1063 else NS_LOG_WARN(
"QKDApp004 found null m_dataSocketApp to close in StopApplication");
1066 else NS_LOG_WARN(
"QKDApp004 found null m_signalingSocketApp to close in StopApplication");
1069 else NS_LOG_WARN(
"QKDApp004 found null m_socketToKMS to close in StopApplication");
1107 if(
encKey->GetLifetime() == 0)
1112 <<
"\nEncryption key ID:\t\t" <<
encKey->GetIndex() <<
encKey->GetKeyString()
1120 NS_LOG_ERROR(
this <<
"no autentication key available");
1129 <<
"\nAuthentication tag:\t\t" <<
authTag);
1150 qHeader.SetLength(packet->GetSize() +
qHeader.GetSerializedSize());
1159 NS_LOG_FUNCTION(
this <<
"packet sent" << packet->GetUid() << packet->GetSize());
1218 NS_LOG_DEBUG(
this <<
"authentication failed -> packet is dropped");
1235 }
else if(
encKey->GetLifetime() == 0)
1295 {
"Source",
GetId()},
1300 msgBody[
"Key_stream_ID"] = ksid;
1342 nlohmann::json
msgBody {{
"Key_stream_ID", ksid}};
1535 NS_LOG_DEBUG(
this <<
"unexpected get_key error on receiver App004");
1550 std::string ksid {};
1564 if(method ==
"send_ksid"){
1570 NS_ASSERT(!ksid.empty() || !scope.empty());
1576 }
else if(scope ==
"auth"){
1590 }
else if(method ==
"establish_queues"){
1602 if(method ==
"send_ksid")
1610 NS_ASSERT(!ksid.empty() || !scope.empty());
1617 else if(scope ==
"auth"){
1627 }
else if(method ==
"establish_queues"){
1663 {
"Content-Type",
"application/json; charset=utf-8"},
1679 NS_LOG_FUNCTION(
this <<
"Request sent" << packet->GetUid() << packet->GetSize() << httpMessage.
GetUri());
1697 {
"Content-Type",
"application/json; charset=utf-8"},
1698 {
"Request URI",
"http://" +
IpToString(
GetIp() ) +
"/api/v1/" +
GetId() +
"/establish_queues"}
1713 NS_LOG_FUNCTION(
this <<
"Request sent" << packet->GetUid() << packet->GetSize() << httpMessage.
GetUri());
1776 "for AppTransitionTree()");
1789 "for AppTransitionTree()");
1807 return "NOT_STARTED";
1810 return "INITIALIZED";
1813 return "ESTABLISHING_ASSOCIATIONS";
1816 return "ASSOCIATIONS_ESTABLISHED";
1819 return "ESTABLISHING_KEY_QUEUES";
1822 return "KEY_QUEUES_ESTABLISHED";
1834 return "DECRYPT_DATA";
1841 return "FATAL_ERROR";
1942 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
1943 "abcdefghijklmnopqrstuvwxyz";
1963 return CryptoPP::AES::MAX_KEYLENGTH * 8;
1977 return CryptoPP::AES::DEFAULT_KEYLENGTH * 8;
2024 uint8_t *buffer =
new uint8_t[packet->GetSize()];
2025 packet->CopyData(buffer, packet->GetSize());
2026 std::string
payload = std::string((
char*)buffer, packet->GetSize());
2032std::vector<std::string>
2040 while((pos = s.find(
delimiter)) != std::string::npos){
2041 token = s.substr(0, pos);
a polymophic address class
The base class for all ns3 applications.
void DoDispose() override
Destructor implementation.
Ptr< Node > GetNode() const
Class for representing data rates.
uint64_t GetBitRate() const
Get the underlying bitrate.
An identifier for simulation events.
bool IsPending() const
This method is syntactic sugar for !IsExpired().
The basic class to represent both HTTP requests and responses.
std::string GetRequestUri() const
std::string ToString()
Takes the headers added to the message along with the body and outputs it to a std::string for use in...
std::string GetUri() const
Grab the uri.
void CreateRequest(const std::string &url, const std::string &method)
std::string GetMessageBodyString()
HTTPMessage & SetHeader(const std::string &name, const std::string &value)
Set a header in the map to the value provided.
void CreateResponse(const HttpStatus status)
HTTPMessage::HttpStatus GetStatus() const
To be returned with a status code in a response is a status text describing the status code by text r...
A basic class to parse a HTTP message, both request and response.
static bool IsMatchingType(const Address &address)
Ipv4Address GetIpv4() const
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.
bool TraceConnectWithoutContext(std::string name, const CallbackBase &cb)
Connect a TraceSource to a Callback without a context.
Smart pointer class similar to boost::intrusive_ptr.
Establish secure communication on application lavel to use the key and test LKSM.
void HandlePeerErrorFromKMS(Ptr< Socket > socket)
Handle a connection error from KMS.
void PushHttpKmsRequest(std::string uri, KeyStreamSession::Type sessionType=KeyStreamSession::ENCRYPTION)
Add HTTP request to queue to map response later.
void HandlePeerCloseFromApp(Ptr< Socket > socket)
Handle a connection close from peer QKD application.
std::multimap< std::string, KeyStreamSession::Type > m_httpRequestsKMS
void HandleReadFromApp(Ptr< Socket > socket)
Handle a packet received by the QKD application from peer QKD application.
State GetState() const
Returns the current state of the application.
TracedCallback< Ptr< Packet >, std::string > m_deauthenticationTrace
trace callback for authentication check
void ConnectionToKMSSucceeded(Ptr< Socket > socket)
Callback function after the connection to the KMS is complete.
std::string GetAppStateString() const
Returns the current state of the application in string format.
Ipv4Address GetIp()
Get application Ipv4 address.
Ptr< Socket > m_dataSocketApp
void SendKsid(std::string ksid, KeyStreamSession::Type sessionType, HTTPMessage::HttpStatus statusCode=HTTPMessage::Ok)
Sends SEND_KSID request(for sender App004) or response(for receiver App004)
void ConnectionToKMSFailed(Ptr< Socket > socket)
Callback function after the connection to the KMS has failed.
void HandleAcceptFromKMS(Ptr< Socket > s, const Address &from)
Handle an incoming connection from KMS.
void OpenConnect(std::string ksid, KeyStreamSession::Type sessionType)
QKDApp reserves an association(Key_stream_ID)
std::vector< std::string > ReadUri(std::string s)
void RegisterAckTime(Time oldRtt, Time newRtt)
Ptr< Socket > m_socketToKMS
bool m_isSignalingConnectedToApp
uint32_t m_keyBufferLengthEncryption
TracedCallback< const std::string &, Ptr< const Packet > > m_rxSigTrace
Traced Callback: received signaling packets.
Ptr< Socket > m_signalingSocketApp
void ProcessSignalingPacketFromApp(HTTPMessage &header, Ptr< Socket > socket)
Process signaling packets from peer QKD application.
void ProcessOpenConnectResponse(HTTPMessage &header)
Process response from KMS on OPEN_CONNECT call.
void ProcessGetKeyResponse(HTTPMessage &header)
Process Get Key response from KMS.
TracedCallback< Ptr< Packet >, std::string > m_authenticationTrace
trace callback for authentication
bool ConnectionRequestedSignalingFromApp(Ptr< Socket > socket, const Address &address)
Callback function after the connection for response from KMS has been received.
uint32_t m_keyBufferLengthAuthentication
TracedCallback< Ptr< Packet > > m_encryptionTrace
trace callback for encryption
ns3::TracedCallback< const std::string &, const std::string & > m_stateTransitionTrace
The StateTransition trace source.
void CreateKeyStreamSessions()
std::unordered_map< Address, Ptr< Packet >, AddressHash > m_buffer_qkdapp
Buffer for received packets(fragmentation)
void Setup(std::string socketType, std::string appId, std::string remoteAppId, const Address &appAddress, const Address &remoteAppAddress, const Address &kmAddress, std::string type)
Ptr< KeyStreamSession > m_authStream
void DataToKMSSend(Ptr< Socket >, uint32_t)
Callback function to notify that data to KMS has been sent.
TracedCallback< const std::string &, Ptr< const Packet > > m_mxTrace
Traced Callback: missed send packet call.
void HandleAcceptSignalingFromApp(Ptr< Socket > s, const Address &from)
Handle a signaling incoming connection from peer QKD application.
bool m_primaryQueueEstablished
void PrepareSocketToKMS()
Prepare send socket to communicate with KMS Application.
void StartApplication() override
void HandleReadSignalingFromApp(Ptr< Socket > socket)
Handle a signaling packet received by the QKD application from peer QKD application.
bool m_isDataConnectedToApp
TracedCallback< const std::string &, Ptr< const Packet > > m_rxTrace
Traced Callback: received data packets.
TracedCallback< const std::string &, Ptr< const Packet > > m_rxKmsTrace
Traced Callback: received packets from KMS.
void CheckStreamSessions()
Check if the associations are successfuly established.
void HandleAcceptFromApp(Ptr< Socket > s, const Address &from)
Handle an incoming connection from peer QKD application.
QKDEncryptor::EncryptionType m_encryptionType
uint32_t GetEncryptionKeySize()
Get key size for defined encryption algorithm.
void ConnectionSignalingToAppFailed(Ptr< Socket > socket)
Callback function after the signaling connection to the APP has.
void EstablishQueues()
Sends ESTABLISH_QUEUES request(for sende App004) or response(for receiver App004)
void Close(std::string ksid)
Terminate the association.
void HandlePeerErrorSignalingFromApp(Ptr< Socket > socket)
Handle a signaling connection error from peer QKD application.
Ptr< KeyStreamSession > m_encStream
static TypeId GetTypeId()
Get the type ID.
void ProcessPacketsToKMSFromQueue()
void SetCryptoSettings(uint32_t encryptionType, uint32_t authenticationType, uint32_t authenticationTagLengthInBits)
Set encryption and authentication type.
uint32_t GetAuthenticationKeySize()
Get key size for defined authentication algorithm.
void StopApplication() override
Application specific shutdown code.
bool ConnectionRequestedFromKMS(Ptr< Socket > socket, const Address &address)
Callback function after the connection for response from KMS has been received.
void ProcessCloseResponse(HTTPMessage &header)
Process response from KMS on CLOSE call.
void PacketReceivedFromKMS(const Ptr< Packet > &p, const Address &from, Ptr< Socket > socket)
Check for tcp segmentation of packets received from KMS.
std::string GetPacketContent(uint32_t msgLength=0)
Get the packet payload content.
bool m_replicaQueueEstablished
void ConnectionSignalingToAppSucceeded(Ptr< Socket > socket)
Callback function after the signaling connection to the APP is complete.
void ConnectionToAppSucceeded(Ptr< Socket > socket)
Callback function after the connection to the APP is complete.
bool ConnectionRequestedFromApp(Ptr< Socket > socket, const Address &address)
Callback function after the connection for response from KMS has been received.
void SetState(State state)
Set state.
void SendPacket()
QKDApp encrypts the data with obtained keys and sends this encrypted data to the peer QKDApp.
void SignalingPacketReceivedFromApp(const Ptr< Packet > &p, const Address &from, Ptr< Socket > socket)
Check for tcp segmentation of signaling packets received from APP.
void ProcessDataPacket(QKDAppHeader header, Ptr< Packet > packet, Ptr< Socket > socket)
Process data packets from peer QKD application.
Ipv4Address GetPeerIp()
Get peer application Ipv4 address.
void HandlePeerErrorFromApp(Ptr< Socket > socket)
Handle a connection error from peer QKD application.
QKDEncryptor::AuthenticationType m_authenticationType
Ptr< QKDEncryptor > m_encryptor
void HandlePeerCloseSignalingFromApp(Ptr< Socket > socket)
Handle a signaling connection close from peer QKD application.
std::string GetSessionScope(KeyStreamSession::Type type)
uint32_t m_authenticationTagLengthInBits
length of the authentication tag in bits(32 by default)
void GetKeyFromKMS(std::string ksid)
Obtain the required amount of key material.
State
QKD App states(App) States that refer to QKDApp data transmision!
@ ESTABLISHING_ASSOCIATIONS
@ ASSOCIATIONS_ESTABLISHED
@ ESTABLISHING_KEY_QUEUES
void ProcessResponseFromKMS(HTTPMessage &header, Ptr< Packet > packet, Ptr< Socket > socket)
Process response from KMS application.
void HandlePeerCloseToKMS(Ptr< Socket > socket)
Handle a connection close to KMS.
void CheckQueues()
Application establishing key queues before establishing data traffic.
std::string IpToString(Ipv4Address address)
uint32_t m_authentication
std::string GetId()
Get application identifier.
std::unordered_map< Address, Ptr< Packet >, AddressHash > m_buffer_sig
Buffer for received packets(fragmentation)
void ConnectionToAppFailed(Ptr< Socket > socket)
Callback function after the connection to the APP has failed.
void HandlePeerCloseFromKMS(Ptr< Socket > socket)
Handle a connection close from KMS.
TracedCallback< Ptr< Packet > > m_decryptionTrace
trace callback for decryption
Ipv4Address GetKmsIp()
Get KMS Ipv4 address.
void HandleReadFromKMS(Ptr< Socket > socket)
Handle a packet received by the QKD application from KMS application.
std::string PacketToString(Ptr< Packet > packet)
Convert packet to string.
static uint32_t m_applicationCounts
void AppTransitionTree()
Transition tree of the application.
TracedCallback< const std::string &, Ptr< const Packet > > m_txKmsTrace
Traced Callback: transmitted packets to KMS.
void DataPacketReceived(const Ptr< Packet > &p, const Address &from, Ptr< Socket > socket)
Check for tcp segmentation of signaling packets received from KMS.
std::string GetPeerId()
Get peer application identifier.
std::vector< KMSPacket > m_queue_kms
void HandlePeerErrorToKMS(Ptr< Socket > socket)
Handle a connection error to KMS.
TracedCallback< const std::string &, Ptr< const Packet > > m_txSigTrace
Traced Callback: transmitted signaling packets.
void DoDispose() override
Destructor implementation.
std::unordered_map< Address, Ptr< Packet >, AddressHash > m_buffer_kms
Buffer for received packets(fragmentation)
void PrepareSocketToApp()
Prepare send socket to communicate with QKD Application.
TracedCallback< const std::string &, Ptr< const Packet > > m_txTrace
Traced Callback: transmitted data packets.
KeyStreamSession::Type PopHttpKmsRequest(std::string uri)
Pop HTTP request from the queue(mapping response)
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
static void Cancel(const EventId &id)
Set the cancel bit on this event: the event's associated function will not be invoked when it expires...
static Time Now()
Return the current simulation virtual time.
virtual int Send(Ptr< Packet > p, uint32_t flags)=0
Send data (or dummy data) to the remote host.
void SetConnectCallback(Callback< void, Ptr< Socket > > connectionSucceeded, Callback< void, Ptr< Socket > > connectionFailed)
Specify callbacks to allow the caller to determine if the connection succeeds of fails.
virtual Socket::SocketErrno GetErrno() const =0
Get last error number.
void SetAcceptCallback(Callback< bool, Ptr< Socket >, const Address & > connectionRequest, Callback< void, Ptr< Socket >, const Address & > newConnectionCreated)
Accept connection requests from remote hosts.
void SetDataSentCallback(Callback< void, Ptr< Socket >, uint32_t > dataSent)
Notify application when a packet has been sent from transport protocol (non-standard socket call)
virtual int GetPeerName(Address &address) const =0
Get the peer address of a connected socket.
virtual int Connect(const Address &address)=0
Initiate a connection to a remote host.
void SetCloseCallbacks(Callback< void, Ptr< Socket > > normalClose, Callback< void, Ptr< Socket > > errorClose)
Detect socket recv() events such as graceful shutdown or error.
void SetRecvCallback(Callback< void, Ptr< Socket > > receivedData)
Notify application when new data is available to be read.
static Ptr< Socket > CreateSocket(Ptr< Node > node, TypeId tid)
This method wraps the creation of sockets that is performed on a given node by a SocketFactory specif...
virtual int Close()=0
Close a socket.
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
virtual int Listen()=0
Listen for incoming connections.
static TypeId GetTypeId()
Get the type ID.
Simulation virtual time values and global simulation resolution.
AttributeValue implementation for Time.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
AttributeValue implementation for TypeId.
static TypeId GetTypeId()
Get the type ID.
Hold an unsigned integer type.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Ptr< const AttributeChecker > MakeTimeChecker()
Helper to make an unbounded Time checker.
Callback< R, Args... > MakeNullCallback()
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
#define NS_ABORT_IF(cond)
Abnormal program termination if a condition is true.
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Ptr< T > Create(Ts &&... args)
Create class instances by constructors with varying numbers of arguments and return them by Ptr.
Time Seconds(double value)
Construct a Time in the indicated unit.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Callback< R, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Ptr< const AttributeChecker > MakeTypeIdChecker()
Ptr< const AttributeAccessor > MakeTypeIdAccessor(T1 a1)
static const uint32_t packetSize
Packet size generated at the AP.