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