cloudFPGA (cF) API  1.0
The documentation of the source code of cloudFPGA (cF)
tx_sar_table.cpp
Go to the documentation of this file.
1 
17 
42 
55 #include "tx_sar_table.hpp"
56 
57 using namespace hls;
58 
59 
63 #ifndef __SYNTHESIS__
64  extern bool gTraceEvent;
65 #endif
66 
67 #define THIS_NAME "TOE/TSt"
68 
69 #define TRACE_OFF 0x0000
70 #define TRACE_TST 1 << 1
71 #define TRACE_ALL 0xFFFF
72 
73 #define DEBUG_LEVEL (TRACE_OFF)
74 
75 
76 
92  stream<RXeTxSarQuery> &siRXe_TxSarQry,
93  stream<RXeTxSarReply> &soRXe_TxSarRep,
94  stream<TXeTxSarQuery> &siTXe_TxSarQry,
95  stream<TXeTxSarReply> &soTXe_TxSarRep,
96  stream<TAiTxSarPush> &siTAi_PushCmd,
97  stream<TStTxSarPush> &soTAi_PushCmd)
98 {
99  //-- DIRECTIVES FOR THIS PROCESS -------------------------------------------
100  #pragma HLS PIPELINE II=1 enable_flush
101 
102  const char *myName = THIS_NAME;
103 
104  //-- STATIC ARRAYS ---------------------------------------------------------
105  static TxSarEntry TX_SAR_TABLE[TOE_MAX_SESSIONS];
106  #pragma HLS DEPENDENCE variable=TX_SAR_TABLE inter false
107  #pragma HLS RESOURCE variable=TX_SAR_TABLE core=RAM_2P
108 
109  if (!siTXe_TxSarQry.empty()) {
110  TXeTxSarQuery sTXeQry;
111  //----------------------------------------
112  //-- Rd/Wr Query from TX Engine
113  //----------------------------------------
114  siTXe_TxSarQry.read(sTXeQry);
115  if (sTXeQry.write) {
116  //-- TXe Write Query
117  if (not sTXeQry.isRtQuery) {
118  TX_SAR_TABLE[sTXeQry.sessionID].unak = sTXeQry.not_ackd;
119  if (sTXeQry.init) {
120  TX_SAR_TABLE[sTXeQry.sessionID].appw = sTXeQry.not_ackd;
121  TX_SAR_TABLE[sTXeQry.sessionID].ackd = sTXeQry.not_ackd-1;
122  TX_SAR_TABLE[sTXeQry.sessionID].cong_window = 0x3908; // 10 x 1460(MSS)
123  TX_SAR_TABLE[sTXeQry.sessionID].slowstart_threshold = 0xFFFF;
124  // Avoid initializing 'finReady' and 'finSent' at two different
125  // places because it will translate into II=2 and DRC message:
126  // 'Unable to schedule store operation on array due to limited memory ports'.
127 
128  // Init ACK on the TxAppInterface side
129  soTAi_PushCmd.write(TStTxSarPush(sTXeQry.sessionID,
130  sTXeQry.not_ackd, CMD_INIT));
131  }
132  if (sTXeQry.finReady or sTXeQry.init) {
133  TX_SAR_TABLE[sTXeQry.sessionID].finReady = sTXeQry.finReady;
134  }
135  if (sTXeQry.finSent or sTXeQry.init) {
136  TX_SAR_TABLE[sTXeQry.sessionID].finSent = sTXeQry.finSent;
137  }
138  }
139  else {
140  //-- TXe Write RtQuery
141  TXeTxSarRtQuery sTXeRtQry = sTXeQry;
142  TX_SAR_TABLE[sTXeQry.sessionID].slowstart_threshold = sTXeRtQry.getThreshold();
143  TX_SAR_TABLE[sTXeQry.sessionID].cong_window = 0x3908; // 10 x 1460(MSS) TODO is this correct or less, eg. 1/2 * MSS
144  if (DEBUG_LEVEL & TRACE_TST) {
145  printInfo(myName, "Received a Retry-Write query from TXe for session #%d.\n",
146  sTXeQry.sessionID.to_int());
147  }
148  }
149  }
150  else {
151  //-- TXe Read Query
152  TxSarEntry txSarEntry = TX_SAR_TABLE[sTXeQry.sessionID];
153 
154  TcpWindow minWindow;
155  if (txSarEntry.cong_window < txSarEntry.recv_window) {
156  minWindow = txSarEntry.cong_window;
157  }
158  else {
159  minWindow = TX_SAR_TABLE[sTXeQry.sessionID].recv_window;
160  }
161  soTXe_TxSarRep.write(TXeTxSarReply(TX_SAR_TABLE[sTXeQry.sessionID].ackd,
162  TX_SAR_TABLE[sTXeQry.sessionID].unak,
163  minWindow,
164  TX_SAR_TABLE[sTXeQry.sessionID].appw,
165  TX_SAR_TABLE[sTXeQry.sessionID].finReady,
166  TX_SAR_TABLE[sTXeQry.sessionID].finSent));
167  }
168  }
169  else if (!siTAi_PushCmd.empty()) {
170  TAiTxSarPush sTAiCmd;
171  //---------------------------------------
172  //-- Wr Command from TX APP Interface
173  //---------------------------------------
174  siTAi_PushCmd.read(sTAiCmd);
175  //-- Update the 'txAppWrPtr'
176  TX_SAR_TABLE[sTAiCmd.sessionID].appw = sTAiCmd.app;
177  }
178  else if (!siRXe_TxSarQry.empty()) {
179  RXeTxSarQuery sRXeQry;
180  //---------------------------------------
181  //-- Rd/Wr Query from RX Engine
182  //---------------------------------------
183  siRXe_TxSarQry.read(sRXeQry);
184  if (sRXeQry.write == QUERY_WR) {
185  TX_SAR_TABLE[sRXeQry.sessionID].ackd = sRXeQry.ackd;
186  TX_SAR_TABLE[sRXeQry.sessionID].recv_window = sRXeQry.recv_window;
187  TX_SAR_TABLE[sRXeQry.sessionID].cong_window = sRXeQry.cong_window;
188  TX_SAR_TABLE[sRXeQry.sessionID].count = sRXeQry.count;
189  TX_SAR_TABLE[sRXeQry.sessionID].fastRetransmitted = sRXeQry.fastRetransmitted;
190  // Push ACK to txAppInterface
191  soTAi_PushCmd.write(TStTxSarPush(sRXeQry.sessionID, sRXeQry.ackd));
192  }
193  else {
194  //-- Read Query
195  soRXe_TxSarRep.write(RXeTxSarReply(TX_SAR_TABLE[sRXeQry.sessionID].ackd,
196  TX_SAR_TABLE[sRXeQry.sessionID].unak,
197  TX_SAR_TABLE[sRXeQry.sessionID].cong_window,
198  TX_SAR_TABLE[sRXeQry.sessionID].slowstart_threshold,
199  TX_SAR_TABLE[sRXeQry.sessionID].count,
200  TX_SAR_TABLE[sRXeQry.sessionID].fastRetransmitted));
201  }
202  }
203 }
204 
RemotWinSize recv_window
Definition: toe.hpp:449
CmdBool fastRetransmitted
Definition: toe.hpp:452
TxAckNum ackd
Definition: toe.hpp:448
RdWrBit write
Definition: toe.hpp:453
ap_uint< 2 > count
Definition: toe.hpp:451
LocalWinSize cong_window
Definition: toe.hpp:450
SessionId sessionID
Definition: toe.hpp:447
SessionId sessionID
Definition: toe.hpp:547
TxBufPtr app
Definition: toe.hpp:548
bool finReady
Definition: toe.hpp:490
bool isRtQuery
Definition: toe.hpp:492
bool finSent
Definition: toe.hpp:491
SessionId sessionID
Definition: toe.hpp:486
TxAckNum not_ackd
Definition: toe.hpp:487
RdWrBit write
Definition: toe.hpp:488
CmdBit init
Definition: toe.hpp:489
ap_uint< TOE_WINDOW_BITS > getThreshold()
Definition: toe.hpp:537
bool fastRetransmitted
TxAckNum unak
TxBufPtr appw
TcpWindow slowstart_threshold
LocalWinSize cong_window
ap_uint< 2 > count
RemotWinSize recv_window
TxAckNum ackd
#define TRACE_TST
void tx_sar_table(stream< RXeTxSarQuery > &siRXe_TxSarQry, stream< RXeTxSarReply > &soRXe_TxSarRep, stream< TXeTxSarQuery > &siTXe_TxSarQry, stream< TXeTxSarReply > &soTXe_TxSarRep, stream< TAiTxSarPush > &siTAi_PushCmd, stream< TStTxSarPush > &soTAi_PushCmd)
Tx Sar Table (TSt). Stores the data structures for managing the TCP Tx buffer and Tx sliding window.
bool gTraceEvent
Definition: tb_nal.cpp:151
#define THIS_NAME
#define DEBUG_LEVEL
#define CMD_INIT
Definition: nts_types.hpp:60
#define QUERY_WR
Definition: nts_types.hpp:66
#define printInfo(callerName, format,...)
A macro to print an information message.
Definition: nts_utils.hpp:169
ap_uint< 16 > TcpWindow
Definition: AxisTcp.hpp:112
: Tx Segmentation and re-assembly Table (TSt)