[Click] ANNOUNCE: Click-1.7.0rc1
Beyers Cronje
bcronje at gmail.com
Mon Mar 9 03:38:04 EDT 2009
Hi Eddie,
I use the userlevel Packet destructor callback and needed a way to store
user data to be returned via the destructor callback. Any chance something
like this might be consired for inclusion in 1.7 ?
Note the patch below was generated on an older version of Click, so it will
probable not apply directly anymore. I'm just curious IF you would consider
such a change? If so, then I will gladly generate a new patch on current GIT
version.
Cheers
Beyers
diff -Naur click/elements/userlevel/fromfile.cc
newclick/elements/userlevel/fromfile.cc
--- click/elements/userlevel/fromfile.cc 2007-09-18 22:37:05.000000000
+0200
+++ newclick/elements/userlevel/fromfile.cc 2007-10-16 21:21:43.000000000
+0200
@@ -120,7 +120,7 @@
#ifdef ALLOW_MMAP
static void
-munmap_destructor(unsigned char *data, size_t amount)
+munmap_destructor(unsigned char *data, size_t amount, void *)
{
if (munmap((caddr_t)data, amount) < 0)
click_chatter("FromFile: munmap: %s", strerror(errno));
@@ -158,7 +158,7 @@
if (mmap_data == MAP_FAILED)
return error(errh, "mmap: %s", strerror(errno));
- _data_packet = Packet::make((unsigned char *)mmap_data, _len,
munmap_destructor);
+ _data_packet = Packet::make((unsigned char *)mmap_data, _len,
munmap_destructor, 0);
_buffer = _data_packet->data();
_file_offset = _mmap_off;
_mmap_off += _len;
diff -Naur click/include/click/packet.hh newclick/include/click/packet.hh
--- click/include/click/packet.hh 2007-09-07 22:26:45.000000000 +0200
+++ newclick/include/click/packet.hh 2007-10-16 21:17:52.000000000 +0200
@@ -21,12 +21,12 @@
# include <click/simclick.h>
#endif
-
CLICK_DECLS
class IP6Address;
class WritablePacket;
+
class Packet { public:
// PACKET CREATION
@@ -51,7 +51,7 @@
const struct mbuf *m() const { return (const struct mbuf *)_m; }
struct mbuf *steal_m();
#else /* User-space */
- static WritablePacket *make(unsigned char *, uint32_t, void
(*destructor)(unsigned char *, size_t));
+ static WritablePacket *make(unsigned char *, uint32_t, void
(*destructor)(unsigned char *, size_t, void *), void *);
#endif
inline void kill();
@@ -81,6 +81,7 @@
#if CLICK_USERLEVEL
inline void shrink_data(const unsigned char *, uint32_t length);
inline void change_headroom_and_length(uint32_t headroom, uint32_t
length);
+ inline void *client_data() { return _client_data; }
#endif
// HEADER ANNOTATIONS
@@ -255,7 +256,8 @@
unsigned char *_tail; /* one beyond end of packet */
unsigned char *_end; /* one beyond end of allocated buffer */
# if CLICK_USERLEVEL
- void (*_destructor)(unsigned char *, size_t);
+ void (*_destructor)(unsigned char *, size_t, void *);
+ void *_client_data;
# endif
unsigned char _cb[48];
unsigned char *_mac;
@@ -325,6 +327,21 @@
};
+inline void
+Packet::kill()
+{
+#if CLICK_LINUXMODULE
+ struct sk_buff *b = skb();
+ b->next = b->prev = 0;
+# if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 15)
+ b->list = 0;
+# endif
+ skbmgr_recycle_skbs(b);
+#else
+ if (_use_count.dec_and_test())
+ delete this;
+#endif
+}
inline const unsigned char *
@@ -656,23 +673,6 @@
#endif
-inline void
-Packet::kill()
-{
-#if CLICK_LINUXMODULE
- struct sk_buff *b = skb();
- b->next = b->prev = 0;
-# if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 15)
- b->list = 0;
-# endif
- skbmgr_recycle_skbs(b);
-#else
- if (_use_count.dec_and_test())
- delete this;
-#endif
-}
-
-
#if CLICK_BSDMODULE /* BSD kernel module */
inline void
Packet::assimilate_mbuf(Packet *p)
diff -Naur click/lib/packet.cc newclick/lib/packet.cc
--- click/lib/packet.cc 2007-09-07 19:53:46.000000000 +0200
+++ newclick/lib/packet.cc 2007-10-16 21:17:02.000000000 +0200
@@ -25,6 +25,7 @@
#endif
CLICK_DECLS
+
#ifdef CLICK_LINUXMODULE /* Linux kernel module */
Packet::Packet()
@@ -66,6 +67,7 @@
_head = _data = _tail = _end = 0;
#if CLICK_USERLEVEL
_destructor = 0;
+ _client_data = 0;
#elif CLICK_BSDMODULE
_m = 0;
#endif
@@ -78,7 +80,7 @@
_data_packet->kill();
#if CLICK_USERLEVEL
else if (_head && _destructor)
- _destructor(_head, _end - _head);
+ _destructor(_head, _end - _head, _client_data);
else
delete[] _head;
#elif CLICK_BSDMODULE
@@ -97,13 +99,14 @@
#ifdef CLICK_USERLEVEL
WritablePacket *
-Packet::make(unsigned char *data, uint32_t len, void (*destruct)(unsigned
char *, size_t))
+Packet::make(unsigned char *data, uint32_t len, void (*destruct)(unsigned
char *, size_t, void *), void *cdata)
{
WritablePacket *p = new WritablePacket;
if (p) {
p->_head = p->_data = data;
p->_tail = p->_end = data + len;
p->_destructor = destruct;
+ p->_client_data = cdata;
}
return p;
}
@@ -319,7 +322,7 @@
_data_packet->kill();
# if CLICK_USERLEVEL
else if (_destructor)
- _destructor(old_head, old_end - old_head);
+ _destructor(old_head, old_end - old_head, _client_data);
else
delete[] old_head;
_destructor = 0;
More information about the click
mailing list