Hi Eddie, I understand adding more data to the Packet header is not desirable and I'm happy not to go that route.
I think I have found an alternative way to accomplish what I want to do without changing Packet, so please disregard my request :) Beyers On Mon, Mar 9, 2009 at 4:30 PM, Eddie Kohler <[email protected]> wrote: > 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; >> >> >> _______________________________________________ click mailing list [email protected] https://amsterdam.lcs.mit.edu/mailman/listinfo/click
