From: David Gibson <david@gibson.dropbear.id.au>
To: passt-dev@passt.top, Stefano Brivio <sbrivio@redhat.com>
Cc: David Gibson <david@gibson.dropbear.id.au>
Subject: [PATCH v4 12/17] ip: Prepare ip.[ch] for sharing with pesto tool
Date: Tue, 21 Apr 2026 14:42:12 +1000 [thread overview]
Message-ID: <20260421044217.2500314-13-david@gibson.dropbear.id.au> (raw)
In-Reply-To: <20260421044217.2500314-1-david@gibson.dropbear.id.au>
Most things in ip.[ch] related purely to IP addresses and headers with
no dependency on other passt/pasta internals. A number of these will be
useful to re-use in pesto. The exception is ipv6_l4hdr() which uses
iov_tail.
The only caller of this is in tap.c, so move the function there. Along
with moving the constant byteswapping functions to common.h, that lets
ip.[ch] to be linked into pesto as well as passt/pasta.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
common.h | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
inany.h | 2 ++
ip.c | 56 +++-----------------------------------------------------
ip.h | 4 +---
tap.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
util.h | 48 ------------------------------------------------
6 files changed, 106 insertions(+), 104 deletions(-)
diff --git a/common.h b/common.h
index 45f66ea6..4a167ae0 100644
--- a/common.h
+++ b/common.h
@@ -55,4 +55,52 @@ static inline const char *strerror_(int errnum)
#define ARRAY_SIZE(a) ((int)(sizeof(a) / sizeof((a)[0])))
+#ifndef __bswap_constant_16
+#define __bswap_constant_16(x) \
+ ((uint16_t) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)))
+#endif
+
+#ifndef __bswap_constant_32
+#define __bswap_constant_32(x) \
+ ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \
+ (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24))
+#endif
+
+#ifndef __bswap_constant_32
+#define __bswap_constant_32(x) \
+ ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \
+ (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24))
+#endif
+
+#ifndef __bswap_constant_64
+#define __bswap_constant_64(x) \
+ ((((x) & 0xff00000000000000ULL) >> 56) | \
+ (((x) & 0x00ff000000000000ULL) >> 40) | \
+ (((x) & 0x0000ff0000000000ULL) >> 24) | \
+ (((x) & 0x000000ff00000000ULL) >> 8) | \
+ (((x) & 0x00000000ff000000ULL) << 8) | \
+ (((x) & 0x0000000000ff0000ULL) << 24) | \
+ (((x) & 0x000000000000ff00ULL) << 40) | \
+ (((x) & 0x00000000000000ffULL) << 56))
+#endif
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+#define htons_constant(x) (x)
+#define htonl_constant(x) (x)
+#define htonll_constant(x) (x)
+#define ntohs_constant(x) (x)
+#define ntohl_constant(x) (x)
+#define ntohll_constant(x) (x)
+#else
+#define htons_constant(x) (__bswap_constant_16(x))
+#define htonl_constant(x) (__bswap_constant_32(x))
+#define htonll_constant(x) (__bswap_constant_64(x))
+#define ntohs_constant(x) (__bswap_constant_16(x))
+#define ntohl_constant(x) (__bswap_constant_32(x))
+#define ntohll_constant(x) (__bswap_constant_64(x))
+#endif
+
+#define ntohll(x) (be64toh((x)))
+#define htonll(x) (htobe64((x)))
+
#endif /* _COMMON_H */
diff --git a/inany.h b/inany.h
index 30e24164..1f7741d1 100644
--- a/inany.h
+++ b/inany.h
@@ -10,8 +10,10 @@
#define INANY_H
#include <assert.h>
+#include <stdbool.h>
#include <string.h>
+#include "util.h"
#include "ip.h"
#include "siphash.h"
diff --git a/ip.c b/ip.c
index 25fa4073..f2506bb1 100644
--- a/ip.c
+++ b/ip.c
@@ -6,6 +6,9 @@
* PASTA - Pack A Subtle Tap Abstraction
* for network namespace/tap device mode
*
+ * PESTO - Programmable Extensible Socket Translation Orchestrator
+ * front-end for passt(1) and pasta(1) forwarding configuration
+ *
* ip.c - IP related functions
*
* Copyright (c) 2020-2021 Red Hat GmbH
@@ -16,61 +19,8 @@
#include <stddef.h>
#include <netinet/in.h>
-#include "util.h"
#include "ip.h"
-#define IPV6_NH_OPT(nh) \
- ((nh) == 0 || (nh) == 43 || (nh) == 44 || (nh) == 50 || \
- (nh) == 51 || (nh) == 60 || (nh) == 135 || (nh) == 139 || \
- (nh) == 140 || (nh) == 253 || (nh) == 254)
-
-/**
- * ipv6_l4hdr() - Find pointer to L4 header in IPv6 packet and extract protocol
- * @data: IPv6 packet
- * @proto: Filled with L4 protocol number
- * @dlen: Data length (payload excluding header extensions), set on return
- *
- * Return: true if the L4 header is found and @data, @proto, @dlen are set,
- * false on error. Outputs are indeterminate on failure.
- */
-bool ipv6_l4hdr(struct iov_tail *data, uint8_t *proto, size_t *dlen)
-{
- struct ipv6_opt_hdr o_storage;
- const struct ipv6_opt_hdr *o;
- struct ipv6hdr ip6h_storage;
- const struct ipv6hdr *ip6h;
- int hdrlen;
- uint8_t nh;
-
- ip6h = IOV_REMOVE_HEADER(data, ip6h_storage);
- if (!ip6h)
- return false;
-
- nh = ip6h->nexthdr;
- if (!IPV6_NH_OPT(nh))
- goto found;
-
- while ((o = IOV_PEEK_HEADER(data, o_storage))) {
- nh = o->nexthdr;
- hdrlen = (o->hdrlen + 1) * 8;
-
- if (IPV6_NH_OPT(nh))
- iov_drop_header(data, hdrlen);
- else
- goto found;
- }
-
- return false;
-
-found:
- if (nh == IPPROTO_NONE)
- return false;
-
- *dlen = iov_tail_size(data);
- *proto = nh;
- return true;
-}
-
/**
* ipproto_name() - Get IP protocol name from number
* @proto: IP protocol number
diff --git a/ip.h b/ip.h
index fb4119a7..aab9b86a 100644
--- a/ip.h
+++ b/ip.h
@@ -9,7 +9,7 @@
#include <netinet/ip.h>
#include <netinet/ip6.h>
-#include "util.h"
+#include "common.h"
#define IN4_IS_ADDR_UNSPECIFIED(a) \
(((struct in_addr *)(a))->s_addr == htonl_constant(INADDR_ANY))
@@ -117,8 +117,6 @@ static inline uint32_t ip6_get_flow_lbl(const struct ipv6hdr *ip6h)
ip6h->flow_lbl[2];
}
-bool ipv6_l4hdr(struct iov_tail *data, uint8_t *proto, size_t *dlen);
-
#define IPPROTO_STRLEN (sizeof("<unknown protocol>"))
const char *ipproto_name(uint8_t proto);
diff --git a/tap.c b/tap.c
index 7d06189d..cfd7b649 100644
--- a/tap.c
+++ b/tap.c
@@ -874,6 +874,58 @@ append:
return in->count;
}
+#define IPV6_NH_OPT(nh) \
+ ((nh) == 0 || (nh) == 43 || (nh) == 44 || (nh) == 50 || \
+ (nh) == 51 || (nh) == 60 || (nh) == 135 || (nh) == 139 || \
+ (nh) == 140 || (nh) == 253 || (nh) == 254)
+
+/**
+ * ipv6_l4hdr() - Find pointer to L4 header in IPv6 packet and extract protocol
+ * @data: IPv6 packet
+ * @proto: Filled with L4 protocol number
+ * @dlen: Data length (payload excluding header extensions), set on return
+ *
+ * Return: true if the L4 header is found and @data, @proto, @dlen are set,
+ * false on error. Outputs are indeterminate on failure.
+ */
+static bool ipv6_l4hdr(struct iov_tail *data, uint8_t *proto, size_t *dlen)
+{
+ struct ipv6_opt_hdr o_storage;
+ const struct ipv6_opt_hdr *o;
+ struct ipv6hdr ip6h_storage;
+ const struct ipv6hdr *ip6h;
+ int hdrlen;
+ uint8_t nh;
+
+ ip6h = IOV_REMOVE_HEADER(data, ip6h_storage);
+ if (!ip6h)
+ return false;
+
+ nh = ip6h->nexthdr;
+ if (!IPV6_NH_OPT(nh))
+ goto found;
+
+ while ((o = IOV_PEEK_HEADER(data, o_storage))) {
+ nh = o->nexthdr;
+ hdrlen = (o->hdrlen + 1) * 8;
+
+ if (IPV6_NH_OPT(nh))
+ iov_drop_header(data, hdrlen);
+ else
+ goto found;
+ }
+
+ return false;
+
+found:
+ if (nh == IPPROTO_NONE)
+ return false;
+
+ *dlen = iov_tail_size(data);
+ *proto = nh;
+ return true;
+}
+
/**
* tap6_handler() - IPv6 packet handler for tap file descriptor
* @c: Execution context
diff --git a/util.h b/util.h
index c7883824..dc14c78c 100644
--- a/util.h
+++ b/util.h
@@ -101,54 +101,6 @@ void abort_with_msg(const char *fmt, ...)
#define MAC_UNDEF MAC_BROADCAST
#define MAC_IS_UNDEF(addr) (!memcmp((addr), MAC_UNDEF, ETH_ALEN))
-#ifndef __bswap_constant_16
-#define __bswap_constant_16(x) \
- ((uint16_t) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8)))
-#endif
-
-#ifndef __bswap_constant_32
-#define __bswap_constant_32(x) \
- ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \
- (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24))
-#endif
-
-#ifndef __bswap_constant_32
-#define __bswap_constant_32(x) \
- ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \
- (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24))
-#endif
-
-#ifndef __bswap_constant_64
-#define __bswap_constant_64(x) \
- ((((x) & 0xff00000000000000ULL) >> 56) | \
- (((x) & 0x00ff000000000000ULL) >> 40) | \
- (((x) & 0x0000ff0000000000ULL) >> 24) | \
- (((x) & 0x000000ff00000000ULL) >> 8) | \
- (((x) & 0x00000000ff000000ULL) << 8) | \
- (((x) & 0x0000000000ff0000ULL) << 24) | \
- (((x) & 0x000000000000ff00ULL) << 40) | \
- (((x) & 0x00000000000000ffULL) << 56))
-#endif
-
-#if __BYTE_ORDER == __BIG_ENDIAN
-#define htons_constant(x) (x)
-#define htonl_constant(x) (x)
-#define htonll_constant(x) (x)
-#define ntohs_constant(x) (x)
-#define ntohl_constant(x) (x)
-#define ntohll_constant(x) (x)
-#else
-#define htons_constant(x) (__bswap_constant_16(x))
-#define htonl_constant(x) (__bswap_constant_32(x))
-#define htonll_constant(x) (__bswap_constant_64(x))
-#define ntohs_constant(x) (__bswap_constant_16(x))
-#define ntohl_constant(x) (__bswap_constant_32(x))
-#define ntohll_constant(x) (__bswap_constant_64(x))
-#endif
-
-#define ntohll(x) (be64toh((x)))
-#define htonll(x) (htobe64((x)))
-
extern uint8_t eth_pad[ETH_ZLEN];
/**
--
2.53.0
next prev parent reply other threads:[~2026-04-21 4:42 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-21 4:42 [PATCH v4 00/17] RFC: Dynamic configuration update implementation David Gibson
2026-04-21 4:42 ` [PATCH v4 01/17] conf, fwd: Stricter rule checking in fwd_rule_add() David Gibson
2026-04-21 4:42 ` [PATCH v4 02/17] fwd_rule: Move ephemeral port probing to fwd_rule.c David Gibson
2026-04-21 4:42 ` [PATCH v4 03/17] fwd, conf: Move rule parsing code to fwd_rule.[ch] David Gibson
2026-04-21 4:42 ` [PATCH v4 04/17] fwd_rule: Move conflict checking back within fwd_rule_add() David Gibson
2026-04-21 4:42 ` [PATCH v4 05/17] fwd: Generalise fwd_rules_info() David Gibson
2026-04-21 4:42 ` [PATCH v4 06/17] pif: Limit pif names to 128 bytes David Gibson
2026-04-21 4:42 ` [PATCH v4 07/17] fwd_rule: Fix some format specifiers David Gibson
2026-04-21 4:42 ` [PATCH v4 08/17] pesto: Introduce stub configuration tool David Gibson
2026-04-21 4:42 ` [PATCH v4 09/17] pesto, log: Share log.h (but not log.c) with pesto tool David Gibson
2026-04-21 4:42 ` [PATCH v4 10/17] pesto, conf: Have pesto connect to passt and check versions David Gibson
2026-04-21 4:42 ` [PATCH v4 11/17] pesto: Expose list of pifs to pesto and optionally display David Gibson
2026-04-21 4:42 ` David Gibson [this message]
2026-04-21 4:42 ` [PATCH v4 13/17] inany: Prepare inany.[ch] for sharing with pesto tool David Gibson
2026-04-21 4:42 ` [PATCH v4 14/17] pesto: Read current ruleset from passt/pasta and optionally display it David Gibson
2026-04-21 4:42 ` [PATCH v4 15/17] pesto: Parse and add new rules from command line David Gibson
2026-04-21 4:42 ` [PATCH v4 16/17] pesto, conf: Send updated rules from pesto back to passt/pasta David Gibson
2026-04-21 4:42 ` [PATCH v4 17/17] conf, fwd: Allow switching to new rules received from pesto David Gibson
2026-04-21 6:26 ` [PATCH v4 00/17] IGNORE RFC: Dynamic configuration update implementation David Gibson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260421044217.2500314-13-david@gibson.dropbear.id.au \
--to=david@gibson.dropbear.id.au \
--cc=passt-dev@passt.top \
--cc=sbrivio@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://passt.top/passt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).