[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