aboutgitcodebugslistschat
diff options
context:
space:
mode:
-rw-r--r--Makefile17
-rw-r--r--bitmap.c99
-rw-r--r--bitmap.h24
-rw-r--r--conf.c1
-rw-r--r--fwd.h1
-rw-r--r--util.c84
-rw-r--r--util.h10
7 files changed, 134 insertions, 102 deletions
diff --git a/Makefile b/Makefile
index 5b6891d..d6ced32 100644
--- a/Makefile
+++ b/Makefile
@@ -37,20 +37,21 @@ FLAGS += -DPAGE_SIZE=$(shell getconf PAGE_SIZE)
FLAGS += -DVERSION=\"$(VERSION)\"
FLAGS += -DDUAL_STACK_SOCKETS=$(DUAL_STACK_SOCKETS)
-PASST_SRCS = arch.c arp.c checksum.c conf.c dhcp.c dhcpv6.c epoll_ctl.c \
- flow.c fwd.c icmp.c igmp.c inany.c iov.c ip.c isolation.c lineread.c \
- log.c mld.c ndp.c netlink.c migrate.c packet.c passt.c pasta.c pcap.c \
- pif.c repair.c serialise.c tap.c tcp.c tcp_buf.c tcp_splice.c tcp_vu.c \
- udp.c udp_flow.c udp_vu.c util.c vhost_user.c virtio.c vu_common.c
+PASST_SRCS = arch.c arp.c bitmap.c checksum.c conf.c dhcp.c dhcpv6.c \
+ epoll_ctl.c flow.c fwd.c icmp.c igmp.c inany.c iov.c ip.c isolation.c \
+ lineread.c log.c mld.c ndp.c netlink.c migrate.c packet.c passt.c \
+ pasta.c pcap.c pif.c repair.c serialise.c tap.c tcp.c tcp_buf.c \
+ tcp_splice.c tcp_vu.c udp.c udp_flow.c udp_vu.c util.c vhost_user.c \
+ virtio.c vu_common.c
QRAP_SRCS = qrap.c
PASST_REPAIR_SRCS = passt-repair.c
SRCS = $(PASST_SRCS) $(QRAP_SRCS) $(PASST_REPAIR_SRCS)
MANPAGES = passt.1 pasta.1 qrap.1 passt-repair.1
-PASST_HEADERS = arch.h arp.h checksum.h conf.h dhcp.h dhcpv6.h epoll_ctl.h \
- flow.h fwd.h flow_table.h icmp.h icmp_flow.h inany.h iov.h ip.h \
- isolation.h lineread.h log.h migrate.h ndp.h netlink.h packet.h \
+PASST_HEADERS = arch.h arp.h bitmap.h checksum.h conf.h dhcp.h dhcpv6.h \
+ epoll_ctl.h flow.h fwd.h flow_table.h icmp.h icmp_flow.h inany.h iov.h \
+ ip.h isolation.h lineread.h log.h migrate.h ndp.h netlink.h packet.h \
passt.h pasta.h pcap.h pif.h repair.h serialise.h siphash.h tap.h tcp.h \
tcp_buf.h tcp_conn.h tcp_internal.h tcp_splice.h tcp_vu.h udp.h \
udp_flow.h udp_internal.h udp_vu.h util.h vhost_user.h virtio.h \
diff --git a/bitmap.c b/bitmap.c
new file mode 100644
index 0000000..b3b204b
--- /dev/null
+++ b/bitmap.c
@@ -0,0 +1,99 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+/* PASST - Plug A Simple Socket Transport
+ * for qemu/UNIX domain socket mode
+ *
+ * PASTA - Pack A Subtle Tap Abstraction
+ * for network namespace/tap device mode
+ *
+ * bitmap.c - bitmap handling
+ *
+ * Copyright Red Hat
+ * Author: Stefano Brivio <sbrivio@redhat.com>
+ */
+
+#include "bitmap.h"
+
+/**
+ * bitmap_set() - Set single bit in bitmap
+ * @map: Pointer to bitmap
+ * @bit: Bit number to set
+ */
+void bitmap_set(uint8_t *map, unsigned bit)
+{
+ unsigned long *word = (unsigned long *)map + BITMAP_WORD(bit);
+
+ *word |= BITMAP_BIT(bit);
+}
+
+/**
+ * bitmap_clear() - Clear single bit in bitmap
+ * @map: Pointer to bitmap
+ * @bit: Bit number to clear
+ */
+/* cppcheck-suppress unusedFunction */
+void bitmap_clear(uint8_t *map, unsigned bit)
+{
+ unsigned long *word = (unsigned long *)map + BITMAP_WORD(bit);
+
+ *word &= ~BITMAP_BIT(bit);
+}
+
+/**
+ * bitmap_isset() - Check for set bit in bitmap
+ * @map: Pointer to bitmap
+ * @bit: Bit number to check
+ *
+ * Return: true if given bit is set, false if it's not
+ */
+bool bitmap_isset(const uint8_t *map, unsigned bit)
+{
+ const unsigned long *word
+ = (const unsigned long *)map + BITMAP_WORD(bit);
+
+ return !!(*word & BITMAP_BIT(bit));
+}
+
+/**
+ * bitmap_or() - Logical disjunction (OR) of two bitmaps
+ * @dst: Pointer to result bitmap
+ * @size: Size of bitmaps, in bytes
+ * @a: First operand
+ * @b: Second operand
+ */
+/* cppcheck-suppress unusedFunction */
+void bitmap_or(uint8_t *dst, size_t size, const uint8_t *a, const uint8_t *b)
+{
+ unsigned long *dw = (unsigned long *)dst;
+ unsigned long *aw = (unsigned long *)a;
+ unsigned long *bw = (unsigned long *)b;
+ size_t i;
+
+ for (i = 0; i < size / sizeof(long); i++, dw++, aw++, bw++)
+ *dw = *aw | *bw;
+
+ for (i = size / sizeof(long) * sizeof(long); i < size; i++)
+ dst[i] = a[i] | b[i];
+}
+
+/**
+ * bitmap_and_not() - Logical conjunction with complement (AND NOT) of bitmap
+ * @dst: Pointer to result bitmap
+ * @size: Size of bitmaps, in bytes
+ * @a: First operand
+ * @b: Second operand
+ */
+void bitmap_and_not(uint8_t *dst, size_t size,
+ const uint8_t *a, const uint8_t *b)
+{
+ unsigned long *dw = (unsigned long *)dst;
+ unsigned long *aw = (unsigned long *)a;
+ unsigned long *bw = (unsigned long *)b;
+ size_t i;
+
+ for (i = 0; i < size / sizeof(long); i++, dw++, aw++, bw++)
+ *dw = *aw & ~*bw;
+
+ for (i = size / sizeof(long) * sizeof(long); i < size; i++)
+ dst[i] = a[i] & ~b[i];
+}
diff --git a/bitmap.h b/bitmap.h
new file mode 100644
index 0000000..b6e91c0
--- /dev/null
+++ b/bitmap.h
@@ -0,0 +1,24 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later
+ * Copyright Red Hat
+ * Author: Stefano Brivio <sbrivio@redhat.com>
+ */
+
+#ifndef BITMAP_H
+#define BITMAP_H
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+
+#define BIT(n) (1UL << (n))
+#define BITMAP_BIT(n) (BIT((n) % (sizeof(long) * 8)))
+#define BITMAP_WORD(n) (n / (sizeof(long) * 8))
+
+void bitmap_set(uint8_t *map, unsigned bit);
+void bitmap_clear(uint8_t *map, unsigned bit);
+bool bitmap_isset(const uint8_t *map, unsigned bit);
+void bitmap_or(uint8_t *dst, size_t size, const uint8_t *a, const uint8_t *b);
+void bitmap_and_not(uint8_t *dst, size_t size,
+ const uint8_t *a, const uint8_t *b);
+
+#endif /* BITMAP_H */
diff --git a/conf.c b/conf.c
index 5639ef0..ae37bf9 100644
--- a/conf.c
+++ b/conf.c
@@ -36,6 +36,7 @@
#include <netinet/if_ether.h>
#include "util.h"
+#include "bitmap.h"
#include "ip.h"
#include "passt.h"
#include "netlink.h"
diff --git a/fwd.h b/fwd.h
index f111e13..beba0bf 100644
--- a/fwd.h
+++ b/fwd.h
@@ -14,6 +14,7 @@
#include <netinet/in.h>
+#include "bitmap.h"
#include "inany.h"
struct flowside;
diff --git a/util.c b/util.c
index faa2c6a..73c9d51 100644
--- a/util.c
+++ b/util.c
@@ -368,90 +368,6 @@ long timespec_diff_ms(const struct timespec *a, const struct timespec *b)
}
/**
- * bitmap_set() - Set single bit in bitmap
- * @map: Pointer to bitmap
- * @bit: Bit number to set
- */
-void bitmap_set(uint8_t *map, unsigned bit)
-{
- unsigned long *word = (unsigned long *)map + BITMAP_WORD(bit);
-
- *word |= BITMAP_BIT(bit);
-}
-
-/**
- * bitmap_clear() - Clear single bit in bitmap
- * @map: Pointer to bitmap
- * @bit: Bit number to clear
- */
-/* cppcheck-suppress unusedFunction */
-void bitmap_clear(uint8_t *map, unsigned bit)
-{
- unsigned long *word = (unsigned long *)map + BITMAP_WORD(bit);
-
- *word &= ~BITMAP_BIT(bit);
-}
-
-/**
- * bitmap_isset() - Check for set bit in bitmap
- * @map: Pointer to bitmap
- * @bit: Bit number to check
- *
- * Return: true if given bit is set, false if it's not
- */
-bool bitmap_isset(const uint8_t *map, unsigned bit)
-{
- const unsigned long *word
- = (const unsigned long *)map + BITMAP_WORD(bit);
-
- return !!(*word & BITMAP_BIT(bit));
-}
-
-/**
- * bitmap_or() - Logical disjunction (OR) of two bitmaps
- * @dst: Pointer to result bitmap
- * @size: Size of bitmaps, in bytes
- * @a: First operand
- * @b: Second operand
- */
-/* cppcheck-suppress unusedFunction */
-void bitmap_or(uint8_t *dst, size_t size, const uint8_t *a, const uint8_t *b)
-{
- unsigned long *dw = (unsigned long *)dst;
- unsigned long *aw = (unsigned long *)a;
- unsigned long *bw = (unsigned long *)b;
- size_t i;
-
- for (i = 0; i < size / sizeof(long); i++, dw++, aw++, bw++)
- *dw = *aw | *bw;
-
- for (i = size / sizeof(long) * sizeof(long); i < size; i++)
- dst[i] = a[i] | b[i];
-}
-
-/**
- * bitmap_and_not() - Logical conjunction with complement (AND NOT) of bitmap
- * @dst: Pointer to result bitmap
- * @size: Size of bitmaps, in bytes
- * @a: First operand
- * @b: Second operand
- */
-void bitmap_and_not(uint8_t *dst, size_t size,
- const uint8_t *a, const uint8_t *b)
-{
- unsigned long *dw = (unsigned long *)dst;
- unsigned long *aw = (unsigned long *)a;
- unsigned long *bw = (unsigned long *)b;
- size_t i;
-
- for (i = 0; i < size / sizeof(long); i++, dw++, aw++, bw++)
- *dw = *aw & ~*bw;
-
- for (i = size / sizeof(long) * sizeof(long); i < size; i++)
- dst[i] = a[i] & ~b[i];
-}
-
-/**
* ns_enter() - Enter configured user (unless already joined) and network ns
* @c: Execution context
*
diff --git a/util.h b/util.h
index cb66910..92aeabc 100644
--- a/util.h
+++ b/util.h
@@ -50,10 +50,6 @@
#define MAX_FROM_BITS(n) (((1U << (n)) - 1))
-#define BIT(n) (1UL << (n))
-#define BITMAP_BIT(n) (BIT((n) % (sizeof(long) * 8)))
-#define BITMAP_WORD(n) (n / (sizeof(long) * 8))
-
#define SWAP(a, b) \
do { \
__typeof__(a) __x = (a); (a) = (b); (b) = __x; \
@@ -228,12 +224,6 @@ int sock_unix(char *sock_path);
void sock_probe_features(struct ctx *c);
long timespec_diff_ms(const struct timespec *a, const struct timespec *b);
int64_t timespec_diff_us(const struct timespec *a, const struct timespec *b);
-void bitmap_set(uint8_t *map, unsigned bit);
-void bitmap_clear(uint8_t *map, unsigned bit);
-bool bitmap_isset(const uint8_t *map, unsigned bit);
-void bitmap_or(uint8_t *dst, size_t size, const uint8_t *a, const uint8_t *b);
-void bitmap_and_not(uint8_t *dst, size_t size,
- const uint8_t *a, const uint8_t *b);
char *line_read(char *buf, size_t len, int fd);
void ns_enter(const struct ctx *c);
bool ns_is_init(void);