Fix Idle count
[samplevnf.git] / VNFs / DPPD-PROX / tools / flow_extract / stream2.cpp
1 /*
2 // Copyright (c) 2010-2017 Intel Corporation
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 //     http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 */
16
17 #include <iomanip>
18 #include <arpa/inet.h>
19 #include <sstream>
20
21 #include "stream.hpp"
22 #include "stream2.hpp"
23
24 int Stream2::fromFile(ifstream *f)
25 {
26         m_actions.clear();
27         if (streamHdr.fromFile(f))
28                 return -1;
29         if (actionsFromFile(f, streamHdr.actionCount))
30                 return -1;
31         if (setReferences(f))
32                 return -1;
33
34         return 0;
35 }
36
37 int Stream2::actionsFromFile(ifstream *f, size_t actionCount)
38 {
39         m_actions.resize(actionCount);
40         for (size_t i = 0; i < actionCount; ++i)
41                 f->read((char *)&m_actions[i], sizeof(Stream::ActionEntry));
42
43         return 0;
44 }
45
46 int Stream2::setReferences(ifstream *f)
47 {
48         size_t toRead = streamHdr.clientHdrLen +
49                 streamHdr.serverHdrLen +
50                 streamHdr.clientContentLen +
51                 streamHdr.serverContentLen;
52
53         delete [] clientServerHdrContent;
54         clientServerHdrContent = new uint8_t[toRead];
55         f->read((char *)clientServerHdrContent, toRead);
56         return 0;
57 }
58
59 void Stream2::calcOffsets(ofstream *out)
60 {
61         size_t curPos = out->tellp();
62
63         clientHdrBeg = curPos;
64         serverHdrBeg = clientHdrBeg + streamHdr.clientHdrLen;
65         clientContentBeg = serverHdrBeg + streamHdr.serverHdrLen;
66         serverContentBeg = clientContentBeg + streamHdr.clientContentLen;
67 }
68
69 void Stream2::toFile(ofstream *out) const
70 {
71         size_t len = streamHdr.clientHdrLen +
72                 streamHdr.serverHdrLen +
73                 streamHdr.clientContentLen +
74                 streamHdr.serverContentLen;
75
76         out->write((const char *)clientServerHdrContent, len);
77 }
78
79 static string ipToString(const uint32_t ip)
80 {
81         uint32_t ip_ne = htonl(ip);
82         stringstream ss;
83
84         ss << ((ip_ne >> 24) & 0xff) << "."
85            << ((ip_ne >> 16) & 0xff) << "."
86            << ((ip_ne >> 8) & 0xff) << "."
87            << (ip_ne & 0xff);
88
89         return ss.str();
90 }
91
92 static string spaces(uint32_t count)
93 {
94         stringstream ss;
95
96         while (count--)
97                 ss << " ";
98         return ss.str();
99 }
100
101 NetSocket Stream2::getServerNetSocket() const
102 {
103         return NetSocket(streamHdr.serverIP, ntohs(streamHdr.serverPort));
104 }
105
106 NetSocket Stream2::getClientNetSocket() const
107 {
108         return NetSocket(streamHdr.clientIP, ntohs(streamHdr.clientPort));
109 }
110 void Stream2::setServerNetSocket(const NetSocket& netSocket)
111 {
112         streamHdr.serverPort = htons(netSocket.port);
113         streamHdr.serverIP = netSocket.host;
114 }
115
116 void Stream2::setClientNetSocket(const NetSocket& netSocket)
117 {
118         streamHdr.clientPort = htons(netSocket.port);
119         streamHdr.clientIP = netSocket.host;
120 }
121 void Stream2::toLua(ofstream *f, const string& binFileName, const string& streamTableName) const
122
123 {
124         (*f) << std::fixed;
125
126         (*f) << streamTableName << "[" << streamHdr.streamId << "] = {" << endl
127              << spaces(3) << "client_data = {" << endl
128              << spaces(6) << "header = bin_read(" << binFileName << "," << clientHdrBeg << "," << streamHdr.clientHdrLen << "), " << endl
129              << spaces(6) << "content = bin_read(" << binFileName << "," << clientContentBeg << "," << streamHdr.clientContentLen << "), " << endl
130              << spaces(3) << "}," << endl
131              << spaces(3) << "server_data = {" << endl
132              << spaces(6) << "header = bin_read(" << binFileName << "," << serverHdrBeg << "," << streamHdr.serverHdrLen << "), " << endl
133              << spaces(6) << "content = bin_read(" << binFileName << "," << serverContentBeg << "," << streamHdr.serverContentLen << "), " << endl
134              << spaces(3) << "}," << endl
135              << spaces(3) << "actions = {" << endl;
136
137         for (size_t i = 0; i < m_actions.size(); ++i) {
138                 const char *peer_str = m_actions[i].peer == 0? "client" : "server";
139
140                 (*f) << spaces(6) <<  peer_str << "_content(" << m_actions[i].beg << "," << m_actions[i].len << ")," << endl;
141         }
142
143         (*f) << spaces(3) << "}," << endl
144              << spaces(3) << "clients = {ip = ip(\"" << ipToString(streamHdr.clientIP) << "\"), port = " << ntohs(streamHdr.clientPort) << "}," << endl
145              << spaces(3) << "servers = {ip = ip(\"" << ipToString(streamHdr.serverIP) << "\"), port = " << ntohs(streamHdr.serverPort) << "}," << endl
146              << spaces(3) << "l4_proto = \"" << (streamHdr.protocol == 0x06? "tcp" : "udp") << "\"," << endl
147              << spaces(3) << "up_bps = " << setprecision(4) << streamHdr.upRate << "," << endl
148              << spaces(3) << "dn_bps = " << setprecision(4) << streamHdr.dnRate << "," << endl;
149
150         (*f) << "}" << endl;
151 }