From ee930fffee469d076998274a2ca55e13dc1efb67 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Fri, 10 May 2024 08:50:54 +0000
Subject: [PATCH] enable tun/tap/iptables

---
 kernel/include/net/xdp_sock.h |  112 ++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 65 insertions(+), 47 deletions(-)

diff --git a/kernel/include/net/xdp_sock.h b/kernel/include/net/xdp_sock.h
index c2c10cc..cc17bc9 100644
--- a/kernel/include/net/xdp_sock.h
+++ b/kernel/include/net/xdp_sock.h
@@ -15,88 +15,106 @@
 
 struct net_device;
 struct xsk_queue;
-
-struct xdp_umem_props {
-	u64 chunk_mask;
-	u64 size;
-};
-
-struct xdp_umem_page {
-	void *addr;
-	dma_addr_t dma;
-};
+struct xdp_buff;
 
 struct xdp_umem {
-	struct xsk_queue *fq;
-	struct xsk_queue *cq;
-	struct xdp_umem_page *pages;
-	struct xdp_umem_props props;
+	void *addrs;
+	u64 size;
 	u32 headroom;
-	u32 chunk_size_nohr;
-	struct user_struct *user;
-	unsigned long address;
-	refcount_t users;
-	struct work_struct work;
-	struct page **pgs;
+	u32 chunk_size;
+	u32 chunks;
 	u32 npgs;
-	struct net_device *dev;
-	u16 queue_id;
+	struct user_struct *user;
+	refcount_t users;
+	u8 flags;
 	bool zc;
-	spinlock_t xsk_list_lock;
-	struct list_head xsk_list;
+	struct page **pgs;
+	int id;
+	struct list_head xsk_dma_list;
+	struct work_struct work;
+};
+
+struct xsk_map {
+	struct bpf_map map;
+	spinlock_t lock; /* Synchronize map updates */
+	struct xdp_sock *xsk_map[];
 };
 
 struct xdp_sock {
 	/* struct sock must be the first member of struct xdp_sock */
 	struct sock sk;
-	struct xsk_queue *rx;
+	struct xsk_queue *rx ____cacheline_aligned_in_smp;
 	struct net_device *dev;
 	struct xdp_umem *umem;
 	struct list_head flush_node;
+	struct xsk_buff_pool *pool;
 	u16 queue_id;
-	struct xsk_queue *tx ____cacheline_aligned_in_smp;
-	struct list_head list;
 	bool zc;
+	enum {
+		XSK_READY = 0,
+		XSK_BOUND,
+		XSK_UNBOUND,
+	} state;
+
+	struct xsk_queue *tx ____cacheline_aligned_in_smp;
+	struct list_head tx_list;
+	/* Protects generic receive. */
+	spinlock_t rx_lock;
+
+	/* Statistics */
+	u64 rx_dropped;
+	u64 rx_queue_full;
+
+	struct list_head map_list;
+	/* Protects map_list */
+	spinlock_t map_list_lock;
 	/* Protects multiple processes in the control path */
 	struct mutex mutex;
-	/* Mutual exclusion of NAPI TX thread and sendmsg error paths
-	 * in the SKB destructor callback.
-	 */
-	spinlock_t tx_completion_lock;
-	u64 rx_dropped;
+	struct xsk_queue *fq_tmp; /* Only as tmp storage before bind */
+	struct xsk_queue *cq_tmp; /* Only as tmp storage before bind */
 };
 
-struct xdp_buff;
 #ifdef CONFIG_XDP_SOCKETS
+
 int xsk_generic_rcv(struct xdp_sock *xs, struct xdp_buff *xdp);
-int xsk_rcv(struct xdp_sock *xs, struct xdp_buff *xdp);
-void xsk_flush(struct xdp_sock *xs);
-bool xsk_is_setup_for_bpf_map(struct xdp_sock *xs);
-/* Used from netdev driver */
-u64 *xsk_umem_peek_addr(struct xdp_umem *umem, u64 *addr);
-void xsk_umem_discard_addr(struct xdp_umem *umem);
-void xsk_umem_complete_tx(struct xdp_umem *umem, u32 nb_entries);
-bool xsk_umem_consume_tx(struct xdp_umem *umem, dma_addr_t *dma, u32 *len);
-void xsk_umem_consume_tx_done(struct xdp_umem *umem);
+int __xsk_map_redirect(struct xdp_sock *xs, struct xdp_buff *xdp);
+void __xsk_map_flush(void);
+
+static inline struct xdp_sock *__xsk_map_lookup_elem(struct bpf_map *map,
+						     u32 key)
+{
+	struct xsk_map *m = container_of(map, struct xsk_map, map);
+	struct xdp_sock *xs;
+
+	if (key >= map->max_entries)
+		return NULL;
+
+	xs = READ_ONCE(m->xsk_map[key]);
+	return xs;
+}
+
 #else
+
 static inline int xsk_generic_rcv(struct xdp_sock *xs, struct xdp_buff *xdp)
 {
 	return -ENOTSUPP;
 }
 
-static inline int xsk_rcv(struct xdp_sock *xs, struct xdp_buff *xdp)
+static inline int __xsk_map_redirect(struct xdp_sock *xs, struct xdp_buff *xdp)
 {
-	return -ENOTSUPP;
+	return -EOPNOTSUPP;
 }
 
-static inline void xsk_flush(struct xdp_sock *xs)
+static inline void __xsk_map_flush(void)
 {
 }
 
-static inline bool xsk_is_setup_for_bpf_map(struct xdp_sock *xs)
+static inline struct xdp_sock *__xsk_map_lookup_elem(struct bpf_map *map,
+						     u32 key)
 {
-	return false;
+	return NULL;
 }
+
 #endif /* CONFIG_XDP_SOCKETS */
 
 #endif /* _LINUX_XDP_SOCK_H */

--
Gitblit v1.6.2