From 7e970c18f85f99acc678d90128b6e01dce1bf273 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Fri, 01 Nov 2024 02:40:12 +0000
Subject: [PATCH] gmac get mac form eeprom
---
kernel/net/core/skbuff.c | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 115 insertions(+), 0 deletions(-)
diff --git a/kernel/net/core/skbuff.c b/kernel/net/core/skbuff.c
index 382dbdc..ba8222f 100644
--- a/kernel/net/core/skbuff.c
+++ b/kernel/net/core/skbuff.c
@@ -291,6 +291,108 @@
return skb;
}
+#ifdef CONFIG_NET_OOB
+
+struct sk_buff *__netdev_alloc_oob_skb(struct net_device *dev, size_t len,
+ size_t headroom, gfp_t gfp_mask)
+{
+ struct sk_buff *skb;
+
+ headroom = ALIGN(NET_SKB_PAD + headroom, NET_SKB_PAD);
+ skb = __alloc_skb(len + headroom, gfp_mask,
+ SKB_ALLOC_RX, NUMA_NO_NODE);
+ if (!skb)
+ return NULL;
+
+ skb_reserve(skb, headroom);
+ skb->dev = dev;
+ skb->oob = true;
+
+ return skb;
+}
+EXPORT_SYMBOL_GPL(__netdev_alloc_oob_skb);
+
+void __netdev_free_oob_skb(struct net_device *dev, struct sk_buff *skb)
+{
+ skb->oob = false;
+ skb->oob_clone = false;
+ dev_kfree_skb(skb);
+}
+EXPORT_SYMBOL_GPL(__netdev_free_oob_skb);
+
+void netdev_reset_oob_skb(struct net_device *dev, struct sk_buff *skb,
+ size_t headroom)
+{
+ unsigned char *data = skb->head; /* Always from kmalloc_reserve(). */
+
+ if (WARN_ON_ONCE(!skb->oob || skb->oob_clone))
+ return;
+
+ memset(skb, 0, offsetof(struct sk_buff, tail));
+ __build_skb_around(skb, data, 0);
+ headroom = ALIGN(NET_SKB_PAD + headroom, NET_SKB_PAD);
+ skb_reserve(skb, headroom);
+ skb->oob = true;
+ skb->dev = dev;
+}
+EXPORT_SYMBOL_GPL(netdev_reset_oob_skb);
+
+struct sk_buff *skb_alloc_oob_head(gfp_t gfp_mask)
+{
+ struct sk_buff *skb = kmem_cache_alloc(skbuff_head_cache, gfp_mask);
+
+ if (!skb)
+ return NULL;
+
+ /*
+ * skb heads allocated for out-of-band traffic should be
+ * reserved for clones, so memset is extraneous in the sense
+ * that skb_morph_oob() should follow the allocation.
+ */
+ memset(skb, 0, offsetof(struct sk_buff, tail));
+ refcount_set(&skb->users, 1);
+ skb->oob_clone = true;
+ skb_set_kcov_handle(skb, kcov_common_handle());
+
+ return skb;
+}
+EXPORT_SYMBOL_GPL(skb_alloc_oob_head);
+
+static struct sk_buff *__skb_clone(struct sk_buff *n, struct sk_buff *skb);
+
+void skb_morph_oob_skb(struct sk_buff *n, struct sk_buff *skb)
+{
+ __skb_clone(n, skb);
+ n->oob = true;
+ n->oob_clone = true;
+ skb->oob_cloned = true;
+}
+EXPORT_SYMBOL_GPL(skb_morph_oob_skb);
+
+bool skb_release_oob_skb(struct sk_buff *skb, int *dref)
+{
+ struct skb_shared_info *shinfo = skb_shinfo(skb);
+
+ if (!skb_unref(skb))
+ return false;
+
+ /*
+ * ->nohdr is never set for oob shells, so we always refcount
+ * the full data (header + payload) when cloned.
+ */
+ *dref = skb->cloned ? atomic_sub_return(1, &shinfo->dataref) : 0;
+
+ return true;
+}
+EXPORT_SYMBOL_GPL(skb_release_oob_skb);
+
+__weak bool skb_oob_recycle(struct sk_buff *skb)
+{
+ return false;
+}
+
+#endif /* CONFIG_NET_OOB */
+
/**
* __build_skb - build a network buffer
* @data: data buffer provided by caller
@@ -691,6 +793,9 @@
void __kfree_skb(struct sk_buff *skb)
{
+ if (recycle_oob_skb(skb))
+ return;
+
skb_release_all(skb);
kfree_skbmem(skb);
}
@@ -884,6 +989,9 @@
struct napi_alloc_cache *nc = this_cpu_ptr(&napi_alloc_cache);
/* drop skb->head and call any destructors for packet */
+ if (recycle_oob_skb(skb))
+ return;
+
skb_release_all(skb);
/* record skb to CPU local list */
@@ -903,6 +1011,9 @@
}
void __kfree_skb_defer(struct sk_buff *skb)
{
+ if (recycle_oob_skb(skb))
+ return;
+
_kfree_skb_defer(skb);
}
@@ -926,6 +1037,9 @@
return;
}
+ if (recycle_oob_skb(skb))
+ return;
+
_kfree_skb_defer(skb);
}
EXPORT_SYMBOL(napi_consume_skb);
@@ -946,6 +1060,7 @@
skb_dst_copy(new, old);
__skb_ext_copy(new, old);
__nf_copy(new, old, false);
+ __skb_oob_copy(new, old);
/* Note : this field could be in headers_start/headers_end section
* It is not yet because we do not want to have a 16 bit hole
--
Gitblit v1.6.2