examples/ipsec-secgw: convert IV to big endian
[dpdk.git] / examples / ipsec-secgw / esp.c
index 56ad7a0..a63fb95 100644 (file)
@@ -211,7 +211,8 @@ esp_inbound_post(struct rte_mbuf *m, struct ipsec_sa *sa,
                        /* XXX No option headers supported */
                        memmove(ip6, ip, sizeof(struct ip6_hdr));
                        ip6->ip6_nxt = *nexthdr;
-                       ip6->ip6_plen = htons(rte_pktmbuf_data_len(m));
+                       ip6->ip6_plen = htons(rte_pktmbuf_data_len(m) -
+                                             sizeof(struct ip6_hdr));
                }
        } else
                ipip_inbound(m, sizeof(struct esp_hdr) + sa->iv_len);
@@ -313,7 +314,8 @@ esp_outbound(struct rte_mbuf *m, struct ipsec_sa *sa,
                } else {
                        ip6 = (struct ip6_hdr *)new_ip;
                        ip6->ip6_nxt = IPPROTO_ESP;
-                       ip6->ip6_plen = htons(rte_pktmbuf_data_len(m));
+                       ip6->ip6_plen = htons(rte_pktmbuf_data_len(m) -
+                                             sizeof(struct ip6_hdr));
                }
        }
 
@@ -329,7 +331,7 @@ esp_outbound(struct rte_mbuf *m, struct ipsec_sa *sa,
        if (sa->aead_algo == RTE_CRYPTO_AEAD_AES_GCM) {
                uint8_t *aad;
 
-               *iv = sa->seq;
+               *iv = rte_cpu_to_be_64(sa->seq);
                sym_cop->aead.data.offset = ip_hdr_len +
                        sizeof(struct esp_hdr) + sa->iv_len;
                sym_cop->aead.data.length = pad_payload_len;
@@ -342,7 +344,7 @@ esp_outbound(struct rte_mbuf *m, struct ipsec_sa *sa,
 
                struct cnt_blk *icb = get_cnt_blk(m);
                icb->salt = sa->salt;
-               icb->iv = sa->seq;
+               icb->iv = rte_cpu_to_be_64(sa->seq);
                icb->cnt = rte_cpu_to_be_32(1);
 
                aad = get_aad(m);
@@ -365,7 +367,7 @@ esp_outbound(struct rte_mbuf *m, struct ipsec_sa *sa,
                        sym_cop->cipher.data.length = pad_payload_len + sa->iv_len;
                        break;
                case RTE_CRYPTO_CIPHER_AES_CTR:
-                       *iv = sa->seq;
+                       *iv = rte_cpu_to_be_64(sa->seq);
                        sym_cop->cipher.data.offset = ip_hdr_len +
                                sizeof(struct esp_hdr) + sa->iv_len;
                        sym_cop->cipher.data.length = pad_payload_len;
@@ -384,7 +386,7 @@ esp_outbound(struct rte_mbuf *m, struct ipsec_sa *sa,
 
                struct cnt_blk *icb = get_cnt_blk(m);
                icb->salt = sa->salt;
-               icb->iv = sa->seq;
+               icb->iv = rte_cpu_to_be_64(sa->seq);
                icb->cnt = rte_cpu_to_be_32(1);
 
                switch (sa->auth_algo) {