From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id C819345B68; Fri, 18 Oct 2024 11:19:05 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 5F65C40E11; Fri, 18 Oct 2024 11:18:25 +0200 (CEST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mails.dpdk.org (Postfix) with ESMTP id 4921D40E01 for ; Fri, 18 Oct 2024 11:18:20 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1729243099; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=vnSDRrz2o1nrNfDzCR50+qZQ/4UIi1szim2tuT/KOe0=; b=dAb1z7k3h4KVKRri7FM0yQztYS3hYDUbiMAoXYUCTZ0QI81WQgrgbjuUM6pbgRHHQ51uJ/ 1Xb609W7miWNk8g5uMlZ4U7tS6Mv6UFJJ6wrlIGnGaXsMzGRmFQym95AJJm8DJ5nAo+wZS mvtQQezsZaAJC+VNGhmExWDoIuswN24= Received: from mx-prod-mc-04.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-85-cx-bQ_gzMpCbS1lJ2GpCGw-1; Fri, 18 Oct 2024 05:18:18 -0400 X-MC-Unique: cx-bQ_gzMpCbS1lJ2GpCGw-1 Received: from mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.40]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 50DE31955F45; Fri, 18 Oct 2024 09:18:17 +0000 (UTC) Received: from ringo.redhat.com (unknown [10.39.208.23]) by mx-prod-int-04.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 0B04119560AD; Fri, 18 Oct 2024 09:18:15 +0000 (UTC) From: Robin Jarry To: dev@dpdk.org, Cristian Dumitrescu Subject: [PATCH dpdk v4 10/17] pipeline: use IPv6 structures Date: Fri, 18 Oct 2024 11:17:27 +0200 Message-ID: <20241018091734.64601-11-rjarry@redhat.com> In-Reply-To: <20241018091734.64601-1-rjarry@redhat.com> References: <20240821162516.610624-17-rjarry@redhat.com> <20241018091734.64601-1-rjarry@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.40 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII"; x-default=true X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Update rte_table_action_ipv6_header and rte_table_action_nat_params to use rte_ipv6_addr structures instead of uint8_t[16] arrays. For consistency, also update rte_swx_ipsec_sa_encap_params to use rte_ipv6_addr instead of in6_addr. Signed-off-by: Robin Jarry --- doc/guides/rel_notes/deprecation.rst | 2 - doc/guides/rel_notes/release_24_11.rst | 4 ++ examples/ip_pipeline/cli.c | 61 +++++++++++--------------- examples/ip_pipeline/parser.c | 2 +- examples/ip_pipeline/parser.h | 3 +- examples/ip_pipeline/pipeline.h | 6 +-- examples/ip_pipeline/thread.c | 15 +++---- lib/pipeline/rte_swx_ipsec.c | 16 ++++--- lib/pipeline/rte_swx_ipsec.h | 5 ++- lib/pipeline/rte_table_action.c | 36 ++++++--------- lib/pipeline/rte_table_action.h | 7 +-- 11 files changed, 72 insertions(+), 85 deletions(-) diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst index 14b7f151afc1..c41124ee6e4a 100644 --- a/doc/guides/rel_notes/deprecation.rst +++ b/doc/guides/rel_notes/deprecation.rst @@ -76,8 +76,6 @@ Deprecation Notices - ``struct rte_ipv6_tuple`` ipsec - ``struct rte_ipsec_sadv6_key`` - pipeline - - ``struct rte_table_action_ipv6_header`` * net, ethdev: The flow item ``RTE_FLOW_ITEM_TYPE_VXLAN_GPE`` is replaced with ``RTE_FLOW_ITEM_TYPE_VXLAN``. diff --git a/doc/guides/rel_notes/release_24_11.rst b/doc/guides/rel_notes/release_24_11.rst index 59d9338a59f8..cd6c4cf25ecc 100644 --- a/doc/guides/rel_notes/release_24_11.rst +++ b/doc/guides/rel_notes/release_24_11.rst @@ -306,6 +306,10 @@ API Changes - ``struct rte_ipv6_hdr`` node - ``rte_node_ip6_route_add()`` + pipeline + - ``struct rte_swx_ipsec_sa_encap_params`` + - ``struct rte_table_action_ipv6_header`` + - ``struct rte_table_action_nat_params`` table - ``struct rte_table_lpm_ipv6_key`` rib diff --git a/examples/ip_pipeline/cli.c b/examples/ip_pipeline/cli.c index e8269ea90c11..92dfacdeb0fe 100644 --- a/examples/ip_pipeline/cli.c +++ b/examples/ip_pipeline/cli.c @@ -2587,8 +2587,8 @@ struct pkt_key_ipv6_5tuple { uint16_t payload_length; uint8_t proto; uint8_t hop_limit; - uint8_t sa[16]; - uint8_t da[16]; + struct rte_ipv6_addr sa; + struct rte_ipv6_addr da; uint16_t sp; uint16_t dp; } __rte_packed; @@ -2598,7 +2598,7 @@ struct pkt_key_ipv4_addr { } __rte_packed; struct pkt_key_ipv6_addr { - uint8_t addr[16]; + struct rte_ipv6_addr addr; } __rte_packed; static uint32_t @@ -2654,7 +2654,7 @@ parse_match(char **tokens, } m->match.acl.ipv4.da = rte_be_to_cpu_32(daddr.s_addr); } else if (strcmp(tokens[4], "ipv6") == 0) { - struct in6_addr saddr, daddr; + struct rte_ipv6_addr saddr, daddr; m->match.acl.ip_version = 0; @@ -2662,13 +2662,13 @@ parse_match(char **tokens, snprintf(out, out_size, MSG_ARG_INVALID, "sa"); return 0; } - memcpy(m->match.acl.ipv6.sa, saddr.s6_addr, 16); + m->match.acl.ipv6.sa = saddr; if (parse_ipv6_addr(tokens[7], &daddr) != 0) { snprintf(out, out_size, MSG_ARG_INVALID, "da"); return 0; } - memcpy(m->match.acl.ipv6.da, daddr.s6_addr, 16); + m->match.acl.ipv6.da = daddr; } else { snprintf(out, out_size, MSG_ARG_NOT_FOUND, "ipv4 or ipv6"); @@ -2810,7 +2810,7 @@ parse_match(char **tokens, if (strcmp(tokens[2], "ipv6_5tuple") == 0) { struct pkt_key_ipv6_5tuple *ipv6 = (struct pkt_key_ipv6_5tuple *) m->match.hash.key; - struct in6_addr saddr, daddr; + struct rte_ipv6_addr saddr, daddr; uint16_t sp, dp; uint8_t proto; @@ -2846,8 +2846,8 @@ parse_match(char **tokens, return 0; } - memcpy(ipv6->sa, saddr.s6_addr, 16); - memcpy(ipv6->da, daddr.s6_addr, 16); + ipv6->sa = saddr; + ipv6->da = daddr; ipv6->sp = rte_cpu_to_be_16(sp); ipv6->dp = rte_cpu_to_be_16(dp); ipv6->proto = proto; @@ -2880,7 +2880,7 @@ parse_match(char **tokens, if (strcmp(tokens[2], "ipv6_addr") == 0) { struct pkt_key_ipv6_addr *ipv6_addr = (struct pkt_key_ipv6_addr *) m->match.hash.key; - struct in6_addr addr; + struct rte_ipv6_addr addr; if (n_tokens < 4) { snprintf(out, out_size, MSG_ARG_MISMATCH, @@ -2894,7 +2894,7 @@ parse_match(char **tokens, return 0; } - memcpy(ipv6_addr->addr, addr.s6_addr, 16); + ipv6_addr->addr = addr; return 4; } /* hash ipv6_5tuple */ @@ -2955,7 +2955,7 @@ parse_match(char **tokens, m->match.lpm.ipv4 = rte_be_to_cpu_32(addr.s_addr); } else if (strcmp(tokens[2], "ipv6") == 0) { - struct in6_addr addr; + struct rte_ipv6_addr addr; m->match.lpm.ip_version = 0; @@ -2965,7 +2965,7 @@ parse_match(char **tokens, return 0; } - memcpy(m->match.lpm.ipv6, addr.s6_addr, 16); + m->match.lpm.ipv6 = addr; } else { snprintf(out, out_size, MSG_ARG_MISMATCH, "ipv4 or ipv6"); @@ -3527,7 +3527,7 @@ parse_table_action_encap(char **tokens, tokens += 5; n += 5; } else if (strcmp(tokens[0], "ipv6") == 0) { - struct in6_addr sa, da; + struct rte_ipv6_addr sa, da; uint32_t flow_label; uint8_t dscp, hop_limit; @@ -3540,8 +3540,8 @@ parse_table_action_encap(char **tokens, parser_read_uint8(&hop_limit, tokens[5])) return 0; - memcpy(a->encap.vxlan.ipv6.sa, sa.s6_addr, 16); - memcpy(a->encap.vxlan.ipv6.da, da.s6_addr, 16); + a->encap.vxlan.ipv6.sa = sa; + a->encap.vxlan.ipv6.da = da; a->encap.vxlan.ipv6.flow_label = flow_label; a->encap.vxlan.ipv6.dscp = dscp; a->encap.vxlan.ipv6.hop_limit = hop_limit; @@ -3607,7 +3607,7 @@ parse_table_action_nat(char **tokens, } if (strcmp(tokens[1], "ipv6") == 0) { - struct in6_addr addr; + struct rte_ipv6_addr addr; uint16_t port; if (parse_ipv6_addr(tokens[2], &addr) || @@ -3615,7 +3615,7 @@ parse_table_action_nat(char **tokens, return 0; a->nat.ip_version = 0; - memcpy(a->nat.addr.ipv6, addr.s6_addr, 16); + a->nat.addr.ipv6 = addr; a->nat.port = port; a->action_mask |= 1 << RTE_TABLE_ACTION_NAT; return 4; @@ -4700,18 +4700,9 @@ ipv4_addr_show(FILE *f, uint32_t addr) } static void -ipv6_addr_show(FILE *f, uint8_t *addr) +ipv6_addr_show(FILE *f, const struct rte_ipv6_addr *ip) { - fprintf(f, "%02x%02x:%02x%02x:%02x%02x:%02x%02x:" - "%02x%02x:%02x%02x:%02x%02x:%02x%02x:", - (uint32_t)addr[0], (uint32_t)addr[1], - (uint32_t)addr[2], (uint32_t)addr[3], - (uint32_t)addr[4], (uint32_t)addr[5], - (uint32_t)addr[6], (uint32_t)addr[7], - (uint32_t)addr[8], (uint32_t)addr[9], - (uint32_t)addr[10], (uint32_t)addr[11], - (uint32_t)addr[12], (uint32_t)addr[13], - (uint32_t)addr[14], (uint32_t)addr[15]); + fprintf(f, RTE_IPV6_ADDR_FMT ":", RTE_IPV6_ADDR_SPLIT(ip)); } static const char * @@ -4769,14 +4760,14 @@ table_rule_show(const char *pipeline_name, if (m->match.acl.ip_version) ipv4_addr_show(f, m->match.acl.ipv4.sa); else - ipv6_addr_show(f, m->match.acl.ipv6.sa); + ipv6_addr_show(f, &m->match.acl.ipv6.sa); fprintf(f, "%u", m->match.acl.sa_depth); if (m->match.acl.ip_version) ipv4_addr_show(f, m->match.acl.ipv4.da); else - ipv6_addr_show(f, m->match.acl.ipv6.da); + ipv6_addr_show(f, &m->match.acl.ipv6.da); fprintf(f, "%u", m->match.acl.da_depth); @@ -4808,7 +4799,7 @@ table_rule_show(const char *pipeline_name, if (m->match.acl.ip_version) ipv4_addr_show(f, m->match.lpm.ipv4); else - ipv6_addr_show(f, m->match.lpm.ipv6); + ipv6_addr_show(f, &m->match.lpm.ipv6); fprintf(f, "%u ", (uint32_t)m->match.lpm.depth); @@ -4956,9 +4947,9 @@ table_rule_show(const char *pipeline_name, (uint32_t)a->encap.vxlan.ipv4.ttl); } else { fprintf(f, " ipv6 "); - ipv6_addr_show(f, a->encap.vxlan.ipv6.sa); + ipv6_addr_show(f, &a->encap.vxlan.ipv6.sa); fprintf(f, " "); - ipv6_addr_show(f, a->encap.vxlan.ipv6.da); + ipv6_addr_show(f, &a->encap.vxlan.ipv6.da); fprintf(f, " %u %u %u ", a->encap.vxlan.ipv6.flow_label, (uint32_t)a->encap.vxlan.ipv6.dscp, @@ -4980,7 +4971,7 @@ table_rule_show(const char *pipeline_name, if (a->nat.ip_version) ipv4_addr_show(f, a->nat.addr.ipv4); else - ipv6_addr_show(f, a->nat.addr.ipv6); + ipv6_addr_show(f, &a->nat.addr.ipv6); fprintf(f, " %u ", (uint32_t)(a->nat.port)); } diff --git a/examples/ip_pipeline/parser.c b/examples/ip_pipeline/parser.c index 62fc52f9db78..dfca026be58b 100644 --- a/examples/ip_pipeline/parser.c +++ b/examples/ip_pipeline/parser.c @@ -387,7 +387,7 @@ parse_ipv4_addr(const char *token, struct in_addr *ipv4) } int -parse_ipv6_addr(const char *token, struct in6_addr *ipv6) +parse_ipv6_addr(const char *token, struct rte_ipv6_addr *ipv6) { if (strlen(token) >= INET6_ADDRSTRLEN) return -EINVAL; diff --git a/examples/ip_pipeline/parser.h b/examples/ip_pipeline/parser.h index 32b5ff99764b..758e0032ddc8 100644 --- a/examples/ip_pipeline/parser.h +++ b/examples/ip_pipeline/parser.h @@ -9,6 +9,7 @@ #include #include +#include #include #define PARSE_DELIMITER " \f\n\r\t\v" @@ -39,7 +40,7 @@ int parser_read_uint8_hex(uint8_t *value, const char *p); int parse_hex_string(char *src, uint8_t *dst, uint32_t *size); int parse_ipv4_addr(const char *token, struct in_addr *ipv4); -int parse_ipv6_addr(const char *token, struct in6_addr *ipv6); +int parse_ipv6_addr(const char *token, struct rte_ipv6_addr *ipv6); int parse_mac_addr(const char *token, struct rte_ether_addr *addr); int parse_mpls_labels(char *string, uint32_t *labels, uint32_t *n_labels); diff --git a/examples/ip_pipeline/pipeline.h b/examples/ip_pipeline/pipeline.h index 22f04fd752ca..89696480fc01 100644 --- a/examples/ip_pipeline/pipeline.h +++ b/examples/ip_pipeline/pipeline.h @@ -218,8 +218,8 @@ struct table_rule_match_acl { } ipv4; struct { - uint8_t sa[16]; - uint8_t da[16]; + struct rte_ipv6_addr sa; + struct rte_ipv6_addr da; } ipv6; }; @@ -255,7 +255,7 @@ struct table_rule_match_lpm { union { uint32_t ipv4; - uint8_t ipv6[16]; + struct rte_ipv6_addr ipv6; }; uint8_t depth; diff --git a/examples/ip_pipeline/thread.c b/examples/ip_pipeline/thread.c index 9d8082b73080..0a44bddd90fc 100644 --- a/examples/ip_pipeline/thread.c +++ b/examples/ip_pipeline/thread.c @@ -2409,10 +2409,8 @@ match_convert(struct table_rule_match *mh, } else if (add) { - uint32_t *sa32 = - (uint32_t *) mh->match.acl.ipv6.sa; - uint32_t *da32 = - (uint32_t *) mh->match.acl.ipv6.da; + uint32_t *sa32 = (uint32_t *)&mh->match.acl.ipv6.sa; + uint32_t *da32 = (uint32_t *)&mh->match.acl.ipv6.da; uint32_t sa32_depth[4], da32_depth[4]; int status; @@ -2480,10 +2478,8 @@ match_convert(struct table_rule_match *mh, ml->acl_add.priority = (int32_t) mh->match.acl.priority; } else { - uint32_t *sa32 = - (uint32_t *) mh->match.acl.ipv6.sa; - uint32_t *da32 = - (uint32_t *) mh->match.acl.ipv6.da; + uint32_t *sa32 = (uint32_t *)&mh->match.acl.ipv6.sa; + uint32_t *da32 = (uint32_t *)&mh->match.acl.ipv6.da; uint32_t sa32_depth[4], da32_depth[4]; int status; @@ -2563,8 +2559,7 @@ match_convert(struct table_rule_match *mh, ml->lpm_ipv4.ip = mh->match.lpm.ipv4; ml->lpm_ipv4.depth = mh->match.lpm.depth; } else { - memcpy(&ml->lpm_ipv6.ip, - mh->match.lpm.ipv6, sizeof(ml->lpm_ipv6.ip)); + ml->lpm_ipv6.ip = mh->match.lpm.ipv6; ml->lpm_ipv6.depth = mh->match.lpm.depth; } diff --git a/lib/pipeline/rte_swx_ipsec.c b/lib/pipeline/rte_swx_ipsec.c index 0ed0ecd134c8..6bc81145409b 100644 --- a/lib/pipeline/rte_swx_ipsec.c +++ b/lib/pipeline/rte_swx_ipsec.c @@ -1320,14 +1320,14 @@ rte_swx_ipsec_sa_read(struct rte_swx_ipsec *ipsec __rte_unused, CHECK(!strcmp(t[2], "srcaddr"), "Missing \"srcaddr\" keyword"); status = hex_string_parse(t[3], - p->encap.tunnel.ipv6.src_addr.s6_addr, + p->encap.tunnel.ipv6.src_addr.a, 16); CHECK(!status, "Tunnel IPv6 source address invalid format"); CHECK(!strcmp(t[4], "dstaddr"), "Missing \"dstaddr\" keyword"); status = hex_string_parse(t[5], - p->encap.tunnel.ipv6.dst_addr.s6_addr, + p->encap.tunnel.ipv6.dst_addr.a, 16); CHECK(!status, "Tunnel IPv6 destination address invalid format"); @@ -1386,11 +1386,11 @@ tunnel_ipv6_header_set(struct rte_ipv6_hdr *h, struct rte_swx_ipsec_sa_params *p .payload_len = 0, /* Cannot be pre-computed. */ .proto = IPPROTO_ESP, .hop_limits = 64, + .src_addr = p->encap.tunnel.ipv6.src_addr, + .dst_addr = p->encap.tunnel.ipv6.dst_addr, }; memcpy(h, &ipv6_hdr, sizeof(ipv6_hdr)); - memcpy(&h->src_addr, p->encap.tunnel.ipv6.src_addr.s6_addr, 16); - memcpy(&h->dst_addr, p->encap.tunnel.ipv6.dst_addr.s6_addr, 16); } /* IPsec library SA parameters. */ @@ -1579,8 +1579,12 @@ ipsec_xform_get(struct rte_swx_ipsec_sa_params *p, ipsec_xform->tunnel.ipv4.df = 0; ipsec_xform->tunnel.ipv4.ttl = 64; } else { - ipsec_xform->tunnel.ipv6.src_addr = p->encap.tunnel.ipv6.src_addr; - ipsec_xform->tunnel.ipv6.dst_addr = p->encap.tunnel.ipv6.dst_addr; + memcpy(&ipsec_xform->tunnel.ipv6.src_addr, + &p->encap.tunnel.ipv6.src_addr, + sizeof(ipsec_xform->tunnel.ipv6.src_addr)); + memcpy(&ipsec_xform->tunnel.ipv6.dst_addr, + &p->encap.tunnel.ipv6.dst_addr, + sizeof(ipsec_xform->tunnel.ipv6.dst_addr)); ipsec_xform->tunnel.ipv6.dscp = 0; ipsec_xform->tunnel.ipv6.flabel = 0; ipsec_xform->tunnel.ipv6.hlimit = 64; diff --git a/lib/pipeline/rte_swx_ipsec.h b/lib/pipeline/rte_swx_ipsec.h index d2e5abef7d61..6cff18084f9c 100644 --- a/lib/pipeline/rte_swx_ipsec.h +++ b/lib/pipeline/rte_swx_ipsec.h @@ -48,6 +48,7 @@ #include #include +#include #ifdef __cplusplus extern "C" { @@ -248,10 +249,10 @@ struct rte_swx_ipsec_sa_encap_params { /** IPv6 header. */ struct { /** Source address. */ - struct in6_addr src_addr; + struct rte_ipv6_addr src_addr; /** Destination address. */ - struct in6_addr dst_addr; + struct rte_ipv6_addr dst_addr; } ipv6; } tunnel; }; diff --git a/lib/pipeline/rte_table_action.c b/lib/pipeline/rte_table_action.c index c0be656536eb..a7e63b984643 100644 --- a/lib/pipeline/rte_table_action.c +++ b/lib/pipeline/rte_table_action.c @@ -871,12 +871,8 @@ encap_vxlan_apply(void *data, d->ipv6.payload_len = 0; /* not pre-computed */ d->ipv6.proto = IP_PROTO_UDP; d->ipv6.hop_limits = p->vxlan.ipv6.hop_limit; - memcpy(&d->ipv6.src_addr, - p->vxlan.ipv6.sa, - sizeof(p->vxlan.ipv6.sa)); - memcpy(&d->ipv6.dst_addr, - p->vxlan.ipv6.da, - sizeof(p->vxlan.ipv6.da)); + d->ipv6.src_addr = p->vxlan.ipv6.sa; + d->ipv6.dst_addr = p->vxlan.ipv6.da; /* UDP */ d->udp.src_port = rte_htons(p->vxlan.udp.sp); @@ -906,12 +902,8 @@ encap_vxlan_apply(void *data, d->ipv6.payload_len = 0; /* not pre-computed */ d->ipv6.proto = IP_PROTO_UDP; d->ipv6.hop_limits = p->vxlan.ipv6.hop_limit; - memcpy(&d->ipv6.src_addr, - p->vxlan.ipv6.sa, - sizeof(p->vxlan.ipv6.sa)); - memcpy(&d->ipv6.dst_addr, - p->vxlan.ipv6.da, - sizeof(p->vxlan.ipv6.da)); + d->ipv6.src_addr = p->vxlan.ipv6.sa; + d->ipv6.dst_addr = p->vxlan.ipv6.da; /* UDP */ d->udp.src_port = rte_htons(p->vxlan.udp.sp); @@ -1210,7 +1202,7 @@ struct nat_ipv4_data { } __rte_packed; struct nat_ipv6_data { - uint8_t addr[16]; + struct rte_ipv6_addr addr; uint16_t port; } __rte_packed; @@ -1257,7 +1249,7 @@ nat_apply(void *data, } else { struct nat_ipv6_data *d = data; - memcpy(d->addr, p->addr.ipv6, sizeof(d->addr)); + d->addr = p->addr.ipv6; d->port = rte_htons(p->port); } @@ -1437,11 +1429,11 @@ pkt_ipv6_work_nat(struct rte_ipv6_hdr *ip, tcp_cksum = nat_ipv6_tcp_udp_checksum_update(tcp->cksum, (uint16_t *)&ip->src_addr, - (uint16_t *)data->addr, + (uint16_t *)&data->addr, tcp->src_port, data->port); - rte_memcpy(&ip->src_addr, data->addr, 16); + ip->src_addr = data->addr; tcp->src_port = data->port; tcp->cksum = tcp_cksum; } else { @@ -1450,11 +1442,11 @@ pkt_ipv6_work_nat(struct rte_ipv6_hdr *ip, udp_cksum = nat_ipv6_tcp_udp_checksum_update(udp->dgram_cksum, (uint16_t *)&ip->src_addr, - (uint16_t *)data->addr, + (uint16_t *)&data->addr, udp->src_port, data->port); - rte_memcpy(&ip->src_addr, data->addr, 16); + ip->src_addr = data->addr; udp->src_port = data->port; udp->dgram_cksum = udp_cksum; } @@ -1465,11 +1457,11 @@ pkt_ipv6_work_nat(struct rte_ipv6_hdr *ip, tcp_cksum = nat_ipv6_tcp_udp_checksum_update(tcp->cksum, (uint16_t *)&ip->dst_addr, - (uint16_t *)data->addr, + (uint16_t *)&data->addr, tcp->dst_port, data->port); - rte_memcpy(&ip->dst_addr, data->addr, 16); + ip->dst_addr = data->addr; tcp->dst_port = data->port; tcp->cksum = tcp_cksum; } else { @@ -1478,11 +1470,11 @@ pkt_ipv6_work_nat(struct rte_ipv6_hdr *ip, udp_cksum = nat_ipv6_tcp_udp_checksum_update(udp->dgram_cksum, (uint16_t *)&ip->dst_addr, - (uint16_t *)data->addr, + (uint16_t *)&data->addr, udp->dst_port, data->port); - rte_memcpy(&ip->dst_addr, data->addr, 16); + ip->dst_addr = data->addr; udp->dst_port = data->port; udp->dgram_cksum = udp_cksum; } diff --git a/lib/pipeline/rte_table_action.h b/lib/pipeline/rte_table_action.h index bab4bfd2e23c..47a7bdfc01cc 100644 --- a/lib/pipeline/rte_table_action.h +++ b/lib/pipeline/rte_table_action.h @@ -56,6 +56,7 @@ #include #include +#include #include #include @@ -419,8 +420,8 @@ struct rte_table_action_ipv4_header { /** Pre-computed IPv6 header fields for encapsulation action. */ struct rte_table_action_ipv6_header { - uint8_t sa[16]; /**< Source address. */ - uint8_t da[16]; /**< Destination address. */ + struct rte_ipv6_addr sa; /**< Source address. */ + struct rte_ipv6_addr da; /**< Destination address. */ uint32_t flow_label; /**< Flow label. */ uint8_t dscp; /**< DiffServ Code Point (DSCP). */ uint8_t hop_limit; /**< Hop Limit (HL). */ @@ -597,7 +598,7 @@ struct rte_table_action_nat_params { uint32_t ipv4; /** IPv6 address; only valid when *ip_version* is set to 0. */ - uint8_t ipv6[16]; + struct rte_ipv6_addr ipv6; } addr; /** Port. */ -- 2.47.0