/* * Copyright (c) 2016 Chelsio Communications, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation. * */ #ifndef __CXGBIT_LRO_H__ #define __CXGBIT_LRO_H__ #include <linux/kernel.h> #include <linux/module.h> #include <linux/errno.h> #include <linux/types.h> #include <linux/skbuff.h> #define LRO_FLUSH_LEN_MAX 65535 struct cxgbit_lro_cb { struct cxgbit_sock *csk; u32 pdu_totallen; u32 offset; u8 pdu_idx; bool complete; }; enum cxgbit_pducb_flags { PDUCBF_RX_HDR = (1 << 0), /* received pdu header */ PDUCBF_RX_DATA = (1 << 1), /* received pdu payload */ PDUCBF_RX_STATUS = (1 << 2), /* received ddp status */ PDUCBF_RX_DATA_DDPD = (1 << 3), /* pdu payload ddp'd */ PDUCBF_RX_DDP_CMP = (1 << 4), /* ddp completion */ PDUCBF_RX_HCRC_ERR = (1 << 5), /* header digest error */ PDUCBF_RX_DCRC_ERR = (1 << 6), /* data digest error */ }; struct cxgbit_lro_pdu_cb { u8 flags; u8 frags; u8 hfrag_idx; u8 nr_dfrags; u8 dfrag_idx; bool complete; u32 seq; u32 pdulen; u32 hlen; u32 dlen; u32 doffset; u32 ddigest; void *hdr; }; #define LRO_SKB_MAX_HEADROOM \ (sizeof(struct cxgbit_lro_cb) + \ (MAX_SKB_FRAGS * sizeof(struct cxgbit_lro_pdu_cb))) #define LRO_SKB_MIN_HEADROOM \ (sizeof(struct cxgbit_lro_cb) + \ sizeof(struct cxgbit_lro_pdu_cb)) #define cxgbit_skb_lro_cb(skb) ((struct cxgbit_lro_cb *)skb->data) #define cxgbit_skb_lro_pdu_cb(skb, i) \ ((struct cxgbit_lro_pdu_cb *)(skb->data + sizeof(struct cxgbit_lro_cb) \ + (i * sizeof(struct cxgbit_lro_pdu_cb)))) #define CPL_RX_ISCSI_DDP_STATUS_DDP_SHIFT 16 /* ddp'able */ #define CPL_RX_ISCSI_DDP_STATUS_PAD_SHIFT 19 /* pad error */ #define CPL_RX_ISCSI_DDP_STATUS_HCRC_SHIFT 20 /* hcrc error */ #define CPL_RX_ISCSI_DDP_STATUS_DCRC_SHIFT 21 /* dcrc error */ #endif /*__CXGBIT_LRO_H_*/