summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMandy Lavi <mandy.lavi@freescale.com>2015-11-19 05:18:04 (GMT)
committerMandy Lavi <mandy.lavi@freescale.com>2015-11-24 07:50:40 (GMT)
commitb242e9c35ae998f1f732deff174c4513a5f34ad1 (patch)
tree9dc0467cb84d5be6c9dbddc24e1dbd036d633f9e
parentfd8e7c71bf30389a5145efc9d088775e0f22402c (diff)
downloadlinux-fsl-qoriq-b242e9c35ae998f1f732deff174c4513a5f34ad1.tar.xz
fmd: Add support for IPF after HMan
fmd: change cc owners attribute from uint8 to unit16 fmd: change manip owner attribute from uint8 to unit16 fmd: add risc load monitor in sysfs fmd: Fix modification of nodes pointed by HM fmd: add missing fields in pcd_manip_hdr_insrt_ip Signed-off-by: Mandy Lavi <mandy.lavi@freescale.com>
-rw-r--r--drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_cc.c8
-rw-r--r--drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_cc.h6
-rw-r--r--drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.c85
-rw-r--r--drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.h7
-rw-r--r--drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_fm.h1
-rw-r--r--drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.h7
-rw-r--r--drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_sysfs_fm.c46
-rw-r--r--include/uapi/linux/fmd/Peripherals/fm_pcd_ioctls.h7
8 files changed, 128 insertions, 39 deletions
diff --git a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_cc.c b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_cc.c
index 13a5c15..c7ddc88 100644
--- a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_cc.c
+++ b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_cc.c
@@ -844,6 +844,7 @@ static t_Handle BuildNewAd(
t_FmPcdCcNextEngineParams *p_FmPcdCcNextEngineParams)
{
t_FmPcdCcNode *p_FmPcdCcNodeTmp;
+ t_Handle h_OrigAd = NULL;
p_FmPcdCcNodeTmp = (t_FmPcdCcNode*)XX_Malloc(sizeof(t_FmPcdCcNode));
if (!p_FmPcdCcNodeTmp)
@@ -874,6 +875,7 @@ static t_Handle BuildNewAd(
{
if (p_FmPcdCcNextEngineParams->h_Manip)
{
+ h_OrigAd = p_CcNode->h_Ad;
if (AllocAndFillAdForContLookupManip(
p_FmPcdCcNextEngineParams->params.ccParams.h_CcNode)
!= E_OK)
@@ -884,7 +886,7 @@ static t_Handle BuildNewAd(
}
}
FillAdOfTypeContLookup(h_Ad, NULL, p_CcNode->h_FmPcd, p_FmPcdCcNodeTmp,
- p_FmPcdCcNextEngineParams->h_Manip, NULL);
+ h_OrigAd ? NULL : p_FmPcdCcNextEngineParams->h_Manip, NULL);
}
#if (DPAA_VERSION >= 11)
@@ -3573,6 +3575,7 @@ static t_Error UpdatePtrWhichPointOnCrntMdfNode(
t_FmPcdCcNextEngineParams *p_NextEngineParams = NULL;
t_CcNodeInformation ccNodeInfo = { 0 };
t_Handle h_NewAd;
+ t_Handle h_OrigAd = NULL;
/* Building a list of all action descriptors that point to the previous node */
if (!LIST_IsEmpty(&p_CcNode->ccPrevNodesLst))
@@ -3592,13 +3595,14 @@ static t_Error UpdatePtrWhichPointOnCrntMdfNode(
RETURN_ERROR(MAJOR, E_NO_MEMORY, NO_MSG);
IOMemSet32(h_NewAd, 0, FM_PCD_CC_AD_ENTRY_SIZE);
+ h_OrigAd = p_CcNode->h_Ad;
BuildNewAd(h_NewAd, p_FmPcdModifyCcKeyAdditionalParams, p_CcNode,
p_NextEngineParams);
ccNodeInfo.h_CcNode = h_NewAd;
EnqueueNodeInfoToRelevantLst(h_NewLst, &ccNodeInfo, NULL);
- if (p_NextEngineParams->h_Manip)
+ if (p_NextEngineParams->h_Manip && !h_OrigAd)
FmPcdManipUpdateOwner(p_NextEngineParams->h_Manip, FALSE);
}
return E_OK;
diff --git a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_cc.h b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_cc.h
index 00d3f05..d148ff4 100644
--- a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_cc.h
+++ b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_cc.h
@@ -326,7 +326,7 @@ typedef struct
uint8_t offset;
uint8_t prsArrayOffset;
bool ctrlFlow;
- uint8_t owners;
+ uint16_t owners;
uint8_t ccKeySizeAccExtraction;
uint8_t sizeOfExtraction;
@@ -361,7 +361,7 @@ typedef struct
{
t_FmPcdCcNode *p_FmPcdCcNode;
bool occupied;
- uint8_t owners;
+ uint16_t owners;
volatile bool lock;
} t_FmPcdCcNodeArray;
@@ -382,7 +382,7 @@ typedef struct
t_List fmPortsLst;
t_FmPcdLock *p_Lock;
uint8_t numOfEntries;
- uint8_t owners;
+ uint16_t owners;
t_Handle h_FmPcdCcSavedManipParams;
bool modifiedState;
uint32_t requiredAction;
diff --git a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.c b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.c
index ba81535..f7be4d9 100644
--- a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.c
+++ b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.c
@@ -1017,6 +1017,7 @@ static t_Error BuildHmct(t_FmPcdManip *p_Manip,
/* If this node has a nextManip, and no parsing is required, the old table must be copied to the new table
the old table and should be freed */
if (p_FmPcdManipParams->h_NextManip &&
+ (p_Manip->nextManipType == e_FM_PCD_MANIP_HDR) &&
(MANIP_DONT_REPARSE(p_Manip)))
{
if (new)
@@ -1028,14 +1029,6 @@ static t_Error BuildHmct(t_FmPcdManip *p_Manip,
p_Manip->unifiedPosition = e_MANIP_UNIFIED_FIRST;
- /* The HMTD of the next Manip is never going to be used */
- if (((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->muramAllocate)
- FM_MURAM_FreeMem(
- ((t_FmPcd *)((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_FmPcd)->h_FmMuram,
- ((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_Ad);
- else
- XX_Free(((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_Ad);
- ((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_Ad = NULL;
}
}
else
@@ -1058,15 +1051,23 @@ static t_Error CreateManipActionNew(t_FmPcdManip *p_Manip,
uint8_t *p_OldHmct, *p_TmpHmctPtr, *p_TmpDataPtr;
/* set Manip structure */
+
+ p_Manip->dontParseAfterManip =
+ p_FmPcdManipParams->u.hdr.dontParseAfterManip;
+
if (p_FmPcdManipParams->h_NextManip)
- {
- if (p_FmPcdManipParams->u.hdr.dontParseAfterManip)
+ { /* Next Header manipulation exists */
+ p_Manip->nextManipType = MANIP_GET_TYPE(p_FmPcdManipParams->h_NextManip);
+
+ if ((p_Manip->nextManipType == e_FM_PCD_MANIP_HDR) && p_Manip->dontParseAfterManip)
nextSize = (uint32_t)(GetHmctSize(p_FmPcdManipParams->h_NextManip) + GetDataSize(p_FmPcdManipParams->h_NextManip));
- else
- p_Manip->cascadedNext = TRUE;
+ else /* either parsing is required or next manip is Frag; no table merging. */
+ p_Manip->cascaded = TRUE;
+ /* pass up the "cascaded" attribute. The whole chain is cascaded
+ * if something is cascaded along the way. */
+ if (MANIP_IS_CASCADED(p_FmPcdManipParams->h_NextManip))
+ p_Manip->cascaded = TRUE;
}
- p_Manip->dontParseAfterManip =
- p_FmPcdManipParams->u.hdr.dontParseAfterManip;
/* Allocate new table */
/* calculate table size according to manip parameters */
@@ -1105,9 +1106,9 @@ static t_Error CreateManipActionNew(t_FmPcdManip *p_Manip,
("MURAM allocation for HdrManip node shadow"));
}
-
- if (p_FmPcdManipParams->h_NextManip &&
- (MANIP_DONT_REPARSE(p_Manip)))
+ if (p_FmPcdManipParams->h_NextManip
+ && (p_Manip->nextManipType == e_FM_PCD_MANIP_HDR)
+ && (MANIP_DONT_REPARSE(p_Manip)))
{
p_OldHmct = (uint8_t *)GetManipInfo(p_FmPcdManipParams->h_NextManip,
e_MANIP_HMCT);
@@ -1157,18 +1158,28 @@ static t_Error CreateManipActionNew(t_FmPcdManip *p_Manip,
/* Build HMTD (table descriptor) */
tmpReg = HMTD_CFG_TYPE; /* NADEN = 0 */
+
/* add parseAfterManip */
if (!p_Manip->dontParseAfterManip)
tmpReg |= HMTD_CFG_PRS_AFTER_HM;
/* create cascade */
- if (p_FmPcdManipParams->h_NextManip &&
- !MANIP_DONT_REPARSE(p_Manip))
+ /*if (p_FmPcdManipParams->h_NextManip
+ && (!MANIP_DONT_REPARSE(p_Manip) || (p_Manip->nextManipType != e_FM_PCD_MANIP_HDR)))*/
+ if (p_Manip->cascaded)
{
+ uint16_t nextAd;
/* indicate that there's another HM table descriptor */
tmpReg |= HMTD_CFG_NEXT_AD_EN;
- WRITE_UINT16(
- ((t_Hmtd *)p_Manip->h_Ad)->nextAdIdx,
- (uint16_t)((uint32_t)(XX_VirtToPhys(MANIP_GET_HMTD_PTR(p_FmPcdManipParams->h_NextManip)) - (((t_FmPcd*)p_Manip->h_FmPcd)->physicalMuramBase)) >> 4));
+ /* get address of next HMTD (table descriptor; h_Ad).
+ * If the next HMTD was removed due to table unifing, get the address
+ * of the "next next" as written in the h_Ad of the next h_Manip node.
+ */
+ if (p_Manip->unifiedPosition != e_MANIP_UNIFIED_FIRST)
+ nextAd = (uint16_t)((uint32_t)(XX_VirtToPhys(MANIP_GET_HMTD_PTR(p_FmPcdManipParams->h_NextManip)) - (((t_FmPcd*)p_Manip->h_FmPcd)->physicalMuramBase)) >> 4);
+ else
+ nextAd = ((t_Hmtd *)((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_Ad)->nextAdIdx;
+
+ WRITE_UINT16(((t_Hmtd *)p_Manip->h_Ad)->nextAdIdx, nextAd);
}
WRITE_UINT16(((t_Hmtd *)p_Manip->h_Ad)->cfg, tmpReg);
@@ -1178,6 +1189,19 @@ static t_Error CreateManipActionNew(t_FmPcdManip *p_Manip,
WRITE_UINT8(((t_Hmtd *)p_Manip->h_Ad)->opCode, HMAN_OC);
+ if (p_Manip->unifiedPosition == e_MANIP_UNIFIED_FIRST)
+ {
+ /* The HMTD of the next Manip is never going to be used */
+ if (((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->muramAllocate)
+ FM_MURAM_FreeMem(
+ ((t_FmPcd *)((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_FmPcd)->h_FmMuram,
+ ((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_Ad);
+ else
+ XX_Free(((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_Ad);
+ ((t_FmPcdManip *)p_FmPcdManipParams->h_NextManip)->h_Ad = NULL;
+ }
+
+
return E_OK;
}
@@ -2606,12 +2630,11 @@ static t_Error CheckManipParamsAndSetType(t_FmPcdManip *p_Manip,
RETURN_ERROR(
MAJOR, E_INVALID_STATE,
("h_NextManip is already a part of another chain"));
- if (MANIP_GET_TYPE(p_ManipParams->h_NextManip)
- != e_FM_PCD_MANIP_HDR)
- RETURN_ERROR(
- MAJOR,
- E_NOT_SUPPORTED,
- ("For a Header Manipulation node - no support of h_NextManip of type other than Header Manipulation."));
+ if ((MANIP_GET_TYPE(p_ManipParams->h_NextManip)
+ != e_FM_PCD_MANIP_HDR) &&
+ (MANIP_GET_TYPE(p_ManipParams->h_NextManip)
+ != e_FM_PCD_MANIP_FRAG))
+ RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("For a Header Manipulation node - no support of h_NextManip of type other than Header Manipulation or Fragmentation."));
}
if (p_ManipParams->u.hdr.rmv)
@@ -4673,8 +4696,8 @@ t_Error FmPcdManipCheckParamsForCcNextEngine(
p_Manip->ownerTmp++;
break;
case (HMAN_OC):
- if ((p_FmPcdCcNextEngineParams->nextEngine == e_FM_PCD_CC)
- && MANIP_IS_CASCADE_NEXT(p_Manip))
+ if (( p_FmPcdCcNextEngineParams->nextEngine == e_FM_PCD_CC)
+ && MANIP_IS_CASCADED(p_Manip))
RETURN_ERROR(
MINOR,
E_INVALID_STATE,
@@ -5262,7 +5285,7 @@ t_Error FM_PCD_ManipNodeReplace(t_Handle h_Manip,
* (1) If this is an independent node, all its owners should be updated.
*
* (2) If it is the head of a cascaded chain (it does not have a "prev" but
- * it has a "next" and it has a "cascaded-next" indication), the next
+ * it has a "next" and it has a "cascaded" indication), the next
* node remains unchanged, and the behavior is as in (1).
*
* (3) If it is not the head, but a part of a cascaded chain, in can be
diff --git a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.h b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.h
index de7e4c8..b85d861 100644
--- a/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.h
+++ b/drivers/net/ethernet/freescale/fman/Peripherals/FM/Pcd/fm_manip.h
@@ -279,7 +279,7 @@
}
/* position regarding Manip SW structure */
#define MANIP_IS_FIRST(h_Manip) (!(((t_FmPcdManip *)h_Manip)->h_PrevManip))
-#define MANIP_IS_CASCADE_NEXT(h_Manip) (((t_FmPcdManip *)h_Manip)->cascadedNext)
+#define MANIP_IS_CASCADED(h_Manip) (((t_FmPcdManip *)h_Manip)->cascaded)
#define MANIP_IS_UNIFIED(h_Manip) (!(((t_FmPcdManip *)h_Manip)->unifiedPosition == e_MANIP_UNIFIED_NONE))
#define MANIP_IS_UNIFIED_NON_FIRST(h_Manip) ((((t_FmPcdManip *)h_Manip)->unifiedPosition == e_MANIP_UNIFIED_MID) || \
(((t_FmPcdManip *)h_Manip)->unifiedPosition == e_MANIP_UNIFIED_LAST))
@@ -482,6 +482,7 @@ typedef struct{
bool insrt;
t_Handle h_NextManip;
t_Handle h_PrevManip;
+ e_FmPcdManipType nextManipType;
/* HdrManip parameters*/
uint8_t *p_Hmct;
uint8_t *p_Data;
@@ -490,11 +491,11 @@ typedef struct{
bool custom;
uint16_t tableSize;
uint8_t dataSize;
- bool cascadedNext;
+ bool cascaded;
e_ManipUnifiedPosition unifiedPosition;
/* end HdrManip */
uint8_t *p_Template;
- uint8_t owner;
+ uint16_t owner;
uint32_t updateParams;
uint32_t shadowUpdateParams;
bool frag;
diff --git a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_fm.h b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_fm.h
index 05202a2..95e382c 100644
--- a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_fm.h
+++ b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_fm.h
@@ -234,6 +234,7 @@ typedef struct {
struct class *fm_class;
struct device_attribute *dev_attr_stats;
struct device_attribute *dev_attr_regs;
+ struct device_attribute *dev_attr_risc_load;
struct device_attribute *dev_pcd_attr_stats;
struct device_attribute *dev_plcr_attr_regs;
diff --git a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.h b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.h
index 3b6fb59..af158e9 100644
--- a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.h
+++ b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_ioctls_fm_compat.h
@@ -429,6 +429,13 @@ typedef struct ioc_compat_fm_pcd_manip_hdr_insrt_ip_params_t {
uint8_t last_pid_offset; /**< the offset of the last Protocol within
the inserted header */
uint16_t id; /**< 16 bit New IP ID */
+ bool dont_frag_overwrite;
+ /**< IPv4 only. DF is overwritten with the hash-result next-to-last byte.
+ * This byte is configured to be overwritten when RPD is set. */
+ uint8_t last_dst_offset;
+ /**< IPv6 only. if routing extension exist, user should set the offset of the destination address
+ * in order to calculate UDP checksum pseudo header;
+ * Otherwise set it to '0'. */
ioc_compat_fm_pcd_manip_hdr_insrt_t insrt; /**< size and data to be inserted. */
} ioc_compat_fm_pcd_manip_hdr_insrt_ip_params_t;
#endif /* (DPAA_VERSION >= 11) */
diff --git a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_sysfs_fm.c b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_sysfs_fm.c
index dd3bc3e..3545634 100644
--- a/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_sysfs_fm.c
+++ b/drivers/net/ethernet/freescale/fman/src/wrapper/lnxwrp_sysfs_fm.c
@@ -44,6 +44,7 @@
#endif
#include "../../fman/Peripherals/FM/fm.h"
+#include <linux/delay.h>
static int fm_get_counter(void *h_fm, e_FmCounters cnt_e, uint32_t *cnt_val);
@@ -225,6 +226,46 @@ static const struct sysfs_stats_t fm_sysfs_stats[] = {
};
+static ssize_t show_fm_risc_load(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ t_LnxWrpFmDev *p_wrp_fm_dev = NULL;
+ unsigned long flags;
+ int m =0;
+ int err =0;
+ unsigned n = 0;
+ t_FmCtrlMon util;
+ uint8_t i =0 ;
+
+ if (attr == NULL || buf == NULL || dev == NULL)
+ return -EINVAL;
+
+ p_wrp_fm_dev = (t_LnxWrpFmDev *) dev_get_drvdata(dev);
+ if (WARN_ON(p_wrp_fm_dev == NULL))
+ return -EINVAL;
+
+ if (!p_wrp_fm_dev->active || !p_wrp_fm_dev->h_Dev)
+ return -EIO;
+
+ local_irq_save(flags);
+
+ /* Calculate risc load */
+ FM_CtrlMonStart(p_wrp_fm_dev->h_Dev);
+ msleep(1000);
+ FM_CtrlMonStop(p_wrp_fm_dev->h_Dev);
+
+ for (i = 0; i < FM_NUM_OF_CTRL; i++) {
+ err |= FM_CtrlMonGetCounters(p_wrp_fm_dev->h_Dev, i, &util);
+ m = snprintf(&buf[n],PAGE_SIZE,"\tRisc%u: util-%u%%, efficiency-%u%%\n",
+ i, util.percentCnt[0], util.percentCnt[1]);
+ n=m+n;
+ }
+
+ local_irq_restore(flags);
+
+ return n;
+}
+
/* Fm stats and regs dumps via sysfs */
static ssize_t show_fm_dma_stats(struct device *dev,
struct device_attribute *attr, char *buf)
@@ -598,6 +639,7 @@ static ssize_t show_fm_schemes(struct device *dev,
/* FM */
static DEVICE_ATTR(enq_total_frame, S_IRUGO, show_fm_stats, NULL);
static DEVICE_ATTR(deq_total_frame, S_IRUGO, show_fm_stats, NULL);
+static DEVICE_ATTR(fm_risc_load_val, S_IRUGO, show_fm_risc_load, NULL);
static DEVICE_ATTR(deq_0, S_IRUGO, show_fm_stats, NULL);
static DEVICE_ATTR(deq_1, S_IRUGO, show_fm_stats, NULL);
static DEVICE_ATTR(deq_2, S_IRUGO, show_fm_stats, NULL);
@@ -1211,6 +1253,7 @@ int fm_sysfs_create(struct device *dev)
/* store to remove them when module is disabled */
p_wrp_fm_dev->dev_attr_regs = &dev_attr_fm_regs;
+ p_wrp_fm_dev->dev_attr_risc_load = &dev_attr_fm_risc_load_val;
p_wrp_fm_dev->dev_fm_fpm_attr_regs = &dev_attr_fm_fpm_regs;
p_wrp_fm_dev->dev_fm_kg_attr_regs = &dev_attr_fm_kg_regs;
p_wrp_fm_dev->dev_fm_kg_pe_attr_regs = &dev_attr_fm_kg_pe_regs;
@@ -1239,6 +1282,9 @@ int fm_sysfs_create(struct device *dev)
if (device_create_file(dev, &dev_attr_fm_regs) != 0)
return -EIO;
+ if (device_create_file(dev, &dev_attr_fm_risc_load_val) != 0)
+ return -EIO;
+
if (device_create_file(dev, &dev_attr_fm_fpm_regs) != 0)
return -EIO;
diff --git a/include/uapi/linux/fmd/Peripherals/fm_pcd_ioctls.h b/include/uapi/linux/fmd/Peripherals/fm_pcd_ioctls.h
index ad655cc..325f186 100644
--- a/include/uapi/linux/fmd/Peripherals/fm_pcd_ioctls.h
+++ b/include/uapi/linux/fmd/Peripherals/fm_pcd_ioctls.h
@@ -2091,6 +2091,13 @@ typedef struct ioc_fm_pcd_manip_hdr_insrt_ip_params_t {
uint8_t last_pid_offset; /**< the offset of the last Protocol within
the inserted header */
uint16_t id; /**< 16 bit New IP ID */
+ bool dont_frag_overwrite;
+ /**< IPv4 only. DF is overwritten with the hash-result next-to-last byte.
+ * This byte is configured to be overwritten when RPD is set. */
+ uint8_t last_dst_offset;
+ /**< IPv6 only. if routing extension exist, user should set the offset of the destination address
+ * in order to calculate UDP checksum pseudo header;
+ * Otherwise set it to '0'. */
ioc_fm_pcd_manip_hdr_insrt_t insrt; /**< size and data to be inserted. */
} ioc_fm_pcd_manip_hdr_insrt_ip_params_t;
#endif /* (DPAA_VERSION >= 11) */