59 static_assert(
sizeof(
NtFlow_t*) ==
sizeof(uint64_t),
"Pointers must be 64bit");
67 std::atomic<uint64_t>* ipv4counter, std::atomic<uint64_t>* ipv6counter)
75 ip = learnedFlowList[flowStatus.
id]->keyId ==
KEY_ID_IPV4 ?
" (IPv4): " :
" (IPv6): ";
76 std::cout <<
"Flow status for ID " << flowStatus.
id << ip;
79 switch (flowStatus.
flags) {
85 default: std::cout <<
"Unknown flag" << std::endl;
break;
89 std::cout << std::endl;
95 while (
NT_FlowRead(flowStream, &flowInfo, 0) == NT_SUCCESS) {
105 std::cout <<
"NT_FlowRead of flow ID " << flowInfo.
id << ip << std::endl
106 <<
"CSA: packets: " << flowInfo.
packetsA 107 <<
", Octets: " << flowInfo.
octetsA << std::endl
108 <<
"CSB: packets: " << flowInfo.
packetsB 109 <<
", Octets: " << flowInfo.
octetsB << std::endl
110 <<
"Time stamp: " << flowInfo.
ts << std::endl
111 <<
"TCP flags A: " << flowInfo.
flagsA 112 <<
", TCP flags B: " << flowInfo.
flagsB << std::endl;
114 switch (flowInfo.
cause) {
115 case 0: std::cout <<
"Unlearn cause: Software" << std::endl;
break;
116 case 1: std::cout <<
"Unlearn cause: Timeout" << std::endl;
break;
117 case 2: std::cout <<
"Unlearn cause: TCP flow termination" << std::endl;
break;
118 default: std::cout <<
"Unlearn cause: Not supported" << std::endl;
break;
120 std::cout << std::endl;
127 std::atomic<uint64_t>* ipv4counter, std::atomic<uint64_t>* ipv6counter)
130 uint64_t idCounter = 0U;
131 std::vector<std::unique_ptr<NtFlow_t>> learnedFlowList;
133 NtFlowAttr_t flowAttr;
144 status =
NT_FlowOpen_Attr(&flowStream,
"flowmatch_example_receiver_attr", &flowAttr);
148 std::cout <<
"Detected Flow Stream API verion " << FlowStreamVersion << std::endl;
160 if (status == NT_STATUS_TIMEOUT || status == NT_STATUS_TRYAGAIN)
continue;
165 auto flow = std::unique_ptr<NtFlow_t>(
new NtFlow_t);
166 std::memset(flow.get(), 0x0,
sizeof(
NtFlow_t));
171 flow->id = idCounter++;
175 flow->ipProtocolField = 6;
182 NtDyn4Descr_t* dyn4 = _NT_NET_GET_PKT_DESCR_PTR_DYN4(hNetBuffer);
183 uint8_t* packet =
reinterpret_cast<uint8_t*
>(dyn4) + dyn4->
descrLength;
192 std::memcpy(flow->keyData, packet + dyn4->
offset0, 4);
193 std::memcpy(flow->keyData + 4, packet + dyn4->
offset0 + 4, 4);
194 std::memcpy(flow->keyData + 8, packet + dyn4->
offset1, 2);
195 std::memcpy(flow->keyData + 10, packet + dyn4->
offset1 + 2, 2);
201 std::memcpy(flow->keyData, packet + dyn4->
offset0, 16);
202 std::memcpy(flow->keyData + 16, packet + dyn4->
offset0 + 16, 16);
203 std::memcpy(flow->keyData + 32, packet + dyn4->
offset1, 2);
204 std::memcpy(flow->keyData + 34, packet + dyn4->
offset1 + 2, 2);
214 learnedFlowList.push_back(std::move(flow));
218 for (
auto&& flow : learnedFlowList) {
227 std::this_thread::sleep_for(std::chrono::milliseconds(1000));
240 std::atomic<uint64_t>* counter)
254 if (status == NT_STATUS_TIMEOUT || status == NT_STATUS_TRYAGAIN)
continue;