131 Ptr<UniformRandomVariable> u, std::shared_ptr<Qubit> qRef, Time tStart,
155 const auto idealState = net.
GetState(qRef);
158 info.
completionMs = (Simulator::Now() - tStart).GetSeconds() * 1000.0;
162 std::cout <<
"[B] corrections applied"
163 <<
" hold_ms=" << std::fixed << std::setprecision(3)
164 << holdTime.GetSeconds() * 1000.0 <<
" fidelity=" << std::setprecision(4)
173 Ptr<DepolarizingQMap> depol, Ptr<UniformRandomVariable> u,
174 std::shared_ptr<Qubit> qRef, Time* tStart,
bool verbose,
175 Ptr<const Packet> packet,
const Address&) {
176 uint8_t bytes[2] = {0, 0};
177 const uint32_t n = packet->CopyData(bytes, 2);
184 bobInfo->
m1 = bytes[0] & 1;
185 bobInfo->
m2 = bytes[1] & 1;
189 std::cout <<
"[RECV][classical][B] t=" << std::fixed << std::setprecision(6)
190 << Simulator::Now().GetSeconds() <<
" s"
191 <<
" m1=" << bobInfo->
m1 <<
" m2=" << bobInfo->
m2 <<
"\n";
194 TryCorrections(bob, *net, *bobInfo, depol, u, qRef, *tStart, verbose);
218 const uint16_t port = 9000;
221 const Time qDelay = MicroSeconds(
static_cast<int64_t
>(std::llround(5.0 * distanceKm)));
222 const Time cDelay = MicroSeconds(
static_cast<int64_t
>(std::llround(5.0 * distanceKm)));
225 Time tStart = Seconds(0);
235 auto qRef = ref->CreateQubit();
239 auto depol = CreateObject<DepolarizingQMap>();
241 const double ratePerSecond = 1000.0 / TDepMs;
242 depol->SetAttribute(
"Rate", DoubleValue(ratePerSecond));
244 depol->SetAttribute(
"Probability", DoubleValue(0.0));
247 auto u = CreateObject<UniformRandomVariable>();
251 ch->SetAttribute(
"Delay", TimeValue(qDelay));
254 InternetStackHelper internet;
258 PointToPointHelper p2p;
259 p2p.SetDeviceAttribute(
"DataRate", StringValue(
"100Mbps"));
260 p2p.SetChannelAttribute(
"Delay", TimeValue(cDelay));
261 NetDeviceContainer devices = p2p.Install(A, B);
263 Ipv4AddressHelper ip;
264 ip.SetBase(
"10.1.1.0",
"255.255.255.0");
265 Ipv4InterfaceContainer interfaces = ip.Assign(devices);
268 Address bindAddr = InetSocketAddress(Ipv4Address::GetAny(), port);
269 PacketSinkHelper sinkHelper((proto ==
"udp") ?
"ns3::UdpSocketFactory" :
"ns3::TcpSocketFactory",
271 ApplicationContainer sinkApps = sinkHelper.Install(B);
272 sinkApps.Start(Seconds(0.0));
273 sinkApps.Stop(Seconds(5.0));
275 Ptr<PacketSink> sink = DynamicCast<PacketSink>(sinkApps.Get(0));
277 NS_ABORT_MSG(
"Failed to install PacketSink on Bob");
282 sink->TraceConnectWithoutContext(
"Rx", MakeBoundCallback(&
OnControlRxTrace, B, &bobInfo, &net,
283 depol, u, qRef, &tStart, verbose));
288 auto tcpState = std::make_shared<TcpSendState>();
289 tcpState->verbose = verbose;
293 [B, &bobInfo, &net, depol, u, qRef, &tStart, verbose](std::shared_ptr<Qubit> q) {
299 std::cout <<
"[RECV][quantum][B] t=" << std::fixed << std::setprecision(6)
300 << Simulator::Now().GetSeconds() <<
" s\n";
306 auto sendCtrlPacket = [&](Ptr<Packet> pkt) {
307 InetSocketAddress dst(interfaces.GetAddress(1), port);
309 if (proto ==
"udp") {
310 Ptr<Socket> sock = Socket::CreateSocket(A, UdpSocketFactory::GetTypeId());
311 if (sock->Connect(dst) == 0) {
314 std::cout <<
"[SEND][classical][udp] A->B\n";
316 }
else if (verbose) {
317 std::cout <<
"[WARN] UDP connect failed\n";
323 Ptr<Socket> sock = Socket::CreateSocket(A, TcpSocketFactory::GetTypeId());
324 tcpState->pendingPkt = pkt;
325 tcpState->sent =
false;
330 int rc = sock->Connect(dst);
333 std::cout <<
"[WARN] TCP connect() immediate failure\n";
336 tcpState->pendingPkt =
nullptr;
341 Simulator::Schedule(NanoSeconds(1), [&]() {
342 tStart = Simulator::Now();
344 auto [qA, qBRemote] = A->CreateBellPair();
345 const bool ok = A->Send(qBRemote, B->GetId());
348 std::cout <<
"[SEND][quantum] A->B: " << (ok ?
"ok" :
"failed") <<
"\n";
351 auto psi = A->CreateQubit();
354 auto [
m1,
m2] = A->MeasureBell(psi, qA);
357 std::cout <<
"[A] BSM results: " <<
m1 <<
", " <<
m2 <<
"\n";
361 static_cast<uint8_t
>(
m1),
362 static_cast<uint8_t
>(
m2),
365 sendCtrlPacket(Create<Packet>(bytes, 2));
368 Simulator::Stop(Seconds(5));
370 Simulator::Destroy();