Hi Eddie,

I've started using the userlevel Packet destructor callback and needed a way
to store user data to be returned via the destructor callback. It's a small
change and you might consider incorporating this into Click.

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;
_______________________________________________
click mailing list
[email protected]
https://amsterdam.lcs.mit.edu/mailman/listinfo/click

Reply via email to