Skip to content

Commit

Permalink
fix up dpdk 24.11 issues with ipv6
Browse files Browse the repository at this point in the history
Signed-off-by: Keith Wiles <[email protected]>
  • Loading branch information
KeithWiles committed Oct 30, 2024
1 parent dea335e commit 867e183
Show file tree
Hide file tree
Showing 8 changed files with 70 additions and 77 deletions.
87 changes: 40 additions & 47 deletions app/pktgen-cmds.c
Original file line number Diff line number Diff line change
Expand Up @@ -157,15 +157,14 @@ pktgen_script_save(char *path)
(pkt->ipProto == PG_IPPROTO_TCP) ? "tcp"
: (pkt->ipProto == PG_IPPROTO_ICMP) ? "icmp"
: "udp");
fprintf(
fd, "set %d dst ip %s\n", i,
(pkt->ethType == RTE_ETHER_TYPE_IPV6)
? inet_ntop6(buff, sizeof(buff), pkt->ip_dst_addr.addr.ipv6.s6_addr, PG_PREFIXMAX)
: inet_ntop4(buff, sizeof(buff), ntohl(pkt->ip_dst_addr.addr.ipv4.s_addr),
0xFFFFFFFF));
fprintf(fd, "set %d dst ip %s\n", i,
(pkt->ethType == RTE_ETHER_TYPE_IPV6)
? inet_ntop6(buff, sizeof(buff), pkt->ip_dst_addr.addr.ipv6.a, PG_PREFIXMAX)
: inet_ntop4(buff, sizeof(buff), ntohl(pkt->ip_dst_addr.addr.ipv4.s_addr),
0xFFFFFFFF));
fprintf(fd, "set %d src ip %s\n", i,
(pkt->ethType == RTE_ETHER_TYPE_IPV6)
? inet_ntop6(buff, sizeof(buff), pkt->ip_src_addr.addr.ipv6.s6_addr,
? inet_ntop6(buff, sizeof(buff), pkt->ip_src_addr.addr.ipv6.a,
pkt->ip_src_addr.prefixlen)
: inet_ntop4(buff, sizeof(buff), ntohl(pkt->ip_src_addr.addr.ipv4.s_addr),
pkt->ip_mask));
Expand Down Expand Up @@ -331,13 +330,12 @@ pktgen_script_save(char *path)
fprintf(fd, "%s ", inet_mtoa(buff, sizeof(buff), &pkt->eth_src_addr));
fprintf(fd, "%s ",
(pkt->ethType == RTE_ETHER_TYPE_IPV6)
? inet_ntop6(buff, sizeof(buff), pkt->ip_dst_addr.addr.ipv6.s6_addr,
PG_PREFIXMAX)
? inet_ntop6(buff, sizeof(buff), pkt->ip_dst_addr.addr.ipv6.a, PG_PREFIXMAX)
: inet_ntop4(buff, sizeof(buff), htonl(pkt->ip_dst_addr.addr.ipv4.s_addr),
0xFFFFFFFF));
fprintf(fd, "%s ",
(pkt->ethType == RTE_ETHER_TYPE_IPV6)
? inet_ntop6(buff, sizeof(buff), pkt->ip_src_addr.addr.ipv6.s6_addr,
? inet_ntop6(buff, sizeof(buff), pkt->ip_src_addr.addr.ipv6.a,
pkt->ip_src_addr.prefixlen)
: inet_ntop4(buff, sizeof(buff), htonl(pkt->ip_src_addr.addr.ipv4.s_addr),
pkt->ip_mask));
Expand Down Expand Up @@ -491,15 +489,14 @@ pktgen_lua_save(char *path)
(pkt->ipProto == PG_IPPROTO_TCP) ? "tcp"
: (pkt->ipProto == PG_IPPROTO_ICMP) ? "icmp"
: "udp");
fprintf(
fd, "pktgen.set_ipaddr('%d', 'dst', '%s');\n", i,
(pkt->ethType == RTE_ETHER_TYPE_IPV6)
? inet_ntop6(buff, sizeof(buff), pkt->ip_dst_addr.addr.ipv6.s6_addr, PG_PREFIXMAX)
: inet_ntop4(buff, sizeof(buff), ntohl(pkt->ip_dst_addr.addr.ipv4.s_addr),
0xFFFFFFFF));
fprintf(fd, "pktgen.set_ipaddr('%d', 'dst', '%s');\n", i,
(pkt->ethType == RTE_ETHER_TYPE_IPV6)
? inet_ntop6(buff, sizeof(buff), pkt->ip_dst_addr.addr.ipv6.a, PG_PREFIXMAX)
: inet_ntop4(buff, sizeof(buff), ntohl(pkt->ip_dst_addr.addr.ipv4.s_addr),
0xFFFFFFFF));
fprintf(fd, "pktgen.set_ipaddr('%d', 'src','%s');\n", i,
(pkt->ethType == RTE_ETHER_TYPE_IPV6)
? inet_ntop6(buff, sizeof(buff), pkt->ip_src_addr.addr.ipv6.s6_addr,
? inet_ntop6(buff, sizeof(buff), pkt->ip_src_addr.addr.ipv6.a,
pkt->ip_src_addr.prefixlen)
: inet_ntop4(buff, sizeof(buff), ntohl(pkt->ip_src_addr.addr.ipv4.s_addr),
pkt->ip_mask));
Expand Down Expand Up @@ -657,15 +654,15 @@ pktgen_lua_save(char *path)
fprintf(fd, "-- pktgen.seq(%d, '%d', '%s' ", j, i,
inet_mtoa(buff, sizeof(buff), &pkt->eth_dst_addr));
fprintf(fd, "'%s', ", inet_mtoa(buff, sizeof(buff), &pkt->eth_src_addr));
fprintf(
fd, "'%s', ",
(pkt->ethType == RTE_ETHER_TYPE_IPV6)
? inet_ntop6(buff, sizeof(buff), pkt->ip_dst_addr.addr.ipv6.a, PG_PREFIXMAX)
: inet_ntop4(buff, sizeof(buff), htonl(pkt->ip_dst_addr.addr.ipv4.s_addr),
0xFFFFFFFF));
fprintf(fd, "'%s', ",
(pkt->ethType == RTE_ETHER_TYPE_IPV6)
? inet_ntop6(buff, sizeof(buff), pkt->ip_dst_addr.addr.ipv6.s6_addr,
PG_PREFIXMAX)
: inet_ntop4(buff, sizeof(buff),
htonl(pkt->ip_dst_addr.addr.ipv4.s_addr), 0xFFFFFFFF));
fprintf(fd, "'%s', ",
(pkt->ethType == RTE_ETHER_TYPE_IPV6)
? inet_ntop6(buff, sizeof(buff), pkt->ip_src_addr.addr.ipv6.s6_addr,
? inet_ntop6(buff, sizeof(buff), pkt->ip_src_addr.addr.ipv6.a,
pkt->ip_src_addr.prefixlen)
: inet_ntop4(buff, sizeof(buff),
htonl(pkt->ip_src_addr.addr.ipv4.s_addr), pkt->ip_mask));
Expand All @@ -688,15 +685,15 @@ pktgen_lua_save(char *path)
inet_mtoa(buff, sizeof(buff), &pkt->eth_dst_addr));
fprintf(fd, " ['eth_src_addr'] = '%s',\n",
inet_mtoa(buff, sizeof(buff), &pkt->eth_src_addr));
fprintf(fd, " ['ip_dst_addr'] = '%s',\n",
(pkt->ethType == RTE_ETHER_TYPE_IPV6)
? inet_ntop6(buff, sizeof(buff), pkt->ip_dst_addr.addr.ipv6.s6_addr,
PG_PREFIXMAX)
: inet_ntop4(buff, sizeof(buff),
htonl(pkt->ip_dst_addr.addr.ipv4.s_addr), 0xFFFFFFFF));
fprintf(
fd, " ['ip_dst_addr'] = '%s',\n",
(pkt->ethType == RTE_ETHER_TYPE_IPV6)
? inet_ntop6(buff, sizeof(buff), pkt->ip_dst_addr.addr.ipv6.a, PG_PREFIXMAX)
: inet_ntop4(buff, sizeof(buff), htonl(pkt->ip_dst_addr.addr.ipv4.s_addr),
0xFFFFFFFF));
fprintf(fd, " ['ip_src_addr'] = '%s',\n",
(pkt->ethType == RTE_ETHER_TYPE_IPV6)
? inet_ntop6(buff, sizeof(buff), pkt->ip_src_addr.addr.ipv6.s6_addr,
? inet_ntop6(buff, sizeof(buff), pkt->ip_src_addr.addr.ipv6.a,
pkt->ip_src_addr.prefixlen)
: inet_ntop4(buff, sizeof(buff),
htonl(pkt->ip_src_addr.addr.ipv4.s_addr), 0xFFFFFFFF));
Expand Down Expand Up @@ -2805,11 +2802,9 @@ single_set_ipaddr(port_info_t *pinfo, char type, struct pg_ipaddr *ip, int ip_ve
} else if (ip_ver == 6) {
if (type == 's') {
pkt->ip_src_addr.prefixlen = ip->prefixlen;
rte_memcpy(pkt->ip_src_addr.addr.ipv6.s6_addr, ip->ipv6.s6_addr,
sizeof(struct in6_addr));
rte_memcpy(&pkt->ip_src_addr.addr.ipv6, &ip->ipv6, sizeof(struct rte_ipv6_addr));
} else if (type == 'd')
rte_memcpy(pkt->ip_dst_addr.addr.ipv6.s6_addr, ip->ipv6.s6_addr,
sizeof(struct in6_addr));
rte_memcpy(&pkt->ip_dst_addr.addr.ipv6, &ip->ipv6, sizeof(struct rte_ipv6_addr));
else
return;

Expand Down Expand Up @@ -3307,13 +3302,13 @@ range_set_src_ip(port_info_t *pinfo, char *what, struct pg_ipaddr *ip)
{
if (pinfo->seq_pkt[RANGE_PKT].ethType == RTE_ETHER_TYPE_IPV6) {
if (!strcmp(what, "min") || !strcmp(what, "minimum"))
rte_memcpy(pinfo->range.src_ipv6_min, ip->ipv6.s6_addr, sizeof(struct in6_addr));
rte_memcpy(pinfo->range.src_ipv6_min, &ip->ipv6, sizeof(struct rte_ipv6_addr));
else if (!strcmp(what, "max") || !strcmp(what, "maximum"))
rte_memcpy(pinfo->range.src_ipv6_max, ip->ipv6.s6_addr, sizeof(struct in6_addr));
rte_memcpy(pinfo->range.src_ipv6_max, &ip->ipv6, sizeof(struct rte_ipv6_addr));
else if (!strcmp(what, "inc") || !strcmp(what, "increment"))
rte_memcpy(pinfo->range.src_ipv6_inc, ip->ipv6.s6_addr, sizeof(struct in6_addr));
rte_memcpy(pinfo->range.src_ipv6_inc, &ip->ipv6, sizeof(struct rte_ipv6_addr));
else if (!strcmp(what, "start"))
rte_memcpy(pinfo->range.src_ipv6, ip->ipv6.s6_addr, sizeof(struct in6_addr));
rte_memcpy(pinfo->range.src_ipv6, &ip->ipv6, sizeof(struct rte_ipv6_addr));
} else {
if (!strcmp(what, "min") || !strcmp(what, "minimum"))
pinfo->range.src_ip_min = ntohl(ip->ipv4.s_addr);
Expand Down Expand Up @@ -3343,13 +3338,13 @@ range_set_dst_ip(port_info_t *pinfo, char *what, struct pg_ipaddr *ip)
{
if (pinfo->seq_pkt[RANGE_PKT].ethType == RTE_ETHER_TYPE_IPV6) {
if (!strcmp(what, "min") || !strcmp(what, "minimum"))
rte_memcpy(pinfo->range.dst_ipv6_min, ip->ipv6.s6_addr, sizeof(struct in6_addr));
rte_memcpy(pinfo->range.dst_ipv6_min, &ip->ipv6, sizeof(struct rte_ipv6_addr));
else if (!strcmp(what, "max") || !strcmp(what, "maximum"))
rte_memcpy(pinfo->range.dst_ipv6_max, ip->ipv6.s6_addr, sizeof(struct in6_addr));
rte_memcpy(pinfo->range.dst_ipv6_max, &ip->ipv6, sizeof(struct rte_ipv6_addr));
else if (!strcmp(what, "inc") || !strcmp(what, "increment"))
rte_memcpy(pinfo->range.dst_ipv6_inc, ip->ipv6.s6_addr, sizeof(struct in6_addr));
rte_memcpy(pinfo->range.dst_ipv6_inc, &ip->ipv6, sizeof(struct rte_ipv6_addr));
else if (!strcmp(what, "start"))
rte_memcpy(pinfo->range.dst_ipv6, ip->ipv6.s6_addr, sizeof(struct in6_addr));
rte_memcpy(pinfo->range.dst_ipv6, &ip->ipv6, sizeof(struct rte_ipv6_addr));
} else {
if (!strcmp(what, "min") || !strcmp(what, "minimum"))
pinfo->range.dst_ip_min = ntohl(ip->ipv4.s_addr);
Expand Down Expand Up @@ -3788,10 +3783,8 @@ pktgen_set_seq(port_info_t *pinfo, uint32_t seqnum, struct rte_ether_addr *daddr
pkt->ip_src_addr.addr.ipv4.s_addr = htonl(ip_saddr->ipv4.s_addr);
pkt->ip_dst_addr.addr.ipv4.s_addr = htonl(ip_daddr->ipv4.s_addr);
} else {
memcpy(&pkt->ip_src_addr.addr.ipv6.s6_addr, ip_saddr->ipv6.s6_addr,
sizeof(struct in6_addr));
memcpy(&pkt->ip_dst_addr.addr.ipv6.s6_addr, ip_daddr->ipv6.s6_addr,
sizeof(struct in6_addr));
memcpy(&pkt->ip_src_addr.addr.ipv6, &ip_saddr->ipv6, sizeof(struct rte_ipv6_addr));
memcpy(&pkt->ip_dst_addr.addr.ipv6, &ip_daddr->ipv6, sizeof(struct rte_ipv6_addr));
}
pkt->dport = dport;
pkt->sport = sport;
Expand Down
4 changes: 2 additions & 2 deletions app/pktgen-ipv6.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ pktgen_ipv6_ctor(pkt_seq_t *pkt, void *hdr)
ip->hop_limits = pkt->hop_limits;
ip->proto = pkt->ipProto;

rte_memcpy(&ip->dst_addr, pkt->ip_dst_addr.addr.ipv6.s6_addr, sizeof(struct in6_addr));
rte_memcpy(&ip->src_addr, pkt->ip_src_addr.addr.ipv6.s6_addr, sizeof(struct in6_addr));
rte_memcpy(&ip->dst_addr, &pkt->ip_dst_addr.addr.ipv6, sizeof(struct rte_ipv6_addr));
rte_memcpy(&ip->src_addr, &pkt->ip_src_addr.addr.ipv6, sizeof(struct rte_ipv6_addr));
}

/**
Expand Down
32 changes: 16 additions & 16 deletions app/pktgen-range.c
Original file line number Diff line number Diff line change
Expand Up @@ -304,30 +304,30 @@ pktgen_range_ctor(range_info_t *range, pkt_seq_t *pkt)
if (unlikely(!inet6AddrIsUnspecified(range->src_ipv6_inc))) {
uint8_t p[PG_IN6ADDRSZ];

rte_memcpy(p, pkt->ip_src_addr.addr.ipv6.s6_addr, sizeof(struct in6_addr));
rte_memcpy(p, &pkt->ip_src_addr.addr.ipv6, sizeof(struct rte_ipv6_addr));
inet6AddrAdd(p, range->src_ipv6_inc, p);
if (memcmp(p, range->src_ipv6_min, sizeof(struct in6_addr)) < 0)
rte_memcpy(p, range->src_ipv6_min, sizeof(struct in6_addr));
else if (memcmp(p, range->src_ipv6_max, sizeof(struct in6_addr)) > 0)
rte_memcpy(p, range->src_ipv6_min, sizeof(struct in6_addr));
rte_memcpy(pkt->ip_src_addr.addr.ipv6.s6_addr, p, sizeof(struct in6_addr));
if (memcmp(p, range->src_ipv6_min, sizeof(struct rte_ipv6_addr)) < 0)
rte_memcpy(p, range->src_ipv6_min, sizeof(struct rte_ipv6_addr));
else if (memcmp(p, range->src_ipv6_max, sizeof(struct rte_ipv6_addr)) > 0)
rte_memcpy(p, range->src_ipv6_min, sizeof(struct rte_ipv6_addr));
rte_memcpy(&pkt->ip_src_addr.addr.ipv6, p, sizeof(struct rte_ipv6_addr));
} else
rte_memcpy(pkt->ip_src_addr.addr.ipv6.s6_addr, range->src_ipv6,
sizeof(struct in6_addr));
rte_memcpy(&pkt->ip_src_addr.addr.ipv6, range->src_ipv6,
sizeof(struct rte_ipv6_addr));

if (unlikely(!inet6AddrIsUnspecified(range->dst_ipv6_inc))) {
uint8_t p[PG_IN6ADDRSZ];

rte_memcpy(p, pkt->ip_dst_addr.addr.ipv6.s6_addr, sizeof(struct in6_addr));
rte_memcpy(p, &pkt->ip_dst_addr.addr.ipv6, sizeof(struct rte_ipv6_addr));
inet6AddrAdd(p, range->dst_ipv6_inc, p);
if (memcmp(p, range->dst_ipv6_min, sizeof(struct in6_addr)) < 0)
rte_memcpy(p, range->dst_ipv6_min, sizeof(struct in6_addr));
else if (memcmp(p, range->dst_ipv6_max, sizeof(struct in6_addr)) > 0)
rte_memcpy(p, range->dst_ipv6_min, sizeof(struct in6_addr));
rte_memcpy(pkt->ip_dst_addr.addr.ipv6.s6_addr, p, sizeof(struct in6_addr));
if (memcmp(p, range->dst_ipv6_min, sizeof(struct rte_ipv6_addr)) < 0)
rte_memcpy(p, range->dst_ipv6_min, sizeof(struct rte_ipv6_addr));
else if (memcmp(p, range->dst_ipv6_max, sizeof(struct rte_ipv6_addr)) > 0)
rte_memcpy(p, range->dst_ipv6_min, sizeof(struct rte_ipv6_addr));
rte_memcpy(&pkt->ip_dst_addr.addr.ipv6, p, sizeof(struct rte_ipv6_addr));
} else
rte_memcpy(pkt->ip_dst_addr.addr.ipv6.s6_addr, range->dst_ipv6,
sizeof(struct in6_addr));
rte_memcpy(&pkt->ip_dst_addr.addr.ipv6, range->dst_ipv6,
sizeof(struct rte_ipv6_addr));

if (unlikely(range->vlan_id_inc != 0)) {
/* Since VLAN is set to MIN_VLAN_ID, check this and skip first increment
Expand Down
4 changes: 2 additions & 2 deletions app/pktgen-stats.c
Original file line number Diff line number Diff line change
Expand Up @@ -153,10 +153,10 @@ pktgen_print_static_data(void)
pktgen_display_set_color("stats.ip");
if (pkt->ethType == RTE_ETHER_TYPE_IPV6) {
scrn_printf(row++, col, "%*s", COLUMN_WIDTH_1,
inet_ntop6(buff, sizeof(buff), pkt->ip_dst_addr.addr.ipv6.s6_addr,
inet_ntop6(buff, sizeof(buff), pkt->ip_dst_addr.addr.ipv6.a,
PG_PREFIXMAX | ((COLUMN_WIDTH_1 - 1) << 8)));
scrn_printf(row++, col, "%*s", COLUMN_WIDTH_1,
inet_ntop6(buff, sizeof(buff), pkt->ip_src_addr.addr.ipv6.s6_addr,
inet_ntop6(buff, sizeof(buff), pkt->ip_src_addr.addr.ipv6.a,
pkt->ip_src_addr.prefixlen | ((COLUMN_WIDTH_1 - 1) << 8)));
} else {
scrn_printf(row++, col, "%*s", COLUMN_WIDTH_1,
Expand Down
8 changes: 4 additions & 4 deletions app/pktgen-tcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,10 @@ pktgen_tcp_hdr_ctor(pkt_seq_t *pkt, void *hdr, int type)
struct rte_tcp_hdr *tcp = (struct rte_tcp_hdr *)&ipv6[1];

/* Create the pseudo header and TCP information */
memset(ipv6->dst_addr, 0, sizeof(struct in6_addr));
memset(ipv6->src_addr, 0, sizeof(struct in6_addr));
rte_memcpy(ipv6->dst_addr, &pkt->ip_dst_addr.addr.ipv6.s6_addr, sizeof(struct in6_addr));
rte_memcpy(ipv6->src_addr, &pkt->ip_src_addr.addr.ipv6.s6_addr, sizeof(struct in6_addr));
memset(&ipv6->dst_addr, 0, sizeof(struct rte_ipv6_addr));
memset(&ipv6->src_addr, 0, sizeof(struct rte_ipv6_addr));
rte_memcpy(&ipv6->dst_addr, &pkt->ip_dst_addr.addr.ipv6, sizeof(struct rte_ipv6_addr));
rte_memcpy(&ipv6->src_addr, &pkt->ip_src_addr.addr.ipv6, sizeof(struct rte_ipv6_addr));

tlen = pkt->pkt_size - (pkt->ether_hdr_size + sizeof(struct rte_ipv6_hdr));
ipv6->payload_len = htons(tlen);
Expand Down
8 changes: 4 additions & 4 deletions app/pktgen-udp.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,10 @@ pktgen_udp_hdr_ctor(pkt_seq_t *pkt, void *hdr, int type)
struct rte_udp_hdr *udp = (struct rte_udp_hdr *)&ipv6[1];

/* Create the pseudo header and TCP information */
memset(ipv6->dst_addr, 0, sizeof(struct in6_addr));
memset(ipv6->src_addr, 0, sizeof(struct in6_addr));
rte_memcpy(ipv6->dst_addr, &pkt->ip_dst_addr.addr.ipv6.s6_addr, sizeof(struct in6_addr));
rte_memcpy(ipv6->src_addr, &pkt->ip_src_addr.addr.ipv6.s6_addr, sizeof(struct in6_addr));
memset(&ipv6->dst_addr, 0, sizeof(struct rte_ipv6_addr));
memset(&ipv6->src_addr, 0, sizeof(struct rte_ipv6_addr));
rte_memcpy(&ipv6->dst_addr, &pkt->ip_dst_addr.addr.ipv6, sizeof(struct rte_ipv6_addr));
rte_memcpy(&ipv6->src_addr, &pkt->ip_src_addr.addr.ipv6, sizeof(struct rte_ipv6_addr));

tlen = pkt->pkt_size - (pkt->ether_hdr_size + sizeof(struct rte_ipv6_hdr));
ipv6->payload_len = htons(tlen);
Expand Down
2 changes: 1 addition & 1 deletion lib/common/pg_inet.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ struct pg_ipaddr {
uint8_t family;
union {
struct in_addr ipv4;
struct in6_addr ipv6;
struct rte_ipv6_addr ipv6;
};
unsigned int prefixlen; /* in case of network only */
};
Expand Down
2 changes: 1 addition & 1 deletion lib/utils/_atoip.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ struct rte_ipaddr {
uint8_t family;
union {
struct in_addr ipv4;
struct in6_addr ipv6;
struct rte_ipv6_addr ipv6;
};
unsigned int prefixlen; /* in case of network only */
};
Expand Down

0 comments on commit 867e183

Please sign in to comment.