> On 9/23/2021 5:43 PM, Ananyev, Konstantin wrote:
> >
> >> Add support for the IPsec NAT-Traversal use case for Tunnel mode
> >> packets.
> >>
> >> Signed-off-by: Declan Doherty <declan.dohe...@intel.com>
> >> Signed-off-by: Radu Nicolau <radu.nico...@intel.com>
> >> Signed-off-by: Abhijit Sinha <abhijit.si...@intel.com>
> >> Signed-off-by: Daniel Martin Buckley <daniel.m.buck...@intel.com>
> >> Acked-by: Fan Zhang <roy.fan.zh...@intel.com>
> >> ---
> >>   lib/ipsec/iph.h          | 17 +++++++++++++++++
> >>   lib/ipsec/rte_ipsec_sa.h |  8 +++++++-
> >>   lib/ipsec/sa.c           | 13 ++++++++++++-
> >>   lib/ipsec/sa.h           |  4 ++++
> >>   4 files changed, 40 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/lib/ipsec/iph.h b/lib/ipsec/iph.h
> >> index 2d223199ac..c5c213a2b4 100644
> >> --- a/lib/ipsec/iph.h
> >> +++ b/lib/ipsec/iph.h
> >> @@ -251,6 +251,7 @@ update_tun_outb_l3hdr(const struct rte_ipsec_sa *sa, 
> >> void *outh,
> >>   {
> >>    struct rte_ipv4_hdr *v4h;
> >>    struct rte_ipv6_hdr *v6h;
> >> +  struct rte_udp_hdr *udph;
> >>    uint8_t is_outh_ipv4;
> >>
> >>    if (sa->type & RTE_IPSEC_SATP_MODE_TUNLV4) {
> >> @@ -258,11 +259,27 @@ update_tun_outb_l3hdr(const struct rte_ipsec_sa *sa, 
> >> void *outh,
> >>            v4h = outh;
> >>            v4h->packet_id = pid;
> >>            v4h->total_length = rte_cpu_to_be_16(plen - l2len);
> >> +
> >> +          if (sa->type & RTE_IPSEC_SATP_NATT_ENABLE) {
> >> +                  udph = (struct rte_udp_hdr *)(v4h + 1);
> >> +                  udph->dst_port = sa->natt.dport;
> >> +                  udph->src_port = sa->natt.sport;
> >> +                  udph->dgram_len = rte_cpu_to_be_16(plen - l2len -
> >> +                          (sizeof(*v4h) + sizeof(*udph)));
> >> +          }
> >>    } else {
> >>            is_outh_ipv4 = 0;
> >>            v6h = outh;
> >>            v6h->payload_len = rte_cpu_to_be_16(plen - l2len -
> >>                            sizeof(*v6h));
> >> +
> >> +          if (sa->type & RTE_IPSEC_SATP_NATT_ENABLE) {
> >> +                  udph = (struct rte_udp_hdr *)(v6h + 1);
> > Why you presume there would be always ipv6 with no options?
> > Shouldn't we use hdr_l3_len provided by user?
> 
> Yes, I will use hdr_l3_len.
> 
> > Another thing - I am not sure we need 'natt' field in rte_ipsec_sa at all.
> > UDP header (sport, dport) is consitant and could be part of header template
> > provided by user at sa initialization time.
> 
> The rte_security_ipsec_sa_options::udp_encap flag assumes that the UDP
> encapsulation i.e. adding the header is not the responsibility of the
> user, so we can append it (transparently to the user) to the header
> template but the user should not do it. Will this work?

Interesting idea, I suppose that should work...
Do I get it right, this udp header will always be appended to the end of
user provided tun.hdr?

> 
> 
> >
> >> +                  udph->dst_port = sa->natt.dport;
> >> +                  udph->src_port = sa->natt.sport;
> >> +                  udph->dgram_len = rte_cpu_to_be_16(plen - l2len -
> >> +                          (sizeof(*v6h) + sizeof(*udph)));
> > Whose responsibility will be to update cksum field?
> According to the RFC it should be zero and the rx side must not
> check/use it. I will set it as zero

Reply via email to