* @txbuf: Pointer to driver soft TX descriptor
  * @txd: Pointer to HW TX descriptor
  * @skb: Pointer to SKB
+ * @md_bytes: Prepend length
  *
  * Set up Tx descriptor for LSO, do nothing for non-LSO skbs.
  * Return error on packet header greater than maximum supported LSO header size.
  */
 static void nfp_net_tx_tso(struct nfp_net_r_vector *r_vec,
                           struct nfp_net_tx_buf *txbuf,
-                          struct nfp_net_tx_desc *txd, struct sk_buff *skb)
+                          struct nfp_net_tx_desc *txd, struct sk_buff *skb,
+                          u32 md_bytes)
 {
-       u32 hdrlen;
+       u32 l3_offset, l4_offset, hdrlen;
        u16 mss;
 
        if (!skb_is_gso(skb))
                return;
 
        if (!skb->encapsulation) {
-               txd->l3_offset = skb_network_offset(skb);
-               txd->l4_offset = skb_transport_offset(skb);
+               l3_offset = skb_network_offset(skb);
+               l4_offset = skb_transport_offset(skb);
                hdrlen = skb_transport_offset(skb) + tcp_hdrlen(skb);
        } else {
-               txd->l3_offset = skb_inner_network_offset(skb);
-               txd->l4_offset = skb_inner_transport_offset(skb);
+               l3_offset = skb_inner_network_offset(skb);
+               l4_offset = skb_inner_transport_offset(skb);
                hdrlen = skb_inner_transport_header(skb) - skb->data +
                        inner_tcp_hdrlen(skb);
        }
        txbuf->real_len += hdrlen * (txbuf->pkt_cnt - 1);
 
        mss = skb_shinfo(skb)->gso_size & PCIE_DESC_TX_MSS_MASK;
-       txd->lso_hdrlen = hdrlen;
+       txd->l3_offset = l3_offset - md_bytes;
+       txd->l4_offset = l4_offset - md_bytes;
+       txd->lso_hdrlen = hdrlen - md_bytes;
        txd->mss = cpu_to_le16(mss);
        txd->flags |= PCIE_DESC_TX_LSO;
 
        txd->lso_hdrlen = 0;
 
        /* Do not reorder - tso may adjust pkt cnt, vlan may override fields */
-       nfp_net_tx_tso(r_vec, txbuf, txd, skb);
+       nfp_net_tx_tso(r_vec, txbuf, txd, skb, md_bytes);
        nfp_net_tx_csum(dp, r_vec, txbuf, txd, skb);
        if (skb_vlan_tag_present(skb) && dp->ctrl & NFP_NET_CFG_CTRL_TXVLAN) {
                txd->flags |= PCIE_DESC_TX_VLAN;