qed: iWARP - Add check for errors on a SYN packet
authorMichal Kalderon <Michal.Kalderon@cavium.com>
Sun, 24 Sep 2017 09:09:45 +0000 (12:09 +0300)
committerDavid S. Miller <davem@davemloft.net>
Tue, 26 Sep 2017 18:22:03 +0000 (11:22 -0700)
A SYN packet which arrives with errors from FW should be dropped.
This required adding an additional field to the ll2
rx completion data.

Signed-off-by: Michal Kalderon <Michal.Kalderon@cavium.com>
Signed-off-by: Ariel Elior <Ariel.Elior@cavium.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/qlogic/qed/qed_iwarp.c
drivers/net/ethernet/qlogic/qed/qed_ll2.c
include/linux/qed/qed_ll2_if.h

index 568e985..8fc9c81 100644 (file)
@@ -1733,6 +1733,14 @@ qed_iwarp_ll2_comp_syn_pkt(void *cxt, struct qed_ll2_comp_rx_data *data)
 
        memset(&cm_info, 0, sizeof(cm_info));
        ll2_syn_handle = p_hwfn->p_rdma_info->iwarp.ll2_syn_handle;
+
+       /* Check if packet was received with errors... */
+       if (data->err_flags) {
+               DP_NOTICE(p_hwfn, "Error received on SYN packet: 0x%x\n",
+                         data->err_flags);
+               goto err;
+       }
+
        if (GET_FIELD(data->parse_flags,
                      PARSING_AND_ERR_FLAGS_L4CHKSMWASCALCULATED) &&
            GET_FIELD(data->parse_flags, PARSING_AND_ERR_FLAGS_L4CHKSMERROR)) {
index c06ad4f..250afa5 100644 (file)
@@ -413,6 +413,7 @@ static void qed_ll2_rxq_parse_reg(struct qed_hwfn *p_hwfn,
                                  struct qed_ll2_comp_rx_data *data)
 {
        data->parse_flags = le16_to_cpu(p_cqe->rx_cqe_fp.parse_flags.flags);
+       data->err_flags = le16_to_cpu(p_cqe->rx_cqe_fp.err_flags.flags);
        data->length.packet_length =
            le16_to_cpu(p_cqe->rx_cqe_fp.packet_length);
        data->vlan = le16_to_cpu(p_cqe->rx_cqe_fp.vlan);
index dd7a3b8..89fa0bb 100644 (file)
@@ -101,6 +101,7 @@ struct qed_ll2_comp_rx_data {
        void *cookie;
        dma_addr_t rx_buf_addr;
        u16 parse_flags;
+       u16 err_flags;
        u16 vlan;
        bool b_last_packet;
        u8 connection_handle;