From 0c774c1a4e4564e4eb64a5e2ec169aee3d373b2d Mon Sep 17 00:00:00 2001
From: David Sidler <david.sidler@inf.ethz.ch>
Date: Wed, 11 Sep 2019 23:02:51 +0200
Subject: [PATCH] deduplicate ip optinal header drop

---
 hls/ipv4/ipv4.cpp               | 143 +------------------------------
 hls/ipv4/ipv4.hpp               | 139 ++++++++++++++++++++++++++++++
 hls/toe/rx_engine/rx_engine.cpp | 144 +-------------------------------
 3 files changed, 142 insertions(+), 284 deletions(-)

diff --git a/hls/ipv4/ipv4.cpp b/hls/ipv4/ipv4.cpp
index fe1451c..b9f51c3 100644
--- a/hls/ipv4/ipv4.cpp
+++ b/hls/ipv4/ipv4.cpp
@@ -69,145 +69,6 @@ void process_ipv4(	stream<net_axis<WIDTH> >&		dataIn,
 	}
 }
 
-template <int WIDTH>
-void drop_optional_header(	stream<ap_uint<4> >&	process2dropLengthFifo,
-							stream<net_axis<WIDTH> >&	process2dropFifo,
-							stream<net_axis<WIDTH> >&	dataOut)
-{
-#pragma HLS INLINE off
-#pragma HLS pipeline II=1
-
-	enum fsmStateType {META, DROP, BODY, SHIFT, LAST, SHIFT_FIVE, LAST_FIVE};
-	static fsmStateType doh_state = META;
-	static ap_uint<4> length;
-
-	static net_axis<WIDTH> prevWord;
-	net_axis<WIDTH> currWord;
-	net_axis<WIDTH> sendWord;
-
-	//TODO length deduction depends on WIDTH
-	switch (doh_state)
-	{
-	case META:
-		if (!process2dropLengthFifo.empty() && !process2dropFifo.empty())
-		{
-			process2dropLengthFifo.read(length);
-			//Handle differently depending on AXI bus width. TODO 128, 256
-			if (WIDTH == 64)
-			{
-				if (length > 1)
-				{
-					doh_state = DROP;
-				}
-				else
-				{
-					process2dropFifo.read(prevWord);
-					doh_state = SHIFT;
-				}
-			}
-			if (WIDTH == 512)
-			{
-				if (length == 5)
-				{
-					process2dropFifo.read(prevWord);
-					doh_state = SHIFT_FIVE;
-					if (prevWord.last)
-					{
-						doh_state = LAST_FIVE;
-					}
-				}
-			}
-		}
-		break;
-	case DROP:
-		if (!process2dropFifo.empty())
-		{
-			process2dropFifo.read(prevWord);
-			length -= 2;
-			if (length == 1)
-			{
-				doh_state = SHIFT;
-			} else if (length == 0)
-			{
-				doh_state = BODY;
-			}
-		}
-		break;
-	case BODY:
-		if (!process2dropFifo.empty())
-		{
-			process2dropFifo.read(currWord);
-			dataOut.write(currWord);
-			if (currWord.last)
-			{
-				doh_state = META;
-			}
-		}
-		break;
-	case SHIFT:
-		if (!process2dropFifo.empty())
-		{
-			process2dropFifo.read(currWord);
-			sendWord.data(WIDTH-32-1, 0) = prevWord.data(WIDTH-1, 32);
-			sendWord.keep((WIDTH/8)-4-1, 0) = prevWord.keep((WIDTH/8)-1, 4);
-			sendWord.data(WIDTH-1, WIDTH-32) = currWord.data(31, 0);
-			sendWord.keep((WIDTH/8)-1, (WIDTH/8)-4) = currWord.keep(3, 0);
-			sendWord.last = (currWord.keep[4] == 0);
-			dataOut.write(sendWord);
-			prevWord = currWord;
-			if (sendWord.last)
-			{
-				doh_state = META;
-			}
-			else if (currWord.last)
-			{
-				doh_state = LAST;
-			}
-		}
-		break;
-	case SHIFT_FIVE:
-		if (!process2dropFifo.empty())
-		{
-			process2dropFifo.read(currWord);
-			sendWord.data(WIDTH-160-1, 0) = prevWord.data(WIDTH-1, 160);
-			sendWord.keep((WIDTH/8)-20-1, 0) = prevWord.keep((WIDTH/8)-1, 20);
-			sendWord.data(WIDTH-1, WIDTH-160) = currWord.data(160-1, 0);
-			sendWord.keep((WIDTH/8)-1, (WIDTH/8)-20) = currWord.keep(20-1, 0);
-			sendWord.last = (currWord.keep[20] == 0);
-			dataOut.write(sendWord);
-			prevWord = currWord;
-
-			if (sendWord.last)
-			{
-				doh_state = META;
-			}
-			else if (currWord.last)
-			{
-				doh_state = LAST_FIVE;
-			}
-		}
-		break;
-	case LAST:
-		sendWord.data(WIDTH-32-1, 0) = prevWord.data(WIDTH-1, 32);
-		sendWord.keep((WIDTH/8)-4-1, 0) = prevWord.keep((WIDTH/8)-1, 4);
-		sendWord.data(WIDTH-1, WIDTH-32) = 0;
-		sendWord.keep((WIDTH/8)-1, (WIDTH/8)-4) = 0x0;
-		sendWord.last = 0x1;
-		dataOut.write(sendWord);
-		doh_state = META;
-		break;
-		case LAST_FIVE:
-		sendWord.data(WIDTH-160-1, 0) = prevWord.data(WIDTH-1, 160);
-		sendWord.keep((WIDTH/8)-20-1, 0) = prevWord.keep((WIDTH/8)-1, 20);
-		sendWord.data(WIDTH-1, WIDTH-160) = 0;
-		sendWord.keep((WIDTH/8)-1, (WIDTH/8)-20) = 0x0;
-		sendWord.last = 0x1;
-		dataOut.write(sendWord);
-		doh_state = META;
-		break;
-	} //switch
-}
-
 template <int WIDTH>
 void generate_ipv4( stream<ipv4Meta>&		txEng_ipMetaDataFifoIn,
 					stream<net_axis<WIDTH> >&	tx_shift2ipv4Fifo,
@@ -321,8 +182,8 @@ void ipv4(		hls::stream<net_axis<WIDTH> >&	s_axis_rx_data,
 	 * RX PATH
 	 */
 	process_ipv4(s_axis_rx_data, rx_process2dropLengthFifo, m_axis_rx_meta, rx_process2dropFifo);
-	//TODO maybe assume no optional header fields!
-	drop_optional_header(rx_process2dropLengthFifo, rx_process2dropFifo, m_axis_rx_data);
+	//Assumes for WIDTH > 64 no optional fields
+	drop_optional_ip_header(rx_process2dropLengthFifo, rx_process2dropFifo, m_axis_rx_data);
 
 	/*
 	 * TX PATH
diff --git a/hls/ipv4/ipv4.hpp b/hls/ipv4/ipv4.hpp
index 48f7d66..cb38ca0 100644
--- a/hls/ipv4/ipv4.hpp
+++ b/hls/ipv4/ipv4.hpp
@@ -50,6 +50,145 @@ struct subSums
 	ap_uint<17>		sum[N];
 };
 
+template <int WIDTH>
+void drop_optional_ip_header(	stream<ap_uint<4> >&	process2dropLengthFifo,
+							stream<net_axis<WIDTH> >&	process2dropFifo,
+							stream<net_axis<WIDTH> >&	dataOut)
+{
+#pragma HLS INLINE off
+#pragma HLS pipeline II=1
+
+	enum fsmStateType {META, DROP, BODY, SHIFT, LAST, SHIFT_FIVE, LAST_FIVE};
+	static fsmStateType doh_state = META;
+	static ap_uint<4> length;
+
+	static net_axis<WIDTH> prevWord;
+	net_axis<WIDTH> currWord;
+	net_axis<WIDTH> sendWord;
+
+	switch (doh_state)
+	{
+	case META:
+		if (!process2dropLengthFifo.empty() && !process2dropFifo.empty())
+		{
+			process2dropLengthFifo.read(length);
+			std::cout << "(Optional) Header length: " << length << std::endl;
+
+			//TODO for WIDTH == 128 this only works if no IP options
+			if (WIDTH == 64 || WIDTH == 128)
+			{
+				if (length > 1)
+				{
+					doh_state = DROP;
+				}
+				else
+				{
+					process2dropFifo.read(prevWord);
+					doh_state = SHIFT;
+				}
+			}
+			if (WIDTH == 256 || WIDTH == 512)
+			{
+				//TODO this is a hack and only works if there are no IP options
+				if (length == 5)
+				{
+					process2dropFifo.read(prevWord);
+					doh_state = SHIFT_FIVE;
+					if (prevWord.last)
+					{
+						doh_state = LAST_FIVE;
+					}
+				}
+			}
+		}
+		break;
+	case DROP:
+		if (!process2dropFifo.empty())
+		{
+			process2dropFifo.read(prevWord);
+			length -= 2;
+			if (length == 1)
+			{
+				doh_state = SHIFT;
+			} else if (length == 0)
+			{
+				doh_state = BODY;
+			}
+		}
+		break;
+	case BODY:
+		if (!process2dropFifo.empty())
+		{
+			process2dropFifo.read(currWord);
+			dataOut.write(currWord);
+			if (currWord.last)
+			{
+				doh_state = META;
+			}
+		}
+		break;
+	case SHIFT:
+		if (!process2dropFifo.empty())
+		{
+			process2dropFifo.read(currWord);
+			sendWord.data(WIDTH-32-1, 0) = prevWord.data(WIDTH-1, 32);
+			sendWord.keep((WIDTH/8)-4-1, 0) = prevWord.keep((WIDTH/8)-1, 4);
+			sendWord.data(WIDTH-1, WIDTH-32) = currWord.data(31, 0);
+			sendWord.keep((WIDTH/8)-1, (WIDTH/8)-4) = currWord.keep(3, 0);
+			sendWord.last = (currWord.keep[4] == 0);
+			dataOut.write(sendWord);
+			prevWord = currWord;
+			if (sendWord.last)
+			{
+				doh_state = META;
+			}
+			else if (currWord.last)
+			{
+				doh_state = LAST;
+			}
+		}
+		break;
+	case SHIFT_FIVE:
+		if (!process2dropFifo.empty())
+		{
+			process2dropFifo.read(currWord);
+			sendWord.data(WIDTH-160-1, 0) = prevWord.data(WIDTH-1, 160);
+			sendWord.keep((WIDTH/8)-20-1, 0) = prevWord.keep((WIDTH/8)-1, 20);
+			sendWord.data(WIDTH-1, WIDTH-160) = currWord.data(160-1, 0);
+			sendWord.keep((WIDTH/8)-1, (WIDTH/8)-20) = currWord.keep(20-1, 0);
+			sendWord.last = (currWord.keep[20] == 0);
+			dataOut.write(sendWord);
+			prevWord = currWord;
+			if (sendWord.last)
+			{
+				doh_state = META;
+			}
+			else if (currWord.last)
+			{
+				doh_state = LAST_FIVE;
+			}
+		}
+		break;
+	case LAST:
+		sendWord.data(WIDTH-32-1, 0) = prevWord.data(WIDTH-1, 32);
+		sendWord.keep((WIDTH/8)-4-1, 0) = prevWord.keep((WIDTH/8)-1, 4);
+		sendWord.data(WIDTH-1, WIDTH-32) = 0;
+		sendWord.keep((WIDTH/8)-1, (WIDTH/8)-4) = 0x0;
+		sendWord.last = 0x1;
+		dataOut.write(sendWord);
+		doh_state = META;
+		break;
+	case LAST_FIVE:
+		sendWord.data(WIDTH-160-1, 0) = prevWord.data(WIDTH-1, 160);
+		sendWord.keep((WIDTH/8)-20-1, 0) = prevWord.keep((WIDTH/8)-1, 20);
+		sendWord.data(WIDTH-1, WIDTH-160) = 0;
+		sendWord.keep((WIDTH/8)-1, (WIDTH/8)-20) = 0;
+		sendWord.last = 0x1;
+		dataOut.write(sendWord);
+		doh_state = META;
+		break;
+	} //switch
+}
 
 void compute_ipv4_checksum(	hls::stream<net_axis<64> >&	dataIn,
 							hls::stream<net_axis<64> >&	dataOut,
diff --git a/hls/toe/rx_engine/rx_engine.cpp b/hls/toe/rx_engine/rx_engine.cpp
index 7e54d9c..ca615d9 100755
--- a/hls/toe/rx_engine/rx_engine.cpp
+++ b/hls/toe/rx_engine/rx_engine.cpp
@@ -75,149 +75,6 @@ void process_ipv4(	stream<net_axis<WIDTH> >&		dataIn,
 	}
 }
 
-//align remove options??
-//USE code from ipv4.hpp
-template <int WIDTH>
-void drop_optional_ip_header(	stream<ap_uint<4> >&	process2dropLengthFifo,
-							stream<net_axis<WIDTH> >&	process2dropFifo,
-							stream<net_axis<WIDTH> >&	dataOut)
-{
-#pragma HLS INLINE off
-#pragma HLS pipeline II=1
-
-	enum fsmStateType {META, DROP, BODY, SHIFT, LAST, SHIFT_FIVE, LAST_FIVE};
-	static fsmStateType doh_state = META;
-	static ap_uint<4> length;
-
-	static net_axis<WIDTH> prevWord;
-	net_axis<WIDTH> currWord;
-	net_axis<WIDTH> sendWord;
-
-	//TODO length deduction depends on AXI_WIDTH
-	switch (doh_state)
-	{
-	case META:
-		if (!process2dropLengthFifo.empty() && !process2dropFifo.empty())
-		{
-			process2dropLengthFifo.read(length);
-			std::cout << "(Optional) Header length: " << length << std::endl;
-
-			//TODO for WIDTH == 128 this only works if no IP options
-			if (WIDTH == 64 || WIDTH == 128)
-			{
-				if (length > 1)
-				{
-					doh_state = DROP;
-				}
-				else
-				{
-					process2dropFifo.read(prevWord);
-					doh_state = SHIFT;
-				}
-			}
-			if (WIDTH == 256 || WIDTH == 512)
-			{
-				//TODO this is a hack and only works if there are no IP options
-				if (length == 5)
-				{
-					process2dropFifo.read(prevWord);
-					doh_state = SHIFT_FIVE;
-					if (prevWord.last)
-					{
-						doh_state = LAST_FIVE;
-					}
-				}
-			}
-		}
-		break;
-	case DROP:
-		if (!process2dropFifo.empty())
-		{
-			process2dropFifo.read(prevWord);
-			length -= 2;
-			if (length == 1)
-			{
-				doh_state = SHIFT;
-			} else if (length == 0)
-			{
-				doh_state = BODY;
-			}
-		}
-		break;
-	case BODY:
-		if (!process2dropFifo.empty())
-		{
-			process2dropFifo.read(currWord);
-			dataOut.write(currWord);
-			if (currWord.last)
-			{
-				doh_state = META;
-			}
-		}
-		break;
-	case SHIFT:
-		if (!process2dropFifo.empty())
-		{
-			process2dropFifo.read(currWord);
-			sendWord.data(WIDTH-32-1, 0) = prevWord.data(WIDTH-1, 32);
-			sendWord.keep((WIDTH/8)-4-1, 0) = prevWord.keep((WIDTH/8)-1, 4);
-			sendWord.data(WIDTH-1, WIDTH-32) = currWord.data(31, 0);
-			sendWord.keep((WIDTH/8)-1, (WIDTH/8)-4) = currWord.keep(3, 0);
-			sendWord.last = (currWord.keep[4] == 0);
-			dataOut.write(sendWord);
-			prevWord = currWord;
-			if (sendWord.last)
-			{
-				doh_state = META;
-			}
-			else if (currWord.last)
-			{
-				doh_state = LAST;
-			}
-		}
-		break;
-	case SHIFT_FIVE:
-		if (!process2dropFifo.empty())
-		{
-			process2dropFifo.read(currWord);
-			sendWord.data(WIDTH-160-1, 0) = prevWord.data(WIDTH-1, 160);
-			sendWord.keep((WIDTH/8)-20-1, 0) = prevWord.keep((WIDTH/8)-1, 20);
-			sendWord.data(WIDTH-1, WIDTH-160) = currWord.data(160-1, 0);
-			sendWord.keep((WIDTH/8)-1, (WIDTH/8)-20) = currWord.keep(20-1, 0);
-			sendWord.last = (currWord.keep[20] == 0);
-			dataOut.write(sendWord);
-			prevWord = currWord;
-			if (sendWord.last)
-			{
-				doh_state = META;
-			}
-			else if (currWord.last)
-			{
-				doh_state = LAST_FIVE;
-			}
-		}
-		break;
-	case LAST:
-		sendWord.data(WIDTH-32-1, 0) = prevWord.data(WIDTH-1, 32);
-		sendWord.keep((WIDTH/8)-4-1, 0) = prevWord.keep((WIDTH/8)-1, 4);
-		sendWord.data(WIDTH-1, WIDTH-32) = 0;
-		sendWord.keep((WIDTH/8)-1, (WIDTH/8)-4) = 0x0;
-		sendWord.last = 0x1;
-		dataOut.write(sendWord);
-		doh_state = META;
-		break;
-	case LAST_FIVE:
-		sendWord.data(WIDTH-160-1, 0) = prevWord.data(WIDTH-1, 160);
-		sendWord.keep((WIDTH/8)-20-1, 0) = prevWord.keep((WIDTH/8)-1, 20);
-		sendWord.data(WIDTH-1, WIDTH-160) = 0;
-		sendWord.keep((WIDTH/8)-1, (WIDTH/8)-20) = 0;
-		sendWord.last = 0x1;
-		dataOut.write(sendWord);
-		doh_state = META;
-		break;
-	} //switch
-}
-
 template <int WIDTH>
 void constructPseudoHeader(	hls::stream<pseudoMeta>&	ipMetaIn,
 							hls::stream<net_axis<WIDTH> >&	headerOut)
@@ -1942,6 +1799,7 @@ void rx_engine(	stream<net_axis<WIDTH> >&					ipRxData,
 
 
 	process_ipv4<WIDTH>(ipRxData, rx_process2dropLengthFifo, rxEng_ipMetaFifo, rxEng_dataBuffer0);
+	//Assumes for WIDTH > 64 no optional fields
 	drop_optional_ip_header<WIDTH>(rx_process2dropLengthFifo, rxEng_dataBuffer0, rxEng_dataBuffer4);
 	//align
 	lshiftWordByOctet<WIDTH, 2>(((TCP_PSEUDO_HEADER_SIZE%WIDTH)/8), rxEng_dataBuffer4, rxEng_dataBuffer5);
-- 
GitLab