Update rte_table_action_ipv6_header and rte_table_action_nat_params to
use rte_ipv6_addr structures instead of uint8_t[16] arrays.

Signed-off-by: Robin Jarry <rja...@redhat.com>
---

Notes:
    v3:
    
    - replace *memcpy() with direct struct assignments
    - replace more uint8_t arrays with rte_ipv6_addr in examples

 doc/guides/rel_notes/deprecation.rst   |  2 -
 doc/guides/rel_notes/release_24_11.rst |  1 +
 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_table_action.c        | 36 ++++++---------
 lib/pipeline/rte_table_action.h        |  7 +--
 9 files changed, 56 insertions(+), 77 deletions(-)

diff --git a/doc/guides/rel_notes/deprecation.rst 
b/doc/guides/rel_notes/deprecation.rst
index c268c497834c..fcccb22593d8 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 4b2f6627b0d0..e517b5e5abe2 100644
--- a/doc/guides/rel_notes/release_24_11.rst
+++ b/doc/guides/rel_notes/release_24_11.rst
@@ -147,6 +147,7 @@ API Changes
 * rib6,fib6,lpm6: All public API functions were modified to use ``struct 
rte_ipv6_addr`` instead of ``uint8_t[16]`` parameters.
 * cmdline: ``cmdline_ipaddr_t`` was modified to use ``struct rte_ipv6_addr`` 
instead of ``in6_addr``.
 * node: ``rte_node_ip6_route_add()`` was modified to use a ``struct 
rte_ipv6_addr`` instead of ``uint8_t[16]`` parameter.
+* pipeline: ``rte_table_action_ipv6_header`` and 
``rte_table_action_nat_params`` were modified to use ``struct rte_ipv6_addr`` 
instead of ``uint8_t[16]`` fields.
 
 ABI Changes
 -----------
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 <stdint.h>
 
 #include <rte_ip.h>
+#include <rte_ip6.h>
 #include <rte_ether.h>
 
 #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_table_action.c b/lib/pipeline/rte_table_action.c
index 89a63f024a1f..60b291bad4b8 100644
--- a/lib/pipeline/rte_table_action.c
+++ b/lib/pipeline/rte_table_action.c
@@ -872,12 +872,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);
@@ -907,12 +903,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);
@@ -1211,7 +1203,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;
 
@@ -1258,7 +1250,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);
        }
 
@@ -1438,11 +1430,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 {
@@ -1451,11 +1443,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;
                }
@@ -1466,11 +1458,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 {
@@ -1479,11 +1471,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 <rte_compat.h>
 #include <rte_ether.h>
+#include <rte_ip6.h>
 #include <rte_meter.h>
 #include <rte_table_hash.h>
 
@@ -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.46.2

Reply via email to