1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2018 Intel Corporation
*/
#ifndef _IPH_H_
#define _IPH_H_
/**
* @file iph.h
* Contains functions/structures/macros to manipulate IPv4/IPv6 headers
* used internally by ipsec library.
*/
/*
* Move preceding (L3) headers down to remove ESP header and IV.
*/
static inline void
remove_esph(char *np, char *op, uint32_t hlen)
{
uint32_t i;
for (i = hlen; i-- != 0; np[i] = op[i])
;
}
/*
* Move preceding (L3) headers up to free space for ESP header and IV.
*/
static inline void
insert_esph(char *np, char *op, uint32_t hlen)
{
uint32_t i;
for (i = 0; i != hlen; i++)
np[i] = op[i];
}
/* update original ip header fields for transport case */
static inline int
update_trs_l3hdr(const struct rte_ipsec_sa *sa, void *p, uint32_t plen,
uint32_t l2len, uint32_t l3len, uint8_t proto)
{
struct ipv4_hdr *v4h;
struct ipv6_hdr *v6h;
int32_t rc;
if ((sa->type & RTE_IPSEC_SATP_IPV_MASK) == RTE_IPSEC_SATP_IPV4) {
v4h = p;
rc = v4h->next_proto_id;
v4h->next_proto_id = proto;
v4h->total_length = rte_cpu_to_be_16(plen - l2len);
} else if (l3len == sizeof(*v6h)) {
v6h = p;
rc = v6h->proto;
v6h->proto = proto;
v6h->payload_len = rte_cpu_to_be_16(plen - l2len -
sizeof(*v6h));
/* need to add support for IPv6 with options */
} else
rc = -ENOTSUP;
return rc;
}
/* update original and new ip header fields for tunnel case */
static inline void
update_tun_l3hdr(const struct rte_ipsec_sa *sa, void *p, uint32_t plen,
uint32_t l2len, rte_be16_t pid)
{
struct ipv4_hdr *v4h;
struct ipv6_hdr *v6h;
if (sa->type & RTE_IPSEC_SATP_MODE_TUNLV4) {
v4h = p;
v4h->packet_id = pid;
v4h->total_length = rte_cpu_to_be_16(plen - l2len);
} else {
v6h = p;
v6h->payload_len = rte_cpu_to_be_16(plen - l2len -
sizeof(*v6h));
}
}
#endif /* _IPH_H_ */
|