[Click] ANNOUNCE: Click-1.7.0rc1
Eddie Kohler
kohler at cs.ucla.edu
Mon Mar 9 10:30:00 EDT 2009
Hi Beyers,
Can you not use an annotation to store this type of data? I'd rather not
continue adding data to a Packet header.
Eddie
Beyers Cronje wrote:
> 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