static_always_inline void
esp_update_ip4_hdr (ip4_header_t * ip4, u16 len, int is_transport, int is_udp)
{
- ip_csum_t sum = ip4->checksum;
- u16 old_len = 0;
+ ip_csum_t sum;
+ u16 old_len;
+
+ len = clib_net_to_host_u16 (len);
+ old_len = ip4->length;
if (is_transport)
{
u8 prot = is_udp ? IP_PROTOCOL_UDP : IP_PROTOCOL_IPSEC_ESP;
- old_len = ip4->length;
- sum = ip_csum_update (sum, ip4->protocol, prot, ip4_header_t, protocol);
+
+ sum = ip_csum_update (ip4->checksum, ip4->protocol,
+ prot, ip4_header_t, protocol);
ip4->protocol = prot;
+
+ sum = ip_csum_update (sum, old_len, len, ip4_header_t, length);
}
+ else
+ sum = ip_csum_update (ip4->checksum, old_len, len, ip4_header_t, length);
- ip4->length = len = clib_net_to_host_u16 (len);
- sum = ip_csum_update (ip4->checksum, old_len, len, ip4_header_t, length);
+ ip4->length = len;
ip4->checksum = ip_csum_fold (sum);
}
u16 len;
ip4_header_t *ip4 = (ip4_header_t *) (ip_hdr);
*next_hdr_ptr = ip4->protocol;
- len = payload_len + hdr_len + l2_len;
+ len = payload_len + hdr_len - l2_len;
if (udp)
{
esp_update_ip4_hdr (ip4, len, /* is_transport */ 1, 1);
vnet_crypto_op_init (op, sa0->crypto_enc_op_id);
op->iv = payload - iv_sz;
op->src = op->dst = payload;
- op->key = sa0->crypto_key.data;
+ op->key_index = sa0->crypto_key_index;
op->len = payload_len - icv_sz;
op->flags = VNET_CRYPTO_OP_FLAG_INIT_IV;
op->user_data = b - bufs;
vnet_crypto_op_init (op, sa0->integ_op_id);
op->src = payload - iv_sz - sizeof (esp_header_t);
op->digest = payload + payload_len - icv_sz;
- op->key = sa0->integ_key.data;
- op->key_len = sa0->integ_key.len;
+ op->key_index = sa0->integ_key_index;
op->digest_len = icv_sz;
op->len = payload_len - icv_sz + iv_sz + sizeof (esp_header_t);
op->user_data = b - bufs;