aboutgitcodebugslistschat
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2026-07-03 13:54:39 +1000
committerStefano Brivio <sbrivio@redhat.com>2026-07-04 13:14:07 +0200
commit42069134e9ff3cbcb35dccf92a0a044a4b71999b (patch)
treeefbcef983abee1fac90ead19d09b2b6e7d942cbe
parent8ffff9b9fca92afb785a37ddde1397805122befc (diff)
downloadpasst-42069134e9ff3cbcb35dccf92a0a044a4b71999b.tar
passt-42069134e9ff3cbcb35dccf92a0a044a4b71999b.tar.gz
passt-42069134e9ff3cbcb35dccf92a0a044a4b71999b.tar.bz2
passt-42069134e9ff3cbcb35dccf92a0a044a4b71999b.tar.lz
passt-42069134e9ff3cbcb35dccf92a0a044a4b71999b.tar.xz
passt-42069134e9ff3cbcb35dccf92a0a044a4b71999b.tar.zst
passt-42069134e9ff3cbcb35dccf92a0a044a4b71999b.zip
parse: Move parse_port_range() to new parsing framework
parse_port_range() in fwd_rule.c takes an approach similar to that used by the new parsing helpers in parse.c (and is partially inspiration for it), but isn't quite the same. Move it into parse.c, and bring it into line with that file's conventions. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
-rw-r--r--common.h3
-rw-r--r--fwd_rule.c53
-rw-r--r--fwd_rule.h2
-rw-r--r--parse.c28
-rw-r--r--parse.h13
5 files changed, 47 insertions, 52 deletions
diff --git a/common.h b/common.h
index f2518f6..16b9dc8 100644
--- a/common.h
+++ b/common.h
@@ -113,4 +113,7 @@ static inline const char *strerror_(int errnum)
#define ntohll(x) (be64toh((x)))
#define htonll(x) (htobe64((x)))
+/* Number of ports for both TCP and UDP */
+#define NUM_PORTS (1U << 16)
+
#endif /* COMMON_H */
diff --git a/fwd_rule.c b/fwd_rule.c
index d4b422d..0b85b17 100644
--- a/fwd_rule.c
+++ b/fwd_rule.c
@@ -368,53 +368,6 @@ int fwd_rule_add(struct fwd_table *fwd, const struct fwd_rule *new)
}
/**
- * port_range() - Represents a non-empty range of ports
- * @first: First port number in the range
- * @last: Last port number in the range (inclusive)
- *
- * Invariant: @last >= @first
- */
-struct port_range {
- in_port_t first, last;
-};
-
-/**
- * parse_port_range() - Parse a range of port numbers '<first>[-<last>]'
- * @s: String to parse
- * @endptr: Update to the character after the parsed range (similar to
- * strtol() etc.)
- * @range: Update with the parsed values on success
- *
- * Return: -EINVAL on parsing error, -ERANGE on out of range port
- * numbers, 0 on success
- */
-static int parse_port_range(const char *s, const char **endptr,
- struct port_range *range)
-{
- unsigned long first, last;
- char *ep;
-
- last = first = strtoul(s, &ep, 10);
- if (ep == s) /* Parsed nothing */
- return -EINVAL;
- if (*ep == '-') { /* we have a last value too */
- const char *lasts = ep + 1;
- last = strtoul(lasts, &ep, 10);
- if (ep == lasts) /* Parsed nothing */
- return -EINVAL;
- }
-
- if ((last < first) || (last >= NUM_PORTS))
- return -ERANGE;
-
- range->first = first;
- range->last = last;
- *endptr = ep;
-
- return 0;
-}
-
-/**
* fwd_rule_range_except() - Set up forwarding for a range of ports minus a
* bitmap of exclusions
* @fwd: Forwarding table to be updated
@@ -550,7 +503,7 @@ static void fwd_rule_parse_ports(struct fwd_table *fwd, bool del, uint8_t proto,
if (!parse_literal(&p, "~"))
goto bad;
- if (parse_port_range(p, &p, &xrange))
+ if (!parse_port_range(&p, &xrange))
goto bad;
if (p != ep) /* Garbage after the range */
goto bad;
@@ -577,12 +530,12 @@ static void fwd_rule_parse_ports(struct fwd_table *fwd, bool del, uint8_t proto,
/* Already parsed */
continue;
- if (parse_port_range(p, &p, &orig_range))
+ if (!parse_port_range(&p, &orig_range))
goto bad;
if (parse_literal(&p, ":")) {
/* There's a range to map to as well */
- if (parse_port_range(p, &p, &mapped_range))
+ if (!parse_port_range(&p, &mapped_range))
goto bad;
if ((mapped_range.last - mapped_range.first) !=
(orig_range.last - orig_range.first))
diff --git a/fwd_rule.h b/fwd_rule.h
index ae9a3cb..435be5b 100644
--- a/fwd_rule.h
+++ b/fwd_rule.h
@@ -18,8 +18,6 @@
#include "inany.h"
#include "bitmap.h"
-/* Number of ports for both TCP and UDP */
-#define NUM_PORTS (1U << 16)
#define PORT_BITMAP_SIZE DIV_ROUND_UP(NUM_PORTS, 8)
/* Forwarding capability bits */
diff --git a/parse.c b/parse.c
index 9bd0e81..ad21040 100644
--- a/parse.c
+++ b/parse.c
@@ -17,6 +17,7 @@
#include <stdlib.h>
#include <string.h>
+#include "common.h"
#include "parse.h"
/**
@@ -83,3 +84,30 @@ bool parse_unsigned(const char **cursor, int base, unsigned long *valp)
*cursor = p;
return true;
}
+
+/**
+ * parse_port_range() - Parse a range of port numbers '<first>[-<last>]'
+ * @range: Update with the parsed values on success
+ */
+bool parse_port_range(const char **cursor, struct port_range *range)
+{
+ unsigned long first, last;
+ const char *p = *cursor;
+
+ if (!parse_unsigned(&p, 10, &first))
+ return false;
+
+ last = first;
+
+ if (parse_literal(&p, "-"))
+ if (!parse_unsigned(&p, 10, &last))
+ return false;
+
+ if ((last < first) || (last >= NUM_PORTS))
+ return false;
+
+ range->first = first;
+ range->last = last;
+ *cursor = p;
+ return true;
+}
diff --git a/parse.h b/parse.h
index 4f38c28..155b399 100644
--- a/parse.h
+++ b/parse.h
@@ -7,9 +7,22 @@
#define PARSE_H
#include <stdbool.h>
+#include <netinet/in.h>
+
+/**
+ * port_range() - Represents a non-empty range of ports
+ * @first: First port number in the range
+ * @last: Last port number in the range (inclusive)
+ *
+ * Invariant: @last >= @first
+ */
+struct port_range {
+ in_port_t first, last;
+};
bool parse_literal(const char **cursor, const char *lit);
bool parse_eoi(const char *cursor);
bool parse_unsigned(const char **cursor, int base, unsigned long *valp);
+bool parse_port_range(const char **cursor, struct port_range *range);
#endif /* _PARSE_H */