60 static_assert(
sizeof(
NtFlow_t*) ==
sizeof(uint64_t),
"Pointers must be 64bit");
68 std::atomic<uint64_t>* ipv4counter, std::atomic<uint64_t>* ipv6counter)
76 ip = learnedFlowList[flowStatus.
id]->keyId ==
KEY_ID_IPV4 ?
" (IPv4): " :
" (IPv6): ";
77 std::cout <<
"Flow status for ID " << flowStatus.
id << ip;
80 switch (flowStatus.
flags) {
86 default: std::cout <<
"Unknown flag" << std::endl;
break;
90 std::cout << std::endl;
96 while (
NT_FlowRead(flowStream, &flowInfo, 0) == NT_SUCCESS) {
106 std::cout <<
"NT_FlowRead of flow ID " << flowInfo.
id << ip << std::endl
107 <<
"CSA: Packages: " << flowInfo.
packetsA 108 <<
", Octets: " << flowInfo.
octetsA << std::endl
109 <<
"CSB: Packages: " << flowInfo.
packetsB 110 <<
", Octets: " << flowInfo.
octetsB << std::endl
111 <<
"Time stamp: " << flowInfo.
ts << std::endl
112 <<
"TCP flags A: " << flowInfo.
flagsA 113 <<
", TCP flags B: " << flowInfo.
flagsB << std::endl;
115 switch (flowInfo.
cause) {
116 case 0: std::cout <<
"Unlearn cause: Software" << std::endl;
break;
117 case 1: std::cout <<
"Unlearn cause: Timeout" << std::endl;
break;
118 case 2: std::cout <<
"Unlearn cause: TCP flow termination" << std::endl;
break;
119 default: std::cout <<
"Unlearn cause: Not supported" << std::endl;
break;
121 std::cout << std::endl;
128 std::atomic<uint64_t>* ipv4counter, std::atomic<uint64_t>* ipv6counter)
131 uint64_t idCounter = 0U;
132 std::vector<std::unique_ptr<NtFlow_t>> learnedFlowList;
134 NtFlowAttr_t flowAttr;
145 status =
NT_FlowOpen_Attr(&flowStream,
"flowmatch_example_receiver_attr", &flowAttr);
158 if (status == NT_STATUS_TIMEOUT || status == NT_STATUS_TRYAGAIN)
continue;
163 auto flow = std::unique_ptr<NtFlow_t>(
new NtFlow_t);
164 std::memset(flow.get(), 0x0,
sizeof(
NtFlow_t));
169 flow->id = idCounter++;
173 flow->ipProtocolField = 6;
180 NtDyn4Descr_t* dyn4 = _NT_NET_GET_PKT_DESCR_PTR_DYN4(hNetBuffer);
181 uint8_t* packet =
reinterpret_cast<uint8_t*
>(dyn4) + dyn4->
descrLength;
190 std::memcpy(flow->keyData, packet + dyn4->
offset0, 4);
191 std::memcpy(flow->keyData + 4, packet + dyn4->
offset0 + 4, 4);
192 std::memcpy(flow->keyData + 8, packet + dyn4->
offset1, 2);
193 std::memcpy(flow->keyData + 10, packet + dyn4->
offset1 + 2, 2);
199 std::memcpy(flow->keyData, packet + dyn4->
offset0, 16);
200 std::memcpy(flow->keyData + 16, packet + dyn4->
offset0 + 16, 16);
201 std::memcpy(flow->keyData + 32, packet + dyn4->
offset1, 2);
202 std::memcpy(flow->keyData + 34, packet + dyn4->
offset1 + 2, 2);
212 learnedFlowList.push_back(std::move(flow));
216 for (
auto&& flow : learnedFlowList) {
225 std::this_thread::sleep_for(std::chrono::milliseconds(1000));
238 std::atomic<uint64_t>* counter)
252 if (status == NT_STATUS_TIMEOUT || status == NT_STATUS_TRYAGAIN)
continue;